From b598efd9be7ea7ae43fa4f78d8dfebaa9cf37fb9 Mon Sep 17 00:00:00 2001 From: kraxarn Date: Sat, 27 Jan 2024 20:01:17 +0100 Subject: [PATCH] Add settings for window title --- src/settingspage/application.cpp | 120 +++++++++++++++++++++++++++++++ src/settingspage/application.hpp | 18 +++++ src/util/font.cpp | 7 ++ src/util/font.hpp | 1 + 4 files changed, 146 insertions(+) diff --git a/src/settingspage/application.cpp b/src/settingspage/application.cpp index fd4c6b2a..99189987 100644 --- a/src/settingspage/application.cpp +++ b/src/settingspage/application.cpp @@ -1,10 +1,42 @@ #include "settingspage/application.hpp" + +#include + #include "mainwindow.hpp" SettingsPage::Application::Application(lib::settings &settings, QWidget *parent) : SettingsPage::Base(settings, parent) { addTab(app(), "General"); + + if (lib::developer_mode::enabled) + { + addTab(windowTitle(), QStringLiteral("Window title")); + } +} + +void SettingsPage::Application::hideEvent(QHideEvent *event) +{ + Base::hideEvent(event); + + const auto *mainWindow = MainWindow::find(parent()); + if (mainWindow != nullptr) + { + disconnect(mainWindow, &MainWindow::playbackRefreshed, + this, &Application::onPlaybackRefreshed); + } +} + +void SettingsPage::Application::showEvent(QShowEvent *event) +{ + Base::showEvent(event); + + const auto *mainWindow = MainWindow::find(parent()); + if (mainWindow != nullptr) + { + connect(mainWindow, &MainWindow::playbackRefreshed, + this, &Application::onPlaybackRefreshed); + } } auto SettingsPage::Application::app() -> QWidget * @@ -84,6 +116,60 @@ auto SettingsPage::Application::app() -> QWidget * return Widget::layoutToWidget(layout, this); } +auto SettingsPage::Application::windowTitle() -> QWidget * +{ + auto *layout = new QVBoxLayout(); + + auto *formatLayout = new QGridLayout(); + formatLayout->setVerticalSpacing(0); + + auto *titleFormatTitle = new QLabel(QStringLiteral("Format"), this); + formatLayout->addWidget(titleFormatTitle, 0, 0); + + titleFormat = new QLineEdit(this); + titleFormat->setFont(Font::monospace()); + titleFormat->setPlaceholderText(QStringLiteral("{artist} - {track}")); + formatLayout->addWidget(titleFormat, 0, 1); + + connect(titleFormat, &QLineEdit::textEdited, + this, &Application::onTitleFormatEdited); + + titlePreview = new QLabel(this); + titlePreview->setFont(Font::italic()); + formatLayout->addWidget(titlePreview, 1, 1); + + layout->addLayout(formatLayout); + + const QMap options{ + {QStringLiteral("{artist}"), QStringLiteral("Name of primary artist")}, + {QStringLiteral("{artists}"), QStringLiteral("All artists, seperated by commas")}, + {QStringLiteral("{track}"), QStringLiteral("Name of track")}, + }; + + auto *infoLayout = new QGridLayout(); + infoLayout->setRowStretch(static_cast(options.size()), 1); + QMapIterator iter(options); + auto row = 0; + + while (iter.hasNext()) + { + iter.next(); + + auto *key = new QLabel(iter.key(), this); + key->setFont(Font::monospace()); + infoLayout->addWidget(key, row, 0); + + auto *value = new QLabel(iter.value(), this); + infoLayout->addWidget(value, row++, 1); + } + + auto *infoBox = new QGroupBox(QStringLiteral("Possible values"), this); + infoBox->setLayout(infoLayout); + layout->addWidget(infoBox, 1); + + return Widget::layoutToWidget(layout, this); +} + auto SettingsPage::Application::icon() -> QIcon { return Icon::get(QStringLiteral("document-properties")); @@ -169,3 +255,37 @@ auto SettingsPage::Application::save() -> bool return success; } + +void SettingsPage::Application::updatePreview() +{ + if (titleFormat == nullptr + || titlePreview == nullptr + || !currentTrack.is_valid()) + { + return; + } + + const auto format = titleFormat->text().isEmpty() + ? titleFormat->placeholderText() + : titleFormat->text(); + + const auto title = lib::format::title(currentTrack, format.toStdString()); + titlePreview->setText(QString::fromStdString(title)); +} + +void SettingsPage::Application::onPlaybackRefreshed(const lib::spt::playback ¤t, + const lib::spt::playback &/*previous*/) +{ + if (currentTrack.id == current.item.id) + { + return; + } + + currentTrack = current.item; + updatePreview(); +} + +void SettingsPage::Application::onTitleFormatEdited(const QString &/*text*/) +{ + updatePreview(); +} diff --git a/src/settingspage/application.hpp b/src/settingspage/application.hpp index 198398ec..f54a6af8 100644 --- a/src/settingspage/application.hpp +++ b/src/settingspage/application.hpp @@ -2,6 +2,7 @@ #include "util/icon.hpp" #include "lib/settings.hpp" +#include "lib/spotify/playback.hpp" #include "settingspage/base.hpp" #include "util/widget.hpp" @@ -16,6 +17,10 @@ namespace SettingsPage auto title() -> QString override; auto save() -> bool override; + protected: + void hideEvent(QHideEvent *event) override; + void showEvent(QShowEvent *event) override; + private: QCheckBox *appMedia = nullptr; QCheckBox *appHotkeys = nullptr; @@ -25,6 +30,11 @@ namespace SettingsPage QCheckBox *appUpdates = nullptr; QCheckBox *ignoreUnavailableIndex = nullptr; + QLineEdit *titleFormat; + QLabel *titlePreview; + + lib::spt::track currentTrack; + static constexpr int minRefreshInterval = 1; static constexpr int maxRefreshInterval = 60; @@ -32,5 +42,13 @@ namespace SettingsPage static constexpr int maxMaxQueue = 1000; auto app() -> QWidget *; + auto windowTitle() -> QWidget *; + + void updatePreview(); + + void onPlaybackRefreshed(const lib::spt::playback ¤t, + const lib::spt::playback &previous); + + void onTitleFormatEdited(const QString &text); }; } diff --git a/src/util/font.cpp b/src/util/font.cpp index c52ce7f6..4d806bec 100644 --- a/src/util/font.cpp +++ b/src/util/font.cpp @@ -9,6 +9,13 @@ auto Font::monospace() -> QFont return QFontDatabase::systemFont(QFontDatabase::FixedFont); } +auto Font::italic() -> QFont +{ + QFont font; + font.setItalic(true); + return font; +} + auto Font::numberWidth() -> int { QFont font; diff --git a/src/util/font.hpp b/src/util/font.hpp index 5d044aa8..8962331f 100644 --- a/src/util/font.hpp +++ b/src/util/font.hpp @@ -7,6 +7,7 @@ class Font { public: static auto monospace() -> QFont; + static auto italic() -> QFont; static auto numberWidth() -> int; static void setFontWeight(QAction *action, QFont::Weight weight);