summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-12-14 16:19:56 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-04 03:33:17 -0500
commit8bcf8cde3c089650abd006a9b8e91c82f6a13880 (patch)
treeb72a9023376c3a6acfa9587d9007f8a10f298c91 /src
parent87868e1b22c27ebf10646269e89cc2848431c0b6 (diff)
hide spacers on statusbar when the progress bar is not visible
always show menu items, added status tips
Diffstat (limited to 'src')
-rw-r--r--src/filetree.cpp234
-rw-r--r--src/mainwindow.cpp6
-rw-r--r--src/statusbar.cpp30
-rw-r--r--src/statusbar.h2
4 files changed, 199 insertions, 73 deletions
diff --git a/src/filetree.cpp b/src/filetree.cpp
index 16542734..2a64d1c6 100644
--- a/src/filetree.cpp
+++ b/src/filetree.cpp
@@ -36,6 +36,87 @@ bool canHideFile(const FileEntry& file);
bool canUnhideFile(const FileEntry& file);
+class MenuItem
+{
+public:
+ MenuItem(QString s={})
+ : m_action(new QAction(std::move(s)))
+ {
+ }
+
+ MenuItem& caption(const QString& s)
+ {
+ m_action->setText(s);
+ return *this;
+ }
+
+ template <class F>
+ MenuItem& callback(F&& f)
+ {
+ QObject::connect(m_action, &QAction::triggered, std::forward<F>(f));
+ return *this;
+ }
+
+ MenuItem& hint(const QString& s)
+ {
+ m_tooltip = s;
+ return *this;
+ }
+
+ MenuItem& disabledHint(const QString& s)
+ {
+ m_disabledHint = s;
+ return *this;
+ }
+
+ MenuItem& enabled(bool b)
+ {
+ m_action->setEnabled(b);
+ return *this;
+ }
+
+ void addTo(QMenu& menu)
+ {
+ QString s;
+
+ setTips();
+
+ m_action->setParent(&menu);
+ menu.addAction(m_action);
+ }
+
+private:
+ QAction* m_action;
+ QString m_tooltip;
+ QString m_disabledHint;
+
+ void setTips()
+ {
+ if (m_action->isEnabled() || m_disabledHint.isEmpty()) {
+ m_action->setStatusTip(m_tooltip);
+ return;
+ }
+
+ QString s = m_tooltip.trimmed();
+
+ if (!s.isEmpty()) {
+ if (!s.endsWith(".")) {
+ s += ".";
+ }
+
+ s += "\n";
+ }
+
+ s += QObject::tr("Disabled because") + ": " + m_disabledHint.trimmed();
+
+ if (!s.endsWith(".")) {
+ s += ".";
+ }
+
+ m_action->setStatusTip(s);
+ }
+};
+
FileTreeItem::FileTreeItem()
: m_flags(NoFlags), m_loaded(false)
@@ -884,89 +965,120 @@ void FileTree::addFileMenus(QMenu& menu, const FileEntry& file, int originID)
addOpenMenus(menu, file);
menu.addSeparator();
+ menu.setToolTipsVisible(true);
const QFileInfo target(QString::fromStdWString(file.getFullPath()));
- if (getFileExecutionType(target) == FileExecutionTypes::Executable) {
- menu.addAction(QObject::tr("&Add as Executable"), [&]{ addAsExecutable(); });
- }
- if (!file.isFromArchive()) {
- menu.addAction(QObject::tr("Open Origin in Explorer"), [&]{ exploreOrigin(); });
- }
+ MenuItem(QObject::tr("&Add as Executable"))
+ .callback([&]{ addAsExecutable(); })
+ .hint(QObject::tr("Add this file to the executables list"))
+ .disabledHint(QObject::tr("This file is not executable"))
+ .enabled(getFileExecutionType(target) == FileExecutionTypes::Executable)
+ .addTo(menu);
- if (originID != 0) {
- menu.addAction(QObject::tr("Open Mod Info"), [&]{ openModInfo(); });
- }
+ MenuItem(QObject::tr("E&xplore"))
+ .callback([&]{ exploreOrigin(); })
+ .hint(QObject::tr("Opens the file in Explorer"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive())
+ .addTo(menu);
- // offer to hide/unhide file, but not for files from archives
- if (!file.isFromArchive()) {
- if (isHidden(file)) {
- menu.addAction(QObject::tr("Un-Hide"), [&]{ hide(); });
- } else {
- menu.addAction(QObject::tr("Hide"), [&]{ unhide(); });
- }
+ MenuItem(QObject::tr("Open &Mod Info"))
+ .callback([&]{ openModInfo(); })
+ .hint(QObject::tr("Opens the Mod Info Window"))
+ .disabledHint(QObject::tr("This file is not in a managed mod"))
+ .enabled(originID != 0)
+ .addTo(menu);
+
+ if (isHidden(file)) {
+ MenuItem(QObject::tr("&Un-Hide"))
+ .callback([&]{ hide(); })
+ .hint(QObject::tr("Un-hides the file"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive())
+ .addTo(menu);
+ } else {
+ MenuItem(QObject::tr("&Hide"))
+ .callback([&]{ unhide(); })
+ .hint(QObject::tr("Hides the file"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive())
+ .addTo(menu);
}
}
void FileTree::addOpenMenus(QMenu& menu, const MOShared::FileEntry& file)
{
- QAction* openMenu = nullptr;
- QAction* openHookedMenu = nullptr;
+ using namespace spawn;
- if (canRunFile(file)) {
- openMenu = new QAction(QObject::tr("&Execute"), m_tree);
- openHookedMenu = new QAction(QObject::tr("Execute with &VFS"), m_tree);
- } else if (canOpenFile(file)) {
- openMenu = new QAction(QObject::tr("&Open"), m_tree);
- openHookedMenu = new QAction(QObject::tr("Open with &VFS"), m_tree);
- }
+ MenuItem openMenu, openHookedMenu;
- QAction* previewMenu = nullptr;
- if (canPreviewFile(m_plugins, file)) {
- previewMenu = new QAction(QObject::tr("Preview"), m_tree);
- }
+ const QFileInfo target(QString::fromStdWString(file.getFullPath()));
- if (openMenu && previewMenu) {
- if (m_core.settings().interface().doubleClicksOpenPreviews()) {
- menu.addAction(previewMenu);
- menu.addAction(openMenu);
- } else {
- menu.addAction(openMenu);
- menu.addAction(previewMenu);
- }
- } else {
- if (openMenu) {
- menu.addAction(openMenu);
- }
+ if (getFileExecutionType(target) == FileExecutionTypes::Executable) {
+ openMenu
+ .caption(QObject::tr("&Execute"))
+ .callback([&]{ open(); })
+ .hint(QObject::tr("Launches this program"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive());
- if (previewMenu) {
- menu.addAction(previewMenu);
- }
- }
+ openHookedMenu
+ .caption(QObject::tr("Execute with &VFS"))
+ .callback([&]{ openHooked(); })
+ .hint(QObject::tr("Launches this program hooked to the VFS"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive());
+ } else {
+ openMenu
+ .caption(QObject::tr("&Open"))
+ .callback([&]{ open(); })
+ .hint(QObject::tr("Opens this file with its default handler"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive());
- if (openHookedMenu) {
- menu.addAction(openHookedMenu);
+ openHookedMenu
+ .caption(QObject::tr("Open with &VFS"))
+ .callback([&]{ openHooked(); })
+ .hint(QObject::tr("Opens this file with its default handler hooked to the VFS"))
+ .disabledHint(QObject::tr("This file is in an archive"))
+ .enabled(!file.isFromArchive());
}
+ MenuItem previewMenu(QObject::tr("&Preview"));
+ previewMenu
+ .callback([&]{ preview(); })
+ .hint(QObject::tr("Previews this file within Mod Organizer"))
+ .disabledHint(QObject::tr(
+ "This file is in an archive or has no preview handler "
+ "associated with it"))
+ .enabled(canPreviewFile(m_plugins, file));
- if (openMenu) {
- QObject::connect(openMenu, &QAction::triggered, [&]{ open(); });
- }
-
- if (openHookedMenu) {
- QObject::connect(openHookedMenu, &QAction::triggered, [&]{ openHooked(); });
+ if (m_core.settings().interface().doubleClicksOpenPreviews()) {
+ previewMenu.addTo(menu);
+ openMenu.addTo(menu);
+ openHookedMenu.addTo(menu);
+ } else {
+ openMenu.addTo(menu);
+ previewMenu.addTo(menu);
+ openHookedMenu.addTo(menu);
}
- if (previewMenu) {
- QObject::connect(previewMenu, &QAction::triggered, [&]{ preview(); });
- }
+ // bold the first enabled option, only first three are considered
+ for (int i=0; i<3; ++i) {
+ if (i >= menu.actions().size()) {
+ break;
+ }
+ auto* a = menu.actions()[i];
- // bold the first option
- auto* top = menu.actions()[0];
- auto f = top->font();
- f.setBold(true);
- top->setFont(f);
+ if (menu.actions()[i]->isEnabled()) {
+ auto f = a->font();
+ f.setBold(true);
+ a->setFont(f);
+ break;
+ }
+ }
}
void FileTree::addCommonMenus(QMenu& menu)
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 2ed9bd3c..c71a877d 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -466,6 +466,8 @@ MainWindow::MainWindow(Settings &settings
m_showArchiveData = false;
}
+ QApplication::instance()->installEventFilter(this);
+
refreshExecutablesList();
updatePinnedExecutables();
resetActionIcons();
@@ -1471,7 +1473,11 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
if ((object == ui->savegameList) &&
((event->type() == QEvent::Leave) || (event->type() == QEvent::WindowDeactivate))) {
hideSaveGameInfo();
+ } else if (event->type() == QEvent::StatusTip && object != this) {
+ QMainWindow::event(event);
+ return true;
}
+
return false;
}
diff --git a/src/statusbar.cpp b/src/statusbar.cpp
index 4729c6ad..c3de2b0a 100644
--- a/src/statusbar.cpp
+++ b/src/statusbar.cpp
@@ -5,6 +5,7 @@
StatusBar::StatusBar(QWidget* parent) :
QStatusBar(parent), ui(nullptr), m_progress(new QProgressBar),
+ m_progressSpacer1(new QWidget), m_progressSpacer2(new QWidget),
m_notifications(nullptr), m_update(nullptr), m_api(new QLabel)
{
}
@@ -15,17 +16,17 @@ void StatusBar::setup(Ui::MainWindow* mainWindowUI, const Settings& settings)
m_notifications = new StatusBarAction(ui->actionNotifications);
m_update = new StatusBarAction(ui->actionUpdate);
- QWidget* spacer1 = new QWidget;
- spacer1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- spacer1->setHidden(true);
- spacer1->setVisible(true);
- addPermanentWidget(spacer1, 0);
+ m_progressSpacer1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_progressSpacer1->setHidden(true);
+ m_progressSpacer1->setVisible(true);
+ addPermanentWidget(m_progressSpacer1, 0);
addPermanentWidget(m_progress);
- QWidget* spacer2 = new QWidget;
- spacer2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- spacer2->setHidden(true);
- spacer2->setVisible(true);
- addPermanentWidget(spacer2,0);
+
+ m_progressSpacer2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ m_progressSpacer2->setHidden(true);
+ m_progressSpacer2->setVisible(true);
+ addPermanentWidget(m_progressSpacer2,0);
+
addPermanentWidget(m_notifications);
addPermanentWidget(m_update);
addPermanentWidget(m_api);
@@ -57,14 +58,19 @@ void StatusBar::setup(Ui::MainWindow* mainWindowUI, const Settings& settings)
void StatusBar::setProgress(int percent)
{
+ bool visible =true;
+
if (percent < 0 || percent >= 100) {
clearMessage();
- m_progress->setVisible(false);
+ visible = false;
} else {
showMessage(QObject::tr("Loading..."));
- m_progress->setVisible(true);
m_progress->setValue(percent);
}
+
+ m_progress->setVisible(visible);
+ m_progressSpacer1->setVisible(visible);
+ m_progressSpacer2->setVisible(visible);
}
void StatusBar::setNotifications(bool hasNotifications)
diff --git a/src/statusbar.h b/src/statusbar.h
index 3da45d41..708615a1 100644
--- a/src/statusbar.h
+++ b/src/statusbar.h
@@ -49,6 +49,8 @@ protected:
private:
Ui::MainWindow* ui;
QProgressBar* m_progress;
+ QWidget* m_progressSpacer1;
+ QWidget* m_progressSpacer2;
StatusBarAction* m_notifications;
StatusBarAction* m_update;
QLabel* m_api;