diff options
Diffstat (limited to 'src/statusbar.cpp')
| -rw-r--r-- | src/statusbar.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/statusbar.cpp b/src/statusbar.cpp new file mode 100644 index 00000000..e9a6e658 --- /dev/null +++ b/src/statusbar.cpp @@ -0,0 +1,168 @@ +#include "statusbar.h" +#include "nexusinterface.h" +#include "settings.h" +#include "ui_mainwindow.h" + +StatusBar::StatusBar(QStatusBar* bar, Ui::MainWindow* ui) : + m_bar(bar), m_progress(new QProgressBar), + m_notifications(new StatusBarAction(ui->actionNotifications)), + m_update(new StatusBarAction(ui->actionUpdate)), + m_api(new QLabel) +{ + QWidget* spacer1 = new QWidget; + spacer1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + spacer1->setHidden(true); + spacer1->setVisible(true); + m_bar->addPermanentWidget(spacer1, 0); + m_bar->addPermanentWidget(m_progress); + QWidget* spacer2 = new QWidget; + spacer2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + spacer2->setHidden(true); + spacer2->setVisible(true); + m_bar->addPermanentWidget(spacer2,0); + m_bar->addPermanentWidget(m_notifications); + m_bar->addPermanentWidget(m_update); + m_bar->addPermanentWidget(m_api); + + + m_progress->setTextVisible(true); + m_progress->setRange(0, 100); + m_progress->setMaximumWidth(300); + m_progress->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + m_update->set(false); + m_notifications->set(false); + + m_api->setObjectName("apistats"); + m_api->setToolTip(QObject::tr( + "This tracks the number of queued Nexus API requests, as well as the " + "remaining daily and hourly requests. 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.")); + + m_bar->clearMessage(); + setProgress(-1); + setAPI({}, {}); +} + +void StatusBar::setProgress(int percent) +{ + if (percent < 0 || percent >= 100) { + m_bar->clearMessage(); + m_progress->setVisible(false); + } else { + m_bar->showMessage(QObject::tr("Loading...")); + m_progress->setVisible(true); + m_progress->setValue(percent); + } +} + +void StatusBar::setNotifications(bool hasNotifications) +{ + m_notifications->set(hasNotifications); +} + +void StatusBar::setAPI(const APIStats& stats, const APIUserAccount& user) +{ + QString text; + QString textColor; + QString backgroundColor; + + if (user.type() == APIUserAccountTypes::None) { + text = "API: not logged in"; + textColor = ""; + backgroundColor = ""; + } else { + text = QString("API: Queued: %1 | Daily: %2 | Hourly: %3") + .arg(stats.requestsQueued) + .arg(user.limits().remainingDailyRequests) + .arg(user.limits().remainingHourlyRequests); + + if (user.remainingRequests() > 500) { + textColor = "white"; + backgroundColor = "darkgreen"; + } else if (user.remainingRequests() > 200) { + textColor = "black"; + backgroundColor = "rgb(226, 192, 0)"; // yellow + } else { + textColor = "white"; + backgroundColor = "darkred"; + } + } + + m_api->setText(text); + + QString ss(R"( + QLabel + { + padding-left: 0.1em; + padding-right: 0.1em; + padding-top: 0; + padding-bottom: 0;)"); + + if (!textColor.isEmpty()) { + ss += QString("\ncolor: %1;").arg(textColor); + } + + if (!backgroundColor.isEmpty()) { + ss += QString("\nbackground-color: %2;").arg(backgroundColor); + } + + ss += "\n}"; + + m_api->setStyleSheet(ss); + m_api->setAutoFillBackground(true); +} + +void StatusBar::setUpdateAvailable(bool b) +{ + m_update->set(b); +} + +void StatusBar::checkSettings(const Settings& settings) +{ + m_api->setVisible(!settings.hideAPICounter()); +} + + +StatusBarAction::StatusBarAction(QAction* action) + : m_action(action), m_icon(new QLabel), m_text(new QLabel) +{ + setLayout(new QHBoxLayout); + layout()->setContentsMargins(0, 0, 0, 0); + layout()->addWidget(m_icon); + layout()->addWidget(m_text); +} + +void StatusBarAction::set(bool visible) +{ + if (visible) { + m_icon->setPixmap(m_action->icon().pixmap(16, 16)); + m_text->setText(cleanupActionText(m_action->text())); + } + + setVisible(visible); +} + +void StatusBarAction::mouseDoubleClickEvent(QMouseEvent* e) +{ + if (m_action->isEnabled()) { + m_action->trigger(); + } +} + +QString StatusBarAction::cleanupActionText(const QString& original) const +{ + QString s = original; + + s.replace(QRegExp("\\&([^&])"), "\\1"); // &Item -> Item + s.replace("&&", "&"); // &&Item -> &Item + + if (s.endsWith("...")) { + s = s.left(s.size() - 3); + } + + return s; +} |
