add "Add to Favourites/Remove from Favourites" context menu action

This commit is contained in:
2026-05-08 12:13:28 +03:00
parent d6fa306f83
commit 48f0b63ddb
3 changed files with 68 additions and 0 deletions

View File

@@ -153,6 +153,25 @@ public class UnlockedRepositoryViewModel : ViewModelBase
OnPropertyChanged(nameof(Passwords)); OnPropertyChanged(nameof(Passwords));
} }
public void RemoveEntryFromFavourites(PassStoreEntry entry)
{
var favouritesGroup = PasswordGroups.FirstOrDefault(g => g.GroupType == FileFormatConstants.GROUP_TYPE_FAVOURITES);
if (favouritesGroup == null)
return;
PassStoreEntryPassword? pwd = FollowLinkIfNeeded(entry);
if (pwd == null)
return;
var linkToRemove = pwd.Backlinks.FirstOrDefault(bl => bl is PassStoreEntryLink lnk && lnk.Parent == favouritesGroup);
if (linkToRemove != null)
{
passStore.DeleteEntry(favouritesGroup, linkToRemove.Id);
HasUnsavedChanges = true;
OnPropertyChanged(nameof(Passwords));
}
}
public void UpdateEntry(PassStoreEntryPassword updatedEntry) public void UpdateEntry(PassStoreEntryPassword updatedEntry)
{ {
passStore.UpdateEntry(null, updatedEntry.Id, updatedEntry); passStore.UpdateEntry(null, updatedEntry.Id, updatedEntry);

View File

@@ -169,6 +169,8 @@
<MenuItem Name="entryCtxMenuEdit" Header="Edit" Click="EntryContextMenuItem_Click"/> <MenuItem Name="entryCtxMenuEdit" Header="Edit" Click="EntryContextMenuItem_Click"/>
<MenuItem Name="entryCtxMenuAddToGroup" Header="Add to group" /> <MenuItem Name="entryCtxMenuAddToGroup" Header="Add to group" />
<MenuItem Name="entryCtxMenuRemoveFromGroup" Header="Remove from this group" Click="EntryContextMenuItem_Click" /> <MenuItem Name="entryCtxMenuRemoveFromGroup" Header="Remove from this group" Click="EntryContextMenuItem_Click" />
<MenuItem Name="entryCtxMenuAddToFavourites" Header="Add to Favourites" Click="EntryContextMenuItem_Click" />
<MenuItem Name="entryCtxMenuRemoveFromFavourites" Header="Remove from Favourites" Click="EntryContextMenuItem_Click" />
<MenuItem Name="entryCtxMenuDelete" Header="Delete" Click="EntryContextMenuItem_Click"/> <MenuItem Name="entryCtxMenuDelete" Header="Delete" Click="EntryContextMenuItem_Click"/>
</ContextMenu> </ContextMenu>
</Border.ContextMenu> </Border.ContextMenu>

View File

@@ -257,12 +257,37 @@ public partial class RepositoryWindow : Window
.OfType<MenuItem>() .OfType<MenuItem>()
.FirstOrDefault(m => m.Name == "entryCtxMenuRemoveFromGroup"); .FirstOrDefault(m => m.Name == "entryCtxMenuRemoveFromGroup");
var addToFavouritesItem = contextMenu.Items
.OfType<MenuItem>()
.FirstOrDefault(m => m.Name == "entryCtxMenuAddToFavourites");
var removeFromFavouritesItem = contextMenu.Items
.OfType<MenuItem>()
.FirstOrDefault(m => m.Name == "entryCtxMenuRemoveFromFavourites");
var isNonDefaultGroup = pageVm.SelectedPasswordGroup.GroupType != FileFormatConstants.GROUP_TYPE_DEFAULT; var isNonDefaultGroup = pageVm.SelectedPasswordGroup.GroupType != FileFormatConstants.GROUP_TYPE_DEFAULT;
if (removeFromGroupItem != null) if (removeFromGroupItem != null)
{ {
removeFromGroupItem.IsVisible = isNonDefaultGroup; removeFromGroupItem.IsVisible = isNonDefaultGroup;
} }
// Check if entry is in Favourites group
var favouritesGroup = pageVm.PasswordGroups.FirstOrDefault(g => g.GroupType == FileFormatConstants.GROUP_TYPE_FAVOURITES);
var isInFavourites = false;
if (favouritesGroup != null && _contextMenuEntry != null)
{
PassStoreEntryPassword? pwd = UnlockedRepositoryViewModel.FollowLinkIfNeeded(_contextMenuEntry);
if (pwd != null)
{
isInFavourites = pwd.Backlinks.Any(bl => bl is PassStoreEntryLink lnk && lnk.Parent == favouritesGroup);
}
}
if (addToFavouritesItem != null)
addToFavouritesItem.IsVisible = !isInFavourites;
if (removeFromFavouritesItem != null)
removeFromFavouritesItem.IsVisible = isInFavourites;
if (addToGroupItem == null) if (addToGroupItem == null)
return; return;
@@ -408,6 +433,28 @@ public partial class RepositoryWindow : Window
this.FindControlRecursive<ToastNotificationHost>("NotificationHost")?.Show("Removed from group"); this.FindControlRecursive<ToastNotificationHost>("NotificationHost")?.Show("Removed from group");
} }
} }
else if (s.Name == "entryCtxMenuAddToFavourites")
{
if (DataContext is RepositoryWindowViewModel vm && vm.CurrentPage is UnlockedRepositoryViewModel pageVm)
{
var favouritesGroup = pageVm.PasswordGroups.FirstOrDefault(g => g.GroupType == FileFormatConstants.GROUP_TYPE_FAVOURITES);
if (favouritesGroup != null)
{
if (pageVm.AddEntryToGroup(ent, favouritesGroup))
this.FindControlRecursive<ToastNotificationHost>("NotificationHost")?.Show("Added to Favourites");
else
this.FindControlRecursive<ToastNotificationHost>("NotificationHost")?.Show("Already in Favourites");
}
}
}
else if (s.Name == "entryCtxMenuRemoveFromFavourites")
{
if (DataContext is RepositoryWindowViewModel vm && vm.CurrentPage is UnlockedRepositoryViewModel pageVm)
{
pageVm.RemoveEntryFromFavourites(ent);
this.FindControlRecursive<ToastNotificationHost>("NotificationHost")?.Show("Removed from Favourites");
}
}
else if (s.Name == "entryCtxMenuDelete") else if (s.Name == "entryCtxMenuDelete")
{ {
if (DataContext is RepositoryWindowViewModel vm && vm.CurrentPage is UnlockedRepositoryViewModel pageVm) if (DataContext is RepositoryWindowViewModel vm && vm.CurrentPage is UnlockedRepositoryViewModel pageVm)