reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 6794c92c3165e093ef204cab1b234934e38d6854
parent b98e7853f1983dc8c462f4f4c6c7c96a716c88f1
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Tue, 24 Oct 2017 08:11:02 -0400

browser: disable impossible selection-wide operations in the Actions menu

Diffstat:
Msrc/browser.cpp | 24+++++++++++++++++++-----
Msrc/browser.hpp | 1+
Msrc/browser_entry.cpp | 26++++++++++++++++++++------
Msrc/browser_entry.hpp | 12++++++++++--
4 files changed, 50 insertions(+), 13 deletions(-)

diff --git a/src/browser.cpp b/src/browser.cpp @@ -265,10 +265,7 @@ void Browser::fillMenu(Menu &menu) const Entry *entry = getEntry(m_currentIndex); if(m_list->selectionSize() > 1) { - menu.addAction("&Install/update selection", ACTION_LATEST_ALL); - menu.addAction("&Reinstall selection", ACTION_REINSTALL_ALL); - menu.addAction("&Uninstall selection", ACTION_UNINSTALL_ALL); - menu.addAction("&Clear queued actions", ACTION_RESET_ALL); + fillSelectionMenu(menu); menu.addSeparator(); if(entry) { @@ -280,6 +277,23 @@ void Browser::fillMenu(Menu &menu) entry->fillMenu(menu); } +void Browser::fillSelectionMenu(Menu &menu) +{ + int selFlags = 0; + + for(const int index : m_list->selection()) + selFlags |= getEntry(index)->possibleActions(); + + menu.setEnabled(selFlags & Entry::CanInstallLatest, + menu.addAction("&Install/update selection", ACTION_LATEST_ALL)); + menu.setEnabled(selFlags & Entry::CanReinstall, + menu.addAction("&Reinstall selection", ACTION_REINSTALL_ALL)); + menu.setEnabled(selFlags & Entry::CanUninstall, + menu.addAction("&Uninstall selection", ACTION_UNINSTALL_ALL)); + menu.setEnabled(selFlags & Entry::CanClearQueued, + menu.addAction("&Clear queued actions", ACTION_RESET_ALL)); +} + void Browser::updateDisplayLabel() { char btnLabel[32]; @@ -669,7 +683,7 @@ void Browser::uninstall(const int index, const bool toggle) { const Entry *entry = getEntry(index); - if(entry && entry->test(Entry::InstalledFlag) && !entry->remote().isProtected()) + if(entry && entry->test(Entry::InstalledFlag) && !entry->test(Entry::ProtectedFlag)) setTarget(index, nullptr, toggle); } diff --git a/src/browser.hpp b/src/browser.hpp @@ -100,6 +100,7 @@ private: void displayButton(); void actionsButton(); void fillMenu(Menu &); + void fillSelectionMenu(Menu &); bool isFiltered(Package::Type) const; bool hasAction(const Entry *) const; void listDo(const std::function<void (int)> &, const std::vector<int> &); diff --git a/src/browser_entry.cpp b/src/browser_entry.cpp @@ -48,6 +48,9 @@ Browser::Entry::Entry(const Package *pkg, const Registry::Entry &re, const Index // or the newest available version if older than current installed version. if(!latest) latest = pkg->lastVersion(true); + + if(g_reapack->remote(indexName()).isProtected()) + m_flags |= ProtectedFlag; } Browser::Entry::Entry(const Registry::Entry &re, const IndexPtr &i) @@ -147,11 +150,6 @@ const Time *Browser::Entry::lastUpdate() const return latest ? &latest->time() : nullptr; } -Remote Browser::Entry::remote() const -{ - return g_reapack->remote(indexName()); -} - void Browser::Entry::updateRow(const ListView::RowPtr &row) const { int c = 0; @@ -220,7 +218,7 @@ void Browser::Entry::fillMenu(Menu &menu) const menu.check(pinIndex); const UINT uninstallIndex = menu.addAction("&Uninstall", ACTION_UNINSTALL); - if(!test(InstalledFlag) || remote().isProtected()) + if(!test(InstalledFlag) || test(ProtectedFlag)) menu.disable(uninstallIndex); else if(target && *target == nullptr) menu.check(uninstallIndex); @@ -233,6 +231,22 @@ void Browser::Entry::fillMenu(Menu &menu) const menu.addAction(String::format("&About %s", indexName().c_str()), ACTION_ABOUT_REMOTE); } +int Browser::Entry::possibleActions() const +{ + int flags = 0; + + if((test(UninstalledFlag) || test(OutOfDateFlag)) && (!target || *target != latest)) + flags |= CanInstallLatest; + if(test(InstalledFlag) && !test(ObsoleteFlag) && (!target || *target != current)) + flags |= CanReinstall; + if(test(InstalledFlag) && !test(ProtectedFlag) && (!target || *target != nullptr)) + flags |= CanUninstall; + if(target || pin) + flags |= CanClearQueued; + + return flags; +} + bool Browser::Entry::operator==(const Entry &o) const { return indexName() == o.indexName() && categoryName() == o.categoryName() && diff --git a/src/browser_entry.hpp b/src/browser_entry.hpp @@ -38,6 +38,14 @@ public: InstalledFlag = 1<<1, OutOfDateFlag = 1<<2, ObsoleteFlag = 1<<3, + ProtectedFlag = 1<<4, + }; + + enum PossibleActions { + CanInstallLatest = 1<<0, + CanReinstall = 1<<1, + CanUninstall = 1<<2, + CanClearQueued = 1<<3, }; Entry(const Package *, const Registry::Entry &, const IndexPtr &); @@ -58,11 +66,11 @@ public: std::string displayAuthor() const; const Time *lastUpdate() const; - Remote remote() const; void updateRow(const ListView::RowPtr &) const; void fillMenu(Menu &) const; - bool test(Flag f) const { return (m_flags & f) != 0; } + int possibleActions() const; + bool test(Flag f) const { return (m_flags & f) == f; } bool canPin() const { return target ? *target != nullptr : test(InstalledFlag); } bool operator==(const Entry &o) const;