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:
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;