mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-21 09:45:48 +08:00
refactor(gearTriggerPage): 重构触发器页面操作逻辑,改用行内操作按钮
移除全局选中触发器相关的属性、回调及列表选中绑定。将编辑、删除命令改为接收当前行触发器实例作为参数,不再依赖全局选中状态。在列表每行添加操作按钮,替换原顶部工具栏的批量编辑删除功能,同时调整新增按钮布局。
This commit is contained in:
@@ -194,6 +194,7 @@
|
||||
<ColumnDefinition Width="150" /> <!-- 快捷键 -->
|
||||
<ColumnDefinition Width="120" /> <!-- 快捷键类型 -->
|
||||
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
|
||||
<ColumnDefinition Width="116" /> <!-- 操作 -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<ui:TextBlock Grid.Column="0"
|
||||
@@ -221,6 +222,11 @@
|
||||
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
|
||||
FontWeight="SemiBold"
|
||||
Text="关联任务" />
|
||||
<ui:TextBlock Grid.Column="5"
|
||||
HorizontalAlignment="Center"
|
||||
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
|
||||
FontWeight="SemiBold"
|
||||
Text="操作" />
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
@@ -234,6 +240,7 @@
|
||||
<ColumnDefinition Width="220" /> <!-- 触发器名称 -->
|
||||
<ColumnDefinition Width="220" /> <!-- CRON表达式 -->
|
||||
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
|
||||
<ColumnDefinition Width="116" /> <!-- 操作 -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<ui:TextBlock Grid.Column="0"
|
||||
@@ -256,6 +263,11 @@
|
||||
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
|
||||
FontWeight="SemiBold"
|
||||
Text="关联任务" />
|
||||
<ui:TextBlock Grid.Column="4"
|
||||
HorizontalAlignment="Center"
|
||||
Foreground="{DynamicResource TextFillColorSecondaryBrush}"
|
||||
FontWeight="SemiBold"
|
||||
Text="操作" />
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
@@ -277,6 +289,7 @@
|
||||
<ColumnDefinition Width="150" /> <!-- 快捷键 -->
|
||||
<ColumnDefinition Width="120" /> <!-- 快捷键类型 -->
|
||||
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
|
||||
<ColumnDefinition Width="116" /> <!-- 操作 -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- 启用状态 -->
|
||||
@@ -330,6 +343,21 @@
|
||||
Text="{Binding TaskDefinitionName, TargetNullValue='未设置'}"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
ToolTip="{Binding TaskDefinitionName}" />
|
||||
|
||||
<StackPanel Grid.Column="5"
|
||||
Orientation="Horizontal"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center">
|
||||
<ui:Button Command="{Binding DataContext.EditTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
|
||||
CommandParameter="{Binding}"
|
||||
Icon="{ui:SymbolIcon Edit24}"
|
||||
Margin="0,0,4,0"
|
||||
ToolTip="编辑" />
|
||||
<ui:Button Command="{Binding DataContext.DeleteTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
|
||||
CommandParameter="{Binding}"
|
||||
Icon="{ui:SymbolIcon Delete24}"
|
||||
ToolTip="删除" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
@@ -360,6 +388,7 @@
|
||||
<ColumnDefinition Width="220" /> <!-- 触发器名称 -->
|
||||
<ColumnDefinition Width="220" /> <!-- CRON表达式 -->
|
||||
<ColumnDefinition Width="*" /> <!-- 关联任务 -->
|
||||
<ColumnDefinition Width="116" /> <!-- 操作 -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- 启用状态 -->
|
||||
@@ -401,6 +430,21 @@
|
||||
Text="{Binding TaskDefinitionName, TargetNullValue='未设置'}"
|
||||
TextTrimming="CharacterEllipsis"
|
||||
ToolTip="{Binding TaskDefinitionName}" />
|
||||
|
||||
<StackPanel Grid.Column="4"
|
||||
Orientation="Horizontal"
|
||||
HorizontalAlignment="Center"
|
||||
VerticalAlignment="Center">
|
||||
<ui:Button Command="{Binding DataContext.EditTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
|
||||
CommandParameter="{Binding}"
|
||||
Icon="{ui:SymbolIcon Edit24}"
|
||||
Margin="0,0,4,0"
|
||||
ToolTip="编辑" />
|
||||
<ui:Button Command="{Binding DataContext.DeleteTriggerItemCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"
|
||||
CommandParameter="{Binding}"
|
||||
Icon="{ui:SymbolIcon Delete24}"
|
||||
ToolTip="删除" />
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
</Grid>
|
||||
@@ -430,26 +474,13 @@
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 工具栏 -->
|
||||
<Border Grid.Row="0" Style="{StaticResource TriggerToolbarBorderStyle}">
|
||||
<WrapPanel VerticalAlignment="Center">
|
||||
<ui:Button Content="新增定时触发器"
|
||||
Command="{Binding AddTimedTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Add24}"
|
||||
Appearance="Primary"
|
||||
Margin="0,0,6,6" />
|
||||
<ui:Button Content="编辑选中项"
|
||||
Command="{Binding EditTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Edit24}"
|
||||
Appearance="Secondary"
|
||||
Margin="0,0,6,6" />
|
||||
<ui:Button Content="删除选中项"
|
||||
Command="{Binding DeleteTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Delete24}"
|
||||
Appearance="Secondary"
|
||||
Margin="0,0,6,6" />
|
||||
</WrapPanel>
|
||||
</Border>
|
||||
<Grid Grid.Row="0" Margin="16,12,16,0">
|
||||
<ui:Button HorizontalAlignment="Right"
|
||||
Content="新增定时触发器"
|
||||
Command="{Binding AddTimedTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Add24}"
|
||||
Appearance="Primary" />
|
||||
</Grid>
|
||||
|
||||
<!-- 固定表格头部 -->
|
||||
<ContentPresenter Grid.Row="1"
|
||||
@@ -459,7 +490,6 @@
|
||||
<Grid Grid.Row="2"
|
||||
Margin="0,6,0,12">
|
||||
<ui:ListView ItemsSource="{Binding TimedTriggers}"
|
||||
SelectedItem="{Binding SelectedTrigger, Mode=TwoWay}"
|
||||
ItemContainerStyle="{StaticResource TriggerListViewItemStyle}"
|
||||
ItemTemplate="{StaticResource TimedTriggerItemTemplate}"
|
||||
Style="{StaticResource TriggerListViewStyle}" />
|
||||
@@ -498,26 +528,13 @@
|
||||
<RowDefinition Height="*" />
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- 工具栏 -->
|
||||
<Border Grid.Row="0" Style="{StaticResource TriggerToolbarBorderStyle}">
|
||||
<WrapPanel VerticalAlignment="Center">
|
||||
<ui:Button Content="新增快捷键触发器"
|
||||
Command="{Binding AddHotkeyTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Add24}"
|
||||
Appearance="Primary"
|
||||
Margin="0,0,6,6" />
|
||||
<ui:Button Content="编辑选中项"
|
||||
Command="{Binding EditTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Edit24}"
|
||||
Appearance="Secondary"
|
||||
Margin="0,0,6,6" />
|
||||
<ui:Button Content="删除选中项"
|
||||
Command="{Binding DeleteTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Delete24}"
|
||||
Appearance="Secondary"
|
||||
Margin="0,0,6,6" />
|
||||
</WrapPanel>
|
||||
</Border>
|
||||
<Grid Grid.Row="0" Margin="16,12,16,0">
|
||||
<ui:Button HorizontalAlignment="Right"
|
||||
Content="新增快捷键触发器"
|
||||
Command="{Binding AddHotkeyTriggerCommand}"
|
||||
Icon="{ui:SymbolIcon Add24}"
|
||||
Appearance="Primary" />
|
||||
</Grid>
|
||||
|
||||
<!-- 固定表格头部 -->
|
||||
<ContentPresenter Grid.Row="1"
|
||||
@@ -527,7 +544,6 @@
|
||||
<Grid Grid.Row="2"
|
||||
Margin="0,6,0,12">
|
||||
<ui:ListView ItemsSource="{Binding HotkeyTriggers}"
|
||||
SelectedItem="{Binding SelectedTrigger, Mode=TwoWay}"
|
||||
ItemContainerStyle="{StaticResource TriggerListViewItemStyle}"
|
||||
ItemTemplate="{StaticResource TriggerItemTemplate}"
|
||||
Style="{StaticResource TriggerListViewStyle}" />
|
||||
|
||||
@@ -4,7 +4,6 @@ using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using CommunityToolkit.Mvvm.ComponentModel;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using BetterGenshinImpact.Model;
|
||||
using BetterGenshinImpact.Model.Gear.Triggers;
|
||||
using BetterGenshinImpact.Service;
|
||||
using BetterGenshinImpact.Service.GearTask;
|
||||
@@ -28,12 +27,6 @@ public partial class GearTriggerPageViewModel : ViewModel
|
||||
[ObservableProperty]
|
||||
private ObservableCollection<GearTriggerViewModel> _hotkeyTriggers = new();
|
||||
|
||||
[ObservableProperty]
|
||||
private GearTriggerViewModel? _selectedTrigger;
|
||||
|
||||
[ObservableProperty]
|
||||
private GearTaskDefinitionViewModel? _selectedTaskDefinition;
|
||||
|
||||
public GearTriggerPageViewModel(
|
||||
ILogger<GearTriggerPageViewModel> logger,
|
||||
GearTriggerStorageService storageService,
|
||||
@@ -44,11 +37,6 @@ public partial class GearTriggerPageViewModel : ViewModel
|
||||
_quartzSchedulerService = quartzSchedulerService;
|
||||
}
|
||||
|
||||
partial void OnSelectedTriggerChanged(GearTriggerViewModel? value)
|
||||
{
|
||||
EditTriggerCommand.NotifyCanExecuteChanged();
|
||||
}
|
||||
|
||||
public override void OnNavigatedTo()
|
||||
{
|
||||
_ = LoadTriggersAsync();
|
||||
@@ -175,7 +163,6 @@ public partial class GearTriggerPageViewModel : ViewModel
|
||||
};
|
||||
|
||||
TimedTriggers.Add(newTrigger);
|
||||
SelectedTrigger = newTrigger;
|
||||
newTrigger.UpdateNextRunTime();
|
||||
|
||||
await SaveTriggersAsync();
|
||||
@@ -199,70 +186,63 @@ public partial class GearTriggerPageViewModel : ViewModel
|
||||
};
|
||||
|
||||
HotkeyTriggers.Add(newTrigger);
|
||||
SelectedTrigger = newTrigger;
|
||||
|
||||
await SaveTriggersAsync();
|
||||
}
|
||||
|
||||
[RelayCommand]
|
||||
private async Task DeleteTrigger()
|
||||
private async Task DeleteTriggerItem(GearTriggerViewModel? trigger)
|
||||
{
|
||||
if (SelectedTrigger == null)
|
||||
if (trigger == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
switch (SelectedTrigger.TriggerType)
|
||||
switch (trigger.TriggerType)
|
||||
{
|
||||
case TriggerType.Timed:
|
||||
TimedTriggers.Remove(SelectedTrigger);
|
||||
TimedTriggers.Remove(trigger);
|
||||
break;
|
||||
case TriggerType.Hotkey:
|
||||
HotkeyTriggers.Remove(SelectedTrigger);
|
||||
HotkeyTriggers.Remove(trigger);
|
||||
break;
|
||||
}
|
||||
|
||||
SelectedTrigger = null;
|
||||
await SaveTriggersAsync();
|
||||
}
|
||||
|
||||
private bool CanEditTrigger()
|
||||
[RelayCommand]
|
||||
private async Task EditTriggerItem(GearTriggerViewModel? trigger)
|
||||
{
|
||||
return SelectedTrigger != null;
|
||||
}
|
||||
|
||||
[RelayCommand(CanExecute = nameof(CanEditTrigger))]
|
||||
private async Task EditTrigger()
|
||||
{
|
||||
if (SelectedTrigger is not { } selectedTrigger)
|
||||
if (trigger == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var dialog = AddTriggerDialog.ShowEditTriggerDialog(selectedTrigger);
|
||||
var dialog = AddTriggerDialog.ShowEditTriggerDialog(trigger);
|
||||
if (dialog == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
selectedTrigger.Name = dialog.TriggerName;
|
||||
selectedTrigger.IsEnabled = dialog.IsEnabled;
|
||||
selectedTrigger.TaskDefinitionName = dialog.SelectedTaskDefinitionName;
|
||||
trigger.Name = dialog.TriggerName;
|
||||
trigger.IsEnabled = dialog.IsEnabled;
|
||||
trigger.TaskDefinitionName = dialog.SelectedTaskDefinitionName;
|
||||
|
||||
if (selectedTrigger.TriggerType == TriggerType.Timed)
|
||||
if (trigger.TriggerType == TriggerType.Timed)
|
||||
{
|
||||
selectedTrigger.CronExpression = dialog.CronExpression;
|
||||
selectedTrigger.Hotkey = null;
|
||||
trigger.CronExpression = dialog.CronExpression;
|
||||
trigger.Hotkey = null;
|
||||
}
|
||||
else if (selectedTrigger.TriggerType == TriggerType.Hotkey)
|
||||
else if (trigger.TriggerType == TriggerType.Hotkey)
|
||||
{
|
||||
selectedTrigger.Hotkey = dialog.SelectedHotkey;
|
||||
selectedTrigger.HotkeyType = dialog.HotkeyType;
|
||||
selectedTrigger.CronExpression = null;
|
||||
trigger.Hotkey = dialog.SelectedHotkey;
|
||||
trigger.HotkeyType = dialog.HotkeyType;
|
||||
trigger.CronExpression = null;
|
||||
}
|
||||
|
||||
selectedTrigger.ModifiedTime = DateTime.Now;
|
||||
selectedTrigger.UpdateNextRunTime();
|
||||
trigger.ModifiedTime = DateTime.Now;
|
||||
trigger.UpdateNextRunTime();
|
||||
|
||||
await SaveTriggersAsync();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user