diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-12-14 16:19:56 -0500 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2020-02-04 03:33:17 -0500 |
| commit | 8bcf8cde3c089650abd006a9b8e91c82f6a13880 (patch) | |
| tree | b72a9023376c3a6acfa9587d9007f8a10f298c91 /src | |
| parent | 87868e1b22c27ebf10646269e89cc2848431c0b6 (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.cpp | 234 | ||||
| -rw-r--r-- | src/mainwindow.cpp | 6 | ||||
| -rw-r--r-- | src/statusbar.cpp | 30 | ||||
| -rw-r--r-- | src/statusbar.h | 2 |
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; |
