From 3c7b232361d01f79a1d48ae3d8200cb6a68bbf32 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 11:55:13 -0400 Subject: - always show statusbar, used by the menu and toolbar to display status tips - reduced margins around central widgets to align it with status bar text, removed bottom margins completely because the statusbar is enough - notifications: now always enabled, dialog shows a special item when empty, just change the tooltip and leave the text alone - added all toolbar actions to menu - non functional in menu for now: tools, help and endorse because they're menus - changed some of the action strings to be the same on both toolbar and menu, added missing status tips --- src/mainwindow.ui | 195 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 177 insertions(+), 18 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index d876b54a..84d3c9e4 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -31,6 +31,18 @@ + + 6 + + + 6 + + + 6 + + + 0 + @@ -1381,13 +1393,67 @@ p, li { white-space: pre-wrap; } + + + + 0 + 0 + 926 + 21 + + + + + &File + + + + + + + + + + &Tools + + + + + + + + + &Help + + + + + + + + &View + + + + + + &Edit + + + + + + + + + :/MO/gui/resources/system-installer.png:/MO/gui/resources/system-installer.png - Install Mod + Install &Mod... Install &Mod @@ -1395,6 +1461,9 @@ p, li { white-space: pre-wrap; } Install a new mod from an archive + + Install a new mod from an archive + Ctrl+M @@ -1405,13 +1474,16 @@ p, li { white-space: pre-wrap; } :/MO/gui/profiles:/MO/gui/profiles - Profiles + &Profiles... &Profiles - Configure Profiles + Configure profiles + + + Configure profiles Ctrl+P @@ -1423,7 +1495,7 @@ p, li { white-space: pre-wrap; } :/MO/gui/icon_executable:/MO/gui/icon_executable - Executables + &Executables... &Executables @@ -1431,6 +1503,9 @@ p, li { white-space: pre-wrap; } Configure the executables that can be started through Mod Organizer + + Configure the executables that can be started through Mod Organizer + Ctrl+E @@ -1441,7 +1516,7 @@ p, li { white-space: pre-wrap; } :/MO/gui/plugins:/MO/gui/plugins - Tools + &Tools &Tools @@ -1459,7 +1534,7 @@ p, li { white-space: pre-wrap; } :/MO/gui/settings:/MO/gui/settings - Settings + &Settings... &Settings @@ -1467,6 +1542,9 @@ p, li { white-space: pre-wrap; } Configure settings and workarounds + + Configure settings and workarounds + Ctrl+S @@ -1477,10 +1555,16 @@ p, li { white-space: pre-wrap; } :/MO/gui/resources/internet-web-browser.png:/MO/gui/resources/internet-web-browser.png - Nexus + Visit &Nexus + + + Visit &Nexus - Search nexus network for more mods + Visit the Nexus website in your browser for more mods + + + Visit the Nexus website in your browser for more mods Ctrl+N @@ -1495,25 +1579,34 @@ p, li { white-space: pre-wrap; } :/MO/gui/update:/MO/gui/update - Update + &Update Mod Organizer + + + &Update Mod Organizer Mod Organizer is up-to-date + + Mod Organizer is up-to-date + - - false - :/MO/gui/warning:/MO/gui/warning - No Notifications + Notifications... + + + Open the notifications dialog + + + Open the notifications dialog - This button will be highlighted if MO discovered potential problems in your setup and provide tips on how to fix them. + This button will be highlighted on the toolbar if MO discovered potential problems in your setup and provide tips on how to fix them. @@ -1522,7 +1615,10 @@ p, li { white-space: pre-wrap; } :/MO/gui/help:/MO/gui/help - Help + &Help + + + &Help Help @@ -1537,15 +1633,30 @@ p, li { white-space: pre-wrap; } :/MO/gui/icon_favorite:/MO/gui/icon_favorite - Endorse MO + &Endorse ModOrganizer + + + &Endorse ModOrganizer Endorse Mod Organizer + + Endorse Mod Organizer + - Copy Log to Clipboard + Copy &Log + + + Copy &Log + + + Copy log to clipboard + + + Copy log to clipboard @@ -1554,11 +1665,59 @@ p, li { white-space: pre-wrap; } :/MO/gui/instance_switch:/MO/gui/instance_switch - Change Game + &Change Game... + + + &Change Game Open the Instance selection dialog to manage a different Game + + Open the Instance selection dialog to manage a different Game + + + + + E&xit + + + E&xit + + + Exits Mod Organizer + + + Exits Mod Organizer + + + + + false + + + + :/MO/gui/plugins:/MO/gui/plugins + + + &Tools + + + + + false + + + &Help menu + + + + + false + + + Endorse Mod Organizer + -- cgit v1.3.1 From 860eb49b45703d939196e92ba6e6d99f54ed3088 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 13:14:21 -0400 Subject: removed actionToToolButton(), which was replacing QAction's in the toolbar with QToolButton's, making it very difficult to have an equivalent in the main menu. QAction's can have a menu, so use that instead. the only place this doesn't work is with the nexus button, which can be replaced by a menu if there are IPluginModPage plugins adding items to it; registerModPage() works fine with the toolbar, but doesn't handle the main menu yet --- src/mainwindow.cpp | 117 ++++++++++++++++++++++------------------------------- src/mainwindow.h | 9 +++-- src/mainwindow.ui | 29 +++---------- 3 files changed, 59 insertions(+), 96 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ff62e05e..462eb5e0 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -206,6 +206,7 @@ MainWindow::MainWindow(QSettings &initSettings , m_ContextItem(nullptr) , m_ContextAction(nullptr) , m_ContextRow(-1) + , m_browseModPage(nullptr) , m_CurrentSaveView(nullptr) , m_OrganizerCore(organizerCore) , m_PluginContainer(pluginContainer) @@ -248,17 +249,12 @@ MainWindow::MainWindow(QSettings &initSettings // Setup toolbar QWidget *spacer = new QWidget(ui->toolBar); spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); - QWidget *widget = ui->toolBar->widgetForAction(ui->actionTool); - QToolButton *toolBtn = qobject_cast(widget); - if (toolBtn->menu() == nullptr) { - actionToToolButton(ui->actionTool); - } - - actionToToolButton(ui->actionHelp); - createHelpWidget(); + setupActionMenu(ui->actionTool); + setupActionMenu(ui->actionHelp); + setupActionMenu(ui->actionEndorseMO); - actionToToolButton(ui->actionEndorseMO); + createHelpMenu(); createEndorseWidget(); toggleMO2EndorseState(); @@ -611,28 +607,13 @@ static QModelIndex mapToModel(const QAbstractItemModel *targetModel, QModelIndex return result; } - -void MainWindow::actionToToolButton(QAction *&sourceAction) +void MainWindow::setupActionMenu(QAction* a) { - QToolButton *button = new QToolButton(ui->toolBar); - button->setObjectName(sourceAction->objectName()); - button->setIcon(sourceAction->icon()); - button->setText(sourceAction->text()); - button->setPopupMode(QToolButton::InstantPopup); - button->setToolButtonStyle(ui->toolBar->toolButtonStyle()); - button->setToolTip(sourceAction->toolTip()); - button->setShortcut(sourceAction->shortcut()); - QMenu *buttonMenu = new QMenu(sourceAction->text(), button); - button->setMenu(buttonMenu); - QAction *newAction = ui->toolBar->insertWidget(sourceAction, button); - newAction->setObjectName(sourceAction->objectName()); - newAction->setIcon(sourceAction->icon()); - newAction->setText(sourceAction->text()); - newAction->setToolTip(sourceAction->toolTip()); - newAction->setShortcut(sourceAction->shortcut()); - ui->toolBar->removeAction(sourceAction); - sourceAction->deleteLater(); - sourceAction = newAction; + a->setMenu(new QMenu(this)); + + auto* w = ui->toolBar->widgetForAction(a); + if (auto* tb=dynamic_cast(w)) + tb->setPopupMode(QToolButton::InstantPopup); } void MainWindow::updateToolBar() @@ -760,32 +741,34 @@ void MainWindow::createEndorseWidget() } -void MainWindow::createHelpWidget() +void MainWindow::createHelpMenu() { - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionHelp)); - QMenu *buttonMenu = toolBtn->menu(); - if (buttonMenu == nullptr) { + auto* menu = ui->actionHelp->menu(); + if (!menu) { + // this happens on startup because languageChanged() (which calls this) is + // called before the menus are actually created return; } - buttonMenu->clear(); - QAction *helpAction = new QAction(tr("Help on UI"), buttonMenu); + menu->clear(); + + QAction *helpAction = new QAction(tr("Help on UI"), menu); connect(helpAction, SIGNAL(triggered()), this, SLOT(helpTriggered())); - buttonMenu->addAction(helpAction); + menu->addAction(helpAction); - QAction *wikiAction = new QAction(tr("Documentation"), buttonMenu); + QAction *wikiAction = new QAction(tr("Documentation"), menu); connect(wikiAction, SIGNAL(triggered()), this, SLOT(wikiTriggered())); - buttonMenu->addAction(wikiAction); + menu->addAction(wikiAction); - QAction *discordAction = new QAction(tr("Chat on Discord"), buttonMenu); + QAction *discordAction = new QAction(tr("Chat on Discord"), menu); connect(discordAction, SIGNAL(triggered()), this, SLOT(discordTriggered())); - buttonMenu->addAction(discordAction); + menu->addAction(discordAction); - QAction *issueAction = new QAction(tr("Report Issue"), buttonMenu); + QAction *issueAction = new QAction(tr("Report Issue"), menu); connect(issueAction, SIGNAL(triggered()), this, SLOT(issueTriggered())); - buttonMenu->addAction(issueAction); + menu->addAction(issueAction); - QMenu *tutorialMenu = new QMenu(tr("Tutorials"), buttonMenu); + QMenu *tutorialMenu = new QMenu(tr("Tutorials"), menu); typedef std::vector > ActionList; @@ -823,9 +806,9 @@ void MainWindow::createHelpWidget() tutorialMenu->addAction(iter->second); } - buttonMenu->addMenu(tutorialMenu); - buttonMenu->addAction(tr("About"), this, SLOT(about())); - buttonMenu->addAction(tr("About Qt"), qApp, SLOT(aboutQt())); + menu->addMenu(tutorialMenu); + menu->addAction(tr("About"), this, SLOT(about())); + menu->addAction(tr("About Qt"), qApp, SLOT(aboutQt())); } void MainWindow::modFilterActive(bool filterActive) @@ -1128,21 +1111,20 @@ void MainWindow::modPagePluginInvoke() void MainWindow::registerPluginTool(IPluginTool *tool, QString name, QMenu *menu) { + if (!menu) { + menu = ui->actionTool->menu(); + } + if (name.isEmpty()) name = tool->displayName(); - QAction *action = new QAction(tool->icon(), name, ui->toolBar); + QAction *action = new QAction(tool->icon(), name, menu); action->setToolTip(tool->tooltip()); tool->setParentWidget(this); action->setData(qVariantFromValue((QObject*)tool)); connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection); - if (menu == nullptr) { - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); - toolBtn->menu()->addAction(action); - } else { - menu->addAction(action); - } + menu->addAction(action); } void MainWindow::registerPluginTools(std::vector toolPlugins) @@ -1176,8 +1158,7 @@ void MainWindow::registerPluginTools(std::vector toolPlugins) for (auto info : submenuMap[submenuKey]) { registerPluginTool(info.second, info.first, submenu); } - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); - toolBtn->menu()->addMenu(submenu); + ui->actionTool->menu()->addMenu(submenu); } else { registerPluginTool(submenuMap[submenuKey].front().second); @@ -1188,25 +1169,23 @@ void MainWindow::registerPluginTools(std::vector toolPlugins) void MainWindow::registerModPage(IPluginModPage *modPage) { // turn the browser action into a drop-down menu if necessary - if (ui->actionNexus->menu() == nullptr) { - QAction *nexusAction = ui->actionNexus; - // TODO: use a different icon for nexus! - ui->actionNexus = new QAction(nexusAction->icon(), tr("Browse Mod Page"), ui->toolBar); - ui->toolBar->insertAction(nexusAction, ui->actionNexus); - ui->toolBar->removeAction(nexusAction); - actionToToolButton(ui->actionNexus); + if (!m_browseModPage) { + m_browseModPage = new QAction(ui->actionNexus->icon(), tr("Browse Mod Page"), this); + setupActionMenu(m_browseModPage); - QToolButton *browserBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionNexus)); - browserBtn->menu()->addAction(nexusAction); + m_browseModPage->menu()->addAction(ui->actionNexus); + + ui->toolBar->insertAction(ui->actionNexus, m_browseModPage); + ui->toolBar->removeAction(ui->actionNexus); } - QAction *action = new QAction(modPage->icon(), modPage->displayName(), ui->toolBar); + QAction *action = new QAction(modPage->icon(), modPage->displayName(), this); modPage->setParentWidget(this); action->setData(qVariantFromValue(reinterpret_cast(modPage))); connect(action, SIGNAL(triggered()), this, SLOT(modPagePluginInvoke()), Qt::QueuedConnection); - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionNexus)); - toolBtn->menu()->addAction(action); + + m_browseModPage->menu()->addAction(action); } @@ -5096,7 +5075,7 @@ void MainWindow::languageChange(const QString &newLanguage) ui->profileBox->setItemText(0, QObject::tr("")); - createHelpWidget(); + createHelpMenu(); updateDownloadView(); updateProblemsButton(); diff --git a/src/mainwindow.h b/src/mainwindow.h index 1f0dd5ff..7281aab7 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -206,7 +206,9 @@ private: void cleanup(); - void actionToToolButton(QAction *&sourceAction); + void setupActionMenu(QAction* a); + void createHelpMenu(); + void createEndorseWidget(); void updateToolBar(); void activateSelectedProfile(); @@ -255,9 +257,6 @@ private: // remove invalid category-references from mods void fixCategories(); - void createEndorseWidget(); - void createHelpWidget(); - bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName); size_t checkForProblems(); @@ -343,6 +342,8 @@ private: QTreeWidgetItem *m_ContextItem; QAction *m_ContextAction; + QAction* m_browseModPage; + CategoryFactory &m_CategoryFactory; bool m_LoginAttempted; diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 84d3c9e4..a3eb8504 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1418,14 +1418,14 @@ p, li { white-space: pre-wrap; } - + &Help - + @@ -1621,7 +1621,10 @@ p, li { white-space: pre-wrap; } &Help - Help + Show help options + + + Show help options Ctrl+H @@ -1691,26 +1694,6 @@ p, li { white-space: pre-wrap; } Exits Mod Organizer - - - false - - - - :/MO/gui/plugins:/MO/gui/plugins - - - &Tools - - - - - false - - - &Help menu - - false -- cgit v1.3.1 From 746e9c08e68ed7e44e6ef4e29b250c73b9c21440 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 14:22:24 -0400 Subject: moved notification menu item to tools, was the only thing in view fixed endorse action to also work with the menu fixed changing endorsement integration setting not changing visibility of actions --- src/mainwindow.cpp | 32 +++++++++++++++++--------------- src/mainwindow.h | 2 +- src/mainwindow.ui | 20 ++++---------------- 3 files changed, 22 insertions(+), 32 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 462eb5e0..8e0d2624 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -255,7 +255,7 @@ MainWindow::MainWindow(QSettings &initSettings setupActionMenu(ui->actionEndorseMO); createHelpMenu(); - createEndorseWidget(); + createEndorseMenu(); toggleMO2EndorseState(); @@ -722,22 +722,23 @@ void MainWindow::about() } -void MainWindow::createEndorseWidget() +void MainWindow::createEndorseMenu() { - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionEndorseMO)); - QMenu *buttonMenu = toolBtn->menu(); - if (buttonMenu == nullptr) { + auto* menu = ui->actionEndorseMO->menu(); + if (!menu) { + // shouldn't happen return; } - buttonMenu->clear(); - QAction *endorseAction = new QAction(tr("Endorse"), buttonMenu); + menu->clear(); + + QAction *endorseAction = new QAction(tr("Endorse"), menu); connect(endorseAction, SIGNAL(triggered()), this, SLOT(actionEndorseMO())); - buttonMenu->addAction(endorseAction); + menu->addAction(endorseAction); - QAction *wontEndorseAction = new QAction(tr("Won't Endorse"), buttonMenu); + QAction *wontEndorseAction = new QAction(tr("Won't Endorse"), menu); connect(wontEndorseAction, SIGNAL(triggered()), this, SLOT(actionWontEndorseMO())); - buttonMenu->addAction(wontEndorseAction); + menu->addAction(wontEndorseAction); } @@ -5021,6 +5022,8 @@ void MainWindow::on_actionSettings_triggered() m_OrganizerCore.updateVFSParams(settings.logLevel(), settings.crashDumpsType(), settings.executablesBlacklist()); m_OrganizerCore.cycleDiagnostics(); + + toggleMO2EndorseState(); } @@ -5473,20 +5476,19 @@ void MainWindow::modUpdateCheck(std::multimap IDs) void MainWindow::toggleMO2EndorseState() { - QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionEndorseMO)); if (Settings::instance().endorsementIntegration()) { ui->actionEndorseMO->setVisible(true); if (Settings::instance().directInterface().contains("endorse_state")) { - ui->actionEndorseMO->setEnabled(false); + ui->actionEndorseMO->menu()->setEnabled(false); if (Settings::instance().directInterface().value("endorse_state").toString() == "Endorsed") { ui->actionEndorseMO->setToolTip(tr("Thank you for endorsing MO2! :)")); - toolBtn->setToolTip(tr("Thank you for endorsing MO2! :)")); + ui->actionEndorseMO->setStatusTip(tr("Thank you for endorsing MO2! :)")); } else if (Settings::instance().directInterface().value("endorse_state").toString() == "Abstained") { ui->actionEndorseMO->setToolTip(tr("Please reconsider endorsing MO2 on Nexus!")); - toolBtn->setToolTip(tr("Please reconsider endorsing MO2 on Nexus!")); + ui->actionEndorseMO->setStatusTip(tr("Please reconsider endorsing MO2 on Nexus!")); } } else { - ui->actionEndorseMO->setEnabled(true); + ui->actionEndorseMO->menu()->setEnabled(true); } } else ui->actionEndorseMO->setVisible(false); diff --git a/src/mainwindow.h b/src/mainwindow.h index 7281aab7..96660aeb 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -208,7 +208,7 @@ private: void setupActionMenu(QAction* a); void createHelpMenu(); - void createEndorseWidget(); + void createEndorseMenu(); void updateToolBar(); void activateSelectedProfile(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index a3eb8504..03cb9ab7 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1417,8 +1417,11 @@ p, li { white-space: pre-wrap; } &Tools + + + @@ -1427,13 +1430,7 @@ p, li { white-space: pre-wrap; } - - - - - &View - - + @@ -1443,7 +1440,6 @@ p, li { white-space: pre-wrap; } - @@ -1694,14 +1690,6 @@ p, li { white-space: pre-wrap; } Exits Mod Organizer - - - false - - - Endorse Mod Organizer - - -- cgit v1.3.1 From 41ef9813dd7b3b7587afe8dfe3a16f2711200edb Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 15:22:11 -0400 Subject: moved links to a new dedicated toolbar --- src/mainwindow.cpp | 56 ++++++++++++++++++++++++++++++------------------------ src/mainwindow.h | 4 +--- src/mainwindow.ui | 43 +++++++++++++++++++++++------------------ 3 files changed, 57 insertions(+), 46 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8e0d2624..09ecc3f9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -247,8 +247,6 @@ MainWindow::MainWindow(QSettings &initSettings updateProblemsButton(); // Setup toolbar - QWidget *spacer = new QWidget(ui->toolBar); - spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); setupActionMenu(ui->actionTool); setupActionMenu(ui->actionHelp); @@ -259,16 +257,6 @@ MainWindow::MainWindow(QSettings &initSettings toggleMO2EndorseState(); - for (QAction *action : ui->toolBar->actions()) { - if (action->isSeparator()) { - // insert spacers - ui->toolBar->insertWidget(action, spacer); - m_Sep = action; - // m_Sep would only use the last separator anyway, and we only have the one anyway? - break; - } - } - TaskProgressManager::instance().tryCreateTaskbar(); // set up mod list @@ -407,7 +395,7 @@ MainWindow::MainWindow(QSettings &initSettings connect(&TutorialManager::instance(), SIGNAL(windowTutorialFinished(QString)), this, SLOT(windowTutorialFinished(QString))); connect(ui->tabWidget, SIGNAL(currentChanged(int)), &TutorialManager::instance(), SIGNAL(tabChanged(int))); connect(ui->modList->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(modListSortIndicatorChanged(int,Qt::SortOrder))); - connect(ui->toolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(toolBar_customContextMenuRequested(QPoint))); + connect(ui->linksToolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(linksToolBar_customContextMenuRequested(QPoint))); connect(&m_OrganizerCore, &OrganizerCore::modInstalled, this, &MainWindow::modInstalled); connect(&m_OrganizerCore, &OrganizerCore::close, this, &QMainWindow::close); @@ -618,29 +606,36 @@ void MainWindow::setupActionMenu(QAction* a) void MainWindow::updateToolBar() { - for (QAction *action : ui->toolBar->actions()) { - if (action->objectName().startsWith("custom__")) { - ui->toolBar->removeAction(action); - action->deleteLater(); - } + for (auto* a : ui->linksToolBar->actions()) { + ui->linksToolBar->removeAction(a); + a->deleteLater(); } + bool hasLinks = false; + std::vector::iterator begin, end; m_OrganizerCore.executablesList()->getExecutables(begin, end); + for (auto iter = begin; iter != end; ++iter) { if (iter->isShownOnToolbar()) { + hasLinks = true; + QAction *exeAction = new QAction(iconForExecutable(iter->m_BinaryInfo.filePath()), iter->m_Title, ui->toolBar); + exeAction->setObjectName(QString("custom__") + iter->m_Title); if (!connect(exeAction, SIGNAL(triggered()), this, SLOT(startExeAction()))) { qDebug("failed to connect trigger?"); } - ui->toolBar->insertAction(m_Sep, exeAction); + + ui->linksToolBar->addAction(exeAction); } } -} + // don't show the toolbar if there are no links + ui->linksToolBar->setVisible(hasLinks); +} void MainWindow::scheduleUpdateButton() { @@ -649,7 +644,6 @@ void MainWindow::scheduleUpdateButton() } } - void MainWindow::updateProblemsButton() { size_t numProblems = checkForProblems(); @@ -1834,6 +1828,10 @@ void MainWindow::readSettings() restoreGeometry(settings.value("window_geometry").toByteArray()); } + if (settings.contains("window_state")) { + restoreState(settings.value("window_state").toByteArray()); + } + if (settings.contains("window_split")) { ui->splitter->restoreState(settings.value("window_split").toByteArray()); } @@ -1910,6 +1908,7 @@ void MainWindow::storeSettings(QSettings &settings) { if (settings.value("reset_geometry", false).toBool()) { settings.remove("window_geometry"); + settings.remove("window_state"); settings.remove("window_split"); settings.remove("log_split"); settings.remove("filters_visible"); @@ -1918,6 +1917,7 @@ void MainWindow::storeSettings(QSettings &settings) { settings.remove("reset_geometry"); } else { settings.setValue("window_geometry", saveGeometry()); + settings.setValue("window_state", saveState()); settings.setValue("window_split", ui->splitter->saveState()); settings.setValue("log_split", ui->topLevelSplitter->saveState()); settings.setValue("browser_geometry", m_IntegratedBrowser.saveGeometry()); @@ -6062,17 +6062,23 @@ void MainWindow::removeFromToolbar() } -void MainWindow::toolBar_customContextMenuRequested(const QPoint &point) +void MainWindow::linksToolBar_customContextMenuRequested(const QPoint &point) { - QAction *action = ui->toolBar->actionAt(point); + QAction *action = ui->linksToolBar->actionAt(point); + if (action != nullptr) { if (action->objectName().startsWith("custom_")) { m_ContextAction = action; QMenu menu; - menu.addAction(tr("Remove"), this, SLOT(removeFromToolbar())); - menu.exec(ui->toolBar->mapToGlobal(point)); + menu.addAction(tr("Remove '%1' from the toolbar").arg(action->text()), this, SLOT(removeFromToolbar())); + menu.exec(ui->linksToolBar->mapToGlobal(point)); + return; } } + + // did not click a link button, show the default context menu + auto* m = createPopupMenu(); + m->exec(ui->linksToolBar->mapToGlobal(point)); } void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) diff --git a/src/mainwindow.h b/src/mainwindow.h index 96660aeb..8e50fa2e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -316,8 +316,6 @@ private: Ui::MainWindow *ui; - QAction *m_Sep; // Executable Shortcuts are added after this. Non owning. - bool m_WasVisible; MOBase::TutorialControl m_Tutorial; @@ -594,7 +592,7 @@ private slots: */ void allowListResize(); - void toolBar_customContextMenuRequested(const QPoint &point); + void linksToolBar_customContextMenuRequested(const QPoint &point); void removeFromToolbar(); void overwriteClosed(int); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 03cb9ab7..59d30a09 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1349,17 +1349,8 @@ p, li { white-space: pre-wrap; } - - true - - - Qt::CustomContextMenu - - Tool Bar - - - false + Main ToolBar @@ -1367,12 +1358,6 @@ p, li { white-space: pre-wrap; } 36 - - Qt::ToolButtonIconOnly - - - false - TopToolBarArea @@ -1380,9 +1365,11 @@ p, li { white-space: pre-wrap; } false - - + + + + @@ -1443,6 +1430,26 @@ p, li { white-space: pre-wrap; } + + + Qt::CustomContextMenu + + + Links ToolBar + + + + 42 + 36 + + + + TopToolBarArea + + + false + + -- cgit v1.3.1 From e6706c7a5b82e68443de6ca262c77e1543986b1e Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 16:28:09 -0400 Subject: the toolbar menu is now in the ui file instead of being created by hand it's also shared between the main menu and the context menu --- src/mainwindow.cpp | 82 +++++++++++++++++++++++++++++------------------ src/mainwindow.h | 10 ++++++ src/mainwindow.ui | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 153 insertions(+), 32 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 642b0c99..3da571f9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -399,6 +399,7 @@ MainWindow::MainWindow(QSettings &initSettings connect(ui->tabWidget, SIGNAL(currentChanged(int)), &TutorialManager::instance(), SIGNAL(tabChanged(int))); connect(ui->modList->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(modListSortIndicatorChanged(int,Qt::SortOrder))); connect(ui->linksToolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(linksToolBar_customContextMenuRequested(QPoint))); + connect(ui->menuToolbars, &QMenu::aboutToShow, [&]{ toolbarMenu_aboutToShow(); }); connect(&m_OrganizerCore, &OrganizerCore::modInstalled, this, &MainWindow::modInstalled); connect(&m_OrganizerCore, &OrganizerCore::close, this, &QMainWindow::close); @@ -640,45 +641,66 @@ void MainWindow::updateToolBar() ui->linksToolBar->setVisible(hasLinks); } -QMenu* MainWindow::createPopupMenu() +void MainWindow::toolbarMenu_aboutToShow() { - auto* m = QMainWindow::createPopupMenu(); + // well, this is a bit of a hack to allow the same toolbar menu to be shown + // in both the main menu and the context menu + // + // the toolbar menu is returned by createPopupMenu(), but Qt takes ownership + // of it and deletes it by setting the WA_DeleteOnClose attribute on it + // + // to avoid deleting the menu, the attribute is removed here + ui->menuToolbars->setAttribute(Qt::WA_DeleteOnClose, false); - m->addSeparator(); + ui->actionToolBarMainToggle->setChecked(ui->toolBar->isVisible()); + ui->actionToolBarLinksToggle->setChecked(ui->linksToolBar->isVisible()); - auto* a = new QAction(tr("Small Icons"), m); - connect(a, &QAction::triggered, [&]{ setToolbarSize(SmallToolbarSize); }); - a->setCheckable(true); - a->setChecked(ui->toolBar->iconSize() == SmallToolbarSize); - m->addAction(a); + ui->actionToolBarLargeIcons->setChecked(ui->toolBar->iconSize() == LargeToolbarSize); + ui->actionToolBarSmallIcons->setChecked(ui->toolBar->iconSize() == SmallToolbarSize); - a = new QAction(tr("Large Icons"), m); - connect(a, &QAction::triggered, [&]{ setToolbarSize(LargeToolbarSize); }); - a->setCheckable(true); - a->setChecked(ui->toolBar->iconSize() == LargeToolbarSize); - m->addAction(a); + ui->actionToolBarIconsOnly->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonIconOnly); + ui->actionToolBarTextOnly->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonTextOnly); + ui->actionToolBarIconsAndText->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonTextUnderIcon); +} - m->addSeparator(); +QMenu* MainWindow::createPopupMenu() +{ + return ui->menuToolbars; +} - a = new QAction(tr("Icons only"), m); - connect(a, &QAction::triggered, [&]{ setToolbarButtonStyle(Qt::ToolButtonIconOnly); }); - a->setCheckable(true); - a->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonIconOnly); - m->addAction(a); +void MainWindow::on_actionToolBarMainToggle_triggered() +{ + ui->toolBar->setVisible(!ui->toolBar->isVisible()); +} - a = new QAction(tr("Text only"), m); - connect(a, &QAction::triggered, [&]{ setToolbarButtonStyle(Qt::ToolButtonTextOnly); }); - a->setCheckable(true); - a->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonTextOnly); - m->addAction(a); +void MainWindow::on_actionToolBarLinksToggle_triggered() +{ + ui->linksToolBar->setVisible(!ui->linksToolBar->isVisible()); +} - a = new QAction(tr("Text and Icons"), m); - connect(a, &QAction::triggered, [&]{ setToolbarButtonStyle(Qt::ToolButtonTextUnderIcon); }); - a->setCheckable(true); - a->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonTextUnderIcon); - m->addAction(a); +void MainWindow::on_actionToolBarLargeIcons_triggered() +{ + setToolbarSize(LargeToolbarSize); +} + +void MainWindow::on_actionToolBarSmallIcons_triggered() +{ + setToolbarSize(SmallToolbarSize); +} - return m; +void MainWindow::on_actionToolBarIconsOnly_triggered() +{ + setToolbarButtonStyle(Qt::ToolButtonIconOnly); +} + +void MainWindow::on_actionToolBarTextOnly_triggered() +{ + setToolbarButtonStyle(Qt::ToolButtonTextOnly); +} + +void MainWindow::on_actionToolBarIconsAndText_triggered() +{ + setToolbarButtonStyle(Qt::ToolButtonTextUnderIcon); } void MainWindow::setToolbarSize(const QSize& s) diff --git a/src/mainwindow.h b/src/mainwindow.h index fa5912b8..18aa525e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -213,6 +213,8 @@ private: void updateToolBar(); void setToolbarSize(const QSize& s); void setToolbarButtonStyle(Qt::ToolButtonStyle s); + void toolbarMenu_aboutToShow(); + QMenu* createPopupMenu() override; void activateSelectedProfile(); @@ -631,6 +633,14 @@ private slots: // ui slots void on_actionSettings_triggered(); void on_actionUpdate_triggered(); void on_actionExit_triggered(); + void on_actionToolBarMainToggle_triggered(); + void on_actionToolBarLinksToggle_triggered(); + void on_actionToolBarLargeIcons_triggered(); + void on_actionToolBarSmallIcons_triggered(); + void on_actionToolBarIconsOnly_triggered(); + void on_actionToolBarTextOnly_triggered(); + void on_actionToolBarIconsAndText_triggered(); + void on_bsaList_customContextMenuRequested(const QPoint &pos); void on_clearFiltersButton_clicked(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 59d30a09..a4bd2888 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1358,6 +1358,9 @@ p, li { white-space: pre-wrap; } 36 + + Qt::ToolButtonTextUnderIcon + TopToolBarArea @@ -1405,10 +1408,8 @@ p, li { white-space: pre-wrap; } - - @@ -1425,8 +1426,30 @@ p, li { white-space: pre-wrap; } + + + View + + + + Toolbars + + + + + + + + + + + + + + + @@ -1697,6 +1720,72 @@ p, li { white-space: pre-wrap; } Exits Mod Organizer + + + Toolbar Size + + + + + Toolbar Buttons + + + + + true + + + &Main + + + + + true + + + &Links + + + + + true + + + &Small Icons + + + + + true + + + Lar&ge Icons + + + + + true + + + &Icons Only + + + + + true + + + &Text Only + + + + + true + + + I&cons and Text + + -- cgit v1.3.1 From 71a9f085138bf8f9dc75a27abd9b54cdb89a0876 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 16:45:58 -0400 Subject: added medium toolbar icon size --- src/mainwindow.cpp | 17 ++++++++++++----- src/mainwindow.h | 3 ++- src/mainwindow.ui | 9 ++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3da571f9..753b6a5d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -190,6 +190,7 @@ using namespace MOBase; using namespace MOShared; const QSize SmallToolbarSize(24, 24); +const QSize MediumToolbarSize(32, 32); const QSize LargeToolbarSize(42, 36); @@ -655,8 +656,9 @@ void MainWindow::toolbarMenu_aboutToShow() ui->actionToolBarMainToggle->setChecked(ui->toolBar->isVisible()); ui->actionToolBarLinksToggle->setChecked(ui->linksToolBar->isVisible()); - ui->actionToolBarLargeIcons->setChecked(ui->toolBar->iconSize() == LargeToolbarSize); ui->actionToolBarSmallIcons->setChecked(ui->toolBar->iconSize() == SmallToolbarSize); + ui->actionToolBarMediumIcons->setChecked(ui->toolBar->iconSize() == MediumToolbarSize); + ui->actionToolBarLargeIcons->setChecked(ui->toolBar->iconSize() == LargeToolbarSize); ui->actionToolBarIconsOnly->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonIconOnly); ui->actionToolBarTextOnly->setChecked(ui->toolBar->toolButtonStyle() == Qt::ToolButtonTextOnly); @@ -678,14 +680,19 @@ void MainWindow::on_actionToolBarLinksToggle_triggered() ui->linksToolBar->setVisible(!ui->linksToolBar->isVisible()); } -void MainWindow::on_actionToolBarLargeIcons_triggered() +void MainWindow::on_actionToolBarSmallIcons_triggered() { - setToolbarSize(LargeToolbarSize); + setToolbarSize(SmallToolbarSize); } -void MainWindow::on_actionToolBarSmallIcons_triggered() +void MainWindow::on_actionToolBarMediumIcons_triggered() { - setToolbarSize(SmallToolbarSize); + setToolbarSize(MediumToolbarSize); +} + +void MainWindow::on_actionToolBarLargeIcons_triggered() +{ + setToolbarSize(LargeToolbarSize); } void MainWindow::on_actionToolBarIconsOnly_triggered() diff --git a/src/mainwindow.h b/src/mainwindow.h index 18aa525e..a0cce858 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -635,8 +635,9 @@ private slots: // ui slots void on_actionExit_triggered(); void on_actionToolBarMainToggle_triggered(); void on_actionToolBarLinksToggle_triggered(); - void on_actionToolBarLargeIcons_triggered(); void on_actionToolBarSmallIcons_triggered(); + void on_actionToolBarMediumIcons_triggered(); + void on_actionToolBarLargeIcons_triggered(); void on_actionToolBarIconsOnly_triggered(); void on_actionToolBarTextOnly_triggered(); void on_actionToolBarIconsAndText_triggered(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index a4bd2888..29a8ac76 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1358,9 +1358,6 @@ p, li { white-space: pre-wrap; } 36 - - Qt::ToolButtonTextUnderIcon - TopToolBarArea @@ -1438,6 +1435,7 @@ p, li { white-space: pre-wrap; } + @@ -1786,6 +1784,11 @@ p, li { white-space: pre-wrap; } I&cons and Text + + + M&edium Icons + + -- cgit v1.3.1 From 3c69f1e54ab1eb99b2d1b30e5dfa5f28239e4314 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 21:50:52 -0400 Subject: update styles to handle the new menu bar also formatted the Transparent styles, all the css was on one line added a separator before the settings menu item fixed medium icon item not being checkable --- src/mainwindow.ui | 4 + src/stylesheets/Night Eyes.qss | 50 +- src/stylesheets/Paper Automata.qss | 10 + src/stylesheets/Paper Dark by 6788.qss | 12 + src/stylesheets/Paper Light by 6788.qss | 12 + src/stylesheets/Parchment v1.1 by Bob.qss | 68 ++- src/stylesheets/Transparent-Style-101-Green.qss | 490 +++++++++++++++- src/stylesheets/Transparent-Style-BOS.qss | 743 +++++++++++++++++++++++- src/stylesheets/Transparent-Style-Skyrim.qss | 743 +++++++++++++++++++++++- src/stylesheets/dark.qss | 5 + src/stylesheets/skyrim.qss | 8 + src/stylesheets/vs15 Dark-Green.qss | 14 +- src/stylesheets/vs15 Dark-Orange.qss | 14 +- src/stylesheets/vs15 Dark-Purple.qss | 14 +- src/stylesheets/vs15 Dark-Red.qss | 14 +- src/stylesheets/vs15 Dark-Yellow.qss | 14 +- src/stylesheets/vs15 Dark.qss | 14 +- 17 files changed, 2135 insertions(+), 94 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 29a8ac76..05d64bdf 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1407,6 +1407,7 @@ p, li { white-space: pre-wrap; } + @@ -1785,6 +1786,9 @@ p, li { white-space: pre-wrap; } + + true + M&edium Icons diff --git a/src/stylesheets/Night Eyes.qss b/src/stylesheets/Night Eyes.qss index 6c6b0629..f2f193c4 100644 --- a/src/stylesheets/Night Eyes.qss +++ b/src/stylesheets/Night Eyes.qss @@ -106,15 +106,15 @@ QTreeView::item:selected color: #FFCC88; } -QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { image: url(:/stylesheet/branch-closed.png); border: 0px; } -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { image: url(:/stylesheet/branch-open.png); border: 0px; @@ -342,41 +342,41 @@ QScrollBar::sub-line:vertical /* Combined */ -QScrollBar::handle:horizontal:hover, +QScrollBar::handle:horizontal:hover, QScrollBar::handle:vertical:hover, -QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover { background: #242424; } -QScrollBar::handle:horizontal:pressed, +QScrollBar::handle:horizontal:pressed, QScrollBar::handle:vertical:pressed, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { background: #181818; } -QScrollBar::add-page:horizontal, -QScrollBar::sub-page:horizontal, -QScrollBar::add-page:vertical, +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: transparent; } -QScrollBar::up-arrow:vertical, +QScrollBar::up-arrow:vertical, QScrollBar::right-arrow:horizontal, -QScrollBar::down-arrow:vertical, +QScrollBar::down-arrow:vertical, QScrollBar::left-arrow:horizontal { height: 1px; - width: 1px; + width: 1px; border: 1px solid #181818; } @@ -426,6 +426,16 @@ QHeaderView::down-arrow /* Context Menus, Toolbar Dropdowns, & Tooltips ------------------------------- */ +QMenuBar { + background: #181818; + border: 1px solid #181818; +} + +QMenuBar::item:selected { + background: #242424; + color: #FFCC88; +} + QMenu { background: #141414; @@ -615,8 +625,8 @@ QWidget#downloadTab QAbstractScrollArea background: #242424; } -DownloadListWidget QFrame, -DownloadListWidgetCompact, +DownloadListWidget QFrame, +DownloadListWidgetCompact, DownloadListWidgetCompact QLabel { /* an entry on the Downloads tab */ @@ -641,7 +651,7 @@ DownloadListWidget QFrame:clicked /* compact downloads view */ -DownloadListWidgetCompact, +DownloadListWidgetCompact, DownloadListWidgetCompact QLabel { /* an entry on the Downloads tab */ diff --git a/src/stylesheets/Paper Automata.qss b/src/stylesheets/Paper Automata.qss index d72aa7e2..c9830331 100644 --- a/src/stylesheets/Paper Automata.qss +++ b/src/stylesheets/Paper Automata.qss @@ -593,6 +593,16 @@ QHeaderView::section:last { /* Right Click Menus, Toolbar Dropdown Menus, & Tooltips */ +QMenuBar { + background: #DAD4BB; + border: 2px solid #CDC8B0; +} + +QMenuBar::item:selected { + background: #B4AF9A; + border: none; +} + QMenu { /* right click menu */ background: #DAD4BB; diff --git a/src/stylesheets/Paper Dark by 6788.qss b/src/stylesheets/Paper Dark by 6788.qss index 9abd8086..cde25733 100644 --- a/src/stylesheets/Paper Dark by 6788.qss +++ b/src/stylesheets/Paper Dark by 6788.qss @@ -588,6 +588,18 @@ QHeaderView::down-arrow { /* Right Click Menus, Toolbar Dropdown Menus, & Tooltips */ +QMenuBar { + background: #242424; + border: 1px solid #242424; +} + +QMenuBar::item:selected { + background: #006868; + color: #FFFFFF; + border: 0px; + border-radius: 4px; +} + QMenu { /* right click menu */ background: #141414; diff --git a/src/stylesheets/Paper Light by 6788.qss b/src/stylesheets/Paper Light by 6788.qss index 4aad55a8..54af277a 100644 --- a/src/stylesheets/Paper Light by 6788.qss +++ b/src/stylesheets/Paper Light by 6788.qss @@ -590,6 +590,18 @@ QHeaderView::down-arrow { /* Right Click Menus, Toolbar Dropdown Menus, & Tooltips */ +QMenuBar { + background: #EBEBEB; + border: 1px solid #EBEBEB; +} + +QMenuBar::item:selected { + background: #008484; + color: #FFFFFF; + border: 0px; + border-radius: 4px; +} + QMenu { /* right click menu */ background: #FFFFFF; diff --git a/src/stylesheets/Parchment v1.1 by Bob.qss b/src/stylesheets/Parchment v1.1 by Bob.qss index da3546d1..45c1d57b 100644 --- a/src/stylesheets/Parchment v1.1 by Bob.qss +++ b/src/stylesheets/Parchment v1.1 by Bob.qss @@ -95,7 +95,7 @@ QTreeView { } QTreeView::branch:hover { - background: #008F8F; + background: #008F8F; color: #F7F6CF; } @@ -109,13 +109,13 @@ QTreeView::item:selected { color: #F7F6CF; } -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings { +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { image: url(:/stylesheet/branch-closed.png); border: 0px; } -QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings { image: url(:/stylesheet/branch-open.png); border: 0px; @@ -168,7 +168,7 @@ QCheckBox::indicator { background-color: transparent; border: none; width: 14px; - height: 14px; + height: 14px; } QGroupBox::indicator:checked, QGroupBox::indicator:indeterminate, @@ -177,7 +177,7 @@ QTreeView::indicator:indeterminate, QCheckBox::indicator:checked, QCheckBox::indicator:indeterminate { - image: url(./Parchment/checkbox-checked.png); + image: url(./Parchment/checkbox-checked.png); } QGroupBox::indicator:checked:hover, QGroupBox::indicator:indeterminate:hover, @@ -186,7 +186,7 @@ QTreeView::indicator:indeterminate:hover, QCheckBox::indicator:checked:hover, QCheckBox::indicator:indeterminate:hover { - image: url(./Parchment/checkbox-checked-hover.png); + image: url(./Parchment/checkbox-checked-hover.png); } QGroupBox::indicator:checked:disabled, QGroupBox::indicator:indeterminate:disabled, @@ -195,28 +195,28 @@ QCheckBox::indicator:indeterminate:hover { QCheckBox::indicator:checked:disabled, QCheckBox::indicator:indeterminate:disabled { - image: url(./Parchment/checkbox-checked-disabled.png); + image: url(./Parchment/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked, QTreeView::indicator:unchecked, QCheckBox::indicator:unchecked { - image: url(./Parchment/checkbox.png); + image: url(./Parchment/checkbox.png); } QGroupBox::indicator:unchecked:hover, QTreeView::indicator:unchecked:hover, QCheckBox::indicator:unchecked:hover { - image: url(./Parchment/checkbox-hover.png); + image: url(./Parchment/checkbox-hover.png); } QGroupBox::indicator:unchecked:disabled, QTreeView::indicator:unchecked:disabled, QCheckBox::indicator:unchecked:disabled { - image: url(./Parchment/checkbox-disabled.png); + image: url(./Parchment/checkbox-disabled.png); } /* Search Boxes */ @@ -323,7 +323,7 @@ QScrollBar::add-line:horizontal { margin: 0px -2px -2px 0px; } -QScrollBar::sub-line:horizontal { +QScrollBar::sub-line:horizontal { background: #F7F6CF; width: 23px; subcontrol-position: left; @@ -359,7 +359,7 @@ QScrollBar::add-line:vertical { margin: 0px -2px -2px 0px; } -QScrollBar::sub-line:vertical { +QScrollBar::sub-line:vertical { background: #F7F6CF; height: 23px; subcontrol-position: top; @@ -371,37 +371,37 @@ QScrollBar::sub-line:vertical { /* Combined */ -QScrollBar::handle:horizontal:hover, +QScrollBar::handle:horizontal:hover, QScrollBar::handle:vertical:hover, -QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover { background: #008F8F; } -QScrollBar::handle:horizontal:pressed, +QScrollBar::handle:horizontal:pressed, QScrollBar::handle:vertical:pressed, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { background: #0CA6FF; } -QScrollBar::add-page:horizontal, -QScrollBar::sub-page:horizontal, -QScrollBar::add-page:vertical, +QScrollBar::add-page:horizontal, +QScrollBar::sub-page:horizontal, +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: transparent; } -QScrollBar::up-arrow:vertical, +QScrollBar::up-arrow:vertical, QScrollBar::right-arrow:horizontal, -QScrollBar::down-arrow:vertical, +QScrollBar::down-arrow:vertical, QScrollBar::left-arrow:horizontal { height: 1px; - width: 1px; + width: 1px; border: 1px solid #DBD399; } @@ -443,6 +443,16 @@ QHeaderView::down-arrow { /* Context Menus, Toolbar Dropdowns, & Tooltips */ +QMenuBar { + background: #DBD399; + border: 1px solid #DBD399; +} + +QMenuBar::item:selected { + background: #008F8F; + color: #F7F6CF; +} + QMenu { background: #F7F6CF; selection-color: #F7F6CF; @@ -465,7 +475,7 @@ QMenu::item:disabled { color: #444444; } -QMenu::separator { +QMenu::separator { background: #DBD399; height: 2px; } @@ -483,7 +493,7 @@ QToolTip { /* Progress Bars (Downloads) */ -QProgressBar { +QProgressBar { background: #F7F6CF; text-align: center; border: 0px; diff --git a/src/stylesheets/Transparent-Style-101-Green.qss b/src/stylesheets/Transparent-Style-101-Green.qss index f7bf16b6..7dbf6157 100644 --- a/src/stylesheets/Transparent-Style-101-Green.qss +++ b/src/stylesheets/Transparent-Style-101-Green.qss @@ -1 +1,489 @@ -#centralWidget { border-image: url(./Transparent-Style/Green/vault-101.png) 0 0 0 0 stretch stretch; } QDialog,Qmenu { border: none; } QWidget { color: #fff; background-color: rgb(0, 204, 0, 5); alternate-background-color: rgb(0, 204, 0, 10); } QAbstractItemView { color: #fff; background-color: rgb(0, 204, 0, 5); alternate-background-color: rgb(0, 204, 0, 10); border: 1px solid #001a00; border-style:outset; border-radius: 3px; selection-color: #001a00; outline: none; } #ProblemsDialog,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog, #ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { border-image:url(./Transparent-Style/Green/vault-tec-full.png) 0 0 0 0 stretch stretch; } #EditExecutablesDialog { border-image: url(./Transparent-Style/Green/vault-tec.png) 0 0 0 0 stretch stretch; } #SimpleInstallDialog,#LockedDialog,QMenu { border-image: url(./Transparent-Style/Green/vault-tec-small.png) 0 0 0 0 stretch stretch; } #nameLabel { background-color: rgb(0, 0, 0, 20); border-top:1px solid black; border-bottom:1px solid black; } #ProfilesDialog,#FomodInstallerDialog { border-image: url(./Transparent-Style/Green/vault-tec-profiles.png) 0 0 0 0 stretch stretch; } #filesView { border-image: url(./Transparent-Style/Green/vault-tec-overwrite.png) 0 0 0 0 stretch stretch; } /* ******************************************** */ /* Main Navigation Button Bar at top of window */ /* ******************************************** */ QToolBar { border: none; } QToolBar::separator { image: url(./Transparent-Style/Green/Vault-101-vault-boy.png); } QToolButton { border:2px ridge None; border-radius: 6px; margin: 3px; padding-left: 8px; padding-right: 8px; padding-top: 0px; padding-bottom: 2px; } QToolButton:hover { border: 2px ridge #fff; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); } QToolButton:pressed { background: black; } QTabWidget::pane { background-color: transparent; border:transparent; } QTabWidget::tab-bar { alignment: center; } /* **************************************** */ /* Tabs on top of Treeview */ /* **************************************** */ QTabBar { text-transform: uppercase; max-height: 22px; padding-bottom: 5px; } QTabBar::tab { border: none; border-bottom-style: none; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); padding-left: 15px; padding-right: 15px; padding-top: 3px; padding-bottom: 3px; margin-right: 2px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } QTabBar::tab:selected { color: #fff; background-color: #00cc00; } QTabBar::tab:!selected { color: #00cc00; margin-top: 0px; } QTabBar::tab:disabled { color: #bbbbbb; border-bottom-style: none; margin-top: 0px; background-color: #000; } #deactivateESP,#activateESP { border:px #00cc00; background:QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); } QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open { border:2px ridge #00cc00; image: url(./Transparent-Style/Green/arrow-right.png); } QTabBar QToolButton { border:2px ridge #00cc00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); padding: 1px; margin: 0; } QTabBar QToolButton::right-arrow { image: url(./Transparent-Style/Green/arrow-right.png); } QTabBar QToolButton::left-arrow { image: url(./Transparent-Style/Green/arrow-left.png); } /* **************************************** */ /* Column names of TreeView */ /* **************************************** */ QTableView { color:#fff; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); } QHeaderView::section { color: #00cc00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); border-radius: 6px; padding: 4px; padding-left: 5px; padding-right: 0px; } QHeaderView::section:hover { background: #121212; border: 2px solid #ff0000; padding: 0px; } QHeaderView::up-arrow,QHeaderView::down-arrow { subcontrol-origin: content; subcontrol-position: center right; width: 7px; height: 7px; margin-right: 7px; } QHeaderView::up-arrow { image: url(./Transparent-Style/Green/arrow-up.png); } QHeaderView::down-arrow { image: url(./Transparent-Style/Green/arrow-down.png); } /* **************************************** */ /* Hover */ /* **************************************** */ QMenu:item:hover,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover { color:#fff; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:#000; } QAbstractItemView::item:hover { border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:#000; padding: 3px; } #deactivateESP:hover,#activateESP:hover,QPushButton:hover,QTableView:hover,QHeaderView::selected:hover,QTabBar::tab:!selected:hover,QComboBox:hover { border: 1px solid #ff0000; padding: 1px; text-align: center; } /* **************************************** */ /* Context menus, toolbar dropdowns #QMenu */ /* **************************************** */ QMenu { border-width: 3px; border-style: solid; } QMenu::item { padding: 6px 20px; } QMenu::item:selected { color:#fff; background-color: #001a00; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; } QMenu::right-arrow { image: url(./Transparent-Style/Green/arrow-right.png); subcontrol-origin: padding; subcontrol-position: center right; padding-right: 0.5em; } /* ********************* */ /* LCD Counter */ /* ********************* */ QLCDNumber { Background:#000; border-color: #00cc00; border-style: solid; border-width: 1px; border-radius: 5px; } /* **************************************** */ /* Launch application Drop down Box */ /* **************************************** */ QComboBox { background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); border:1px outset #00cc00; height: 20px; width: 15px; padding: 3px; padding-left:3px; border-radius: 5px; } QComboBox::drop-down{ subcontrol-origin: padding; subcontrol-position: top right; width: 15px; padding:4px; border-radius: 5px; } QComboBox::down-arrow{ image:url(./Transparent-Style/Green/arrow-down.png); } QComboBox::item{ border:3px;padding: 3px; } /* **************************************************************** */ /* Action Buttons */ /* */ /* Open list, Rextore Backup, Create Backup, RUN, Shortcut Button */ /* Sort, Load order backup, Load Order Restore */ /* **************************************************************** */ QPushButton { color: #00cc00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); border-width: 1px; border-color: 1px outset #00cc00; border-style: solid; border-radius: 4px; padding:5px; padding-right: 10px; padding-left: 5px; } QDialog QPushButton { min-width: 3em; min-height: 1em; padding-left: 1em; padding-right: 1em; } QPushButton::menu-indicator { image: url(./Transparent-Style/Green/arrow-down.png); background: transparent; subcontrol-origin: padding; subcontrol-position: center right; padding-right: 5%; } QPushButton:open { background-color: rgb(0, 204, 0, 100); } QPushButton:!enabled { border: 1px grey; color: grey; background: black; } QPushButton#displayCategoriesBtn { min-width: 20px; } /* **************************************** */ /* Scroll bar */ /* **************************************** */ QScrollBar { height:20px; width:20px; background-color:transparent; } QScrollBar::handle { border: 1px solid #aaa; border-radius: 4px; } QScrollBar::handle:vertical { margin: 1px 4px; min-height:20px; min-width: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #33ff33, stop:1 #000000); } QScrollBar::handle:vertical:hover { background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #33ff33); } QScrollBar::handle:horizontal { min-height:10px;min-width:20px;margin:4px 1px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #33ff33, stop:1 #000000); } QScrollBar::handle:horizontal:hover { background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #33ff33); } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background-color: transparent; } QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal { height:0; width:0; } /* ******************************************************** */ /* Main Tree View Inherated from QAbstractItemView */ /* ******************************************************** */ QTreeView { } QTreeView:item { padding:4px; } QTreeView:item:selected { color: #001a00; border: none;outline: none; border-radius: 5px; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color: rgb(0, 204, 0, 100); } QTreeView::branch:has-siblings:!adjoins-item { background:url(Vault-101/Vault-101-item-line-v.png) center center no-repeat; } QTreeView::branch:has-siblings { background:url(Vault-101/Vault-101-itemB-line.png) center center no-repeat; } QTreeView::branch:!has-children:!has-siblings:adjoins-item { background:url(Vault-101/Vault-101-itemB-end.png) center center no-repeat; } QTreeView::branch:closed:has-children:has-siblings { background:url(Vault-101/Vault-101-itemB-close.png) center center no-repeat; } QTreeView::branch:closed:has-children:!has-siblings { background:url(Vault-101/Vault-101-itemB-close-last.png) center center no-repeat; } QTreeView::branch:open:has-children:has-siblings { background:url(Vault-101/Vault-101-itemB-open.png) center center no-repeat; } QTreeView::branch:open:has-children:!has-siblings { background:url(Vault-101/Vault-101-itemB-open-last.png) center center no-repeat; } /* **************************************************************** */ /* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ /* common */ /* **************************************************************** */ QGroupBox::indicator,QTreeView::indicator,QCheckBox::indicator { outline: none; border: none; width: 20px; height: 20px; } QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate { image: url(./Transparent-Style/Green/checkbox-checked.png); } QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover { image: url(./Transparent-Style/Green/checkbox-hover.png); } QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled { image: url(./Transparent-Style/Green/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked { image: url(./Transparent-Style/Green/checkbox.png); } QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover { image: url(./Transparent-Style/Green/checkbox-checked-hover.png); } QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled { image: url(./Transparent-Style/Green/checkbox-checked-disabled.png); } QTreeWidget#categoriesList::item:has-children { background-image: url(./Transparent-Style/Green/arrow-right.png); } QTreeWidget#categoriesList::item:has-children:open { background-image: url(./Transparent-Style/Green/branch-opened.png); } /* ******************************** */ /* Special styles */ /* increase categories tab width */ /* ******************************** */ QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item { padding: .3em 0; } QTreeWidget#categoriesGroup,QTreeWidget#categoriesList { min-width: 200px; } QTreeWidget#categoriesList::item { background-position: center left; background-repeat: no-repeat; padding: 0.35em 4px; } /* ********************* */ /* Display Radio Button */ /* ********************* */ QRadioButton::indicator { width: 16px; height: 16px; } QRadioButton::indicator::checked { image: url(./Transparent-Style/Green/radio-checked.png); } QRadioButton::indicator::unchecked { image: url(./Transparent-Style/Green/radio.png); } QRadioButton::indicator::unchecked:hover { image: url(./Transparent-Style/Green/radio-hover.png); } /* **************************************** */ /* Spinners #QSpinBox, #QDoubleSpinBox */ /* **************************************** */ QAbstractSpinBox { min-height: 24px; } QAbstractSpinBox::up-button,QAbstractSpinBox::down-button { border-style: solid; border-width: 1px; subcontrol-origin: padding; } QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover { background-color: #141414; } QAbstractSpinBox::up-button { subcontrol-position: top right; } QAbstractSpinBox::down-button { subcontrol-position: bottom right; } QAbstractSpinBox::up-arrow { image: url(./Transparent-Style/Green/arrow-up.png); } QAbstractSpinBox::down-arrow { image: url(./Transparent-Style/Green/arrow-down.png); } /* **************************************** */ /* Tooltips #QToolTip, #SaveGameInfoWidget */ /* **************************************** */ QToolTip { background-color:transparent; color:#C0C0C0; padding:0px; border-width:7px; border-style:solid; border-color:transparent; border-image:url(./Transparent-Style/Green/border-image.png) 27 repeat repeat; } SaveGameInfoWidget { background-color:#121212; color:#C0C0C0; } /* **************************** */ /* Handles Web, Nexus info tab */ /* **************************** */ QWebView { background-color: Black; } QLineEdit { font-family: Source Sans Pro; background:#000; border-width: 1px; border-radius:5px; margin: 0px; padding-left:2px; selection-background-color: rgb(0, 204, 0, 10); } /* Font size */ QLabel, QMenu, QPushButton, QTabBar, QTextEdit, QLineEdit, QWebView, QComboBox, QComboBox:editable, QAbstractSpinBox, QGroupBox, QCheckBox, QRadioButton { color: #cccccc; font-family: Source Sans Pro; font-size: 14px; } QAbstractItemView { color: #cccccc; font-family: Source Sans Pro; font-size: 14px; } \ No newline at end of file +#centralWidget { + border-image: url(./Transparent-Style/Green/vault-101.png) 0 0 0 0 stretch stretch; +} + QDialog,Qmenu { + border: none; +} + QWidget { + color: #fff; + background-color: rgb(0, 204, 0, 5); + alternate-background-color: rgb(0, 204, 0, 10); +} + QAbstractItemView { + color: #fff; + background-color: rgb(0, 204, 0, 5); + alternate-background-color: rgb(0, 204, 0, 10); + border: 1px solid #001a00; + border-style:outset; + border-radius: 3px; + selection-color: #001a00; + outline: none; +} + #ProblemsDialog,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog, #ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { + border-image:url(./Transparent-Style/Green/vault-tec-full.png) 0 0 0 0 stretch stretch; +} + #EditExecutablesDialog { + border-image: url(./Transparent-Style/Green/vault-tec.png) 0 0 0 0 stretch stretch; +} + #SimpleInstallDialog,#LockedDialog,QMenu { + border-image: url(./Transparent-Style/Green/vault-tec-small.png) 0 0 0 0 stretch stretch; +} + #nameLabel { + background-color: rgb(0, 0, 0, 20); + border-top:1px solid black; + border-bottom:1px solid black; +} + #ProfilesDialog,#FomodInstallerDialog { + border-image: url(./Transparent-Style/Green/vault-tec-profiles.png) 0 0 0 0 stretch stretch; +} + #filesView { + border-image: url(./Transparent-Style/Green/vault-tec-overwrite.png) 0 0 0 0 stretch stretch; +} +/* ******************************************** */ +/* Main Navigation Button Bar at top of window */ +/* ******************************************** */ + QToolBar { + border: none; +} + QToolBar::separator { + image: url(./Transparent-Style/Green/Vault-101-vault-boy.png); +} + QToolButton { + border:2px ridge None; + border-radius: 6px; + margin: 3px; + padding-left: 8px; + padding-right: 8px; + padding-top: 0px; + padding-bottom: 2px; +} + QToolButton:hover { + border: 2px ridge #fff; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); +} + QToolButton:pressed { + background: black; +} + QTabWidget::pane { + background-color: transparent; + border:transparent; +} + QTabWidget::tab-bar { + alignment: center; +} +/* **************************************** */ +/* Tabs on top of Treeview */ +/* **************************************** */ + QTabBar { + text-transform: uppercase; + max-height: 22px; + padding-bottom: 5px; +} + QTabBar::tab { + border: none; + border-bottom-style: none; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); + padding-left: 15px; + padding-right: 15px; + padding-top: 3px; + padding-bottom: 3px; + margin-right: 2px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + QTabBar::tab:selected { + color: #fff; + background-color: #00cc00; +} + QTabBar::tab:!selected { + color: #00cc00; + margin-top: 0px; +} + QTabBar::tab:disabled { + color: #bbbbbb; + border-bottom-style: none; + margin-top: 0px; + background-color: #000; +} + #deactivateESP,#activateESP { + border:px #00cc00; + background:QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); +} + QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open { + border:2px ridge #00cc00; + image: url(./Transparent-Style/Green/arrow-right.png); +} + QTabBar QToolButton { + border:2px ridge #00cc00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); + padding: 1px; + margin: 0; +} + QTabBar QToolButton::right-arrow { + image: url(./Transparent-Style/Green/arrow-right.png); +} + QTabBar QToolButton::left-arrow { + image: url(./Transparent-Style/Green/arrow-left.png); +} +/* **************************************** */ +/* Column names of TreeView */ +/* **************************************** */ + QTableView { + color:#fff; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); +} + QHeaderView::section { + color: #00cc00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); + border-radius: 6px; + padding: 4px; + padding-left: 5px; + padding-right: 0px; +} + QHeaderView::section:hover { + background: #121212; + border: 2px solid #ff0000; + padding: 0px; +} + QHeaderView::up-arrow,QHeaderView::down-arrow { + subcontrol-origin: content; + subcontrol-position: center right; + width: 7px; + height: 7px; + margin-right: 7px; +} + QHeaderView::up-arrow { + image: url(./Transparent-Style/Green/arrow-up.png); +} + QHeaderView::down-arrow { + image: url(./Transparent-Style/Green/arrow-down.png); +} +/* **************************************** */ +/* Hover */ +/* **************************************** */ + QMenu:item:hover,QMenuBar:item:selected,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover { + color:#fff; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:#000; +} + QAbstractItemView::item:hover { + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:#000; + padding: 3px; +} + #deactivateESP:hover,#activateESP:hover,QPushButton:hover,QTableView:hover,QHeaderView::selected:hover,QTabBar::tab:!selected:hover,QComboBox:hover { + border: 1px solid #ff0000; + padding: 1px; + text-align: center; +} +/* **************************************** */ +/* Context menus, toolbar dropdowns #QMenu */ +/* **************************************** */ + QMenu { + border-width: 3px; + border-style: solid; +} + QMenu::item { + padding: 6px 20px; +} + QMenu::item:selected { + color:#fff; + background-color: #001a00; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; +} + QMenu::right-arrow { + image: url(./Transparent-Style/Green/arrow-right.png); + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 0.5em; +} +/* ********************* */ +/* LCD Counter */ +/* ********************* */ + QLCDNumber { + Background:#000; + border-color: #00cc00; + border-style: solid; + border-width: 1px; + border-radius: 5px; +} +/* **************************************** */ +/* Launch application Drop down Box */ +/* **************************************** */ + QComboBox { + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); + border:1px outset #00cc00; + height: 20px; + width: 15px; + padding: 3px; + padding-left:3px; + border-radius: 5px; +} + QComboBox::drop-down{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + padding:4px; + border-radius: 5px; +} + QComboBox::down-arrow{ + image:url(./Transparent-Style/Green/arrow-down.png); +} + QComboBox::item{ + border:3px; + padding: 3px; +} +/* **************************************************************** */ +/* Action Buttons */ +/* */ +/* Open list, Rextore Backup, Create Backup, RUN, Shortcut Button */ +/* Sort, Load order backup, Load Order Restore */ +/* **************************************************************** */ + QPushButton { + color: #00cc00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #697670, stop: 1 #484F53); + border-width: 1px; + border-color: 1px outset #00cc00; + border-style: solid; + border-radius: 4px; + padding:5px; + padding-right: 10px; + padding-left: 5px; +} + QDialog QPushButton { + min-width: 3em; + min-height: 1em; + padding-left: 1em; + padding-right: 1em; +} + QPushButton::menu-indicator { + image: url(./Transparent-Style/Green/arrow-down.png); + background: transparent; + subcontrol-origin: padding; + subcontrol-position: center right; + padding-right: 5%; +} + QPushButton:open { + background-color: rgb(0, 204, 0, 100); +} + QPushButton:!enabled { + border: 1px grey; + color: grey; + background: black; +} + QPushButton#displayCategoriesBtn { + min-width: 20px; +} +/* **************************************** */ +/* Scroll bar */ +/* **************************************** */ + QScrollBar { + height:20px; + width:20px; + background-color:transparent; +} + QScrollBar::handle { + border: 1px solid #aaa; + border-radius: 4px; +} + QScrollBar::handle:vertical { + margin: 1px 4px; + min-height:20px; + min-width: 10px; + background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #33ff33, stop:1 #000000); +} + QScrollBar::handle:vertical:hover { + background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #33ff33); +} + QScrollBar::handle:horizontal { + min-height:10px; + min-width:20px; + margin:4px 1px; + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #33ff33, stop:1 #000000); +} + QScrollBar::handle:horizontal:hover { + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #33ff33); +} + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background-color: transparent; +} + QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal { + height:0; + width:0; +} +/* ******************************************************** */ +/* Main Tree View Inherated from QAbstractItemView */ +/* ******************************************************** */ + QTreeView { +} + QTreeView:item { + padding:4px; +} + QTreeView:item:selected { + color: #001a00; + border: none; + outline: none; + border-radius: 5px; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color: rgb(0, 204, 0, 100); +} + QTreeView::branch:has-siblings:!adjoins-item { + background:url(Vault-101/Vault-101-item-line-v.png) center center no-repeat; +} + QTreeView::branch:has-siblings { + background:url(Vault-101/Vault-101-itemB-line.png) center center no-repeat; +} + QTreeView::branch:!has-children:!has-siblings:adjoins-item { + background:url(Vault-101/Vault-101-itemB-end.png) center center no-repeat; +} + QTreeView::branch:closed:has-children:has-siblings { + background:url(Vault-101/Vault-101-itemB-close.png) center center no-repeat; +} + QTreeView::branch:closed:has-children:!has-siblings { + background:url(Vault-101/Vault-101-itemB-close-last.png) center center no-repeat; +} + QTreeView::branch:open:has-children:has-siblings { + background:url(Vault-101/Vault-101-itemB-open.png) center center no-repeat; +} + QTreeView::branch:open:has-children:!has-siblings { + background:url(Vault-101/Vault-101-itemB-open-last.png) center center no-repeat; +} +/* **************************************************************** */ +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ +/* **************************************************************** */ + QGroupBox::indicator,QTreeView::indicator,QCheckBox::indicator { + outline: none; + border: none; + width: 20px; + height: 20px; +} + QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate { + image: url(./Transparent-Style/Green/checkbox-checked.png); +} + QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover { + image: url(./Transparent-Style/Green/checkbox-hover.png); +} + QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled { + image: url(./Transparent-Style/Green/checkbox-checked-disabled.png); +} + QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked { + image: url(./Transparent-Style/Green/checkbox.png); +} + QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover { + image: url(./Transparent-Style/Green/checkbox-checked-hover.png); +} + QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled { + image: url(./Transparent-Style/Green/checkbox-checked-disabled.png); +} + QTreeWidget#categoriesList::item:has-children { + background-image: url(./Transparent-Style/Green/arrow-right.png); +} + QTreeWidget#categoriesList::item:has-children:open { + background-image: url(./Transparent-Style/Green/branch-opened.png); +} +/* ******************************** */ +/* Special styles */ +/* increase categories tab width */ +/* ******************************** */ + QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item { + padding: .3em 0; +} + QTreeWidget#categoriesGroup,QTreeWidget#categoriesList { + min-width: 200px; +} + QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: 0.35em 4px; +} +/* ********************* */ +/* Display Radio Button */ +/* ********************* */ + QRadioButton::indicator { + width: 16px; + height: 16px; +} + QRadioButton::indicator::checked { + image: url(./Transparent-Style/Green/radio-checked.png); +} + QRadioButton::indicator::unchecked { + image: url(./Transparent-Style/Green/radio.png); +} + QRadioButton::indicator::unchecked:hover { + image: url(./Transparent-Style/Green/radio-hover.png); +} +/* **************************************** */ +/* Spinners #QSpinBox, #QDoubleSpinBox */ +/* **************************************** */ + QAbstractSpinBox { + min-height: 24px; +} + QAbstractSpinBox::up-button,QAbstractSpinBox::down-button { + border-style: solid; + border-width: 1px; + subcontrol-origin: padding; +} + QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover { + background-color: #141414; +} + QAbstractSpinBox::up-button { + subcontrol-position: top right; +} + QAbstractSpinBox::down-button { + subcontrol-position: bottom right; +} + QAbstractSpinBox::up-arrow { + image: url(./Transparent-Style/Green/arrow-up.png); +} + QAbstractSpinBox::down-arrow { + image: url(./Transparent-Style/Green/arrow-down.png); +} +/* **************************************** */ +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* **************************************** */ + QToolTip { + background-color:transparent; + color:#C0C0C0; + padding:0px; + border-width:7px; + border-style:solid; + border-color:transparent; + border-image:url(./Transparent-Style/Green/border-image.png) 27 repeat repeat; +} + SaveGameInfoWidget { + background-color:#121212; + color:#C0C0C0; +} +/* **************************** */ +/* Handles Web, Nexus info tab */ +/* **************************** */ + QWebView { + background-color: Black; +} + QLineEdit { + font-family: Source Sans Pro; + background:#000; + border-width: 1px; + border-radius:5px; + margin: 0px; + padding-left:2px; + selection-background-color: rgb(0, 204, 0, 10); +} +/* Font size */ + QLabel, QMenu, QPushButton, QTabBar, QTextEdit, QLineEdit, QWebView, QComboBox, QComboBox:editable, QAbstractSpinBox, QGroupBox, QCheckBox, QRadioButton { + color: #cccccc; + font-family: Source Sans Pro; + font-size: 14px; +} + QAbstractItemView { + color: #cccccc; + font-family: Source Sans Pro; + font-size: 14px; +} diff --git a/src/stylesheets/Transparent-Style-BOS.qss b/src/stylesheets/Transparent-Style-BOS.qss index cda40e9f..2c1eb3de 100644 --- a/src/stylesheets/Transparent-Style-BOS.qss +++ b/src/stylesheets/Transparent-Style-BOS.qss @@ -1 +1,742 @@ -#centralWidget { border-image: url(./Transparent-Style/Fallout-BOS.png) 0 0 0 0 stretch stretch; } QWidget#TextViewer{ } QWidget{ color: #fff; background-color: rgba(45,45,48,30); alternate-background-color: rgba(38,38,38,30); } QWidget:disabled{ } QAbstractItemView{ color: #dcdcdc; background-color: rgb(45,45,48,30); alternate-background-color: rgb(38,38,38,50); border: 1px solid #3F3F46; /* Grey - Blue*/ border-style:outset; border-radius: 3px; selection-color: #3F3F46; /* Grey - Blue*/ outline: none; padding-left:0; } #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #toolBarArea{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #EditExecutablesDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #SimpleInstallDialog,#LockedDialog,QMenu{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #nameLabel{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); color:#fff; } #ProfilesDialog,#FomodInstallerDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #filesView{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } /* ******************************************** */ /* Main Navigation Button Bar at top of window */ /* ******************************************** */ QToolBar{ /*border: none;*/ } QToolBar::separator{ /*image: url(./Transparent-Style/Vault-101-vault-logo.png);*/ } QToolButton{ border:2px solid None; border-radius: 6px; margin: 3px; padding-left: 8px; padding-right: 8px; padding-top: 0px; padding-bottom: 2px; } QToolButton:hover{ border-radius: 3px; border: 0px; padding: 0px; background: trANSPARENT; border: 0px ridge #9A9A00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53); } QToolButton:pressed{ background: black; } /* **************************************** */ /* Tabs on top of Treeview */ /* **************************************** */ QTabWidget::pane{ border-color:#3F3F46; /* Grey - Blue*/ /* border-top-color:#9A9A00; */ top: 0px; border-style:hidden; border-width:1px; } QTabWidget::tab-bar{ alignment: center; } QTabBar{ color: #cccccc; font-family: Segoe UI; font-size: 16px; text-transform: none; min-height:auto; padding-bottom: 5px; } QTabBar::tab{ border: none; border-bottom-style: none; background-color: rgba(154,154,0,0.3); padding-left: 9px; padding-right: 9px; padding-top: 3px; padding-bottom: 3px; margin-right: 2px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } QTabBar::tab:disabled{ color: #404040; background-color: #000; margin-top: 0px; } QTabBar::tab:selected{ color: #dcdcdc; background-color: #9A9A00; /*Yellow opaque*/ } QTabBar::tab:!selected:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; padding: 1px; text-align: center; background-color: #9A9A00; color:#fff; Height: 20%; } /* QTabBar::tab:!selected{ color: #808080; background-color: #404040; margin-top: 0px; } */ #deactivateESP,#activateESP{ border:#b30000; background:#333337; } /* **************************************** */ /* on top of Treeview */ /* **************************************** */ QTabBar QToolButton{ border-radius: 0px; border: 0px; padding: 0px; background: transparent; } QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{ image: url(./Transparent-Style/arrow-up.png); } QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{ image: url(./Transparent-Style/arrow-down.png); } QTabBar QToolButton::right-arrow{ image: url(./Transparent-Style/narrow-arrow-right.png); } QTabBar QToolButton::left-arrow{ image: url(./Transparent-Style/narrow-arrow-left.png); } /* **************************************** */ /* Column names of TreeView */ /* **************************************** */ QTableView{ gridline-color:#3F3F46; selection-background-color:#9A9A00; selection-color:#F1F1F1; /* White */ text-align: center; min-height:24px; } QHeaderView{ min-height:24px; /*Top Bar on menus*/ padding: 3px; } QHeaderView::section{ /* color: #cc3333; */ background-color: #252526; border-radius: 0px; padding: 0px; padding-left: 5px; } QHeaderView::section:hover{ background: rgba(154,154,0,0.3); border: 1px solid #9a9a00; padding: 0px; padding-left: 5px; } QHeaderView::up-arrow,QHeaderView::down-arrow{ min-height:Auto; min-width:Auto; } QHeaderView::up-arrow{ image: url(./Transparent-Style/arrow-up.png); min-height:25px; min-width:15px; padding-right: 0px; }QHeaderView::down-arrow{ image: url(./Transparent-Style/arrow-down.png); } /* **************************************** */ /* Hover */ /* **************************************** */ QMenu:item:hover,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{ color:#fff; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); } QAbstractItemView::item:hover{ border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); padding: 3px; } /*#DownloadListWidget{ }*/ #DownloadListWidget{ outline: 1px solid #e8e8e8; border: 0px solid #9a9a00; } #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{ border: 1px solid #9a9a00; padding: 1px; text-align: center; color:#fff; } /* **************************************** */ /* Context menus, toolbar dropdowns #QMenu */ /* **************************************** */ QMenu{ border-width: 3px; border-style: solid; }QMenu::item{ padding: 6px 20px; }QMenu::item:selected{ color:#fff; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QMenu::right-arrow{ image: url(./Transparent-Style/arrow-right.png); /* right click main menu top option*/ subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:0px outset #3F3F46; /* Grey - Blue*/ } /* ********************* */ /* LCD Counter */ /* ********************* */ QLCDNumber{ color: #9A9A00; Background: #000; border-color: #3F3F46; /* Grey - Blue*/ border-style: solid; border-width: 1px; border-radius: 5px; } /* **************************************** */ /* Launch application Drop down Box */ /* **************************************** */ QComboBox{ background-color: #333337; padding: 3px 5px 5px 5px; height: 26px; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QComboBox:on{ padding: 3px 5px 5px 5px; color: white; background-color: #3F3F46; /* Grey - Blue*/ } QComboBox:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; /* padding: 0px; */ } QComboBox::drop-down{ /* Down arrow in combo box */ outline: none; border: none; border-width: 1px; } QComboBox::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px outset #3F3F46; /* Grey - Blue*/ } /* ************************* */ /* QComboBox::down-arrow:on, */ /* ************************* */ QComboBox::down-arrow:hover,QComboBox::down-arrow:focus { image: url(./Transparent-Style/arrow-down-hover.png); } QComboBox::up-arrow:hover,QComboBox::up-arrow:focus { image: url(./Transparent-Style/arrow-up-hover.png); } QComboBox::down-arrow{ image:url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; } QComboBox::down-arrow:on{ image:url(./Transparent-Style/arrow-up.png); } QComboBox:editable { background: black; /* color: pink; */ } QComboBox::item{ } QComboBox QAbstractItemView{ selection-color:#fff; outline: 1px solid #9a9a00; selection-background-color:#3F3F46; /* Grey - Blue*/ border-top:1px solid #9a9a00; border-bottom:1px solid #9a9a00; padding: 5px; } /* **************************************************************** */ /* Action Buttons */ /* */ /* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */ /* Sort, Load order backup, Load Order Restore */ /* **************************************************************** */ QPushButton{ background-color: #333337; min-height:26px; padding:1px 5%; text-align: center; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QPushButton::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px hidden #3F3F46; /* Grey - Blue*/ } QPushButton::menu-indicator:Hover{ image: url(./Transparent-Style/arrow-down-hover.png); } QPushButton:focus{ } QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{ background: #3F3F46; /* Grey - Blue*/ border-radius: 1px; border: 1px solid #9a9a00; } QPushButton:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; } QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{ color:#fff; border-color:#707070; border-style:solid; border-width:1px; } QPushButton:disabled{ } QPushButton:open{ } QPushButton:!enabled{ } /* **************************************** */ /* Filter Button */ /* **************************************** */ QPushButton#displayCategoriesBtn{ min-width: 20px; background:transparent; color: transparent; border: 1px hidden #9a9a00; } QPushButton#displayCategoriesBtn:checked{ image: url(./Transparent-Style/arrow-left.png); } QPushButton#displayCategoriesBtn:!checked{ image: url(./Transparent-Style/arrow-right.png); } QPushButton#displayCategoriesBtn:checked:hover{ image: url(./Transparent-Style/arrow-left-hover.png); } QPushButton#displayCategoriesBtn:!checked:hover{ image: url(./Transparent-Style/arrow-right-hover.png); } /* **************************************** */ /* Scroll bar */ /* **************************************** */ QScrollBar{ height:20px; width:20px; background-color:transparent; } QScrollBar::handle{ border: 1px solid #aaa; border-radius: 4px; } QScrollBar::handle:vertical{ margin: 1px 4px; min-height:20px; min-width: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:vertical:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::handle:horizontal{ min-height:10px;min-width:20px;margin:4px 1px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:horizontal:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ background-color: transparent; } QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{ height:0; width:0; } /* ******************************************************** */ /* Main Tree View Inherited from QAbstractItemView */ /* ******************************************************** */ QTreeView { } QTreeView:item{ padding: 3px; font-size: 16px; height: 18px; /*Bottom text Box*/ } QTreeView:item:selected{ color:#fff; padding: 0px; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QTreeView:item QLineEdit{ outline: none; border: none; padding: 0px; margin: 0px; } QTreeView::branch:has-siblings:!adjoins-item{ background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat; } QTreeView::branch:has-siblings{ background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat; } QTreeView::branch:!has-children:!has-siblings:adjoins-item{ background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat; } QTreeView::branch:closed:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat; } QTreeView::branch:closed:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat; } QTreeView::branch:open:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat; } QTreeView::branch:open:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat; } /* **************************************************************** */ /* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ /* common */ /* **************************************************************** */ QTreeView::indicator,QCheckBox::indicator{ outline: none; border: none; padding: 0px; width: 24px; height: 24px; } QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{ image: url(./Transparent-Style/checkbox-checked.png); } QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{ image: url(./Transparent-Style/checkbox-hover.png); } QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{ image: url(./Transparent-Style/checkbox.png); } QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{ image: url(./Transparent-Style/checkbox-checked-hover.png); } QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QTreeWidget#categoriesList::item:has-children{ background-image: url(./Transparent-Style/arrow-right-small.png); } QTreeWidget#categoriesList::item:has-children:open{ background-image: url(./Transparent-Style/branch-opened.png); } /* ******************************** */ /* Special styles */ /* increase categories tab width */ /* ******************************** */ QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{ min-width: 200px; } QTreeWidget#categoriesList::item { background-position: center left; background-repeat: no-repeat; padding: 0.35em 4px; } /* ********************* */ /* Display Radio Button */ /* ********************* */ QRadioButton::indicator{ width: 16px; height: 16px; } QRadioButton::indicator::checked{ image: url(./Transparent-Style/radio-BOS-checked.png); } QRadioButton::indicator::unchecked{ image: url(./Transparent-Style/radio-BOS.png); } QRadioButton::indicator::unchecked:hover{ image: url(./Transparent-Style/radio-BOS-hover.png); } /* **************************************** */ /* Spinners #QSpinBox, #QDoubleSpinBox */ /* **************************************** */ QAbstractSpinBox{ padding: 5px; background-color: transparent; color: #eff0f1; border-radius: 2px; min-width: Auto; } QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{ border-style: solid; border-width: 1px; subcontrol-origin: border; } QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{ background-color: transparent; } QAbstractSpinBox::up-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center right; padding-right: 5px; /* subcontrol-position: top right; */ } QAbstractSpinBox::down-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center left; padding-left: 5px; /* subcontrol-position: bottom right; */ } QAbstractSpinBox::up-arrow{ border-image: url(./Transparent-Style/narrow-arrow-right.png); }QAbstractSpinBox::down-arrow{ border-image: url(./Transparent-Style/narrow-arrow-left.png); }/* QTextEdit,QWebView,QLineEdit,QComboBox{ border-color:#3F3F46; /* Grey - Blue*/ /*}*/ /* **************************************** */ /* Tooltips #QToolTip, #SaveGameInfoWidget */ /* **************************************** */ QToolTip{ background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } SaveGameInfoWidget{ font-size: 16px; background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* **************************** */ /* Handles Web, Nexus info tab */ /* **************************** */ QWebView{ background-color: Black; } QLineEdit{ font-family: Segoe UI; min-height: 20px; font-size: 16px; background-color:#3F3F46; selection-background-color: rgba(154,154,0,0.6);border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } QTextEdit{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* background-color:#000; */ selection-background-color: rgba(154,154,0,0.6); border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* Font size */ QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* was 14px Profile font size */ } QAbstractItemView{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; /* Body font size*/ } QRadioButton{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; } QWebView,QComboBox,QComboBox:editable{ font-family:Segoe UI; font-style: normal; font-weight: normal; font-size: 16px; background-color:#000; /* border-color:#3F3F46; /* Grey - Blue*/ color: #cccccc; font-family: Arial; font-size: 16px; /* Filter Name*/ } QHeaderView::section{ /* font-family: Source Sans Pro; */ font-family: Segoe UI; font-size: 16px; /*Top Bar on menus font*/ } QListView::item{ color:#F1F1F1; /* White */ } QGroupBox { } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; } QGroupBox::indicator { subcontrol-origin: margin; subcontrol-position: top center; } QLabel { color: #cccccc; /* color: #F1F1F1; /* White */ /* border: none;outline: none; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00;*/ } \ No newline at end of file +#centralWidget { + border-image: url(./Transparent-Style/Fallout-BOS.png) 0 0 0 0 stretch stretch; +} + QWidget#TextViewer{ +} + QWidget{ + color: #fff; + background-color: rgba(45,45,48,30); + alternate-background-color: rgba(38,38,38,30); +} + QWidget:disabled{ +} + QAbstractItemView{ + color: #dcdcdc; + background-color: rgb(45,45,48,30); + alternate-background-color: rgb(38,38,38,50); + border: 1px solid #3F3F46; + /* Grey - Blue*/ + border-style:outset; + border-radius: 3px; + selection-color: #3F3F46; + /* Grey - Blue*/ + outline: none; + padding-left:0; +} + #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { + border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #toolBarArea{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #EditExecutablesDialog{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #SimpleInstallDialog,#LockedDialog,QMenu{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #nameLabel{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:rgba(154,154,0,0.3); + color:#fff; +} + #ProfilesDialog,#FomodInstallerDialog{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #filesView{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} +/* ******************************************** */ +/* Main Navigation Button Bar at top of window */ +/* ******************************************** */ + QToolBar{ + /*border: none; + */ +} + QToolBar::separator{ + /*image: url(./Transparent-Style/Vault-101-vault-logo.png); + */ +} + QToolButton{ + border:2px solid None; + border-radius: 6px; + margin: 3px; + padding-left: 8px; + padding-right: 8px; + padding-top: 0px; + padding-bottom: 2px; +} + QToolButton:hover{ + border-radius: 3px; + border: 0px; + padding: 0px; + background: trANSPARENT; + border: 0px ridge #9A9A00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53); +} + QToolButton:pressed{ + background: black; +} +/* **************************************** */ +/* Tabs on top of Treeview */ +/* **************************************** */ + QTabWidget::pane{ + border-color:#3F3F46; + /* Grey - Blue*/ + /* border-top-color:#9A9A00; + */ + top: 0px; + border-style:hidden; + border-width:1px; +} + QTabWidget::tab-bar{ + alignment: center; +} + QTabBar{ + color: #cccccc; + font-family: Segoe UI; + font-size: 16px; + text-transform: none; + min-height:auto; + padding-bottom: 5px; +} + QTabBar::tab{ + border: none; + border-bottom-style: none; + background-color: rgba(154,154,0,0.3); + padding-left: 9px; + padding-right: 9px; + padding-top: 3px; + padding-bottom: 3px; + margin-right: 2px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + QTabBar::tab:disabled{ + color: #404040; + background-color: #000; + margin-top: 0px; +} + QTabBar::tab:selected{ + color: #dcdcdc; + background-color: #9A9A00; + /*Yellow opaque*/ +} + QTabBar::tab:!selected:hover{ + border-radius: 3px; + border-top:3px double #9A9A00; + border-bottom:3px double #9A9A00; + padding: 1px; + text-align: center; + background-color: #9A9A00; + color:#fff; + Height: 20%; +} +/* QTabBar::tab:!selected{ + color: #808080; + background-color: #404040; + margin-top: 0px; +} + */ + #deactivateESP,#activateESP{ + border:#b30000; + background:#333337; +} +/* **************************************** */ +/* on top of Treeview */ +/* **************************************** */ + QTabBar QToolButton{ + border-radius: 0px; + border: 0px; + padding: 0px; + background: transparent; +} + QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{ + image: url(./Transparent-Style/arrow-up.png); +} + QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{ + image: url(./Transparent-Style/arrow-down.png); +} + QTabBar QToolButton::right-arrow{ + image: url(./Transparent-Style/narrow-arrow-right.png); +} + QTabBar QToolButton::left-arrow{ + image: url(./Transparent-Style/narrow-arrow-left.png); +} +/* **************************************** */ +/* Column names of TreeView */ +/* **************************************** */ + QTableView{ + gridline-color:#3F3F46; + selection-background-color:#9A9A00; + selection-color:#F1F1F1; + /* White */ + text-align: center; + min-height:24px; +} + QHeaderView{ + min-height:24px; + /*Top Bar on menus*/ + padding: 3px; +} + QHeaderView::section{ + /* color: #cc3333; + */ + background-color: #252526; + border-radius: 0px; + padding: 0px; + padding-left: 5px; +} + QHeaderView::section:hover{ + background: rgba(154,154,0,0.3); + border: 1px solid #9a9a00; + padding: 0px; + padding-left: 5px; +} + QHeaderView::up-arrow,QHeaderView::down-arrow{ + min-height:Auto; + min-width:Auto; +} + QHeaderView::up-arrow{ + image: url(./Transparent-Style/arrow-up.png); + min-height:25px; + min-width:15px; + padding-right: 0px; +} +QHeaderView::down-arrow{ + image: url(./Transparent-Style/arrow-down.png); +} +/* **************************************** */ +/* Hover */ +/* **************************************** */ + QMenu:item:hover,QMenuBar::item:selected,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{ + color:#fff; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:rgba(154,154,0,0.3); +} + QAbstractItemView::item:hover{ + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:rgba(154,154,0,0.3); + padding: 3px; +} +/*#DownloadListWidget{ +} +*/ + #DownloadListWidget{ + outline: 1px solid #e8e8e8; + border: 0px solid #9a9a00; +} + #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{ + border: 1px solid #9a9a00; + padding: 1px; + text-align: center; + color:#fff; +} +/* **************************************** */ +/* Context menus, toolbar dropdowns #QMenu */ +/* **************************************** */ + QMenu{ + border-width: 3px; + border-style: solid; +} +QMenu::item{ + padding: 6px 20px; +} +QMenu::item:selected{ + color:#fff; + background-color: #3F3F46; + /* Grey - Blue*/ + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QMenu::right-arrow{ + image: url(./Transparent-Style/arrow-right.png); + /* right click main menu top option*/ + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; + border:0px outset #3F3F46; + /* Grey - Blue*/ +} +/* ********************* */ +/* LCD Counter */ +/* ********************* */ + QLCDNumber{ + color: #9A9A00; + Background: #000; + border-color: #3F3F46; + /* Grey - Blue*/ + border-style: solid; + border-width: 1px; + border-radius: 5px; +} +/* **************************************** */ +/* Launch application Drop down Box */ +/* **************************************** */ + QComboBox{ + background-color: #333337; + padding: 3px 5px 5px 5px; + height: 26px; + border-radius: 5px; + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QComboBox:on{ + padding: 3px 5px 5px 5px; + color: white; + background-color: #3F3F46; + /* Grey - Blue*/ +} + QComboBox:hover{ + border-radius: 3px; + border-top:3px double #9A9A00; + border-bottom:3px double #9A9A00; + /* padding: 0px; + */ +} + QComboBox::drop-down{ + /* Down arrow in combo box */ + outline: none; + border: none; + border-width: 1px; +} + QComboBox::menu-indicator{ + image: url(./Transparent-Style/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; + border:1px outset #3F3F46; + /* Grey - Blue*/ +} +/* ************************* */ +/* QComboBox::down-arrow:on, */ +/* ************************* */ + QComboBox::down-arrow:hover,QComboBox::down-arrow:focus { + image: url(./Transparent-Style/arrow-down-hover.png); +} + QComboBox::up-arrow:hover,QComboBox::up-arrow:focus { + image: url(./Transparent-Style/arrow-up-hover.png); +} + QComboBox::down-arrow{ + image:url(./Transparent-Style/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; +} + QComboBox::down-arrow:on{ + image:url(./Transparent-Style/arrow-up.png); +} + QComboBox:editable { + background: black; + /* color: pink; + */ +} + QComboBox::item{ +} + QComboBox QAbstractItemView{ + selection-color:#fff; + outline: 1px solid #9a9a00; + selection-background-color:#3F3F46; + /* Grey - Blue*/ + border-top:1px solid #9a9a00; + border-bottom:1px solid #9a9a00; + padding: 5px; +} +/* **************************************************************** */ +/* Action Buttons */ +/* */ +/* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */ +/* Sort, Load order backup, Load Order Restore */ +/* **************************************************************** */ + QPushButton{ + background-color: #333337; + min-height:26px; + padding:1px 5%; + text-align: center; + border-radius: 5px; + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QPushButton::menu-indicator{ + image: url(./Transparent-Style/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; + border:1px hidden #3F3F46; + /* Grey - Blue*/ +} + QPushButton::menu-indicator:Hover{ + image: url(./Transparent-Style/arrow-down-hover.png); +} + QPushButton:focus{ +} + QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{ + background: #3F3F46; + /* Grey - Blue*/ + border-radius: 1px; + border: 1px solid #9a9a00; +} + QPushButton:hover{ + border-radius: 3px; + border-top:3px double #9A9A00; + border-bottom:3px double #9A9A00; +} + QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{ + color:#fff; + border-color:#707070; + border-style:solid; + border-width:1px; +} + QPushButton:disabled{ +} + QPushButton:open{ +} + QPushButton:!enabled{ +} +/* **************************************** */ +/* Filter Button */ +/* **************************************** */ + QPushButton#displayCategoriesBtn{ + min-width: 20px; + background:transparent; + color: transparent; + border: 1px hidden #9a9a00; +} + QPushButton#displayCategoriesBtn:checked{ + image: url(./Transparent-Style/arrow-left.png); +} + QPushButton#displayCategoriesBtn:!checked{ + image: url(./Transparent-Style/arrow-right.png); +} + QPushButton#displayCategoriesBtn:checked:hover{ + image: url(./Transparent-Style/arrow-left-hover.png); +} + QPushButton#displayCategoriesBtn:!checked:hover{ + image: url(./Transparent-Style/arrow-right-hover.png); +} +/* **************************************** */ +/* Scroll bar */ +/* **************************************** */ + QScrollBar{ + height:20px; + width:20px; + background-color:transparent; +} + QScrollBar::handle{ + border: 1px solid #aaa; + border-radius: 4px; +} + QScrollBar::handle:vertical{ + margin: 1px 4px; + min-height:20px; + min-width: 10px; + background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000); +} + QScrollBar::handle:vertical:hover{ + background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00); +} + QScrollBar::handle:horizontal{ + min-height:10px; + min-width:20px; + margin:4px 1px; + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000); +} + QScrollBar::handle:horizontal:hover{ + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00); +} + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ + background-color: transparent; +} + QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{ + height:0; + width:0; +} +/* ******************************************************** */ +/* Main Tree View Inherited from QAbstractItemView */ +/* ******************************************************** */ + QTreeView { +} + QTreeView:item{ + padding: 3px; + font-size: 16px; + height: 18px; + /*Bottom text Box*/ +} + QTreeView:item:selected{ + color:#fff; + padding: 0px; + background-color: #3F3F46; + /* Grey - Blue*/ + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QTreeView:item QLineEdit{ + outline: none; + border: none; + padding: 0px; + margin: 0px; +} + QTreeView::branch:has-siblings:!adjoins-item{ + background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat; +} + QTreeView::branch:has-siblings{ + background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat; +} + QTreeView::branch:!has-children:!has-siblings:adjoins-item{ + background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat; +} + QTreeView::branch:closed:has-children:has-siblings{ + background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat; +} + QTreeView::branch:closed:has-children:!has-siblings{ + background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat; +} + QTreeView::branch:open:has-children:has-siblings{ + background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat; +} + QTreeView::branch:open:has-children:!has-siblings{ + background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat; +} +/* **************************************************************** */ +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ +/* **************************************************************** */ + QTreeView::indicator,QCheckBox::indicator{ + outline: none; + border: none; + padding: 0px; + width: 24px; + height: 24px; +} + QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{ + image: url(./Transparent-Style/checkbox-checked.png); +} + QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{ + image: url(./Transparent-Style/checkbox-hover.png); +} + QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{ + image: url(./Transparent-Style/checkbox-checked-disabled.png); +} + QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{ + image: url(./Transparent-Style/checkbox.png); +} + QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{ + image: url(./Transparent-Style/checkbox-checked-hover.png); +} + QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{ + image: url(./Transparent-Style/checkbox-checked-disabled.png); +} + QTreeWidget#categoriesList::item:has-children{ + background-image: url(./Transparent-Style/arrow-right-small.png); +} + QTreeWidget#categoriesList::item:has-children:open{ + background-image: url(./Transparent-Style/branch-opened.png); +} +/* ******************************** */ +/* Special styles */ +/* increase categories tab width */ +/* ******************************** */ + QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ + padding: .3em 0em; +} + QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ + padding: .3em 0em; +} + QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{ + min-width: 200px; +} + QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: 0.35em 4px; +} +/* ********************* */ +/* Display Radio Button */ +/* ********************* */ + QRadioButton::indicator{ + width: 16px; + height: 16px; +} + QRadioButton::indicator::checked{ + image: url(./Transparent-Style/radio-BOS-checked.png); +} + QRadioButton::indicator::unchecked{ + image: url(./Transparent-Style/radio-BOS.png); +} + QRadioButton::indicator::unchecked:hover{ + image: url(./Transparent-Style/radio-BOS-hover.png); +} +/* **************************************** */ +/* Spinners #QSpinBox, #QDoubleSpinBox */ +/* **************************************** */ + QAbstractSpinBox{ + padding: 5px; + background-color: transparent; + color: #eff0f1; + border-radius: 2px; + min-width: Auto; +} + QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{ + border-style: solid; + border-width: 1px; + subcontrol-origin: border; +} + QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{ + background-color: transparent; +} + QAbstractSpinBox::up-button{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; + padding-right: 5px; + /* subcontrol-position: top right; + */ +} + QAbstractSpinBox::down-button{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; + padding-left: 5px; + /* subcontrol-position: bottom right; + */ +} + QAbstractSpinBox::up-arrow{ + border-image: url(./Transparent-Style/narrow-arrow-right.png); +} +QAbstractSpinBox::down-arrow{ + border-image: url(./Transparent-Style/narrow-arrow-left.png); +} +/* QTextEdit,QWebView,QLineEdit,QComboBox{ + border-color:#3F3F46; + /* Grey - Blue*/ + /* +} +*/ +/* **************************************** */ +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* **************************************** */ + QToolTip{ + background-color:#121212; + color:#C0C0C0; + padding:0px; + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} + SaveGameInfoWidget{ + font-size: 16px; + background-color:#121212; + color:#C0C0C0; + padding:0px; + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} +/* **************************** */ +/* Handles Web, Nexus info tab */ +/* **************************** */ + QWebView{ + background-color: Black; +} + QLineEdit{ + font-family: Segoe UI; + min-height: 20px; + font-size: 16px; + background-color:#3F3F46; + selection-background-color: rgba(154,154,0,0.6); + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} + QTextEdit{ + color: #cccccc; + font-family: Segoe UI; + font-size: 16px; + /* background-color:#000; + */ + selection-background-color: rgba(154,154,0,0.6); + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} +/* Font size */ + QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{ + color: #cccccc; + font-family: Segoe UI; + font-size: 16px; + /* was 14px Profile font size */ +} + QAbstractItemView{ + color: #cccccc; + font-family: Segoe UI; + /* font-family: Source Sans Pro; + */ + font-size: 16px; + /* Body font size*/ +} + QRadioButton{ + color: #cccccc; + font-family: Segoe UI; + /* font-family: Source Sans Pro; + */ + font-size: 16px; +} + QWebView,QComboBox,QComboBox:editable{ + font-family:Segoe UI; + font-style: normal; + font-weight: normal; + font-size: 16px; + background-color:#000; + /* border-color:#3F3F46; + /* Grey - Blue*/ + color: #cccccc; + font-family: Arial; + font-size: 16px; + /* Filter Name*/ +} + QHeaderView::section{ + /* font-family: Source Sans Pro; + */ + font-family: Segoe UI; + font-size: 16px; + /*Top Bar on menus font*/ +} + QListView::item{ + color:#F1F1F1; + /* White */ +} + QGroupBox { +} + QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top center; +} + QGroupBox::indicator { + subcontrol-origin: margin; + subcontrol-position: top center; +} + QLabel { + color: #cccccc; + /* color: #F1F1F1; + /* White */ + /* border: none; + outline: none; + border-radius: 5px; + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; + */ +} diff --git a/src/stylesheets/Transparent-Style-Skyrim.qss b/src/stylesheets/Transparent-Style-Skyrim.qss index b5fd7473..e95dcfc5 100644 --- a/src/stylesheets/Transparent-Style-Skyrim.qss +++ b/src/stylesheets/Transparent-Style-Skyrim.qss @@ -1 +1,742 @@ -#centralWidget { border-image: url(./Transparent-Style/Background-skyrim.png) 0 0 0 0 stretch stretch; } QWidget#TextViewer{ } QWidget{ color: #fff; background-color: rgba(45,45,48,30); alternate-background-color: rgba(38,38,38,30); } QWidget:disabled{ } QAbstractItemView{ color: #dcdcdc; background-color: rgb(45,45,48,30); alternate-background-color: rgb(38,38,38,50); border: 1px solid #3F3F46; /* Grey - Blue*/ border-style:outset; border-radius: 3px; selection-color: #3F3F46; /* Grey - Blue*/ outline: none; padding-left:0; } #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #toolBarArea{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #EditExecutablesDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #SimpleInstallDialog,#LockedDialog,QMenu{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #nameLabel{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); color:#fff; } #ProfilesDialog,#FomodInstallerDialog{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } #filesView{ border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; } /* ******************************************** */ /* Main Navigation Button Bar at top of window */ /* ******************************************** */ QToolBar{ /*border: none;*/ } QToolBar::separator{ /*image: url(./Transparent-Style/Vault-101-vault-logo.png);*/ } QToolButton{ border:2px solid None; border-radius: 6px; margin: 3px; padding-left: 8px; padding-right: 8px; padding-top: 0px; padding-bottom: 2px; } QToolButton:hover{ border-radius: 3px; border: 0px; padding: 0px; background: trANSPARENT; border: 0px ridge #9A9A00; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53); } QToolButton:pressed{ background: black; } /* **************************************** */ /* Tabs on top of Treeview */ /* **************************************** */ QTabWidget::pane{ border-color:#3F3F46; /* Grey - Blue*/ /* border-top-color:#9A9A00; */ top: 0px; border-style:hidden; border-width:1px; } QTabWidget::tab-bar{ alignment: center; } QTabBar{ color: #cccccc; font-family: Segoe UI; font-size: 16px; text-transform: none; min-height:auto; padding-bottom: 5px; } QTabBar::tab{ border: none; border-bottom-style: none; background-color: rgba(154,154,0,0.3); padding-left: 9px; padding-right: 9px; padding-top: 3px; padding-bottom: 3px; margin-right: 2px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } QTabBar::tab:disabled{ color: #404040; background-color: #000; margin-top: 0px; } QTabBar::tab:selected{ color: #dcdcdc; background-color: #9A9A00; /*Yellow opaque*/ } QTabBar::tab:!selected:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; padding: 1px; text-align: center; background-color: #9A9A00; color:#fff; Height: 20%; } /* QTabBar::tab:!selected{ color: #808080; background-color: #404040; margin-top: 0px; } */ #deactivateESP,#activateESP{ border:#b30000; background:#333337; } /* **************************************** */ /* on top of Treeview */ /* **************************************** */ QTabBar QToolButton{ border-radius: 0px; border: 0px; padding: 0px; background: transparent; } QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{ image: url(./Transparent-Style/arrow-up.png); } QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{ image: url(./Transparent-Style/arrow-down.png); } QTabBar QToolButton::right-arrow{ image: url(./Transparent-Style/narrow-arrow-right.png); } QTabBar QToolButton::left-arrow{ image: url(./Transparent-Style/narrow-arrow-left.png); } /* **************************************** */ /* Column names of TreeView */ /* **************************************** */ QTableView{ gridline-color:#3F3F46; selection-background-color:#9A9A00; selection-color:#F1F1F1; /* White */ text-align: center; min-height:24px; } QHeaderView{ min-height:24px; /*Top Bar on menus*/ padding: 3px; } QHeaderView::section{ /* color: #cc3333; */ background-color: #252526; border-radius: 0px; padding: 0px; padding-left: 5px; } QHeaderView::section:hover{ background: rgba(154,154,0,0.3); border: 1px solid #9a9a00; padding: 0px; padding-left: 5px; } QHeaderView::up-arrow,QHeaderView::down-arrow{ min-height:Auto; min-width:Auto; } QHeaderView::up-arrow{ image: url(./Transparent-Style/arrow-up.png); min-height:25px; min-width:15px; padding-right: 0px; }QHeaderView::down-arrow{ image: url(./Transparent-Style/arrow-down.png); } /* **************************************** */ /* Hover */ /* **************************************** */ QMenu:item:hover,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{ color:#fff; border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); } QAbstractItemView::item:hover{ border-top:1px solid #b9d7fc; border-bottom:1px solid #b9d7fc; background-color:rgba(154,154,0,0.3); padding: 3px; } /*#DownloadListWidget{ }*/ #DownloadListWidget{ outline: 1px solid #e8e8e8; border: 0px solid #9a9a00; } #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{ border: 1px solid #9a9a00; padding: 1px; text-align: center; color:#fff; } /* **************************************** */ /* Context menus, toolbar dropdowns #QMenu */ /* **************************************** */ QMenu{ border-width: 3px; border-style: solid; }QMenu::item{ padding: 6px 20px; }QMenu::item:selected{ color:#fff; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QMenu::right-arrow{ image: url(./Transparent-Style/arrow-right.png); /* right click main menu top option*/ subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:0px outset #3F3F46; /* Grey - Blue*/ } /* ********************* */ /* LCD Counter */ /* ********************* */ QLCDNumber{ color: #9A9A00; Background: #000; border-color: #3F3F46; /* Grey - Blue*/ border-style: solid; border-width: 1px; border-radius: 5px; } /* **************************************** */ /* Launch application Drop down Box */ /* **************************************** */ QComboBox{ background-color: #333337; padding: 3px 5px 5px 5px; height: 26px; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QComboBox:on{ padding: 3px 5px 5px 5px; color: white; background-color: #3F3F46; /* Grey - Blue*/ } QComboBox:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; /* padding: 0px; */ } QComboBox::drop-down{ /* Down arrow in combo box */ outline: none; border: none; border-width: 1px; } QComboBox::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px outset #3F3F46; /* Grey - Blue*/ } /* ************************* */ /* QComboBox::down-arrow:on, */ /* ************************* */ QComboBox::down-arrow:hover,QComboBox::down-arrow:focus { image: url(./Transparent-Style/arrow-down-hover.png); } QComboBox::up-arrow:hover,QComboBox::up-arrow:focus { image: url(./Transparent-Style/arrow-up-hover.png); } QComboBox::down-arrow{ image:url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; } QComboBox::down-arrow:on{ image:url(./Transparent-Style/arrow-up.png); } QComboBox:editable { background: black; /* color: pink; */ } QComboBox::item{ } QComboBox QAbstractItemView{ selection-color:#fff; outline: 1px solid #9a9a00; selection-background-color:#3F3F46; /* Grey - Blue*/ border-top:1px solid #9a9a00; border-bottom:1px solid #9a9a00; padding: 5px; } /* **************************************************************** */ /* Action Buttons */ /* */ /* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */ /* Sort, Load order backup, Load Order Restore */ /* **************************************************************** */ QPushButton{ background-color: #333337; min-height:26px; padding:1px 5%; text-align: center; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QPushButton::menu-indicator{ image: url(./Transparent-Style/arrow-down.png); subcontrol-origin: padding; subcontrol-position: center right; width: 18px; height: 18px; border:1px hidden #3F3F46; /* Grey - Blue*/ } QPushButton::menu-indicator:Hover{ image: url(./Transparent-Style/arrow-down-hover.png); } QPushButton:focus{ } QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{ background: #3F3F46; /* Grey - Blue*/ border-radius: 1px; border: 1px solid #9a9a00; } QPushButton:hover{ border-radius: 3px; border-top:3px double #9A9A00; border-bottom:3px double #9A9A00; } QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{ color:#fff; border-color:#707070; border-style:solid; border-width:1px; } QPushButton:disabled{ } QPushButton:open{ } QPushButton:!enabled{ } /* **************************************** */ /* Filter Button */ /* **************************************** */ QPushButton#displayCategoriesBtn{ min-width: 20px; background:transparent; color: transparent; border: 1px hidden #9a9a00; } QPushButton#displayCategoriesBtn:checked{ image: url(./Transparent-Style/arrow-left.png); } QPushButton#displayCategoriesBtn:!checked{ image: url(./Transparent-Style/arrow-right.png); } QPushButton#displayCategoriesBtn:checked:hover{ image: url(./Transparent-Style/arrow-left-hover.png); } QPushButton#displayCategoriesBtn:!checked:hover{ image: url(./Transparent-Style/arrow-right-hover.png); } /* **************************************** */ /* Scroll bar */ /* **************************************** */ QScrollBar{ height:20px; width:20px; background-color:transparent; } QScrollBar::handle{ border: 1px solid #aaa; border-radius: 4px; } QScrollBar::handle:vertical{ margin: 1px 4px; min-height:20px; min-width: 10px; background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:vertical:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::handle:horizontal{ min-height:10px;min-width:20px;margin:4px 1px; background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000); } QScrollBar::handle:horizontal:hover{ background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00); } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ background-color: transparent; } QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{ height:0; width:0; } /* ******************************************************** */ /* Main Tree View Inherited from QAbstractItemView */ /* ******************************************************** */ QTreeView { } QTreeView:item{ padding: 3px; font-size: 16px; height: 18px; /*Bottom text Box*/ } QTreeView:item:selected{ color:#fff; padding: 0px; background-color: #3F3F46; /* Grey - Blue*/ border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00; } QTreeView:item QLineEdit{ outline: none; border: none; padding: 0px; margin: 0px; } QTreeView::branch:has-siblings:!adjoins-item{ background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat; } QTreeView::branch:has-siblings{ background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat; } QTreeView::branch:!has-children:!has-siblings:adjoins-item{ background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat; } QTreeView::branch:closed:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat; } QTreeView::branch:closed:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat; } QTreeView::branch:open:has-children:has-siblings{ background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat; } QTreeView::branch:open:has-children:!has-siblings{ background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat; } /* **************************************************************** */ /* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ /* common */ /* **************************************************************** */ QTreeView::indicator,QCheckBox::indicator{ outline: none; border: none; padding: 0px; width: 24px; height: 24px; } QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{ image: url(./Transparent-Style/checkbox-checked.png); } QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{ image: url(./Transparent-Style/checkbox-hover.png); } QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{ image: url(./Transparent-Style/checkbox.png); } QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{ image: url(./Transparent-Style/checkbox-checked-hover.png); } QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{ image: url(./Transparent-Style/checkbox-checked-disabled.png); } QTreeWidget#categoriesList::item:has-children{ background-image: url(./Transparent-Style/arrow-right-small.png); } QTreeWidget#categoriesList::item:has-children:open{ background-image: url(./Transparent-Style/branch-opened.png); } /* ******************************** */ /* Special styles */ /* increase categories tab width */ /* ******************************** */ QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ padding: .3em 0em; } QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{ min-width: 200px; } QTreeWidget#categoriesList::item { background-position: center left; background-repeat: no-repeat; padding: 0.35em 4px; } /* ********************* */ /* Display Radio Button */ /* ********************* */ QRadioButton::indicator{ width: 16px; height: 16px; } QRadioButton::indicator::checked{ image: url(./Transparent-Style/radio-BOS-checked.png); } QRadioButton::indicator::unchecked{ image: url(./Transparent-Style/radio-BOS.png); } QRadioButton::indicator::unchecked:hover{ image: url(./Transparent-Style/radio-BOS-hover.png); } /* **************************************** */ /* Spinners #QSpinBox, #QDoubleSpinBox */ /* **************************************** */ QAbstractSpinBox{ padding: 5px; background-color: transparent; color: #eff0f1; border-radius: 2px; min-width: Auto; } QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{ border-style: solid; border-width: 1px; subcontrol-origin: border; } QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{ background-color: transparent; } QAbstractSpinBox::up-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center right; padding-right: 5px; /* subcontrol-position: top right; */ } QAbstractSpinBox::down-button{ background-color: transparent; subcontrol-origin: border; subcontrol-position: center left; padding-left: 5px; /* subcontrol-position: bottom right; */ } QAbstractSpinBox::up-arrow{ border-image: url(./Transparent-Style/narrow-arrow-right.png); }QAbstractSpinBox::down-arrow{ border-image: url(./Transparent-Style/narrow-arrow-left.png); }/* QTextEdit,QWebView,QLineEdit,QComboBox{ border-color:#3F3F46; /* Grey - Blue*/ /*}*/ /* **************************************** */ /* Tooltips #QToolTip, #SaveGameInfoWidget */ /* **************************************** */ QToolTip{ background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } SaveGameInfoWidget{ font-size: 16px; background-color:#121212; color:#C0C0C0; padding:0px; border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* **************************** */ /* Handles Web, Nexus info tab */ /* **************************** */ QWebView{ background-color: Black; } QLineEdit{ font-family: Segoe UI; min-height: 20px; font-size: 16px; background-color:#3F3F46; selection-background-color: rgba(154,154,0,0.6);border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } QTextEdit{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* background-color:#000; */ selection-background-color: rgba(154,154,0,0.6); border-color:#9A9A00; border-radius: 3px; border-width:1px; border-style:solid; } /* Font size */ QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{ color: #cccccc; font-family: Segoe UI; font-size: 16px; /* was 14px Profile font size */ } QAbstractItemView{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; /* Body font size*/ } QRadioButton{ color: #cccccc; font-family: Segoe UI; /* font-family: Source Sans Pro; */ font-size: 16px; } QWebView,QComboBox,QComboBox:editable{ font-family:Segoe UI; font-style: normal; font-weight: normal; font-size: 16px; background-color:#000; /* border-color:#3F3F46; /* Grey - Blue*/ color: #cccccc; font-family: Arial; font-size: 16px; /* Filter Name*/ } QHeaderView::section{ /* font-family: Source Sans Pro; */ font-family: Segoe UI; font-size: 16px; /*Top Bar on menus font*/ } QListView::item{ color:#F1F1F1; /* White */ } QGroupBox { } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top center; } QGroupBox::indicator { subcontrol-origin: margin; subcontrol-position: top center; } QLabel { color: #cccccc; /* color: #F1F1F1; /* White */ /* border: none;outline: none; border-radius: 5px; border-top:1px solid #9A9A00; border-bottom:1px solid #9A9A00;*/ } \ No newline at end of file +#centralWidget { + border-image: url(./Transparent-Style/Background-skyrim.png) 0 0 0 0 stretch stretch; +} + QWidget#TextViewer{ +} + QWidget{ + color: #fff; + background-color: rgba(45,45,48,30); + alternate-background-color: rgba(38,38,38,30); +} + QWidget:disabled{ +} + QAbstractItemView{ + color: #dcdcdc; + background-color: rgb(45,45,48,30); + alternate-background-color: rgb(38,38,38,50); + border: 1px solid #3F3F46; + /* Grey - Blue*/ + border-style:outset; + border-radius: 3px; + selection-color: #3F3F46; + /* Grey - Blue*/ + outline: none; + padding-left:0; +} + #problemsWidget,#TransferSavesDialog,#SettingsDialog,#ProblemsDialog,#ModInfoDialog,#TextViewer,#PyCfgDialog,#InstallDialog { + border-image:url(./Transparent-Style/Vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #toolBarArea{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #EditExecutablesDialog{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #SimpleInstallDialog,#LockedDialog,QMenu{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #nameLabel{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:rgba(154,154,0,0.3); + color:#fff; +} + #ProfilesDialog,#FomodInstallerDialog{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} + #filesView{ + border-image: url(./Transparent-Style/vault-BOS-Main.png) 0 0 0 0 stretch stretch; +} +/* ******************************************** */ +/* Main Navigation Button Bar at top of window */ +/* ******************************************** */ + QToolBar{ + /*border: none; + */ +} + QToolBar::separator{ + /*image: url(./Transparent-Style/Vault-101-vault-logo.png); + */ +} + QToolButton{ + border:2px solid None; + border-radius: 6px; + margin: 3px; + padding-left: 8px; + padding-right: 8px; + padding-top: 0px; + padding-bottom: 2px; +} + QToolButton:hover{ + border-radius: 3px; + border: 0px; + padding: 0px; + background: trANSPARENT; + border: 0px ridge #9A9A00; + background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #9A9A00, stop: 1 #484F53); +} + QToolButton:pressed{ + background: black; +} +/* **************************************** */ +/* Tabs on top of Treeview */ +/* **************************************** */ + QTabWidget::pane{ + border-color:#3F3F46; + /* Grey - Blue*/ + /* border-top-color:#9A9A00; + */ + top: 0px; + border-style:hidden; + border-width:1px; +} + QTabWidget::tab-bar{ + alignment: center; +} + QTabBar{ + color: #cccccc; + font-family: Segoe UI; + font-size: 16px; + text-transform: none; + min-height:auto; + padding-bottom: 5px; +} + QTabBar::tab{ + border: none; + border-bottom-style: none; + background-color: rgba(154,154,0,0.3); + padding-left: 9px; + padding-right: 9px; + padding-top: 3px; + padding-bottom: 3px; + margin-right: 2px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + QTabBar::tab:disabled{ + color: #404040; + background-color: #000; + margin-top: 0px; +} + QTabBar::tab:selected{ + color: #dcdcdc; + background-color: #9A9A00; + /*Yellow opaque*/ +} + QTabBar::tab:!selected:hover{ + border-radius: 3px; + border-top:3px double #9A9A00; + border-bottom:3px double #9A9A00; + padding: 1px; + text-align: center; + background-color: #9A9A00; + color:#fff; + Height: 20%; +} +/* QTabBar::tab:!selected{ + color: #808080; + background-color: #404040; + margin-top: 0px; +} + */ + #deactivateESP,#activateESP{ + border:#b30000; + background:#333337; +} +/* **************************************** */ +/* on top of Treeview */ +/* **************************************** */ + QTabBar QToolButton{ + border-radius: 0px; + border: 0px; + padding: 0px; + background: transparent; +} + QToolButton::menu-indicator:pressed,QToolButton::menu-indicator:open{ + image: url(./Transparent-Style/arrow-up.png); +} + QToolButton::menu-indicator:!pressed,QToolButton::menu-indicator:!open{ + image: url(./Transparent-Style/arrow-down.png); +} + QTabBar QToolButton::right-arrow{ + image: url(./Transparent-Style/narrow-arrow-right.png); +} + QTabBar QToolButton::left-arrow{ + image: url(./Transparent-Style/narrow-arrow-left.png); +} +/* **************************************** */ +/* Column names of TreeView */ +/* **************************************** */ + QTableView{ + gridline-color:#3F3F46; + selection-background-color:#9A9A00; + selection-color:#F1F1F1; + /* White */ + text-align: center; + min-height:24px; +} + QHeaderView{ + min-height:24px; + /*Top Bar on menus*/ + padding: 3px; +} + QHeaderView::section{ + /* color: #cc3333; + */ + background-color: #252526; + border-radius: 0px; + padding: 0px; + padding-left: 5px; +} + QHeaderView::section:hover{ + background: rgba(154,154,0,0.3); + border: 1px solid #9a9a00; + padding: 0px; + padding-left: 5px; +} + QHeaderView::up-arrow,QHeaderView::down-arrow{ + min-height:Auto; + min-width:Auto; +} + QHeaderView::up-arrow{ + image: url(./Transparent-Style/arrow-up.png); + min-height:25px; + min-width:15px; + padding-right: 0px; +} +QHeaderView::down-arrow{ + image: url(./Transparent-Style/arrow-down.png); +} +/* **************************************** */ +/* Hover */ +/* **************************************** */ + QMenu:item:hover,QMenuBar::item:selected,QTreeView#espList::item:hover,QTreeWidget#categoriesList::item:hover,QListView::item:hover,QTreeWidget::item:hover{ + color:#fff; + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:rgba(154,154,0,0.3); +} + QAbstractItemView::item:hover{ + border-top:1px solid #b9d7fc; + border-bottom:1px solid #b9d7fc; + background-color:rgba(154,154,0,0.3); + padding: 3px; +} +/*#DownloadListWidget{ +} +*/ + #DownloadListWidget{ + outline: 1px solid #e8e8e8; + border: 0px solid #9a9a00; +} + #deactivateESP:hover,#activateESP:hover,QTableView:hover,QHeaderView::selected:hover{ + border: 1px solid #9a9a00; + padding: 1px; + text-align: center; + color:#fff; +} +/* **************************************** */ +/* Context menus, toolbar dropdowns #QMenu */ +/* **************************************** */ + QMenu{ + border-width: 3px; + border-style: solid; +} +QMenu::item{ + padding: 6px 20px; +} +QMenu::item:selected{ + color:#fff; + background-color: #3F3F46; + /* Grey - Blue*/ + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QMenu::right-arrow{ + image: url(./Transparent-Style/arrow-right.png); + /* right click main menu top option*/ + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; + border:0px outset #3F3F46; + /* Grey - Blue*/ +} +/* ********************* */ +/* LCD Counter */ +/* ********************* */ + QLCDNumber{ + color: #9A9A00; + Background: #000; + border-color: #3F3F46; + /* Grey - Blue*/ + border-style: solid; + border-width: 1px; + border-radius: 5px; +} +/* **************************************** */ +/* Launch application Drop down Box */ +/* **************************************** */ + QComboBox{ + background-color: #333337; + padding: 3px 5px 5px 5px; + height: 26px; + border-radius: 5px; + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QComboBox:on{ + padding: 3px 5px 5px 5px; + color: white; + background-color: #3F3F46; + /* Grey - Blue*/ +} + QComboBox:hover{ + border-radius: 3px; + border-top:3px double #9A9A00; + border-bottom:3px double #9A9A00; + /* padding: 0px; + */ +} + QComboBox::drop-down{ + /* Down arrow in combo box */ + outline: none; + border: none; + border-width: 1px; +} + QComboBox::menu-indicator{ + image: url(./Transparent-Style/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; + border:1px outset #3F3F46; + /* Grey - Blue*/ +} +/* ************************* */ +/* QComboBox::down-arrow:on, */ +/* ************************* */ + QComboBox::down-arrow:hover,QComboBox::down-arrow:focus { + image: url(./Transparent-Style/arrow-down-hover.png); +} + QComboBox::up-arrow:hover,QComboBox::up-arrow:focus { + image: url(./Transparent-Style/arrow-up-hover.png); +} + QComboBox::down-arrow{ + image:url(./Transparent-Style/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; +} + QComboBox::down-arrow:on{ + image:url(./Transparent-Style/arrow-up.png); +} + QComboBox:editable { + background: black; + /* color: pink; + */ +} + QComboBox::item{ +} + QComboBox QAbstractItemView{ + selection-color:#fff; + outline: 1px solid #9a9a00; + selection-background-color:#3F3F46; + /* Grey - Blue*/ + border-top:1px solid #9a9a00; + border-bottom:1px solid #9a9a00; + padding: 5px; +} +/* **************************************************************** */ +/* Action Buttons */ +/* */ +/* Open list, Restore Backup, Create Backup, RUN, Shortcut Button */ +/* Sort, Load order backup, Load Order Restore */ +/* **************************************************************** */ + QPushButton{ + background-color: #333337; + min-height:26px; + padding:1px 5%; + text-align: center; + border-radius: 5px; + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QPushButton::menu-indicator{ + image: url(./Transparent-Style/arrow-down.png); + subcontrol-origin: padding; + subcontrol-position: center right; + width: 18px; + height: 18px; + border:1px hidden #3F3F46; + /* Grey - Blue*/ +} + QPushButton::menu-indicator:Hover{ + image: url(./Transparent-Style/arrow-down-hover.png); +} + QPushButton:focus{ +} + QPushButton:on,QPushButton:checked,QPushButton:pressed,QPushButton:checked:hover{ + background: #3F3F46; + /* Grey - Blue*/ + border-radius: 1px; + border: 1px solid #9a9a00; +} + QPushButton:hover{ + border-radius: 3px; + border-top:3px double #9A9A00; + border-bottom:3px double #9A9A00; +} + QDialog QPushButton,QSlider::handle:horizontal,QSlider::handle:vertical{ + color:#fff; + border-color:#707070; + border-style:solid; + border-width:1px; +} + QPushButton:disabled{ +} + QPushButton:open{ +} + QPushButton:!enabled{ +} +/* **************************************** */ +/* Filter Button */ +/* **************************************** */ + QPushButton#displayCategoriesBtn{ + min-width: 20px; + background:transparent; + color: transparent; + border: 1px hidden #9a9a00; +} + QPushButton#displayCategoriesBtn:checked{ + image: url(./Transparent-Style/arrow-left.png); +} + QPushButton#displayCategoriesBtn:!checked{ + image: url(./Transparent-Style/arrow-right.png); +} + QPushButton#displayCategoriesBtn:checked:hover{ + image: url(./Transparent-Style/arrow-left-hover.png); +} + QPushButton#displayCategoriesBtn:!checked:hover{ + image: url(./Transparent-Style/arrow-right-hover.png); +} +/* **************************************** */ +/* Scroll bar */ +/* **************************************** */ + QScrollBar{ + height:20px; + width:20px; + background-color:transparent; +} + QScrollBar::handle{ + border: 1px solid #aaa; + border-radius: 4px; +} + QScrollBar::handle:vertical{ + margin: 1px 4px; + min-height:20px; + min-width: 10px; + background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #9A9A00, stop:1 #000000); +} + QScrollBar::handle:vertical:hover{ + background-color:qlineargradient(x1: 0, y1: 0, x2: 1, y2: 0, stop:0 #000000, stop:1 #9A9A00); +} + QScrollBar::handle:horizontal{ + min-height:10px; + min-width:20px; + margin:4px 1px; + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #9A9A00, stop:1 #000000); +} + QScrollBar::handle:horizontal:hover{ + background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #000000, stop:1 #9A9A00); +} + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical,QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal{ + background-color: transparent; +} + QScrollBar::add-line:vertical,QScrollBar::sub-line:vertical,QScrollBar::add-line:horizontal,QScrollBar::sub-line:horizontal{ + height:0; + width:0; +} +/* ******************************************************** */ +/* Main Tree View Inherited from QAbstractItemView */ +/* ******************************************************** */ + QTreeView { +} + QTreeView:item{ + padding: 3px; + font-size: 16px; + height: 18px; + /*Bottom text Box*/ +} + QTreeView:item:selected{ + color:#fff; + padding: 0px; + background-color: #3F3F46; + /* Grey - Blue*/ + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; +} + QTreeView:item QLineEdit{ + outline: none; + border: none; + padding: 0px; + margin: 0px; +} + QTreeView::branch:has-siblings:!adjoins-item{ + background:url(Transparent-Style/vault-101-item-line-v.png) center center no-repeat; +} + QTreeView::branch:has-siblings{ + background:url(Transparent-Style/vault-101-itemB-line.png) center center no-repeat; +} + QTreeView::branch:!has-children:!has-siblings:adjoins-item{ + background:url(Transparent-Style/vault-101-itemB-end.png) center center no-repeat; +} + QTreeView::branch:closed:has-children:has-siblings{ + background:url(Transparent-Style/vault-101-itemB-close.png) center center no-repeat; +} + QTreeView::branch:closed:has-children:!has-siblings{ + background:url(Transparent-Style/vault-101-itemB-close-last.png) center center no-repeat; +} + QTreeView::branch:open:has-children:has-siblings{ + background:url(Transparent-Style/vault-101-itemB-open.png) center center no-repeat; +} + QTreeView::branch:open:has-children:!has-siblings{ + background:url(Transparent-Style/vault-101-itemB-open-last.png) center center no-repeat; +} +/* **************************************************************** */ +/* Checkboxes and Radio buttons common #QCheckBox, #QRadioButton */ +/* common */ +/* **************************************************************** */ + QTreeView::indicator,QCheckBox::indicator{ + outline: none; + border: none; + padding: 0px; + width: 24px; + height: 24px; +} + QGroupBox::indicator:checked,QGroupBox::indicator:indeterminate,QTreeView::indicator:checked,QTreeView::indicator:indeterminate,QCheckBox::indicator:checked,QCheckBox::indicator:indeterminate{ + image: url(./Transparent-Style/checkbox-checked.png); +} + QGroupBox::indicator:checked:hover,QGroupBox::indicator:indeterminate:hover,QTreeView::indicator:checked:hover,QTreeView::indicator:indeterminate:hover,QCheckBox::indicator:checked:hover,QCheckBox::indicator:indeterminate:hover{ + image: url(./Transparent-Style/checkbox-hover.png); +} + QGroupBox::indicator:checked:disabled,QGroupBox::indicator:indeterminate:disabled,QTreeView::indicator:checked:disabled,QTreeView::indicator:indeterminate:disabled,QCheckBox::indicator:checked:disabled,QCheckBox::indicator:indeterminate:disabled{ + image: url(./Transparent-Style/checkbox-checked-disabled.png); +} + QGroupBox::indicator:unchecked,QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked{ + image: url(./Transparent-Style/checkbox.png); +} + QGroupBox::indicator:unchecked:hover,QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover{ + image: url(./Transparent-Style/checkbox-checked-hover.png); +} + QGroupBox::indicator:unchecked:disabled,QTreeView::indicator:unchecked:disabled,QCheckBox::indicator:unchecked:disabled{ + image: url(./Transparent-Style/checkbox-checked-disabled.png); +} + QTreeWidget#categoriesList::item:has-children{ + background-image: url(./Transparent-Style/arrow-right-small.png); +} + QTreeWidget#categoriesList::item:has-children:open{ + background-image: url(./Transparent-Style/branch-opened.png); +} +/* ******************************** */ +/* Special styles */ +/* increase categories tab width */ +/* ******************************** */ + QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ + padding: .3em 0em; +} + QTreeView#modList::item,QTreeWidget#categoriesTree::item,#tabConflicts QTreeWidget::item,QListView::item,QTreeView#espList::item,QTreeView#treeContent::item{ + padding: .3em 0em; +} + QTreeWidget#categoriesGroup,QTreeWidget#categoriesList{ + min-width: 200px; +} + QTreeWidget#categoriesList::item { + background-position: center left; + background-repeat: no-repeat; + padding: 0.35em 4px; +} +/* ********************* */ +/* Display Radio Button */ +/* ********************* */ + QRadioButton::indicator{ + width: 16px; + height: 16px; +} + QRadioButton::indicator::checked{ + image: url(./Transparent-Style/radio-BOS-checked.png); +} + QRadioButton::indicator::unchecked{ + image: url(./Transparent-Style/radio-BOS.png); +} + QRadioButton::indicator::unchecked:hover{ + image: url(./Transparent-Style/radio-BOS-hover.png); +} +/* **************************************** */ +/* Spinners #QSpinBox, #QDoubleSpinBox */ +/* **************************************** */ + QAbstractSpinBox{ + padding: 5px; + background-color: transparent; + color: #eff0f1; + border-radius: 2px; + min-width: Auto; +} + QAbstractSpinBox::up-button,QAbstractSpinBox::down-button{ + border-style: solid; + border-width: 1px; + subcontrol-origin: border; +} + QAbstractSpinBox::up-button:hover,QAbstractSpinBox::down-button:hover{ + background-color: transparent; +} + QAbstractSpinBox::up-button{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; + padding-right: 5px; + /* subcontrol-position: top right; + */ +} + QAbstractSpinBox::down-button{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; + padding-left: 5px; + /* subcontrol-position: bottom right; + */ +} + QAbstractSpinBox::up-arrow{ + border-image: url(./Transparent-Style/narrow-arrow-right.png); +} +QAbstractSpinBox::down-arrow{ + border-image: url(./Transparent-Style/narrow-arrow-left.png); +} +/* QTextEdit,QWebView,QLineEdit,QComboBox{ + border-color:#3F3F46; + /* Grey - Blue*/ + /* +} +*/ +/* **************************************** */ +/* Tooltips #QToolTip, #SaveGameInfoWidget */ +/* **************************************** */ + QToolTip{ + background-color:#121212; + color:#C0C0C0; + padding:0px; + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} + SaveGameInfoWidget{ + font-size: 16px; + background-color:#121212; + color:#C0C0C0; + padding:0px; + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} +/* **************************** */ +/* Handles Web, Nexus info tab */ +/* **************************** */ + QWebView{ + background-color: Black; +} + QLineEdit{ + font-family: Segoe UI; + min-height: 20px; + font-size: 16px; + background-color:#3F3F46; + selection-background-color: rgba(154,154,0,0.6); + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} + QTextEdit{ + color: #cccccc; + font-family: Segoe UI; + font-size: 16px; + /* background-color:#000; + */ + selection-background-color: rgba(154,154,0,0.6); + border-color:#9A9A00; + border-radius: 3px; + border-width:1px; + border-style:solid; +} +/* Font size */ + QLabel,QMenu,QPushButton,QAbstractSpinBox,QGroupBox,QCheckBox,QRadioButton{ + color: #cccccc; + font-family: Segoe UI; + font-size: 16px; + /* was 14px Profile font size */ +} + QAbstractItemView{ + color: #cccccc; + font-family: Segoe UI; + /* font-family: Source Sans Pro; + */ + font-size: 16px; + /* Body font size*/ +} + QRadioButton{ + color: #cccccc; + font-family: Segoe UI; + /* font-family: Source Sans Pro; + */ + font-size: 16px; +} + QWebView,QComboBox,QComboBox:editable{ + font-family:Segoe UI; + font-style: normal; + font-weight: normal; + font-size: 16px; + background-color:#000; + /* border-color:#3F3F46; + /* Grey - Blue*/ + color: #cccccc; + font-family: Arial; + font-size: 16px; + /* Filter Name*/ +} + QHeaderView::section{ + /* font-family: Source Sans Pro; + */ + font-family: Segoe UI; + font-size: 16px; + /*Top Bar on menus font*/ +} + QListView::item{ + color:#F1F1F1; + /* White */ +} + QGroupBox { +} + QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top center; +} + QGroupBox::indicator { + subcontrol-origin: margin; + subcontrol-position: top center; +} + QLabel { + color: #cccccc; + /* color: #F1F1F1; + /* White */ + /* border: none; + outline: none; + border-radius: 5px; + border-top:1px solid #9A9A00; + border-bottom:1px solid #9A9A00; + */ +} diff --git a/src/stylesheets/dark.qss b/src/stylesheets/dark.qss index 5bbb0f0c..1ad534a1 100644 --- a/src/stylesheets/dark.qss +++ b/src/stylesheets/dark.qss @@ -247,6 +247,11 @@ QMenu::item:selected border-color: #3EA0CA; } +QMenuBar::item:selected { + background-color: #3c4b54; + border-color: #3EA0CA; +} + QProgressBar { border: 2px solid grey; diff --git a/src/stylesheets/skyrim.qss b/src/stylesheets/skyrim.qss index d36eac57..d69fa173 100644 --- a/src/stylesheets/skyrim.qss +++ b/src/stylesheets/skyrim.qss @@ -488,6 +488,14 @@ QHeaderView { image: url(./skyrim/arrow-down.png); } /* Context menus, toolbar drop-downs #QMenu */ +QMenuBar { + background-color: #000; +} + +QMenuBar::item:selected { + background-color: #121212; +} + QMenu { background-color: transparent; } QMenu::item, diff --git a/src/stylesheets/vs15 Dark-Green.qss b/src/stylesheets/vs15 Dark-Green.qss index 10f923cb..1fa9dcef 100644 --- a/src/stylesheets/vs15 Dark-Green.qss +++ b/src/stylesheets/vs15 Dark-Green.qss @@ -435,13 +435,13 @@ QScrollBar::sub-line { background-color: #3E3E42; border: none; } -/*QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { }*/ QScrollBar::handle:hover { background: #9E9E9E; } @@ -551,7 +551,7 @@ QMenu::item { background: transparent; padding: 4px 20px; } -QMenu::item:selected { +QMenu::item:selected, QMenuBar::item:selected { background-color: #333334; } QMenu::item:disabled { diff --git a/src/stylesheets/vs15 Dark-Orange.qss b/src/stylesheets/vs15 Dark-Orange.qss index bbde1f82..e02d895d 100644 --- a/src/stylesheets/vs15 Dark-Orange.qss +++ b/src/stylesheets/vs15 Dark-Orange.qss @@ -436,13 +436,13 @@ QScrollBar::sub-line { background-color: #3E3E42; border: none; } -/*QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { }*/ QScrollBar::handle:hover { background: #9E9E9E; } @@ -552,7 +552,7 @@ QMenu::item { background: transparent; padding: 4px 20px; } -QMenu::item:selected { +QMenu::item:selected, QMenuBar::item:selected { background-color: #333334; } QMenu::item:disabled { diff --git a/src/stylesheets/vs15 Dark-Purple.qss b/src/stylesheets/vs15 Dark-Purple.qss index faad7297..24ad5c35 100644 --- a/src/stylesheets/vs15 Dark-Purple.qss +++ b/src/stylesheets/vs15 Dark-Purple.qss @@ -436,13 +436,13 @@ QScrollBar::sub-line { background-color: #3E3E42; border: none; } -/*QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { }*/ QScrollBar::handle:hover { background: #9E9E9E; } @@ -552,7 +552,7 @@ QMenu::item { background: transparent; padding: 4px 20px; } -QMenu::item:selected { +QMenu::item:selected, QMenuBar::item:selected { background-color: #333334; } QMenu::item:disabled { diff --git a/src/stylesheets/vs15 Dark-Red.qss b/src/stylesheets/vs15 Dark-Red.qss index 2ffcff68..9f286335 100644 --- a/src/stylesheets/vs15 Dark-Red.qss +++ b/src/stylesheets/vs15 Dark-Red.qss @@ -436,13 +436,13 @@ QScrollBar::sub-line { background-color: #3E3E42; border: none; } -/*QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { }*/ QScrollBar::handle:hover { background: #9E9E9E; } @@ -552,7 +552,7 @@ QMenu::item { background: transparent; padding: 4px 20px; } -QMenu::item:selected { +QMenu::item:selected, QMenuBar::item:selected { background-color: #333334; } QMenu::item:disabled { diff --git a/src/stylesheets/vs15 Dark-Yellow.qss b/src/stylesheets/vs15 Dark-Yellow.qss index 24afe005..fc9143ea 100644 --- a/src/stylesheets/vs15 Dark-Yellow.qss +++ b/src/stylesheets/vs15 Dark-Yellow.qss @@ -436,13 +436,13 @@ QScrollBar::sub-line { background-color: #3E3E42; border: none; } -/*QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { }*/ QScrollBar::handle:hover { background: #9E9E9E; } @@ -552,7 +552,7 @@ QMenu::item { background: transparent; padding: 4px 20px; } -QMenu::item:selected { +QMenu::item:selected, QMenuBar::item:selected { background-color: #333334; } QMenu::item:disabled { diff --git a/src/stylesheets/vs15 Dark.qss b/src/stylesheets/vs15 Dark.qss index 6a551775..202c74d8 100644 --- a/src/stylesheets/vs15 Dark.qss +++ b/src/stylesheets/vs15 Dark.qss @@ -435,13 +435,13 @@ QScrollBar::sub-line { background-color: #3E3E42; border: none; } -/*QScrollBar::add-line:horizontal:hover, -QScrollBar::sub-line:horizontal:hover, -QScrollBar::add-line:vertical:hover, +/*QScrollBar::add-line:horizontal:hover, +QScrollBar::sub-line:horizontal:hover, +QScrollBar::add-line:vertical:hover, QScrollBar::sub-line:vertical:hover, -QScrollBar::add-line:horizontal:pressed, -QScrollBar::sub-line:horizontal:pressed, -QScrollBar::add-line:vertical:pressed, +QScrollBar::add-line:horizontal:pressed, +QScrollBar::sub-line:horizontal:pressed, +QScrollBar::add-line:vertical:pressed, QScrollBar::sub-line:vertical:pressed { }*/ QScrollBar::handle:hover { background: #9E9E9E; } @@ -551,7 +551,7 @@ QMenu::item { background: transparent; padding: 4px 20px; } -QMenu::item:selected { +QMenu::item:selected, QMenuBar::item:selected { background-color: #333334; } QMenu::item:disabled { -- cgit v1.3.1 From 1fcd8f0e09363a0103df116e137ea9eb16bbf0db Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sun, 2 Jun 2019 22:37:36 -0400 Subject: missed some mnemonics in the main menu --- src/mainwindow.ui | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 05d64bdf..9656cbf2 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1426,11 +1426,11 @@ p, li { white-space: pre-wrap; } - View + &View - Toolbars + &Toolbars @@ -1622,7 +1622,7 @@ p, li { white-space: pre-wrap; } :/MO/gui/warning:/MO/gui/warning - Notifications... + &Notifications... Open the notifications dialog -- cgit v1.3.1 From 97026b4da03dbb9dda460c6046aaa09a23a927bf Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Mon, 3 Jun 2019 18:30:23 -0400 Subject: added menubar toggle in the context menu removed two unused actions: actionToolbar_Size and actionToolbar_style added ways to make the menu reappear if you hide everything: - show the toolbar popup when right-clicking around the border of the main window - intercept the Alt key and make the main menu visible --- src/mainwindow.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/mainwindow.h | 4 +++- src/mainwindow.ui | 24 +++++++++++++----------- 3 files changed, 56 insertions(+), 12 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 01bb4fc1..1098b529 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -653,6 +653,7 @@ void MainWindow::toolbarMenu_aboutToShow() // to avoid deleting the menu, the attribute is removed here ui->menuToolbars->setAttribute(Qt::WA_DeleteOnClose, false); + ui->actionMainMenuToggle->setChecked(ui->menuBar->isVisible()); ui->actionToolBarMainToggle->setChecked(ui->toolBar->isVisible()); ui->actionToolBarLinksToggle->setChecked(ui->linksToolBar->isVisible()); @@ -670,6 +671,11 @@ QMenu* MainWindow::createPopupMenu() return ui->menuToolbars; } +void MainWindow::on_actionMainMenuToggle_triggered() +{ + ui->menuBar->setVisible(!ui->menuBar->isVisible()); +} + void MainWindow::on_actionToolBarMainToggle_triggered() { ui->toolBar->setVisible(!ui->toolBar->isVisible()); @@ -724,6 +730,23 @@ void MainWindow::setToolbarButtonStyle(Qt::ToolButtonStyle s) } } +void MainWindow::on_centralWidget_customContextMenuRequested(const QPoint &pos) +{ + // the custom context menu event bubbles up to here if widgets don't actually + // process this, which would show the menu when right-clicking button, labels, + // etc. + // + // only show the context menu when right-clicking on the central widget + // itself, which is basically just the outer edges of the main window + auto* w = childAt(pos); + if (w != ui->centralWidget) { + return; + } + + auto* m = createPopupMenu(); + m->exec(ui->centralWidget->mapToGlobal(pos)); +} + void MainWindow::scheduleUpdateButton() { if (!m_UpdateProblemsTimer.isActive()) { @@ -1928,6 +1951,10 @@ void MainWindow::readSettings() settings.value("toolbar_button_style").toInt())); } + if (settings.contains("menubar_visible")) { + ui->menuBar->setVisible(settings.value("menubar_visible").toBool()); + } + if (settings.contains("window_split")) { ui->splitter->restoreState(settings.value("window_split").toByteArray()); } @@ -2007,6 +2034,7 @@ void MainWindow::storeSettings(QSettings &settings) { settings.remove("window_state"); settings.remove("toolbar_size"); settings.remove("toolbar_button_style"); + settings.remove("menubar_visible"); settings.remove("window_split"); settings.remove("window_monitor"); settings.remove("log_split"); @@ -2019,6 +2047,7 @@ void MainWindow::storeSettings(QSettings &settings) { settings.setValue("window_state", saveState()); settings.setValue("toolbar_size", ui->toolBar->iconSize()); settings.setValue("toolbar_button_style", static_cast(ui->toolBar->toolButtonStyle())); + settings.setValue("menubar_visible", ui->menuBar->isVisible()); settings.setValue("window_split", ui->splitter->saveState()); settings.setValue("window_monitor", QApplication::desktop()->screenNumber(this)); settings.setValue("log_split", ui->topLevelSplitter->saveState()); @@ -6815,6 +6844,17 @@ void MainWindow::dropEvent(QDropEvent *event) event->accept(); } +void MainWindow::keyPressEvent(QKeyEvent *event) +{ + // if the menubar is hidden, pressing Alt will make it visible + if (event->key() == Qt::Key_Alt) { + if (!ui->menuBar->isVisible()) { + ui->menuBar->setVisible(true); + } + } + + QMainWindow::keyPressEvent(event); +} void MainWindow::on_clickBlankButton_clicked() { diff --git a/src/mainwindow.h b/src/mainwindow.h index a0cce858..09aeb044 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -195,6 +195,7 @@ protected: virtual void resizeEvent(QResizeEvent *event); virtual void dragEnterEvent(QDragEnterEvent *event); virtual void dropEvent(QDropEvent *event); + void keyPressEvent(QKeyEvent *event) override; private slots: void on_actionChange_Game_triggered(); @@ -633,6 +634,7 @@ private slots: // ui slots void on_actionSettings_triggered(); void on_actionUpdate_triggered(); void on_actionExit_triggered(); + void on_actionMainMenuToggle_triggered(); void on_actionToolBarMainToggle_triggered(); void on_actionToolBarLinksToggle_triggered(); void on_actionToolBarSmallIcons_triggered(); @@ -642,7 +644,7 @@ private slots: // ui slots void on_actionToolBarTextOnly_triggered(); void on_actionToolBarIconsAndText_triggered(); - + void on_centralWidget_customContextMenuRequested(const QPoint &pos); void on_bsaList_customContextMenuRequested(const QPoint &pos); void on_clearFiltersButton_clicked(); void on_btnRefreshData_clicked(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 9656cbf2..e25111e1 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -30,6 +30,9 @@ 0 + + Qt::CustomContextMenu + 6 @@ -1432,6 +1435,7 @@ p, li { white-space: pre-wrap; } &Toolbars + @@ -1719,22 +1723,12 @@ p, li { white-space: pre-wrap; } Exits Mod Organizer - - - Toolbar Size - - - - - Toolbar Buttons - - true - &Main + M&ain @@ -1793,6 +1787,14 @@ p, li { white-space: pre-wrap; } M&edium Icons + + + true + + + &Menu + + -- cgit v1.3.1 From 254304217d6cb00cbedf13f8c493dc6c80e11e24 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Mon, 3 Jun 2019 19:00:44 -0400 Subject: renamed some of the menus to remove underscores added Run menu with shortcuts, only visible when there are shortcuts to show fixed menubar visibility not being remembered --- src/mainwindow.cpp | 30 +++++++++++++++++++----------- src/mainwindow.h | 6 +++++- src/mainwindow.ui | 22 ++++++++++++++-------- 3 files changed, 38 insertions(+), 20 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 1098b529..62971f00 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -201,6 +201,7 @@ MainWindow::MainWindow(QSettings &initSettings : QMainWindow(parent) , ui(new Ui::MainWindow) , m_WasVisible(false) + , m_menuBarVisible(true) , m_Tutorial(this, "MainWindow") , m_OldProfileIndex(-1) , m_ModListGroupingProxy(nullptr) @@ -321,7 +322,7 @@ MainWindow::MainWindow(QSettings &initSettings resizeLists(modListAdjusted, pluginListAdjusted); QMenu *linkMenu = new QMenu(this); - linkMenu->addAction(QIcon(":/MO/gui/link"), tr("Toolbar"), this, SLOT(linkToolbar())); + linkMenu->addAction(QIcon(":/MO/gui/link"), tr("Toolbar and Menu"), this, SLOT(linkToolbar())); linkMenu->addAction(QIcon(":/MO/gui/link"), tr("Desktop"), this, SLOT(linkDesktop())); linkMenu->addAction(QIcon(":/MO/gui/link"), tr("Start Menu"), this, SLOT(linkMenu())); ui->linkButton->setMenu(linkMenu); @@ -470,7 +471,7 @@ MainWindow::MainWindow(QSettings &initSettings } refreshExecutablesList(); - updateToolBar(); + updatePinnedExecutables(); for (QAction *action : ui->toolBar->actions()) { // set the name of the widget to the name of the action to allow styling @@ -609,13 +610,15 @@ void MainWindow::setupActionMenu(QAction* a) tb->setPopupMode(QToolButton::InstantPopup); } -void MainWindow::updateToolBar() +void MainWindow::updatePinnedExecutables() { for (auto* a : ui->linksToolBar->actions()) { ui->linksToolBar->removeAction(a); a->deleteLater(); } + ui->menuRun->clear(); + bool hasLinks = false; std::vector::iterator begin, end; @@ -625,21 +628,23 @@ void MainWindow::updateToolBar() if (iter->isShownOnToolbar()) { hasLinks = true; - QAction *exeAction = new QAction(iconForExecutable(iter->m_BinaryInfo.filePath()), - iter->m_Title, - ui->toolBar); + QAction *exeAction = new QAction( + iconForExecutable(iter->m_BinaryInfo.filePath()), iter->m_Title); exeAction->setObjectName(QString("custom__") + iter->m_Title); + if (!connect(exeAction, SIGNAL(triggered()), this, SLOT(startExeAction()))) { qDebug("failed to connect trigger?"); } ui->linksToolBar->addAction(exeAction); + ui->menuRun->addAction(exeAction); } } - // don't show the toolbar if there are no links + // don't show the toolbar or menu if there are no links ui->linksToolBar->setVisible(hasLinks); + ui->menuRun->menuAction()->setVisible(hasLinks); } void MainWindow::toolbarMenu_aboutToShow() @@ -674,6 +679,7 @@ QMenu* MainWindow::createPopupMenu() void MainWindow::on_actionMainMenuToggle_triggered() { ui->menuBar->setVisible(!ui->menuBar->isVisible()); + m_menuBarVisible = ui->menuBar->isVisible(); } void MainWindow::on_actionToolBarMainToggle_triggered() @@ -1952,7 +1958,8 @@ void MainWindow::readSettings() } if (settings.contains("menubar_visible")) { - ui->menuBar->setVisible(settings.value("menubar_visible").toBool()); + m_menuBarVisible = settings.value("menubar_visible").toBool(); + ui->menuBar->setVisible(m_menuBarVisible); } if (settings.contains("window_split")) { @@ -2047,7 +2054,7 @@ void MainWindow::storeSettings(QSettings &settings) { settings.setValue("window_state", saveState()); settings.setValue("toolbar_size", ui->toolBar->iconSize()); settings.setValue("toolbar_button_style", static_cast(ui->toolBar->toolButtonStyle())); - settings.setValue("menubar_visible", ui->menuBar->isVisible()); + settings.setValue("menubar_visible", m_menuBarVisible); settings.setValue("window_split", ui->splitter->saveState()); settings.setValue("window_monitor", QApplication::desktop()->screenNumber(this)); settings.setValue("log_split", ui->topLevelSplitter->saveState()); @@ -5001,7 +5008,7 @@ void MainWindow::linkToolbar() Executable &exe(getSelectedExecutable()); exe.showOnToolbar(!exe.isShownOnToolbar()); ui->linkButton->menu()->actions().at(static_cast(ShortcutType::Toolbar))->setIcon(exe.isShownOnToolbar() ? QIcon(":/MO/gui/remove") : QIcon(":/MO/gui/link")); - updateToolBar(); + updatePinnedExecutables(); } namespace { @@ -6189,7 +6196,7 @@ void MainWindow::removeFromToolbar() qDebug("executable doesn't exist any more"); } - updateToolBar(); + updatePinnedExecutables(); } @@ -6850,6 +6857,7 @@ void MainWindow::keyPressEvent(QKeyEvent *event) if (event->key() == Qt::Key_Alt) { if (!ui->menuBar->isVisible()) { ui->menuBar->setVisible(true); + m_menuBarVisible = true; } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 09aeb044..4847d65c 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -211,7 +211,7 @@ private: void createHelpMenu(); void createEndorseMenu(); - void updateToolBar(); + void updatePinnedExecutables(); void setToolbarSize(const QSize& s); void setToolbarButtonStyle(Qt::ToolButtonStyle s); void toolbarMenu_aboutToShow(); @@ -324,6 +324,10 @@ private: bool m_WasVisible; + // this has to be remembered because by the time storeSettings() is called, + // the window is closed and the menubar is hidden + bool m_menuBarVisible; + MOBase::TutorialControl m_Tutorial; int m_OldProfileIndex; diff --git a/src/mainwindow.ui b/src/mainwindow.ui index e25111e1..e093fd3f 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1392,7 +1392,7 @@ p, li { white-space: pre-wrap; } 21 - + &File @@ -1402,7 +1402,7 @@ p, li { white-space: pre-wrap; } - + &Tools @@ -1413,7 +1413,7 @@ p, li { white-space: pre-wrap; } - + &Help @@ -1421,7 +1421,7 @@ p, li { white-space: pre-wrap; } - + &Edit @@ -1450,11 +1450,17 @@ p, li { white-space: pre-wrap; } - - + + + &Run + + + + - - + + + -- cgit v1.3.1 From 369408eed067c1ca76759ef22ea5dfc4facdf082 Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Tue, 4 Jun 2019 18:25:31 -0400 Subject: reverted changes to the toolbar: - swapped back "add profile" and "install mod" icons - removed links toolbar, icons are added to the main one - locked the toolbar because there's only one now - right align everything after the last separator and executable shortcuts --- src/mainwindow.cpp | 74 +++++++++++++++++++++++++++++++++++------------------- src/mainwindow.h | 8 ++++-- src/mainwindow.ui | 43 +++++++------------------------ 3 files changed, 63 insertions(+), 62 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ebb5d7ab..60a86b95 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -202,6 +202,7 @@ MainWindow::MainWindow(QSettings &initSettings , ui(new Ui::MainWindow) , m_WasVisible(false) , m_menuBarVisible(true) + , m_linksSeparator(nullptr) , m_Tutorial(this, "MainWindow") , m_OldProfileIndex(-1) , m_ModListGroupingProxy(nullptr) @@ -251,15 +252,7 @@ MainWindow::MainWindow(QSettings &initSettings updateProblemsButton(); - // Setup toolbar - - setupActionMenu(ui->actionTool); - setupActionMenu(ui->actionHelp); - setupActionMenu(ui->actionEndorseMO); - - createHelpMenu(); - createEndorseMenu(); - + setupToolbar(); toggleMO2EndorseState(); TaskProgressManager::instance().tryCreateTaskbar(); @@ -400,7 +393,7 @@ MainWindow::MainWindow(QSettings &initSettings connect(&TutorialManager::instance(), SIGNAL(windowTutorialFinished(QString)), this, SLOT(windowTutorialFinished(QString))); connect(ui->tabWidget, SIGNAL(currentChanged(int)), &TutorialManager::instance(), SIGNAL(tabChanged(int))); connect(ui->modList->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(modListSortIndicatorChanged(int,Qt::SortOrder))); - connect(ui->linksToolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(linksToolBar_customContextMenuRequested(QPoint))); + connect(ui->toolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(toolBar_customContextMenuRequested(QPoint))); connect(ui->menuToolbars, &QMenu::aboutToShow, [&]{ toolbarMenu_aboutToShow(); }); connect(&m_OrganizerCore, &OrganizerCore::modInstalled, this, &MainWindow::modInstalled); @@ -601,6 +594,34 @@ static QModelIndex mapToModel(const QAbstractItemModel *targetModel, QModelIndex return result; } +void MainWindow::setupToolbar() +{ + setupActionMenu(ui->actionTool); + setupActionMenu(ui->actionHelp); + setupActionMenu(ui->actionEndorseMO); + + createHelpMenu(); + createEndorseMenu(); + + // find last separator, add a spacer just before it so the icons are + // right-aligned + m_linksSeparator = nullptr; + for (auto* a : ui->toolBar->actions()) { + if (a->isSeparator()) { + m_linksSeparator = a; + } + } + + if (m_linksSeparator) { + auto* spacer = new QWidget(ui->toolBar); + spacer->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + ui->toolBar->insertWidget(m_linksSeparator, spacer); + + } else { + qWarning("no separator found on the toolbar, icons won't be right-aligned"); + } +} + void MainWindow::setupActionMenu(QAction* a) { a->setMenu(new QMenu(this)); @@ -612,9 +633,11 @@ void MainWindow::setupActionMenu(QAction* a) void MainWindow::updatePinnedExecutables() { - for (auto* a : ui->linksToolBar->actions()) { - ui->linksToolBar->removeAction(a); - a->deleteLater(); + for (auto* a : ui->toolBar->actions()) { + if (a->objectName().startsWith("custom__")) { + ui->toolBar->removeAction(a); + a->deleteLater(); + } } ui->menuRun->clear(); @@ -637,13 +660,18 @@ void MainWindow::updatePinnedExecutables() qDebug("failed to connect trigger?"); } - ui->linksToolBar->addAction(exeAction); + if (m_linksSeparator) { + ui->toolBar->insertAction(m_linksSeparator, exeAction); + } else { + // separator wasn't found, add it to the end + ui->toolBar->addAction(exeAction); + } + ui->menuRun->addAction(exeAction); } } - // don't show the toolbar or menu if there are no links - ui->linksToolBar->setVisible(hasLinks); + // don't show the menu if there are no links ui->menuRun->menuAction()->setVisible(hasLinks); } @@ -660,7 +688,6 @@ void MainWindow::toolbarMenu_aboutToShow() ui->actionMainMenuToggle->setChecked(ui->menuBar->isVisible()); ui->actionToolBarMainToggle->setChecked(ui->toolBar->isVisible()); - ui->actionToolBarLinksToggle->setChecked(ui->linksToolBar->isVisible()); ui->actionToolBarSmallIcons->setChecked(ui->toolBar->iconSize() == SmallToolbarSize); ui->actionToolBarMediumIcons->setChecked(ui->toolBar->iconSize() == MediumToolbarSize); @@ -687,11 +714,6 @@ void MainWindow::on_actionToolBarMainToggle_triggered() ui->toolBar->setVisible(!ui->toolBar->isVisible()); } -void MainWindow::on_actionToolBarLinksToggle_triggered() -{ - ui->linksToolBar->setVisible(!ui->linksToolBar->isVisible()); -} - void MainWindow::on_actionToolBarSmallIcons_triggered() { setToolbarSize(SmallToolbarSize); @@ -6207,23 +6229,23 @@ void MainWindow::removeFromToolbar() } -void MainWindow::linksToolBar_customContextMenuRequested(const QPoint &point) +void MainWindow::toolBar_customContextMenuRequested(const QPoint &point) { - QAction *action = ui->linksToolBar->actionAt(point); + QAction *action = ui->toolBar->actionAt(point); if (action != nullptr) { if (action->objectName().startsWith("custom_")) { m_ContextAction = action; QMenu menu; menu.addAction(tr("Remove '%1' from the toolbar").arg(action->text()), this, SLOT(removeFromToolbar())); - menu.exec(ui->linksToolBar->mapToGlobal(point)); + menu.exec(ui->toolBar->mapToGlobal(point)); return; } } // did not click a link button, show the default context menu auto* m = createPopupMenu(); - m->exec(ui->linksToolBar->mapToGlobal(point)); + m->exec(ui->toolBar->mapToGlobal(point)); } void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos) diff --git a/src/mainwindow.h b/src/mainwindow.h index 81b6a656..679065bd 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -207,6 +207,7 @@ private: void cleanup(); + void setupToolbar(); void setupActionMenu(QAction* a); void createHelpMenu(); void createEndorseMenu(); @@ -328,6 +329,10 @@ private: // the window is closed and the menubar is hidden bool m_menuBarVisible; + // last separator on the toolbar, used to add spacer for right-alignment and + // as an insert point for executables + QAction* m_linksSeparator; + MOBase::TutorialControl m_Tutorial; int m_OldProfileIndex; @@ -602,7 +607,7 @@ private slots: */ void allowListResize(); - void linksToolBar_customContextMenuRequested(const QPoint &point); + void toolBar_customContextMenuRequested(const QPoint &point); void removeFromToolbar(); void overwriteClosed(int); @@ -640,7 +645,6 @@ private slots: // ui slots void on_actionExit_triggered(); void on_actionMainMenuToggle_triggered(); void on_actionToolBarMainToggle_triggered(); - void on_actionToolBarLinksToggle_triggered(); void on_actionToolBarSmallIcons_triggered(); void on_actionToolBarMediumIcons_triggered(); void on_actionToolBarLargeIcons_triggered(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index e093fd3f..d3f9ef39 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1352,9 +1352,15 @@ p, li { white-space: pre-wrap; } + + Qt::CustomContextMenu + Main ToolBar + + false + 42 @@ -1368,11 +1374,9 @@ p, li { white-space: pre-wrap; } false - - - - + + @@ -1437,7 +1441,6 @@ p, li { white-space: pre-wrap; } - @@ -1462,26 +1465,6 @@ p, li { white-space: pre-wrap; } - - - Qt::CustomContextMenu - - - Links ToolBar - - - - 42 - 36 - - - - TopToolBarArea - - - false - - @@ -1734,15 +1717,7 @@ p, li { white-space: pre-wrap; } true - M&ain - - - - - true - - - &Links + M&ain Toolbar -- cgit v1.3.1 From ebbc900755b09862be95d29d2a02b8abd1792a3a Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Wed, 12 Jun 2019 15:10:41 -0400 Subject: added a few helper classes for user accounts and stats moved the api label to the status bar refactored a bunch of copy/pasted code in NexusInterface to use shouldThrottle() and throttledWarning() --- src/mainwindow.cpp | 68 +++++----- src/mainwindow.h | 5 +- src/mainwindow.ui | 46 +------ src/nexusinterface.cpp | 314 ++++++++++++++++++++++++++++++----------------- src/nexusinterface.h | 150 +++++++++++++++++++--- src/nxmaccessmanager.cpp | 15 +-- src/nxmaccessmanager.h | 5 +- src/statusbar.cpp | 53 +++++++- src/statusbar.h | 6 + 9 files changed, 428 insertions(+), 234 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 67d0f2ff..6b3ee11f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -225,7 +225,7 @@ MainWindow::MainWindow(QSettings &initSettings QWebEngineProfile::defaultProfile()->setCachePath(m_OrganizerCore.settings().getCacheDirectory()); QWebEngineProfile::defaultProfile()->setPersistentStoragePath(m_OrganizerCore.settings().getCacheDirectory()); ui->setupUi(this); - updateWindowTitle(QString(), 0, false); + updateWindowTitle({}); languageChange(m_OrganizerCore.settings().language()); @@ -340,13 +340,6 @@ MainWindow::MainWindow(QSettings &initSettings ui->bossButton->setToolTip(tr("There is no supported sort mechanism for this game. You will probably have to use a third-party tool.")); } - ui->apiRequests->setAutoFillBackground(true); - QPalette palette = ui->apiRequests->palette(); - palette.setColor(ui->apiRequests->backgroundRole(), Qt::darkGreen); - palette.setColor(ui->apiRequests->foregroundRole(), Qt::white); - ui->apiRequests->setPalette(palette); - ui->apiRequests->setVisible(!m_OrganizerCore.settings().hideAPICounter()); - connect(&m_PluginContainer, SIGNAL(diagnosisUpdate()), this, SLOT(updateProblemsButton())); connect(ui->savegameList, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(saveSelectionChanged(QListWidgetItem*))); @@ -379,11 +372,24 @@ MainWindow::MainWindow(QSettings &initSettings connect(NexusInterface::instance(&pluginContainer), SIGNAL(nxmDownloadURLsAvailable(QString,int,int,QVariant,QVariant,int)), this, SLOT(nxmDownloadURLs(QString,int,int,QVariant,QVariant,int))); connect(NexusInterface::instance(&pluginContainer), SIGNAL(needLogin()), &m_OrganizerCore, SLOT(nexusApi())); connect(NexusInterface::instance(&pluginContainer)->getAccessManager(), SIGNAL(validateFailed(QString)), this, SLOT(validationFailed(QString))); - connect(NexusInterface::instance(&pluginContainer)->getAccessManager(), SIGNAL(credentialsReceived(const QString&, int, bool, std::tuple)), - this, SLOT(updateWindowTitle(const QString&, int, bool))); - connect(NexusInterface::instance(&pluginContainer)->getAccessManager(), SIGNAL(credentialsReceived(const QString&, int, bool, std::tuple)), - NexusInterface::instance(&m_PluginContainer), SLOT(setRateMax(const QString&, int, bool, std::tuple))); - connect(NexusInterface::instance(&pluginContainer), SIGNAL(requestsChanged(int, std::tuple)), this, SLOT(updateAPICounter(int, std::tuple))); + + connect( + NexusInterface::instance(&pluginContainer)->getAccessManager(), + SIGNAL(credentialsReceived(const APIUserAccount&)), + this, + SLOT(updateWindowTitle(const APIUserAccount&))); + + connect( + NexusInterface::instance(&pluginContainer)->getAccessManager(), + SIGNAL(credentialsReceived(const APIUserAccount&)), + NexusInterface::instance(&m_PluginContainer), + SLOT(setUserAccount(const APIUserAccount&))); + + connect( + NexusInterface::instance(&pluginContainer), + SIGNAL(requestsChanged(const APIStats&, const APIUserAccount&)), + this, + SLOT(onRequestsChanged(const APIStats&, const APIUserAccount&))); connect(&TutorialManager::instance(), SIGNAL(windowTutorialFinished(QString)), this, SLOT(windowTutorialFinished(QString))); connect(ui->tabWidget, SIGNAL(currentChanged(int)), &TutorialManager::instance(), SIGNAL(tabChanged(int))); @@ -548,20 +554,27 @@ MainWindow::~MainWindow() } -void MainWindow::updateWindowTitle(const QString &accountName, int, bool premium) +void MainWindow::updateWindowTitle(const APIUserAccount& user) { QString title = QString("%1 Mod Organizer v%2").arg( m_OrganizerCore.managedGame()->gameName(), m_OrganizerCore.getVersion().displayString(3)); - if (!accountName.isEmpty()) { - title.append(QString(" (%1%2)").arg(accountName, premium ? "*" : "")); + if (!user.name().isEmpty()) { + const QString premium = (user.type() == APIUserAccountTypes::Premium ? "*" : ""); + title.append(QString(" (%1%2)").arg(user.name(), premium)); } this->setWindowTitle(title); } +void MainWindow::onRequestsChanged(const APIStats& stats, const APIUserAccount& user) +{ + m_statusBar->updateAPI(stats, user); +} + + void MainWindow::disconnectPlugins() { if (ui->actionTool->menu() != nullptr) { @@ -5267,8 +5280,7 @@ void MainWindow::on_actionSettings_triggered() activateProxy(settings.useProxy()); } - ui->apiRequests->setVisible(!settings.hideAPICounter()); - + m_statusBar->checkSettings(m_OrganizerCore.settings()); updateDownloadView(); m_OrganizerCore.updateVFSParams(settings.logLevel(), settings.crashDumpsType(), settings.executablesBlacklist()); @@ -6067,26 +6079,6 @@ void MainWindow::nxmRequestFailed(QString gameName, int modID, int, QVariant, in } -void MainWindow::updateAPICounter(int queueCount, std::tuple limits) -{ - ui->apiRequests->setText(QString("API: Q: %1 | D: %2 | H: %3").arg(queueCount).arg(std::get<0>(limits)).arg(std::get<2>(limits))); - int requestsRemaining = std::get<0>(limits) + std::get<2>(limits); - if (requestsRemaining > 300) { - QPalette palette = ui->apiRequests->palette(); - palette.setColor(ui->apiRequests->backgroundRole(), Qt::darkGreen); - ui->apiRequests->setPalette(palette); - } else if (requestsRemaining < 150) { - QPalette palette = ui->apiRequests->palette(); - palette.setColor(ui->apiRequests->backgroundRole(), Qt::darkRed); - ui->apiRequests->setPalette(palette); - } else { - QPalette palette = ui->apiRequests->palette(); - palette.setColor(ui->apiRequests->backgroundRole(), Qt::darkYellow); - ui->apiRequests->setPalette(palette); - } -} - - BSA::EErrorCode MainWindow::extractBSA(BSA::Archive &archive, BSA::Folder::Ptr folder, const QString &destination, QProgressDialog &progress) { diff --git a/src/mainwindow.h b/src/mainwindow.h index 734ece88..e2c6ce8b 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -416,8 +416,7 @@ private: private slots: - void updateWindowTitle(const QString &accountName, int, bool premium); - + void updateWindowTitle(const APIUserAccount& user); void showMessage(const QString &message); void showError(const QString &message); @@ -544,7 +543,7 @@ private slots: void nxmDownloadURLs(QString, int modID, int fileID, QVariant userData, QVariant resultData, int requestID); void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString); - void updateAPICounter(int queueCount, std::tuple limits); + void onRequestsChanged(const APIStats& stats, const APIUserAccount& user); void editCategories(); void deselectFilters(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index d3f9ef39..bbcb734c 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -412,7 +412,7 @@ p, li { white-space: pre-wrap; } - + @@ -471,37 +471,6 @@ p, li { white-space: pre-wrap; } - - - - Nexus API Queued and Remaining Requests - - - <html><head/><body><p>This tracks the number of queued Nexus API requests on the left (<span style=" font-weight:600;">Q</span>) and the remaining daily (<span style=" font-weight:600;">D</span>) and hourly (<span style=" font-weight:600;">H</span>) requests on the right. The Nexus API limits you to a pool of requests per day and requests per hour. It is dynamically updated every time a request is completed. If you run out of requests, you will be unable to queue downloads, check updates, parse mod info, or even log in. Both pools must be consumed before this happens.</p></body></html> - - - QFrame::StyledPanel - - - QFrame::Sunken - - - 2 - - - 1 - - - API: Q: 0 | D: 0 | H: 0 - - - Qt::AlignCenter - - - 2 - - - @@ -546,19 +515,6 @@ p, li { white-space: pre-wrap; } - - - - Qt::Horizontal - - - - 40 - 20 - - - - diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index c677add0..8362143a 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -38,6 +38,82 @@ using namespace MOBase; using namespace MOShared; +void throttledWarning(const APIUserAccount& user) +{ + qCritical() << + QString( + "You have fewer than %1 requests remaining (%2). Only downloads and " + "login validation are being allowed.") + .arg(APIUserAccount::ThrottleThreshold) + .arg(user.remainingRequests()); +} + + +APIUserAccount::APIUserAccount() + : m_type(APIUserAccountTypes::None) +{ +} + +const QString& APIUserAccount::id() const +{ + return m_id; +} + +const QString& APIUserAccount::name() const +{ + return m_name; +} + +APIUserAccountTypes APIUserAccount::type() const +{ + return m_type; +} + +const APILimits& APIUserAccount::limits() const +{ + return m_limits; +} + +APIUserAccount& APIUserAccount::id(const QString& id) +{ + m_id = id; + return *this; +} + +APIUserAccount& APIUserAccount::name(const QString& name) +{ + m_name = name; + return *this; +} + +APIUserAccount& APIUserAccount::type(APIUserAccountTypes type) +{ + m_type = type; + return *this; +} + +APIUserAccount& APIUserAccount::limits(const APILimits& limits) +{ + m_limits = limits; + return *this; +} + +int APIUserAccount::remainingRequests() const +{ + return m_limits.remainingDailyRequests + m_limits.remainingHourlyRequests; +} + +bool APIUserAccount::shouldThrottle() const +{ + return (remainingRequests() < ThrottleThreshold); +} + +bool APIUserAccount::exhausted() const +{ + return (remainingRequests() <= 0); +} + + NexusBridge::NexusBridge(PluginContainer *pluginContainer, const QString &subModule) : m_Interface(NexusInterface::instance(pluginContainer)) , m_SubModule(subModule) @@ -179,15 +255,39 @@ void NexusBridge::nxmRequestFailed(QString gameName, int modID, int fileID, QVar QAtomicInt NexusInterface::NXMRequestInfo::s_NextID(0); +APILimits NexusInterface::defaultAPILimits() +{ + // https://app.swaggerhub.com/apis-docs/NexusMods/nexus-mods_public_api_params_in_form_data/1.0#/ + const int MaxDaily = 2500; + const int MaxHourly = 100; + + APILimits limits; + + limits.maxDailyRequests = MaxDaily; + limits.remainingDailyRequests = MaxDaily; + limits.maxHourlyRequests = MaxHourly; + limits.remainingHourlyRequests = MaxHourly; + + return limits; +} + +APILimits NexusInterface::parseLimits(const QNetworkReply* reply) +{ + APILimits limits; + + limits.maxDailyRequests = reply->rawHeader("x-rl-daily-limit").toInt(); + limits.remainingDailyRequests = reply->rawHeader("x-rl-daily-remaining").toInt(); + limits.maxHourlyRequests = reply->rawHeader("x-rl-hourly-limit").toInt(); + limits.remainingHourlyRequests = reply->rawHeader("x-rl-hourly-remaining").toInt(); + + return limits; +} + + NexusInterface::NexusInterface(PluginContainer *pluginContainer) : m_PluginContainer(pluginContainer) - , m_RemainingDailyRequests(2500) - , m_RemainingHourlyRequests(100) - , m_MaxDailyRequests(2500) - , m_MaxHourlyRequests(100) - , m_IsPremium(false) - , m_UserID(0) { + m_User.limits(defaultAPILimits()); m_MOVersion = createVersionInfo(); m_AccessManager = new NXMAccessManager(this, m_MOVersion.displayString(3)); @@ -222,15 +322,10 @@ void NexusInterface::loginCompleted() nextRequest(); } -void NexusInterface::setRateMax(const QString&, int userId, bool isPremium, std::tuple limits) +void NexusInterface::setUserAccount(const APIUserAccount& user) { - m_RemainingDailyRequests = std::get<0>(limits); - m_MaxDailyRequests = std::get<1>(limits); - m_RemainingHourlyRequests = std::get<2>(limits); - m_MaxHourlyRequests = std::get<3>(limits); - m_IsPremium = isPremium; - m_UserID = userId; - emit requestsChanged(m_RequestQueue.size(), limits); + m_User = user; + emit requestsChanged(stats(), m_User); } void NexusInterface::interpretNexusFileName(const QString &fileName, QString &modName, int &modID, bool query) @@ -369,70 +464,70 @@ int NexusInterface::requestDescription(QString gameName, int modID, QObject *rec int NexusInterface::requestModInfo(QString gameName, int modID, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game) { - if (std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests) >= 200) { - NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_MODINFO, userData, subModule, game); - m_RequestQueue.enqueue(requestInfo); + if (m_User.shouldThrottle()) { + throttledWarning(m_User); + return -1; + } - connect(this, SIGNAL(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), - receiver, SLOT(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_MODINFO, userData, subModule, game); + m_RequestQueue.enqueue(requestInfo); - connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), - receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), + receiver, SLOT(nxmModInfoAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); - nextRequest(); - return requestInfo.m_ID; - } - qCritical() << QString("You have fewer than 200 requests remaining (%1). Only downloads and login validation are being allowed.") - .arg(std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests)); - return -1; + connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), + receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + + nextRequest(); + return requestInfo.m_ID; } int NexusInterface::requestUpdateInfo(QString gameName, NexusInterface::UpdatePeriod period, QObject *receiver, QVariant userData, const QString &subModule, const MOBase::IPluginGame *game) { - if (std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests) >= 200) { - NXMRequestInfo requestInfo(period, NXMRequestInfo::TYPE_CHECKUPDATES, userData, subModule, game); - m_RequestQueue.enqueue(requestInfo); + if (m_User.shouldThrottle()) { + throttledWarning(m_User); + return -1; + } - connect(this, SIGNAL(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)), - receiver, SLOT(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)), Qt::UniqueConnection); + NXMRequestInfo requestInfo(period, NXMRequestInfo::TYPE_CHECKUPDATES, userData, subModule, game); + m_RequestQueue.enqueue(requestInfo); - connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), - receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)), + receiver, SLOT(nxmUpdateInfoAvailable(QString, QVariant, QVariant, int)), Qt::UniqueConnection); - nextRequest(); - return requestInfo.m_ID; - } - qCritical() << QString("You have fewer than 200 requests remaining (%1). Only downloads and login validation are being allowed.") - .arg(std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests)); - return -1; + connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), + receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + + nextRequest(); + return requestInfo.m_ID; } int NexusInterface::requestUpdates(const int &modID, QObject *receiver, QVariant userData, QString gameName, const QString &subModule) { - if (std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests) >= 200) { - IPluginGame *game = getGame(gameName); - if (game == nullptr) { - qCritical("requestUpdates can't find plugin for %s", qUtf8Printable(gameName)); - return -1; - } + if (m_User.shouldThrottle()) { + throttledWarning(m_User); + return -1; + } + + IPluginGame *game = getGame(gameName); + if (game == nullptr) { + qCritical("requestUpdates can't find plugin for %s", qUtf8Printable(gameName)); + return -1; + } - NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_GETUPDATES, userData, subModule, game); - m_RequestQueue.enqueue(requestInfo); + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_GETUPDATES, userData, subModule, game); + m_RequestQueue.enqueue(requestInfo); - connect(this, SIGNAL(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)), - receiver, SLOT(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)), + receiver, SLOT(nxmUpdatesAvailable(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); - connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), - receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), + receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); - nextRequest(); - return requestInfo.m_ID; - } - qCritical() << QString("You have fewer than 200 requests remaining (%1). Only downloads and login validation are being allowed.") - .arg(std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests)); - return -1; + nextRequest(); + return requestInfo.m_ID; } @@ -527,23 +622,23 @@ int NexusInterface::requestEndorsementInfo(QObject *receiver, QVariant userData, int NexusInterface::requestToggleEndorsement(QString gameName, int modID, QString modVersion, bool endorse, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game) { - if (std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests) >= 200) { - NXMRequestInfo requestInfo(modID, modVersion, NXMRequestInfo::TYPE_TOGGLEENDORSEMENT, userData, subModule, game); - requestInfo.m_Endorse = endorse; - m_RequestQueue.enqueue(requestInfo); + if (m_User.shouldThrottle()) { + throttledWarning(m_User); + return -1; + } - connect(this, SIGNAL(nxmEndorsementToggled(QString, int, QVariant, QVariant, int)), - receiver, SLOT(nxmEndorsementToggled(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); + NXMRequestInfo requestInfo(modID, modVersion, NXMRequestInfo::TYPE_TOGGLEENDORSEMENT, userData, subModule, game); + requestInfo.m_Endorse = endorse; + m_RequestQueue.enqueue(requestInfo); - connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), - receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmEndorsementToggled(QString, int, QVariant, QVariant, int)), + receiver, SLOT(nxmEndorsementToggled(QString, int, QVariant, QVariant, int)), Qt::UniqueConnection); - nextRequest(); - return requestInfo.m_ID; - } - qCritical() << QString("You have fewer than 200 requests remaining (%1). Only downloads and login validation are being allowed.") - .arg(std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests)); - return -1; + connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), + receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + + nextRequest(); + return requestInfo.m_ID; } int NexusInterface::requestTrackingInfo(QObject *receiver, QVariant userData, const QString &subModule) @@ -564,23 +659,23 @@ int NexusInterface::requestTrackingInfo(QObject *receiver, QVariant userData, co int NexusInterface::requestToggleTracking(QString gameName, int modID, bool track, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game) { - if (std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests) >= 200) { - NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_TOGGLETRACKING, userData, subModule, game); - requestInfo.m_Track = track; - m_RequestQueue.enqueue(requestInfo); + if (m_User.shouldThrottle()) { + throttledWarning(m_User); + return -1; + } - connect(this, SIGNAL(nxmTrackingToggled(QString, int, QVariant, bool, int)), - receiver, SLOT(nxmTrackingToggled(QString, int, QVariant, bool, int)), Qt::UniqueConnection); + NXMRequestInfo requestInfo(modID, NXMRequestInfo::TYPE_TOGGLETRACKING, userData, subModule, game); + requestInfo.m_Track = track; + m_RequestQueue.enqueue(requestInfo); - connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), - receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + connect(this, SIGNAL(nxmTrackingToggled(QString, int, QVariant, bool, int)), + receiver, SLOT(nxmTrackingToggled(QString, int, QVariant, bool, int)), Qt::UniqueConnection); - nextRequest(); - return requestInfo.m_ID; - } - qCritical() << QString("You have fewer than 200 requests remaining (%1). Only downloads and login validation are being allowed.") - .arg(std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests)); - return -1; + connect(this, SIGNAL(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), + receiver, SLOT(nxmRequestFailed(QString, int, int, QVariant, int, QNetworkReply::NetworkError, QString)), Qt::UniqueConnection); + + nextRequest(); + return requestInfo.m_ID; } int NexusInterface::requestInfoFromMd5(QString gameName, QByteArray &hash, QObject *receiver, QVariant userData, @@ -645,7 +740,7 @@ void NexusInterface::nextRequest() } } - if (std::max(m_RemainingDailyRequests, m_RemainingHourlyRequests) <= 0) { + if (m_User.exhausted()) { m_RequestQueue.clear(); QTime time = QTime::currentTime(); QTime targetTime; @@ -696,9 +791,9 @@ void NexusInterface::nextRequest() } break; case NXMRequestInfo::TYPE_DOWNLOADURL: { ModRepositoryFileInfo *fileInfo = qobject_cast(qvariant_cast(info.m_UserData)); - if (m_IsPremium) { + if (m_User.type() == APIUserAccountTypes::Premium) { url = QString("%1/games/%2/mods/%3/files/%4/download_link").arg(info.m_URL).arg(info.m_GameName).arg(info.m_ModID).arg(info.m_FileID); - } else if (!fileInfo->nexusKey.isEmpty() && fileInfo->nexusExpires && fileInfo->nexusDownloadUser == m_UserID) { + } else if (!fileInfo->nexusKey.isEmpty() && fileInfo->nexusExpires && fileInfo->nexusDownloadUser == m_User.id().toInt()) { url = QString("%1/games/%2/mods/%3/files/%4/download_link?key=%5&expires=%6") .arg(info.m_URL).arg(info.m_GameName).arg(info.m_ModID).arg(info.m_FileID).arg(fileInfo->nexusKey).arg(fileInfo->nexusExpires); } else { @@ -780,23 +875,16 @@ void NexusInterface::requestFinished(std::list::iterator iter) if (iter->m_AllowedErrors.contains(error) && iter->m_AllowedErrors[error].contains(statusCode)) { // These errors are allows to silently happen. They should be handled in nxmRequestFailed below. } else if (statusCode == 429) { - m_RemainingDailyRequests = reply->rawHeader("x-rl-daily-remaining").toInt(); - m_MaxDailyRequests = reply->rawHeader("x-rl-daily-limit").toInt(); - m_RemainingHourlyRequests = reply->rawHeader("x-rl-hourly-remaining").toInt(); - m_MaxHourlyRequests = reply->rawHeader("x-rl-hourly-limit").toInt(); + m_User.limits(parseLimits(reply)); - if (m_RemainingDailyRequests || m_RemainingHourlyRequests) + if (!m_User.exhausted()) { qWarning("You appear to be making requests to the Nexus API too quickly and are being throttled. Please inform the MO2 team."); - else + } + else { qWarning("All API requests have been consumed and are now being denied."); + } - emit requestsChanged(m_RequestQueue.size(), std::tuple(std::make_tuple( - m_RemainingDailyRequests, - m_MaxDailyRequests, - m_RemainingHourlyRequests, - m_MaxHourlyRequests - ))); - + emit requestsChanged(stats(), m_User); qWarning("Error: %s", reply->errorString().toUtf8().constData()); } else { qWarning("request failed: %s", reply->errorString().toUtf8().constData()); @@ -871,17 +959,8 @@ void NexusInterface::requestFinished(std::list::iterator iter) } break; } - m_RemainingDailyRequests = reply->rawHeader("x-rl-daily-remaining").toInt(); - m_MaxDailyRequests = reply->rawHeader("x-rl-daily-limit").toInt(); - m_RemainingHourlyRequests = reply->rawHeader("x-rl-hourly-remaining").toInt(); - m_MaxHourlyRequests = reply->rawHeader("x-rl-hourly-limit").toInt(); - - emit requestsChanged(m_RequestQueue.size(), std::tuple(std::make_tuple( - m_RemainingDailyRequests, - m_MaxDailyRequests, - m_RemainingHourlyRequests, - m_MaxHourlyRequests - ))); + m_User.limits(parseLimits(reply)); + emit requestsChanged(stats(), m_User); } else { emit nxmRequestFailed(iter->m_GameName, iter->m_ModID, iter->m_FileID, iter->m_UserData, iter->m_ID, reply->error(), tr("invalid response")); } @@ -938,6 +1017,15 @@ void NexusInterface::requestTimeout() } } +APIStats NexusInterface::stats() const +{ + APIStats stats; + stats.requestsQueued = m_RequestQueue.size(); + + return stats; +} + + namespace { QString get_management_url() { diff --git a/src/nexusinterface.h b/src/nexusinterface.h index 70c1c9c9..6c4e8d11 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -39,6 +39,131 @@ namespace MOBase { class IPluginGame; } class NexusInterface; class NXMAccessManager; + +/** + * represents user account types on a mod provider website such as nexus + */ +enum class APIUserAccountTypes +{ + // not logged in + None = 0, + + // regular account + Regular, + + // premium account + Premium +}; + + +/** + * current limits imposed on the user account + **/ +struct APILimits +{ + // maximum number of requests per day + int maxDailyRequests = 0; + + // remaining number of requests today + int remainingDailyRequests = 0; + + // maximum number of requests per hour + int maxHourlyRequests = 0; + + // remaining number of requests this hour + int remainingHourlyRequests = 0; +}; + + +/** + * API statistics + */ +struct APIStats +{ + // number of API requests currently queued + int requestsQueued = 0; +}; + + +/** + * represents a user account on the mod provier website + */ +class APIUserAccount +{ +public: + // when the number of remanining requests is under this number, further + // requests will be throttled by avoiding non-critical ones + static const int ThrottleThreshold = 300; + + APIUserAccount(); + + /** + * user id + */ + const QString& id() const; + + /** + * user name + */ + const QString& name() const; + + /** + * account type + */ + APIUserAccountTypes type() const; + + /** + * current API limits + */ + const APILimits& limits() const; + + + /** + * sets the user id + */ + APIUserAccount& id(const QString& id); + + /** + * sets the user name + **/ + APIUserAccount& name(const QString& name); + + /** + * sets the acount type + */ + APIUserAccount& type(APIUserAccountTypes type); + + /** + * sets the current limits + */ + APIUserAccount& limits(const APILimits& limits); + + + /** + * returns the number of remaining requests + */ + int remainingRequests() const; + + /** + * whether the number of remaining requests is low enough that further + * requests should be throttled + */ + bool shouldThrottle() const; + + /** + * true if all the remaining requests have been used and the API will refuse + * further requests + */ + bool exhausted() const; + +private: + QString m_id, m_name; + APIUserAccountTypes m_type; + APILimits m_limits; + APIStats m_stats; +}; + + /** * @brief convenience class to make nxm requests easier * usually, all objects that started a nxm request will be signaled if one finished. @@ -53,7 +178,6 @@ class NexusBridge : public MOBase::IModRepositoryBridge Q_OBJECT public: - NexusBridge(PluginContainer *pluginContainer, const QString &subModule = ""); /** @@ -147,6 +271,8 @@ public: }; public: + static APILimits defaultAPILimits(); + static APILimits parseLimits(const QNetworkReply* reply); ~NexusInterface(); @@ -380,7 +506,7 @@ public: /** * */ - int requestInfoFromMd5(QString gameName, QByteArray &hash, QObject *receiver, QVariant userData, const QString &subModule, + int requestInfoFromMd5(QString gameName, QByteArray &hash, QObject *receiver, QVariant userData, const QString &subModule, MOBase::IPluginGame const *game); /** @@ -459,11 +585,11 @@ signals: void nxmTrackedModsAvailable(QVariant userData, QVariant resultData, int requestID); void nxmTrackingToggled(QString gameName, int modID, QVariant userData, bool tracked, int requestID); void nxmRequestFailed(QString gameName, int modID, int fileID, QVariant userData, int requestID, QNetworkReply::NetworkError error, const QString &errorString); - void requestsChanged(int queueCount, std::tuple requestsRemaining); + void requestsChanged(const APIStats& stats, const APIUserAccount& user); public slots: - void setRateMax(const QString&, int userId, bool isPremium, std::tuple limits); + void setUserAccount(const APIUserAccount& user); private slots: @@ -534,27 +660,15 @@ private: QString getOldModsURL(QString gameName) const; private: - QNetworkDiskCache *m_DiskCache; - NXMAccessManager *m_AccessManager; - std::list m_ActiveRequest; QQueue m_RequestQueue; - MOBase::VersionInfo m_MOVersion; - PluginContainer *m_PluginContainer; + APIUserAccount m_User; - int m_RemainingDailyRequests; - int m_RemainingHourlyRequests; - int m_MaxDailyRequests; - int m_MaxHourlyRequests; - - int m_UserID; - - bool m_IsPremium; - + APIStats stats() const; }; #endif // NEXUSINTERFACE_H diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp index 684a53fa..5886d3ee 100644 --- a/src/nxmaccessmanager.cpp +++ b/src/nxmaccessmanager.cpp @@ -18,8 +18,8 @@ along with Mod Organizer. If not, see . */ #include "nxmaccessmanager.h" - #include "iplugingame.h" +#include "nexusinterface.h" #include "nxmurl.h" #include "report.h" #include "utility.h" @@ -280,14 +280,11 @@ void NXMAccessManager::validateFinished() QString name = credentialsData.value("name").toString(); bool premium = credentialsData.value("is_premium").toBool(); - std::tuple limits(std::make_tuple( - m_ValidateReply->rawHeader("x-rl-daily-remaining").toInt(), - m_ValidateReply->rawHeader("x-rl-daily-limit").toInt(), - m_ValidateReply->rawHeader("x-rl-hourly-remaining").toInt(), - m_ValidateReply->rawHeader("x-rl-hourly-limit").toInt() - )); - - emit credentialsReceived(name, id, premium, limits); + emit credentialsReceived(APIUserAccount() + .id(QString("%1").arg(id)) + .name(name) + .type(premium ? APIUserAccountTypes::Premium : APIUserAccountTypes::Regular) + .limits(NexusInterface::parseLimits(m_ValidateReply))); m_ValidateReply->deleteLater(); m_ValidateReply = nullptr; diff --git a/src/nxmaccessmanager.h b/src/nxmaccessmanager.h index e3608f8d..1d23faf9 100644 --- a/src/nxmaccessmanager.h +++ b/src/nxmaccessmanager.h @@ -20,7 +20,6 @@ along with Mod Organizer. If not, see . #ifndef NXMACCESSMANAGER_H #define NXMACCESSMANAGER_H - #include #include #include @@ -29,6 +28,8 @@ along with Mod Organizer. If not, see . namespace MOBase { class IPluginGame; } +class APIUserAccount; + /** * @brief access manager extended to handle nxm links **/ @@ -78,7 +79,7 @@ signals: void validateFailed(const QString &message); - void credentialsReceived(const QString &userName, int userId, bool premium, std::tuple limits); + void credentialsReceived(const APIUserAccount& user); private slots: diff --git a/src/statusbar.cpp b/src/statusbar.cpp index 7370662a..6af10c56 100644 --- a/src/statusbar.cpp +++ b/src/statusbar.cpp @@ -1,23 +1,26 @@ #include "statusbar.h" +#include "nexusinterface.h" +#include "settings.h" StatusBar::StatusBar(QStatusBar* bar) - : m_bar(bar), m_nexusAPI(new QLabel), m_progress(new QProgressBar) + : m_bar(bar), m_api(new QLabel), m_progress(new QProgressBar) { m_progress->setTextVisible(true); m_progress->setRange(0, 100); - m_progress->setValue(0); - m_progress->setVisible(false); - m_bar->addPermanentWidget(m_nexusAPI); + m_bar->addPermanentWidget(m_api); m_bar->addPermanentWidget(m_progress); + m_api->setObjectName("apistats"); + m_api->setStyleSheet("QLabel{ padding-left: 0.1em; padding-right: 0.1em; }"); + m_bar->clearMessage(); + setProgress(-1); + updateAPI({}, {}); } void StatusBar::setProgress(int percent) { - qDebug().nospace() << "progress: " << percent; - if (percent < 0 || percent >= 100) { m_progress->setVisible(false); } else if (!m_progress->isVisible()) { @@ -25,3 +28,41 @@ void StatusBar::setProgress(int percent) m_progress->setValue(percent); } } + +void StatusBar::updateAPI(const APIStats& stats, const APIUserAccount& user) +{ + m_api->setText( + QString("API: Q: %1 | D: %2 | H: %3") + .arg(stats.requestsQueued) + .arg(user.limits().remainingDailyRequests) + .arg(user.limits().remainingHourlyRequests)); + + QColor textColor; + QColor backgroundColor; + + if (user.type() == APIUserAccountTypes::None) { + backgroundColor = Qt::transparent; + } else if (user.remainingRequests() > 300) { + textColor = "white"; + backgroundColor = Qt::darkGreen; + } else if (user.remainingRequests() < 150) { + textColor = "white"; + backgroundColor = Qt::darkRed; + } else { + textColor = "black"; + backgroundColor = Qt::darkYellow; + } + + QPalette palette = m_api->palette(); + + palette.setColor(QPalette::WindowText, textColor); + palette.setColor(QPalette::Background, backgroundColor); + + m_api->setPalette(palette); + m_api->setAutoFillBackground(true); +} + +void StatusBar::checkSettings(const Settings& settings) +{ + m_api->setVisible(!settings.hideAPICounter()); +} diff --git a/src/statusbar.h b/src/statusbar.h index f3ad3081..47a0e56d 100644 --- a/src/statusbar.h +++ b/src/statusbar.h @@ -4,12 +4,18 @@ #include #include +struct APIStats; +class APIUserAccount; +class Settings; + class StatusBar { public: StatusBar(QStatusBar* bar); void setProgress(int percent); + void updateAPI(const APIStats& stats, const APIUserAccount& user); + void checkSettings(const Settings& settings); private: QStatusBar* m_bar; -- cgit v1.3.1 From a7757e8ba6f5d10feea9e58611bde4dcb911079b Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Thu, 13 Jun 2019 23:43:51 -0400 Subject: added option to hide the status bar centralized menu visibility into a showMenuBar() function --- src/mainwindow.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++------ src/mainwindow.h | 8 ++++++-- src/mainwindow.ui | 9 +++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2497b05d..c255759b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -203,6 +203,7 @@ MainWindow::MainWindow(QSettings &initSettings , ui(new Ui::MainWindow) , m_WasVisible(false) , m_menuBarVisible(true) + , m_statusBarVisible(true) , m_linksSeparator(nullptr) , m_Tutorial(this, "MainWindow") , m_OldProfileIndex(-1) @@ -752,6 +753,7 @@ void MainWindow::toolbarMenu_aboutToShow() ui->actionMainMenuToggle->setChecked(ui->menuBar->isVisible()); ui->actionToolBarMainToggle->setChecked(ui->toolBar->isVisible()); + ui->actionStatusBarToggle->setChecked(ui->statusBar->isVisible()); ui->actionToolBarSmallIcons->setChecked(ui->toolBar->iconSize() == SmallToolbarSize); ui->actionToolBarMediumIcons->setChecked(ui->toolBar->iconSize() == MediumToolbarSize); @@ -769,8 +771,7 @@ QMenu* MainWindow::createPopupMenu() void MainWindow::on_actionMainMenuToggle_triggered() { - ui->menuBar->setVisible(!ui->menuBar->isVisible()); - m_menuBarVisible = ui->menuBar->isVisible(); + showMenuBar(!ui->menuBar->isVisible()); } void MainWindow::on_actionToolBarMainToggle_triggered() @@ -778,6 +779,11 @@ void MainWindow::on_actionToolBarMainToggle_triggered() ui->toolBar->setVisible(!ui->toolBar->isVisible()); } +void MainWindow::on_actionStatusBarToggle_triggered() +{ + showStatusBar(!ui->statusBar->isVisible()); +} + void MainWindow::on_actionToolBarSmallIcons_triggered() { setToolbarSize(SmallToolbarSize); @@ -822,6 +828,36 @@ void MainWindow::setToolbarButtonStyle(Qt::ToolButtonStyle s) } } +void MainWindow::showMenuBar(bool b) +{ + ui->menuBar->setVisible(b); + m_menuBarVisible = b; +} + +void MainWindow::showStatusBar(bool b) +{ + ui->statusBar->setVisible(b); + m_statusBarVisible = b; + + // the central widget typically has no bottom padding because the status bar + // is more than enough, but when it's hidden, the bottom widget (currently + // the log) touches the bottom border of the window, which looks ugly + // + // when hiding the statusbar, the central widget is given the same border + // margin as it has on the top (which is typically 6, as it's the default from + // the qt designer) + + auto m = ui->centralWidget->layout()->contentsMargins(); + + if (b) { + m.setBottom(0); + } else { + m.setBottom(m.top()); + } + + ui->centralWidget->layout()->setContentsMargins(m); +} + void MainWindow::on_centralWidget_customContextMenuRequested(const QPoint &pos) { // this allows for getting the context menu even if both the menubar and all @@ -2096,8 +2132,11 @@ void MainWindow::readSettings() } if (settings.contains("menubar_visible")) { - m_menuBarVisible = settings.value("menubar_visible").toBool(); - ui->menuBar->setVisible(m_menuBarVisible); + showMenuBar(settings.value("menubar_visible").toBool()); + } + + if (settings.contains("statusbar_visible")) { + showStatusBar(settings.value("statusbar_visible").toBool()); } if (settings.contains("window_split")) { @@ -2193,6 +2232,7 @@ void MainWindow::storeSettings(QSettings &settings) { settings.setValue("toolbar_size", ui->toolBar->iconSize()); settings.setValue("toolbar_button_style", static_cast(ui->toolBar->toolButtonStyle())); settings.setValue("menubar_visible", m_menuBarVisible); + settings.setValue("statusbar_visible", m_statusBarVisible); settings.setValue("window_split", ui->splitter->saveState()); settings.setValue("window_monitor", QApplication::desktop()->screenNumber(this)); settings.setValue("log_split", ui->topLevelSplitter->saveState()); @@ -6989,8 +7029,7 @@ void MainWindow::keyReleaseEvent(QKeyEvent *event) // if the menubar is hidden, pressing Alt will make it visible if (event->key() == Qt::Key_Alt) { if (!ui->menuBar->isVisible()) { - ui->menuBar->setVisible(true); - m_menuBarVisible = true; + showMenuBar(true); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index e2c6ce8b..88389738 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -326,8 +326,8 @@ private: bool m_WasVisible; // this has to be remembered because by the time storeSettings() is called, - // the window is closed and the menubar is hidden - bool m_menuBarVisible; + // the window is closed and the all bars are hidden + bool m_menuBarVisible, m_statusBarVisible; std::unique_ptr m_statusBar; @@ -651,6 +651,7 @@ private slots: // ui slots void on_actionExit_triggered(); void on_actionMainMenuToggle_triggered(); void on_actionToolBarMainToggle_triggered(); + void on_actionStatusBarToggle_triggered(); void on_actionToolBarSmallIcons_triggered(); void on_actionToolBarMediumIcons_triggered(); void on_actionToolBarLargeIcons_triggered(); @@ -694,6 +695,9 @@ private slots: // ui slots void on_categoriesAndBtn_toggled(bool checked); void on_categoriesOrBtn_toggled(bool checked); void on_managedArchiveLabel_linkHovered(const QString &link); + + void showMenuBar(bool b); + void showStatusBar(bool b); }; diff --git a/src/mainwindow.ui b/src/mainwindow.ui index bbcb734c..98743b7e 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1397,6 +1397,7 @@ p, li { white-space: pre-wrap; } + @@ -1732,6 +1733,14 @@ p, li { white-space: pre-wrap; } &Menu + + + true + + + St&atus bar + + -- cgit v1.3.1 From c216442eb4368004055246222b7224769c37db82 Mon Sep 17 00:00:00 2001 From: Al Date: Thu, 20 Jun 2019 00:44:19 +0200 Subject: Modified Menu Bar: * Removed Edit and Copy Log as it was useless. * Moved Visit Nexus to Files. * Moved Profiles to Tools. * Renamed Tools submenu to "Tool Plugins". --- src/mainwindow.ui | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 98743b7e..0ee74239 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1358,7 +1358,7 @@ p, li { white-space: pre-wrap; } - + @@ -1366,9 +1366,9 @@ p, li { white-space: pre-wrap; } &Tools - - + + @@ -1379,14 +1379,9 @@ p, li { white-space: pre-wrap; } + - - - &Edit - - - &View @@ -1408,6 +1403,7 @@ p, li { white-space: pre-wrap; } + @@ -1416,7 +1412,6 @@ p, li { white-space: pre-wrap; } - @@ -1491,7 +1486,7 @@ p, li { white-space: pre-wrap; } :/MO/gui/plugins:/MO/gui/plugins - &Tools + &Tool Plugins &Tools -- cgit v1.3.1 From 724fad7cb62a0ee4913ed41bde45c7564183c7af Mon Sep 17 00:00:00 2001 From: Matte A Date: Sun, 23 Jun 2019 04:38:36 +0200 Subject: Correcting minor spelling mistakes in the UI + add contributor --- src/aboutdialog.ui | 4 ++-- src/instancemanager.cpp | 2 +- src/mainwindow.cpp | 4 ++-- src/mainwindow.ui | 4 ++-- src/moapplication.cpp | 4 ++-- src/modinfodialog.cpp | 8 ++++---- src/modinfodialog.ui | 8 ++++---- src/organizercore.cpp | 6 +++--- src/overwriteinfodialog.cpp | 8 ++++---- src/settingsdialog.ui | 4 ++-- src/spawn.cpp | 2 +- src/tutorials/tutorial_conflictresolution_main.js | 2 +- src/tutorials/tutorial_firststeps_main.js | 2 +- src/tutorials/tutorial_firststeps_modinfo.js | 2 +- 14 files changed, 30 insertions(+), 30 deletions(-) (limited to 'src/mainwindow.ui') diff --git a/src/aboutdialog.ui b/src/aboutdialog.ui index 86b95c83..1b3f0ad2 100644 --- a/src/aboutdialog.ui +++ b/src/aboutdialog.ui @@ -337,7 +337,7 @@ - Jax (Swedish) + Jax, Nubbie (Swedish) @@ -361,7 +361,7 @@ - Other Supporters && Contributors + Other Supporters & Contributors diff --git a/src/instancemanager.cpp b/src/instancemanager.cpp index 5b57827a..b5130e8b 100644 --- a/src/instancemanager.cpp +++ b/src/instancemanager.cpp @@ -102,7 +102,7 @@ QString InstanceManager::manageInstances(const QStringList &instanceList) const SelectionDialog selection( QString("

%1


%2") .arg(QObject::tr("Choose Instance to Delete")) - .arg(QObject::tr("Be Carefull! Deleting an Instance will remove all your files for that Instance (mods, downloads, profiles, configuration, ...). Custom paths outside of the instance folder for downloads, mods, etc. will be left untoched.")), + .arg(QObject::tr("Be Careful! Deleting an Instance will remove all your files for that Instance (mods, downloads, profiles, configuration, ...). Custom paths outside of the instance folder for downloads, mods, etc. will be left untoched.")), nullptr); for (const QString &instance : instanceList) { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e383006b..da7c721d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -6796,7 +6796,7 @@ void MainWindow::on_bossButton_clicked() } if (errorMessages.length() > 0) { - QMessageBox *warn = new QMessageBox(QMessageBox::Warning, tr("Errors occured"), errorMessages.c_str(), QMessageBox::Ok, this); + QMessageBox *warn = new QMessageBox(QMessageBox::Warning, tr("Errors occurred"), errorMessages.c_str(), QMessageBox::Ok, this); warn->setModal(false); warn->show(); } @@ -6899,7 +6899,7 @@ void MainWindow::on_saveModsButton_clicked() m_OrganizerCore.currentProfile()->writeModlistNow(true); QDateTime now = QDateTime::currentDateTime(); if (createBackup(m_OrganizerCore.currentProfile()->getModlistFileName(), now)) { - MessageDialog::showMessage(tr("Backup of modlist created"), this); + MessageDialog::showMessage(tr("Backup of mod list created"), this); } } diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 0ee74239..6a816262 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -221,8 +221,8 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Create profiles here. Each profile contains its own list of active mods and esps. This way you can quickly switch between setups for different play throughs.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Please note that right now your esp load order is not kept seperate for different profiles.</span></p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Create profiles here. Each profile contains its own list of active mods and esps. This way you can quickly switch between setups for different playthroughs.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Please note that right now your esp load order is not kept separate for different profiles.</span></p></body></html>
diff --git a/src/moapplication.cpp b/src/moapplication.cpp index 3a791827..5652833a 100644 --- a/src/moapplication.cpp +++ b/src/moapplication.cpp @@ -116,12 +116,12 @@ bool MOApplication::notify(QObject *receiver, QEvent *event) } catch (const std::exception &e) { qCritical("uncaught exception in handler (object %s, eventtype %d): %s", receiver->objectName().toUtf8().constData(), event->type(), e.what()); - reportError(tr("an error occured: %1").arg(e.what())); + reportError(tr("an error occurred: %1").arg(e.what())); return false; } catch (...) { qCritical("uncaught non-std exception in handler (object %s, eventtype %d)", receiver->objectName().toUtf8().constData(), event->type()); - reportError(tr("an error occured")); + reportError(tr("an error occurred")); return false; } } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 2be8e481..188ea956 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -1670,13 +1670,13 @@ void ModInfoDialog::delete_activated() } else if (selection->selectedRows().count() == 1) { QString fileName = m_FileSystemModel->fileName(selection->selectedRows().at(0)); - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete \"%1\"?").arg(fileName), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete \"%1\"?").arg(fileName), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } } else { - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete the selected files?"), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete the selected files?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } @@ -1695,12 +1695,12 @@ void ModInfoDialog::deleteTriggered() return; } else if (m_FileSelection.count() == 1) { QString fileName = m_FileSystemModel->fileName(m_FileSelection.at(0)); - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete \"%1\"?").arg(fileName), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete \"%1\"?").arg(fileName), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } } else { - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete the selected files?"), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete the selected files?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index e009a599..eed4e31f 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -136,7 +136,7 @@ This is a list of ini tweaks (ini modifications that can be toggled). - This is a list of ini tweaks. Ini Tweaks are (usually small) fragments of ini files that are applied over existing settings in skyrim.ini/skyrimprefs.ini. Each tweak can be toggled individually. You should check the description of the mod wether the tweaks are really optional. + This is a list of ini tweaks. Ini Tweaks are (usually small) fragments of ini files that are applied over existing settings in skyrim.ini/skyrimprefs.ini. Each tweak can be toggled individually. You should check the description of the mod whether the tweaks are really optional. @@ -383,7 +383,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e ESPs in the data directory and thus visible to the game. - These are the mod files that are in the (virtual) data directory of your game and will thus be selecteable in the esp list in the main window. + These are the mod files that are in the (virtual) data directory of your game and will thus be selectable in the esp list in the main window. @@ -897,7 +897,7 @@ text-align: left; <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mod ID for this mod on Nexus. This is filled in automatically if you downloaded and installed the mod from inside MO. Otherwise you can enter it manually. To find the correct id, find the mod on nexus. The URL will look like this: <a href=" https://www.nexusmods.com/skyrimspecialedition/mods/6194"><span style=" text-decoration: underline; color:#0000ff;">https://www.nexusmods.com/skyrimspecialedition/mods/6194</span></a>. In this example, 6194 is the id you're looking for. Besides: The above is the link to Mod Organizer2 on Nexus. Why not go there now and endorse us?</p></body></html> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mod ID for this mod on Nexus. This is filled in automatically if you downloaded and installed the mod from inside MO. Otherwise you can enter it manually. To find the correct id, find the mod on nexus. The URL will look like this: <a href=" https://www.nexusmods.com/skyrimspecialedition/mods/6194"><span style=" text-decoration: underline; color:#0000ff;">https://www.nexusmods.com/skyrimspecialedition/mods/6194</span></a>. In this example, 6194 is the id you're looking for. Besides: The above is the link to Mod Organizer 2 on Nexus. Why not go there now and endorse us?</p></body></html> @@ -1067,7 +1067,7 @@ p, li { white-space: pre-wrap; } - Web page URL (only used if invalid NexusID) : + Web page URL (only used if invalid Nexus ID) : diff --git a/src/organizercore.cpp b/src/organizercore.cpp index c724e57f..2cad9ce8 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -391,7 +391,7 @@ void OrganizerCore::storeSettings() if (!shellCopy(iniFile, iniFile + ".new", true, qApp->activeWindow())) { QMessageBox::critical( qApp->activeWindow(), tr("Failed to write settings"), - tr("An error occured trying to update MO settings to %1: %2") + tr("An error occurred trying to update MO settings to %1: %2") .arg(iniFile, windowsErrorString(::GetLastError()))); return; } @@ -418,7 +418,7 @@ void OrganizerCore::storeSettings() : tr("Unknown error %1").arg(result); QMessageBox::critical( qApp->activeWindow(), tr("Failed to write settings"), - tr("An error occured trying to write back MO settings to %1: %2") + tr("An error occurred trying to write back MO settings to %1: %2") .arg(writeTarget, reason)); } } @@ -1570,7 +1570,7 @@ HANDLE OrganizerCore::spawnBinaryProcess(const QFileInfo &binary, tr("MO was denied access to the Steam process. This normally indicates that " "Steam is being run as administrator while MO is not. This can cause issues " "launching the game. It is recommended to not run Steam as administrator unless " - "absolutely neccessary.\n\n" + "absolutely necessary.\n\n" "Restart MO as administrator?"), QDialogButtonBox::Yes | QDialogButtonBox::No | QDialogButtonBox::Cancel); if (result == QDialogButtonBox::Yes) { diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index 9b3e55df..0a884ac9 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -162,13 +162,13 @@ void OverwriteInfoDialog::delete_activated() } else if (selection->selectedRows().count() == 1) { QString fileName = m_FileSystemModel->fileName(selection->selectedRows().at(0)); - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete \"%1\"?").arg(fileName), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete \"%1\"?").arg(fileName), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } } else { - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete the selected files?"), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete the selected files?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } @@ -187,12 +187,12 @@ void OverwriteInfoDialog::deleteTriggered() return; } else if (m_FileSelection.count() == 1) { QString fileName = m_FileSystemModel->fileName(m_FileSelection.at(0)); - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete \"%1\"?").arg(fileName), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete \"%1\"?").arg(fileName), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } } else { - if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete the selected files?"), + if (QMessageBox::question(this, tr("Confirm"), tr("Are you sure you want to delete the selected files?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { return; } diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui index 08c8d9f2..faaf1653 100644 --- a/src/settingsdialog.ui +++ b/src/settingsdialog.ui @@ -441,7 +441,7 @@ If you use pre-releases, never contact me directly by e-mail or via private mess - Important: All directories have to be writeable! + Important: All directories have to be writable! @@ -1297,7 +1297,7 @@ programs you are intentionally running. Decides the amount of data printed to "ModOrganizer.log". - "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regluar use. On the "Error" level the log file usually remains empty. + "Debug" produces very useful information for finding problems. There is usually no noteworthy performance impact but the file may become rather large. If this is a problem you may prefer the "Info" level for regular use. On the "Error" level the log file usually remains empty. diff --git a/src/spawn.cpp b/src/spawn.cpp index d7d5efc2..f77da35f 100644 --- a/src/spawn.cpp +++ b/src/spawn.cpp @@ -150,7 +150,7 @@ HANDLE startBinary(const QFileInfo &binary, if (e.getErrorCode() == ERROR_ELEVATION_REQUIRED) { if (QMessageBox::question(QApplication::activeModalWidget(), QObject::tr("Elevation required"), QObject::tr("This process requires elevation to run.\n" - "This is a potential security risk so I highly advice you to investigate if\n" + "This is a potential security risk so I highly advise you to investigate if\n" "\"%1\"\n" "can be installed to work without elevation.\n\n" "Restart Mod Organizer as an elevated process?\n" diff --git a/src/tutorials/tutorial_conflictresolution_main.js b/src/tutorials/tutorial_conflictresolution_main.js index 3c782af2..404afe5d 100644 --- a/src/tutorials/tutorial_conflictresolution_main.js +++ b/src/tutorials/tutorial_conflictresolution_main.js @@ -56,7 +56,7 @@ function getTutorialSteps() { waitForClick() }, function() { - tutorial.text = qsTr(" indicates that the mod is completely overwrtten by another. You could as well disable it."); + tutorial.text = qsTr(" indicates that the mod is completely overwritten by another. You could as well disable it."); waitForClick() }, function() { diff --git a/src/tutorials/tutorial_firststeps_main.js b/src/tutorials/tutorial_firststeps_main.js index ee97766b..35d1aa11 100644 --- a/src/tutorials/tutorial_firststeps_main.js +++ b/src/tutorials/tutorial_firststeps_main.js @@ -137,7 +137,7 @@ function getTutorialSteps() function() { tutorial.text = qsTr("A single mod may contain zero, one or multiple esps. Some or all may be optional. " - + "If in doubt, please consult the documentation of the indiviual mod. " + + "If in doubt, please consult the documentation of the individual mod. " + "To do so, right-click the mod and select \"Information\".") highlightItem("modList", true) manager.activateTutorial("ModInfoDialog", "tutorial_firststeps_modinfo.js") diff --git a/src/tutorials/tutorial_firststeps_modinfo.js b/src/tutorials/tutorial_firststeps_modinfo.js index 50c38345..1ed0dab7 100644 --- a/src/tutorials/tutorial_firststeps_modinfo.js +++ b/src/tutorials/tutorial_firststeps_modinfo.js @@ -16,7 +16,7 @@ function getTutorialSteps() }, function() { unhighlight() - tutorial.text = qsTr("We may re-visit this screen in later tutorials.") + tutorial.text = qsTr("We may revisit this screen in later tutorials.") waitForClick() } ] -- cgit v1.3.1 From 6378a80ad00aef4b8ae78c189fc032eac8d9e78e Mon Sep 17 00:00:00 2001 From: isanae <14251494+isanae@users.noreply.github.com> Date: Sat, 6 Jul 2019 20:03:01 -0400 Subject: fixed duplicate mnemonic for status bar --- src/mainwindow.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/mainwindow.ui') diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 6a816262..70d1cf39 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1733,7 +1733,7 @@ p, li { white-space: pre-wrap; } true - St&atus bar + Status &bar -- cgit v1.3.1