Skip to content

Commit 2c4b676

Browse files
dooly123claude
andcommitted
Packages: single Install / Manage action per row
An uninstalled package in the Available list now shows a single Install button; an installed one shows a single Manage button that opens a menu with Update, Choose version, and Remove. The menu is built in code-behind and invokes the view-model commands directly, so it doesn't depend on binding resolution inside the flyout popup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent b9a3a28 commit 2c4b676

3 files changed

Lines changed: 45 additions & 20 deletions

File tree

src/BasisPM.App/Localization/Languages/en.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,10 @@
522522
"key": "packages.button.listView",
523523
"value": "List view"
524524
},
525+
{
526+
"key": "packages.button.manage",
527+
"value": "Manage"
528+
},
525529
{
526530
"key": "packages.button.refresh",
527531
"value": "Refresh"

src/BasisPM.App/Views/PackagesView.axaml

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,13 @@
106106
</StackPanel>
107107
</StackPanel>
108108
<StackPanel Grid.Column="2" Width="160" Spacing="8" VerticalAlignment="Center">
109-
<Button Content="{Binding ButtonLabel}" Classes="primary" HorizontalAlignment="Stretch"
109+
<!-- Not installed: a single Install. Installed: a Manage menu. -->
110+
<Button Content="{loc:Tr packages.button.install}" Classes="primary" HorizontalAlignment="Stretch"
111+
IsVisible="{Binding !IsInstalled}"
110112
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).InstallCommand}"
111113
CommandParameter="{Binding Entry}"/>
112-
<Button Content="{loc:Tr packages.button.chooseVersion}" HorizontalAlignment="Stretch" FontSize="11" Padding="10,6"
113-
IsVisible="{Binding HasGit}"
114-
ToolTip.Tip="{loc:Tr packages.tooltip.chooseVersion}"
115-
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).ChooseVersionCommand}"
116-
CommandParameter="{Binding Entry}"/>
117-
<Button Content="{loc:Tr packages.button.remove}" Classes="danger" HorizontalAlignment="Stretch" FontSize="11" Padding="10,6"
118-
IsVisible="{Binding IsInstalled}"
119-
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).RemoveCommand}"
120-
CommandParameter="{Binding Entry}"/>
114+
<Button Content="{loc:Tr packages.button.manage}" Classes="primary" HorizontalAlignment="Stretch"
115+
IsVisible="{Binding IsInstalled}" Click="OnManageClick"/>
121116
</StackPanel>
122117
</Grid>
123118
</Border>
@@ -164,18 +159,12 @@
164159
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).OpenLinkCommand}"
165160
CommandParameter="{Binding Link}"/>
166161
</StackPanel>
167-
<Button Content="{Binding ButtonLabel}" Classes="primary" HorizontalAlignment="Stretch"
162+
<Button Content="{loc:Tr packages.button.install}" Classes="primary" HorizontalAlignment="Stretch"
163+
IsVisible="{Binding !IsInstalled}"
168164
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).InstallCommand}"
169165
CommandParameter="{Binding Entry}"/>
170-
<Button Content="{loc:Tr packages.button.chooseVersion}" HorizontalAlignment="Stretch" FontSize="11" Padding="10,6"
171-
IsVisible="{Binding HasGit}"
172-
ToolTip.Tip="{loc:Tr packages.tooltip.chooseVersion}"
173-
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).ChooseVersionCommand}"
174-
CommandParameter="{Binding Entry}"/>
175-
<Button Content="{loc:Tr packages.button.remove}" Classes="danger" HorizontalAlignment="Stretch" FontSize="11" Padding="10,6"
176-
IsVisible="{Binding IsInstalled}"
177-
Command="{Binding #Root.((vm:PackagesViewModel)DataContext).RemoveCommand}"
178-
CommandParameter="{Binding Entry}"/>
166+
<Button Content="{loc:Tr packages.button.manage}" Classes="primary" HorizontalAlignment="Stretch"
167+
IsVisible="{Binding IsInstalled}" Click="OnManageClick"/>
179168
</StackPanel>
180169
</Border>
181170
</DataTemplate>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,40 @@
11
using Avalonia.Controls;
2+
using Avalonia.Interactivity;
3+
using BasisPM.App.Localization;
4+
using BasisPM.App.ViewModels;
25

36
namespace BasisPM.App.Views;
47

58
public partial class PackagesView : UserControl
69
{
710
public PackagesView() => InitializeComponent();
11+
12+
// The "Manage" menu for an installed package is built in code and its commands invoked
13+
// directly, so it doesn't rely on binding resolution inside the flyout popup.
14+
private void OnManageClick(object? sender, RoutedEventArgs e)
15+
{
16+
if (sender is not Control control || control.DataContext is not PackageRow row) return;
17+
if (DataContext is not PackagesViewModel vm) return;
18+
19+
var flyout = new MenuFlyout();
20+
21+
var update = new MenuItem { Header = L.Tr("packages.button.update") };
22+
update.Click += (_, _) => vm.InstallCommand.Execute(row.Entry);
23+
flyout.Items.Add(update);
24+
25+
if (row.HasGit)
26+
{
27+
var choose = new MenuItem { Header = L.Tr("packages.button.chooseVersion") };
28+
choose.Click += (_, _) => vm.ChooseVersionCommand.Execute(row.Entry);
29+
flyout.Items.Add(choose);
30+
}
31+
32+
flyout.Items.Add(new Separator());
33+
34+
var remove = new MenuItem { Header = L.Tr("packages.button.remove") };
35+
remove.Click += (_, _) => vm.RemoveCommand.Execute(row.Entry);
36+
flyout.Items.Add(remove);
37+
38+
flyout.ShowAt(control);
39+
}
840
}

0 commit comments

Comments
 (0)