feat(desktop): add context menu to tabs

This commit is contained in:
Anna 2020-11-15 13:46:58 -05:00
parent 03697c336b
commit f6e362e9f3
2 changed files with 108 additions and 9 deletions

View File

@ -47,11 +47,6 @@
<MenuItem Header="Exit"
Click="Exit_Click" />
</MenuItem>
<MenuItem Header="Tabs"
WindowChrome.IsHitTestVisibleInChrome="{Binding App.Config.CompactMode}">
<MenuItem Header="Manage"
Click="ManageTabs_Click" />
</MenuItem>
<MenuItem Header="Players"
WindowChrome.IsHitTestVisibleInChrome="{Binding App.Config.CompactMode}">
<MenuItem Header="Friend list"
@ -65,6 +60,57 @@
Loaded="Tabs_Loaded"
SelectionChanged="Tabs_SelectionChanged"
ItemsSource="{Binding App.Config.Tabs}">
<TabControl.CommandBindings>
<CommandBinding Command="local:MainWindow.AddTab"
Executed="AddTab_OnExecuted"
CanExecute="AlwaysTrue_CanExecute" />
<CommandBinding Command="local:MainWindow.ManageTabs"
Executed="ManageTabs_OnExecuted"
CanExecute="AlwaysTrue_CanExecute" />
<CommandBinding Command="local:MainWindow.EditTab"
Executed="EditTab_OnExecuted"
CanExecute="AlwaysTrue_CanExecute" />
<CommandBinding Command="local:MainWindow.DeleteTab"
Executed="DeleteTab_OnExecuted"
CanExecute="AlwaysTrue_CanExecute" />
</TabControl.CommandBindings>
<TabControl.Resources>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource DefaultMenuItemStyle}">
<Setter Property="CommandTarget"
Value="{Binding Path=PlacementTarget,RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}" />
</Style>
<ContextMenu x:Key="TabContextMenu"
DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
d:DataContext="{d:DesignInstance local:Tab}">
<MenuItem Header="Edit"
Command="local:MainWindow.EditTab"
CommandParameter="{Binding}" />
<MenuItem Header="Delete"
Command="local:MainWindow.DeleteTab"
CommandParameter="{Binding}" />
</ContextMenu>
</TabControl.Resources>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}"
BasedOn="{StaticResource DefaultTabItemStyle}">
<Setter Property="ContextMenu"
Value="{StaticResource TabContextMenu}" />
</Style>
</TabControl.ItemContainerStyle>
<TabControl.ContextMenu>
<ContextMenu>
<MenuItem Header="Add tab"
Command="local:MainWindow.AddTab" />
<MenuItem Header="Manage tabs"
Command="local:MainWindow.ManageTabs" />
</ContextMenu>
</TabControl.ContextMenu>
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />

View File

@ -15,6 +15,63 @@ namespace XIVChat_Desktop {
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : INotifyPropertyChanged {
#region commands
private void AlwaysTrue_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
e.CanExecute = true;
}
public static readonly RoutedUICommand EditTab = new RoutedUICommand(
"EditTab",
"EditTab",
typeof(MainWindow)
);
private void EditTab_OnExecuted(object sender, ExecutedRoutedEventArgs e) {
if (!(e.Parameter is Tab tab)) {
return;
}
new ManageTab(this, tab).Show();
}
public static readonly RoutedUICommand DeleteTab = new RoutedUICommand(
"DeleteTab",
"DeleteTab",
typeof(MainWindow)
);
private void DeleteTab_OnExecuted(object sender, ExecutedRoutedEventArgs e) {
if (!(e.Parameter is Tab tab)) {
return;
}
this.App.Config.Tabs.Remove(tab);
this.App.Config.Save();
}
public static readonly RoutedUICommand AddTab = new RoutedUICommand(
"AddTab",
"AddTab",
typeof(MainWindow)
);
private void AddTab_OnExecuted(object sender, ExecutedRoutedEventArgs e) {
new ManageTab(this, null).Show();
}
public static readonly RoutedUICommand ManageTabs = new RoutedUICommand(
"ManageTabs",
"ManageTabs",
typeof(MainWindow)
);
private void ManageTabs_OnExecuted(object sender, ExecutedRoutedEventArgs e) {
new ManageTabs(this).Show();
}
#endregion
public App App => (App)Application.Current;
public List<ServerMessage> Messages { get; } = new List<ServerMessage>();
@ -169,10 +226,6 @@ namespace XIVChat_Desktop {
scroller?.ScrollToBottom();
}
private void ManageTabs_Click(object sender, RoutedEventArgs e) {
new ManageTabs(this).Show();
}
private void Scan_Click(object sender, RoutedEventArgs e) {
new ServerScan(this).Show();
}