Mercurial > minori
changeset 370:ea3a74ed2ef9
*: hm, last commit wasn't quite finished?
author | Paper <paper@tflc.us> |
---|---|
date | Fri, 25 Jul 2025 10:22:04 -0400 |
parents | 47c9f8502269 |
children | c87dcf967cff |
files | include/core/session.h src/gui/dialog/about.cc src/gui/dialog/dialog.cc src/gui/dialog/information.cc src/gui/dialog/licenses.cc src/gui/dialog/settings.cc src/gui/pages/anime_list.cc src/gui/pages/history.cc src/gui/pages/now_playing.cc src/gui/pages/search.cc src/gui/pages/seasons.cc src/gui/pages/statistics.cc src/gui/pages/torrents.cc src/gui/translate/anilist.cc src/gui/translate/anime.cc src/gui/translate/config.cc src/gui/widgets/anime_button.cc src/gui/widgets/anime_info.cc src/gui/widgets/clickable_label.cc src/gui/widgets/drop_list_widget.cc src/gui/widgets/optional_date.cc src/gui/widgets/poster.cc src/gui/widgets/sidebar.cc src/gui/widgets/text.cc |
diffstat | 24 files changed, 822 insertions(+), 591 deletions(-) [+] |
line wrap: on
line diff
--- a/include/core/session.h Fri Jul 25 10:16:02 2025 -0400 +++ b/include/core/session.h Fri Jul 25 10:22:04 2025 -0400 @@ -11,9 +11,9 @@ #include "semver/semver.hpp" #include <atomic> +#include <cstdint> #include <random> #include <string> -#include <cstdint> class MainWindow;
--- a/src/gui/dialog/about.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/dialog/about.cc Fri Jul 25 10:22:04 2025 -0400 @@ -1,29 +1,30 @@ #include "gui/dialog/about.h" -#include "gui/dialog/licenses.h" #include "core/json.h" #include "core/session.h" #include "core/strings.h" +#include "gui/dialog/licenses.h" #include "gui/widgets/text.h" #include "utf8proc.h" +#include <fmt/core.h> #include <toml11/toml.hpp> -#include <fmt/core.h> #include <QCoreApplication> #include <QFont> #include <QHBoxLayout> +#include <QPushButton> #include <QTextBrowser> #include <QTextCharFormat> #include <QTextCursor> -#include <QPushButton> #include <curl/curl.h> #ifdef WIN32 -# include "sys/win32/dark_theme.h" +# include "sys/win32/dark_theme.h" #endif template<typename T, size_t N> -constexpr size_t array_size(T (&)[N]) { +constexpr size_t array_size(T (&)[N]) +{ return N; } @@ -34,49 +35,55 @@ static constexpr semver::version toml11_version{TOML11_VERSION_MAJOR, TOML11_VERSION_MINOR, TOML11_VERSION_PATCH}; static constexpr semver::version fugue_icons_version{3, 5, 6}; -const char* get_curl_version() { - const curl_version_info_data* data = curl_version_info(CURLVERSION_NOW); +const char *get_curl_version() +{ + const curl_version_info_data *data = curl_version_info(CURLVERSION_NOW); return data->version; } static constexpr std::string_view about_template = - "<body>" - "<h2 style=\"font-weight: normal;\"><strong>Minori</strong> v{}</h2>" - "<p><strong>Author:</strong><br>Paper <paper@paper.us.eu.org></p>" - "<p><strong>Third party components:</strong><br>" - "<a href=\"https://curl.se/\">libcurl v{}</a>, " - "<a href=\"https://p.yusukekamiyamane.com/\">Fugue Icons v{}</a>, " - "<a href=\"https://github.com/erengy/anitomy\">Anitomy</a>, " - "<a href=\"https://github.com/nlohmann/json\">JSON for Modern C++ v{}</a>, " - "<a href=\"https://github.com/Neargye/semver\">semver v{}</a>, " - "<a href=\"http://juliastrings.github.io/utf8proc/\">utf8proc v{}</a>, " - "<a href=\"https://github.com/fmtlib/fmt\">fmt v{}</a>, " - "<a href=\"https://github.com/ToruNiina/toml11\">toml11 v{}</a>, " - "and parts of <a href=\"https://github.com/erengy/anisthesia\">Anisthesia</a>" - "</p>" - "<span><strong>Special thanks:</strong></span>" + "<body>" + "<h2 style=\"font-weight: normal;\"><strong>Minori</strong> v{}</h2>" + "<p><strong>Author:</strong><br>Paper <paper@paper.us.eu.org></p>" + "<p><strong>Third party components:</strong><br>" + "<a href=\"https://curl.se/\">libcurl v{}</a>, " + "<a href=\"https://p.yusukekamiyamane.com/\">Fugue Icons v{}</a>, " + "<a href=\"https://github.com/erengy/anitomy\">Anitomy</a>, " + "<a href=\"https://github.com/nlohmann/json\">JSON for Modern C++ v{}</a>, " + "<a href=\"https://github.com/Neargye/semver\">semver v{}</a>, " + "<a href=\"http://juliastrings.github.io/utf8proc/\">utf8proc v{}</a>, " + "<a href=\"https://github.com/fmtlib/fmt\">fmt v{}</a>, " + "<a href=\"https://github.com/ToruNiina/toml11\">toml11 v{}</a>, " + "and parts of <a href=\"https://github.com/erengy/anisthesia\">Anisthesia</a>" + "</p>" + "<span><strong>Special thanks:</strong></span>" "<ul style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 15px; margin-right: 0px; -qt-list-indent:0;\">" "<li><strong>Eren Okka</strong> for creating <a href=\"https://taiga.moe/\">Taiga</a></li>" - "<li><strong>Alex Huszagh</strong> and <strong>Colin Duquesnoy</strong> for creating BreezeStyleSheets, on which the dark theme in this program is based off of</li>" + "<li><strong>Alex Huszagh</strong> and <strong>Colin Duquesnoy</strong> for creating BreezeStyleSheets, on which " + "the dark theme in this program is based off of</li>" "<li><strong>Andy Brice</strong> for providing some sample code for detecting dark mode on Windows and macOS</li>" "<li><strong>Manuel Wudka-Robles</strong> for providing information on getting open file descriptors on macOS</li>" "</ul>" "</body>"; -AboutWindow::AboutWindow(QWidget* parent) : Dialog(parent) { +AboutWindow::AboutWindow(QWidget *parent) : Dialog(parent) +{ setMinimumSize(641, 325); setWindowTitle(tr("About Minori")); setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); setAutoFillBackground(true); - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout *layout = new QVBoxLayout(this); - std::string html = fmt::format(about_template, session.version.to_string(), get_curl_version(), fugue_icons_version.to_string(), json_version.to_string(), semver_version.to_string(), utf8proc_version(), fmt_version.to_string(), toml11_version.to_string()); + std::string html = + fmt::format(about_template, session.version.to_string(), get_curl_version(), fugue_icons_version.to_string(), + json_version.to_string(), semver_version.to_string(), utf8proc_version(), fmt_version.to_string(), + toml11_version.to_string()); setBackgroundRole(QPalette::Base); { - QTextBrowser* paragraph = new QTextBrowser(this); + QTextBrowser *paragraph = new QTextBrowser(this); paragraph->setOpenExternalLinks(true); paragraph->setFrameShape(QFrame::NoFrame); paragraph->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -89,7 +96,7 @@ { QPushButton *license = new QPushButton("&Licenses", this); layout->addWidget(license, Qt::AlignRight); - connect(license, &QPushButton::clicked, this, []{ + connect(license, &QPushButton::clicked, this, [] { LicensesWindow dialog; dialog.exec(); });
--- a/src/gui/dialog/dialog.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/dialog/dialog.cc Fri Jul 25 10:22:04 2025 -0400 @@ -2,10 +2,11 @@ #include "gui/widgets/text.h" #ifdef WIN32 -# include "sys/win32/dark_theme.h" +# include "sys/win32/dark_theme.h" #endif -void Dialog::showEvent(QShowEvent* event) { +void Dialog::showEvent(QShowEvent *event) +{ QDialog::showEvent(event); #ifdef WIN32 win32::SetTitleBarsToBlack(session.config.theme.IsInDarkTheme());
--- a/src/gui/dialog/information.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/dialog/information.cc Fri Jul 25 10:22:04 2025 -0400 @@ -27,12 +27,13 @@ #include <functional> #include <iostream> #ifdef WIN32 -# include "sys/win32/dark_theme.h" +# include "sys/win32/dark_theme.h" #endif /* TODO: Taiga disables rendering of the tab widget entirely when the anime is not part of a list, which sucks. Think of a better way to implement this later. */ -void InformationDialog::SaveData(Anime::Anime* anime) { +void InformationDialog::SaveData(Anime::Anime *anime) +{ if (!anime->IsInUserList()) return; @@ -45,9 +46,10 @@ anime->SetUserDateCompleted(_completed); } -InformationDialog::InformationDialog(Anime::Anime* anime, std::function<void(Anime::Anime*)> accept, enum Pages page, - QWidget* parent) - : Dialog(parent) { +InformationDialog::InformationDialog(Anime::Anime *anime, std::function<void(Anime::Anime *)> accept, enum Pages page, + QWidget *parent) + : Dialog(parent) +{ /* ack. lots of brackets here, but MUCH, MUCH MUCH better than what it used to be */ setFixedSize(842, 613); setWindowTitle(tr("Anime Information")); @@ -59,20 +61,20 @@ setPalette(pal); } - QVBoxLayout* full_layout = new QVBoxLayout(this); + QVBoxLayout *full_layout = new QVBoxLayout(this); { /* this handles the actual page. */ - QWidget* widget = new QWidget(this); - QHBoxLayout* layout = new QHBoxLayout(widget); + QWidget *widget = new QWidget(this); + QHBoxLayout *layout = new QHBoxLayout(widget); { /* Sidebar */ - QWidget* sidebar = new QWidget(widget); - QVBoxLayout* sidebar_layout = new QVBoxLayout(sidebar); + QWidget *sidebar = new QWidget(widget); + QVBoxLayout *sidebar_layout = new QVBoxLayout(sidebar); { /* Poster */ - Poster* poster = new Poster(*anime, sidebar); + Poster *poster = new Poster(*anime, sidebar); sidebar_layout->addWidget(poster); } sidebar_layout->setContentsMargins(0, 0, 0, 0); @@ -82,56 +84,57 @@ { /* ... everything else. */ - QWidget* main_widget = new QWidget(widget); - QVBoxLayout* main_layout = new QVBoxLayout(main_widget); + QWidget *main_widget = new QWidget(widget); + QVBoxLayout *main_layout = new QVBoxLayout(main_widget); main_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); { /* Anime title */ - TextWidgets::Title* anime_title = new TextWidgets::Title(main_widget); + TextWidgets::Title *anime_title = new TextWidgets::Title(main_widget); anime_title->SetText(anime->GetUserPreferredTitle()); main_layout->addWidget(anime_title); } { /* Tab widget, contains main info and settings */ - QTabWidget* tabbed_widget = new QTabWidget(main_widget); + QTabWidget *tabbed_widget = new QTabWidget(main_widget); tabbed_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); { /* Main information */ - AnimeInfoWidget* main_information_widget = new AnimeInfoWidget(*anime, tabbed_widget); + AnimeInfoWidget *main_information_widget = new AnimeInfoWidget(*anime, tabbed_widget); tabbed_widget->addTab(main_information_widget, tr("Main information")); } if (anime->IsInUserList()) { /* My list and settings */ - QWidget* settings_widget = new QWidget(tabbed_widget); + QWidget *settings_widget = new QWidget(tabbed_widget); settings_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); - QVBoxLayout* settings_layout = new QVBoxLayout(settings_widget); + QVBoxLayout *settings_layout = new QVBoxLayout(settings_widget); - TextWidgets::Header* header = new TextWidgets::Header(settings_widget); + TextWidgets::Header *header = new TextWidgets::Header(settings_widget); header->SetText(Strings::Translate("Anime list")); settings_layout->addWidget(header); { /* Anime List */ - QWidget* sg_anime_list_content = new QWidget(settings_widget); + QWidget *sg_anime_list_content = new QWidget(settings_widget); constexpr int LAYOUT_HORIZ_SPACING = 25; constexpr int LAYOUT_VERT_SPACING = 5; constexpr int LAYOUT_ITEM_WIDTH = 175; - QVBoxLayout* al_layout = new QVBoxLayout(sg_anime_list_content); + QVBoxLayout *al_layout = new QVBoxLayout(sg_anime_list_content); al_layout->setSpacing(LAYOUT_VERT_SPACING); al_layout->setContentsMargins(12, 0, 0, 0); /* Helper function for creating sections, reduces clutter. */ - const auto CREATE_SECTION = [](QWidget* parent, std::function<void(QWidget*, QGridLayout*)> x) { - QWidget* section = new QWidget(parent); - QGridLayout* layout = new QGridLayout(section); + const auto CREATE_SECTION = [](QWidget *parent, + std::function<void(QWidget *, QGridLayout *)> x) { + QWidget *section = new QWidget(parent); + QGridLayout *layout = new QGridLayout(section); layout->setHorizontalSpacing(LAYOUT_HORIZ_SPACING); layout->setVerticalSpacing(LAYOUT_VERT_SPACING); layout->setContentsMargins(0, 0, 0, 0); @@ -139,14 +142,14 @@ parent->layout()->addWidget(section); }; - CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget* section, QGridLayout* layout) { + CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget *section, QGridLayout *layout) { { /* Episodes watched... */ layout->addWidget(new QLabel(tr("Episodes watched:"), section), 0, 0); - QSpinBox* spin_box = new QSpinBox(section); + QSpinBox *spin_box = new QSpinBox(section); connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, - [this](int i) { _progress = i; }); + [this](int i) { _progress = i; }); spin_box->setRange(0, anime->GetEpisodes()); spin_box->setSingleStep(1); spin_box->setValue(_progress = anime->GetUserProgress()); @@ -156,36 +159,37 @@ { /* Rewatching? */ - QCheckBox* checkbox = new QCheckBox(tr("Rewatching")); + QCheckBox *checkbox = new QCheckBox(tr("Rewatching")); connect(checkbox, QOverload<int>::of(&QCheckBox::stateChanged), this, - [this](int state) { _rewatching = (state == Qt::Checked); }); + [this](int state) { _rewatching = (state == Qt::Checked); }); checkbox->setCheckState((_rewatching = anime->GetUserIsRewatching()) ? Qt::Checked - : Qt::Unchecked); + : Qt::Unchecked); checkbox->setFixedWidth(LAYOUT_ITEM_WIDTH); layout->addWidget(checkbox, 1, 1); } layout->setColumnStretch(layout->columnCount(), 1); }); - CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget* section, QGridLayout* layout) { + CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget *section, QGridLayout *layout) { { /* Status */ layout->addWidget(new QLabel(tr("Status:"), section), 0, 0); - QComboBox* combo_box = new QComboBox(section); + QComboBox *combo_box = new QComboBox(section); _status = anime->GetUserStatus(); for (unsigned int i = 0; i < Anime::ListStatuses.size(); i++) { - combo_box->addItem(Strings::ToQString(Translate::ToLocalString(Anime::ListStatuses[i])), - static_cast<int>(Anime::ListStatuses[i])); + combo_box->addItem( + Strings::ToQString(Translate::ToLocalString(Anime::ListStatuses[i])), + static_cast<int>(Anime::ListStatuses[i])); if (Anime::ListStatuses[i] == _status) combo_box->setCurrentIndex(i); } connect(combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged), this, - [this, combo_box](int) { - _status = static_cast<Anime::ListStatus>(combo_box->currentData().toInt()); - }); + [this, combo_box](int) { + _status = static_cast<Anime::ListStatus>(combo_box->currentData().toInt()); + }); /* this should NEVER, EVER, be NOT_IN_LIST */ combo_box->setFixedWidth(LAYOUT_ITEM_WIDTH); @@ -196,9 +200,9 @@ /* Score */ layout->addWidget(new QLabel(tr("Score:"), section), 0, 1); - QSpinBox* spin_box = new QSpinBox(section); + QSpinBox *spin_box = new QSpinBox(section); connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, - [this](int i) { _score = i; }); + [this](int i) { _score = i; }); spin_box->setRange(0, 100); spin_box->setSingleStep(5); spin_box->setValue(_score = anime->GetUserScore()); @@ -208,11 +212,11 @@ layout->setColumnStretch(layout->columnCount(), 1); }); - CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget* section, QGridLayout* layout) { + CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget *section, QGridLayout *layout) { layout->addWidget(new QLabel(tr("Notes:"), section), 0, 0); - QLineEdit* line_edit = new QLineEdit(section); - connect(line_edit, &QLineEdit::textChanged, this, [this](const QString& text) { + QLineEdit *line_edit = new QLineEdit(section); + connect(line_edit, &QLineEdit::textChanged, this, [this](const QString &text) { /* this sucks but I don't really want to implement anything smarter :) */ _notes = Strings::ToUtf8String(text); }); @@ -221,14 +225,14 @@ layout->addWidget(line_edit, 1, 0); }); - CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget* section, QGridLayout* layout) { + CREATE_SECTION(sg_anime_list_content, [this, &anime](QWidget *section, QGridLayout *layout) { /* Started */ { layout->addWidget(new QLabel(tr("Date started:"), section), 0, 0); - OptionalDate* date = new OptionalDate(true, section); + OptionalDate *date = new OptionalDate(true, section); connect(date, &OptionalDate::DataChanged, this, - [this](bool enabled, Date date) { _started = enabled ? date : Date(); }); + [this](bool enabled, Date date) { _started = enabled ? date : Date(); }); date->setFixedWidth(LAYOUT_ITEM_WIDTH); _started = anime->GetUserDateStarted(); if (!_started.IsValid()) { @@ -243,9 +247,9 @@ { layout->addWidget(new QLabel(tr("Date completed:"), section), 0, 1); - OptionalDate* date = new OptionalDate(true, section); + OptionalDate *date = new OptionalDate(true, section); connect(date, &OptionalDate::DataChanged, this, - [this](bool enabled, Date date) { _completed = enabled ? date : Date(); }); + [this](bool enabled, Date date) { _completed = enabled ? date : Date(); }); date->setFixedWidth(LAYOUT_ITEM_WIDTH); _completed = anime->GetUserDateCompleted(); if (!_completed.IsValid()) { @@ -263,28 +267,28 @@ /* { - // commenting this out until it actually gets implemented :) + // commenting this out until it actually gets implemented :) - settings_layout->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget)); + settings_layout->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget)); - QWidget* sg_local_content = new QWidget(settings_widget); - QVBoxLayout* sg_local_layout = new QVBoxLayout(sg_local_content); - sg_local_layout->setSpacing(5); - sg_local_layout->setContentsMargins(12, 0, 0, 0); + QWidget* sg_local_content = new QWidget(settings_widget); + QVBoxLayout* sg_local_layout = new QVBoxLayout(sg_local_content); + sg_local_layout->setSpacing(5); + sg_local_layout->setContentsMargins(12, 0, 0, 0); - CREATE_SECTION(sg_local_content, [this, &anime](QWidget* section, QGridLayout* layout){ - layout->addWidget(new QLabel(tr("Alternative titles:"), section), 0, 0); + CREATE_SECTION(sg_local_content, [this, &anime](QWidget* section, QGridLayout* layout){ + layout->addWidget(new QLabel(tr("Alternative titles:"), section), 0, 0); - QLineEdit* line_edit = new QLineEdit("", section); - line_edit->setPlaceholderText( - tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)")); - layout->addWidget(line_edit, 1, 0); + QLineEdit* line_edit = new QLineEdit("", section); + line_edit->setPlaceholderText( + tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)")); + layout->addWidget(line_edit, 1, 0); - QCheckBox* checkbox = new QCheckBox(tr("Use the first alternative title to search for + QCheckBox* checkbox = new QCheckBox(tr("Use the first alternative title to search for torrents")); layout->addWidget(checkbox, 2, 0); - }); + }); - settings_layout->addWidget(sg_local_content); + settings_layout->addWidget(sg_local_content); } */ @@ -307,7 +311,7 @@ { /* Dialog box buttons */ - QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + QDialogButtonBox *button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); connect(button_box, &QDialogButtonBox::accepted, this, [this, accept, anime] { SaveData(anime); accept(anime);
--- a/src/gui/dialog/licenses.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/dialog/licenses.cc Fri Jul 25 10:22:04 2025 -0400 @@ -7,28 +7,30 @@ #include <fmt/core.h> #include <QCoreApplication> +#include <QFile> #include <QFont> #include <QHBoxLayout> #include <QTabWidget> #include <QTextBrowser> #include <QTextCharFormat> #include <QTextCursor> -#include <QFile> #include <curl/curl.h> #ifdef WIN32 -# include "sys/win32/dark_theme.h" +# include "sys/win32/dark_theme.h" #endif -static QWidget *create_license_widget(QWidget *parent, const QString& license) { - QTextBrowser* paragraph = new QTextBrowser(parent); +static QWidget *create_license_widget(QWidget *parent, const QString &license) +{ + QTextBrowser *paragraph = new QTextBrowser(parent); paragraph->setFrameShape(QFrame::NoFrame); paragraph->setPlainText(license); paragraph->setFont(QFont("monospace")); return paragraph; } -static void create_basic_license(QTabWidget *tab_widget, const QString& filename, const QString& title) { +static void create_basic_license(QTabWidget *tab_widget, const QString &filename, const QString &title) +{ QFile f(filename); if (!f.exists()) return; @@ -37,7 +39,9 @@ tab_widget->addTab(create_license_widget(tab_widget, f.readAll()), title); } -static void create_dual_license(QTabWidget *tab_widget, const QString& filename1, const QString& title1, const QString& filename2, const QString& title2) { +static void create_dual_license(QTabWidget *tab_widget, const QString &filename1, const QString &title1, + const QString &filename2, const QString &title2) +{ QString l1, l2; { QFile f1(filename1), f2(filename2); @@ -54,7 +58,11 @@ QWidget *dual = new QWidget(tab_widget); QVBoxLayout *dual_layout = new QVBoxLayout(dual); - QLabel *dual_notice = new QLabel(QCoreApplication::tr("%1 was originally forked from %2, where any changes divergent from %2 are now under a different license. Both the licenses for %1 and %2 are provided below, respectfully:").arg(title1, title2), dual); + QLabel *dual_notice = new QLabel( + QCoreApplication::tr("%1 was originally forked from %2, where any changes divergent from %2 are now under a " + "different license. Both the licenses for %1 and %2 are provided below, respectfully:") + .arg(title1, title2), + dual); dual_notice->setWordWrap(true); dual_layout->addWidget(dual_notice); dual_layout->addWidget(create_license_widget(dual, l1)); @@ -63,13 +71,14 @@ tab_widget->addTab(dual, title1); } -LicensesWindow::LicensesWindow(QWidget* parent) : Dialog(parent) { +LicensesWindow::LicensesWindow(QWidget *parent) : Dialog(parent) +{ resize(641, 500); setWindowTitle(tr("About Minori")); setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); setAutoFillBackground(true); - QHBoxLayout* layout = new QHBoxLayout(this); + QHBoxLayout *layout = new QHBoxLayout(this); setBackgroundRole(QPalette::Base); @@ -79,7 +88,8 @@ create_basic_license(tab_widget, ":/licenses/LICENSE.minori", tr("Minori")); - create_dual_license(tab_widget, ":/licenses/LICENSE.MIT.animone", tr("Animone"), ":/licenses/LICENSE.BSD.animone", tr("Anisthesia")); + create_dual_license(tab_widget, ":/licenses/LICENSE.MIT.animone", tr("Animone"), ":/licenses/LICENSE.BSD.animone", + tr("Anisthesia")); create_basic_license(tab_widget, ":/licenses/LICENSE.anitomy", tr("Anitomy")); create_basic_license(tab_widget, ":/licenses/LICENSE.fmt", tr("fmt"));
--- a/src/gui/dialog/settings.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/dialog/settings.cc Fri Jul 25 10:22:04 2025 -0400 @@ -9,13 +9,11 @@ #include <QVBoxLayout> #include <QWidget> #ifdef WIN32 -# include "sys/win32/dark_theme.h" +# include "sys/win32/dark_theme.h" #endif -SettingsPage::SettingsPage(QWidget* parent, QString title) - : QWidget(parent) - , page_title_(title) - , layout_(this) { +SettingsPage::SettingsPage(QWidget *parent, QString title) : QWidget(parent), page_title_(title), layout_(this) +{ setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); page_title_.setWordWrap(false); @@ -49,19 +47,23 @@ layout_.addWidget(&tab_widget_); } -void SettingsPage::SetTitle(QString title) { +void SettingsPage::SetTitle(QString title) +{ page_title_.setText(title); } -void SettingsPage::AddTab(QWidget* tab, QString title) { +void SettingsPage::AddTab(QWidget *tab, QString title) +{ tab_widget_.addTab(tab, title); } -void SettingsPage::SaveInfo() { +void SettingsPage::SaveInfo() +{ // no-op... child classes will implement this } -void SettingsDialog::OnOK() { +void SettingsDialog::OnOK() +{ services_page_.SaveInfo(); library_page_.SaveInfo(); application_page_.SaveInfo(); @@ -71,11 +73,10 @@ QDialog::accept(); } -SettingsDialog::SettingsDialog(QWidget* parent) - : Dialog(parent) - , layout_(this) - , widget_layout_(&widget_) - , button_box_(QDialogButtonBox::Ok | QDialogButtonBox::Cancel) { +SettingsDialog::SettingsDialog(QWidget *parent) + : Dialog(parent), layout_(this), widget_layout_(&widget_), + button_box_(QDialogButtonBox::Ok | QDialogButtonBox::Cancel) +{ setFixedSize(755, 566); setWindowTitle(tr("Settings")); setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
--- a/src/gui/pages/anime_list.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/anime_list.cc Fri Jul 25 10:22:04 2025 -0400 @@ -14,38 +14,42 @@ #include "core/session.h" #include "core/strings.h" #include "core/time.h" -#include "library/library.h" #include "gui/dialog/information.h" #include "gui/translate/anime.h" +#include "library/library.h" #include "services/services.h" #include <QDate> #include <QDebug> +#include <QDesktopServices> #include <QHBoxLayout> #include <QHeaderView> #include <QMenu> #include <QProgressBar> +#include <QRunnable> #include <QShortcut> #include <QStylePainter> #include <QStyledItemDelegate> #include <QThreadPool> -#include <QRunnable> #include <QTreeView> -#include <QDesktopServices> #include <QUrl> #include <iostream> #include <vector> -AnimeListPageUpdateEntryThread::AnimeListPageUpdateEntryThread(QObject* parent) : QThread(parent) {} +AnimeListPageUpdateEntryThread::AnimeListPageUpdateEntryThread(QObject *parent) : QThread(parent) +{ +} -void AnimeListPageUpdateEntryThread::AddToQueue(int id) { +void AnimeListPageUpdateEntryThread::AddToQueue(int id) +{ const std::lock_guard<std::mutex> guard(queue_mutex_); queue_.push(id); } /* processes the queue... */ -void AnimeListPageUpdateEntryThread::run() { +void AnimeListPageUpdateEntryThread::run() +{ queue_mutex_.lock(); while (!queue_.empty() && !isInterruptionRequested()) { int id = queue_.front(); @@ -63,10 +67,12 @@ emit NeedRefresh(); } -AnimeListPageSortFilter::AnimeListPageSortFilter(QObject* parent) : QSortFilterProxyModel(parent) { +AnimeListPageSortFilter::AnimeListPageSortFilter(QObject *parent) : QSortFilterProxyModel(parent) +{ } -bool AnimeListPageSortFilter::lessThan(const QModelIndex& l, const QModelIndex& r) const { +bool AnimeListPageSortFilter::lessThan(const QModelIndex &l, const QModelIndex &r) const +{ QVariant left = sourceModel()->data(l, sortRole()); QVariant right = sourceModel()->data(r, sortRole()); @@ -83,22 +89,26 @@ /* -------------------------------------------------- */ -AnimeListPageModel::AnimeListPageModel(QObject* parent, Anime::ListStatus _status) : QAbstractListModel(parent) { +AnimeListPageModel::AnimeListPageModel(QObject *parent, Anime::ListStatus _status) : QAbstractListModel(parent) +{ status = _status; return; } -int AnimeListPageModel::rowCount(const QModelIndex& parent) const { +int AnimeListPageModel::rowCount(const QModelIndex &parent) const +{ return list.size(); (void)(parent); } -int AnimeListPageModel::columnCount(const QModelIndex& parent) const { +int AnimeListPageModel::columnCount(const QModelIndex &parent) const +{ return NB_COLUMNS; (void)(parent); } -QVariant AnimeListPageModel::headerData(const int section, const Qt::Orientation orientation, const int role) const { +QVariant AnimeListPageModel::headerData(const int section, const Qt::Orientation orientation, const int role) const +{ if (role == Qt::DisplayRole) { switch (section) { case AL_TITLE: return tr("Anime title"); @@ -133,7 +143,8 @@ return QAbstractListModel::headerData(section, orientation, role); } -QVariant AnimeListPageModel::data(const QModelIndex& index, int role) const { +QVariant AnimeListPageModel::data(const QModelIndex &index, int role) const +{ if (!index.isValid()) return QVariant(); switch (role) { @@ -142,7 +153,7 @@ case AL_TITLE: return Strings::ToQString(list[index.row()].GetUserPreferredTitle()); case AL_PROGRESS: return QString::number(list[index.row()].GetUserProgress()) + "/" + - QString::number(list[index.row()].GetEpisodes()); + QString::number(list[index.row()].GetEpisodes()); case AL_EPISODES: return list[index.row()].GetEpisodes(); case AL_SCORE: return Strings::ToQString(list[index.row()].GetUserPresentableScore()); case AL_TYPE: return Strings::ToQString(Translate::ToString(list[index.row()].GetFormat())); @@ -153,7 +164,8 @@ case AL_UPDATED: { if (list[index.row()].GetUserTimeUpdated() == 0) return QString("-"); - return Strings::ToQString(Time::GetSecondsAsRelativeString(Time::GetSystemTime() - list[index.row()].GetUserTimeUpdated())); + return Strings::ToQString(Time::GetSecondsAsRelativeString(Time::GetSystemTime() - + list[index.row()].GetUserTimeUpdated())); } case AL_NOTES: return Strings::ToQString(list[index.row()].GetUserNotes()); default: return ""; @@ -190,11 +202,13 @@ return QVariant(); } -Anime::Anime* AnimeListPageModel::GetAnimeFromIndex(QModelIndex index) { +Anime::Anime *AnimeListPageModel::GetAnimeFromIndex(QModelIndex index) +{ return &list.at(index.row()); } -void AnimeListPageModel::RefreshList() { +void AnimeListPageModel::RefreshList() +{ /* equivalent to hasChildren()... */ if (!rowCount(index(0))) { beginInsertRows(QModelIndex(), 0, 0); @@ -205,7 +219,7 @@ list.clear(); - for (const auto& a : Anime::db.items) + for (const auto &a : Anime::db.items) if (a.second.IsInUserList() && a.second.GetUserStatus() == status) list.push_back(a.second); @@ -214,7 +228,8 @@ /* ----------------------------------------------------------------- */ -int AnimeListPage::VisibleColumnsCount() const { +int AnimeListPage::VisibleColumnsCount() const +{ int count = 0; for (int i = 0, end = tree_view->header()->count(); i < end; i++) { @@ -225,7 +240,8 @@ return count; } -void AnimeListPage::SetColumnDefaults() { +void AnimeListPage::SetColumnDefaults() +{ tree_view->setColumnHidden(AnimeListPageModel::AL_SEASON, false); tree_view->setColumnHidden(AnimeListPageModel::AL_TYPE, false); tree_view->setColumnHidden(AnimeListPageModel::AL_UPDATED, false); @@ -240,7 +256,8 @@ tree_view->setColumnHidden(AnimeListPageModel::AL_NOTES, true); } -void AnimeListPage::UpdateAnime(int id) { +void AnimeListPage::UpdateAnime(int id) +{ /* this ought to just add to the thread's buffer. */ if (update_entry_thread_.isRunning()) update_entry_thread_.requestInterruption(); @@ -249,14 +266,16 @@ update_entry_thread_.start(); } -void AnimeListPage::RemoveAnime(int id) { - Anime::Anime& anime = Anime::db.items[id]; +void AnimeListPage::RemoveAnime(int id) +{ + Anime::Anime &anime = Anime::db.items[id]; anime.RemoveFromUserList(); Refresh(); } -void AnimeListPage::DisplayColumnHeaderMenu() { - QMenu* menu = new QMenu(this); +void AnimeListPage::DisplayColumnHeaderMenu() +{ + QMenu *menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); menu->setTitle(tr("Column visibility")); menu->setToolTipsVisible(true); @@ -265,9 +284,9 @@ if (i == AnimeListPageModel::AL_TITLE) continue; const auto column_name = - sort_models[tab_bar->currentIndex()]->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); + sort_models[tab_bar->currentIndex()]->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); - QAction* action = menu->addAction(column_name, this, [this, i](const bool checked) { + QAction *action = menu->addAction(column_name, this, [this, i](const bool checked) { if (!checked && (VisibleColumnsCount() <= 1)) return; @@ -293,18 +312,19 @@ menu->popup(QCursor::pos()); } -void AnimeListPage::DisplayListMenu() { +void AnimeListPage::DisplayListMenu() +{ QMenu *const menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); menu->setToolTipsVisible(true); - AnimeListPageModel* source_model = - reinterpret_cast<AnimeListPageModel*>(sort_models[tab_bar->currentIndex()]->sourceModel()); + AnimeListPageModel *source_model = + reinterpret_cast<AnimeListPageModel *>(sort_models[tab_bar->currentIndex()]->sourceModel()); const QItemSelection selection = - sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection()); + sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection()); - std::set<Anime::Anime*> animes; - for (const auto& index : selection.indexes()) { + std::set<Anime::Anime *> animes; + for (const auto &index : selection.indexes()) { if (!index.isValid()) continue; @@ -372,8 +392,9 @@ Anime::Anime *anime = *animes.begin(); menu->addAction(tr("Information"), [this, anime] { - InformationDialog* dialog = new InformationDialog( - anime, [this](Anime::Anime* anime) { UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MAIN_INFO, this); + InformationDialog *dialog = new InformationDialog( + anime, [this](Anime::Anime *anime) { UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MAIN_INFO, + this); dialog->show(); dialog->raise(); @@ -384,17 +405,18 @@ menu->addSeparator(); menu->addAction(tr("Edit"), [this, anime] { - InformationDialog* dialog = new InformationDialog( - anime, [this](Anime::Anime* anime) { UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MY_LIST, this); + InformationDialog *dialog = new InformationDialog( + anime, [this](Anime::Anime *anime) { UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MY_LIST, + this); dialog->show(); dialog->raise(); dialog->activateWindow(); connect(dialog, &InformationDialog::finished, dialog, &InformationDialog::deleteLater); }); - menu->addAction(tr("Delete from list..."), [this, anime] { - RemoveAnime(anime->GetId()); - }, QKeySequence(QKeySequence::Delete)); + menu->addAction( + tr("Delete from list..."), [this, anime] { RemoveAnime(anime->GetId()); }, + QKeySequence(QKeySequence::Delete)); menu->addSeparator(); @@ -405,9 +427,7 @@ QDesktopServices::openUrl(QUrl::fromLocalFile(Strings::ToQString(path.value().u8string()))); }); - menu->addAction(tr("Scan available episodes"), [this, anime] { - Library::db.Refresh(anime->GetId()); - }); + menu->addAction(tr("Scan available episodes"), [this, anime] { Library::db.Refresh(anime->GetId()); }); menu->addSeparator(); @@ -428,38 +448,47 @@ menu->addAction(tr("Play last episode (#%1)").arg(progress), [this, anime, progress] { const int id = anime->GetId(); - if (Library::db.items.find(id) == Library::db.items.end() - || Library::db.items[id].find(progress) == Library::db.items[id].end()) + if (Library::db.items.find(id) == Library::db.items.end() || + Library::db.items[id].find(progress) == Library::db.items[id].end()) return; - QDesktopServices::openUrl(QUrl::fromLocalFile(Strings::ToQString(Library::db.items[id][progress].u8string()))); + QDesktopServices::openUrl( + QUrl::fromLocalFile(Strings::ToQString(Library::db.items[id][progress].u8string()))); }); } if (progress < episodes) { - menu->addAction(tr("Play next episode (#%1)").arg(progress + 1), [this, anime, progress] { - const int id = anime->GetId(); + menu->addAction( + tr("Play next episode (#%1)").arg(progress + 1), + [this, anime, progress] { + const int id = anime->GetId(); - if (Library::db.items.find(id) == Library::db.items.end() - || Library::db.items[id].find(progress + 1) == Library::db.items[id].end()) - return; + if (Library::db.items.find(id) == Library::db.items.end() || + Library::db.items[id].find(progress + 1) == Library::db.items[id].end()) + return; - QDesktopServices::openUrl(QUrl::fromLocalFile(Strings::ToQString(Library::db.items[id][progress + 1].u8string()))); - }, QKeySequence(Qt::CTRL | Qt::Key_N)); + QDesktopServices::openUrl( + QUrl::fromLocalFile(Strings::ToQString(Library::db.items[id][progress + 1].u8string()))); + }, + QKeySequence(Qt::CTRL | Qt::Key_N)); } - menu->addAction(tr("Play random episode"), [this, anime, episodes] { - const int id = anime->GetId(); + menu->addAction( + tr("Play random episode"), + [this, anime, episodes] { + const int id = anime->GetId(); - std::uniform_int_distribution<int> distrib(1, episodes); - const int episode = distrib(session.gen); + std::uniform_int_distribution<int> distrib(1, episodes); + const int episode = distrib(session.gen); - if (Library::db.items.find(id) == Library::db.items.end() - || Library::db.items[id].find(episode) == Library::db.items[id].end()) - return; + if (Library::db.items.find(id) == Library::db.items.end() || + Library::db.items[id].find(episode) == Library::db.items[id].end()) + return; - QDesktopServices::openUrl(QUrl::fromLocalFile(Strings::ToQString(Library::db.items[id][episode].u8string()))); - }, QKeySequence(Qt::CTRL | Qt::Key_R)); + QDesktopServices::openUrl( + QUrl::fromLocalFile(Strings::ToQString(Library::db.items[id][episode].u8string()))); + }, + QKeySequence(Qt::CTRL | Qt::Key_R)); menu->popup(QCursor::pos()); } else { @@ -467,22 +496,23 @@ } } -void AnimeListPage::ItemDoubleClicked() { +void AnimeListPage::ItemDoubleClicked() +{ /* throw out any other garbage */ const QItemSelection selection = - sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection()); + sort_models[tab_bar->currentIndex()]->mapSelectionToSource(tree_view->selectionModel()->selection()); if (!selection.indexes().first().isValid()) { return; } - AnimeListPageModel* source_model = - reinterpret_cast<AnimeListPageModel*>(sort_models[tab_bar->currentIndex()]->sourceModel()); + AnimeListPageModel *source_model = + reinterpret_cast<AnimeListPageModel *>(sort_models[tab_bar->currentIndex()]->sourceModel()); const QModelIndex index = source_model->index(selection.indexes().first().row()); - Anime::Anime& anime = Anime::db.items[source_model->GetAnimeFromIndex(index)->GetId()]; + Anime::Anime &anime = Anime::db.items[source_model->GetAnimeFromIndex(index)->GetId()]; - InformationDialog* dialog = new InformationDialog( - &anime, [this](Anime::Anime* anime) { UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MAIN_INFO, this); + InformationDialog *dialog = new InformationDialog( + &anime, [this](Anime::Anime *anime) { UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MAIN_INFO, this); dialog->show(); dialog->raise(); @@ -490,25 +520,29 @@ connect(dialog, &InformationDialog::finished, dialog, &InformationDialog::deleteLater); } -void AnimeListPage::RefreshList() { +void AnimeListPage::RefreshList() +{ for (unsigned int i = 0; i < sort_models.size(); i++) - reinterpret_cast<AnimeListPageModel*>(sort_models[i]->sourceModel())->RefreshList(); + reinterpret_cast<AnimeListPageModel *>(sort_models[i]->sourceModel())->RefreshList(); } -void AnimeListPage::RefreshTabs() { +void AnimeListPage::RefreshTabs() +{ for (unsigned int i = 0; i < sort_models.size(); i++) tab_bar->setTabText(i, Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])) + " (" + - QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")"); + QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")"); } -void AnimeListPage::Refresh() { +void AnimeListPage::Refresh() +{ RefreshList(); RefreshTabs(); } /* -------- QTabWidget replication begin --------- */ -void AnimeListPage::InitBasicStyle(QStyleOptionTabWidgetFrame* option) const { +void AnimeListPage::InitBasicStyle(QStyleOptionTabWidgetFrame *option) const +{ if (!option) return; @@ -518,7 +552,8 @@ option->tabBarRect = tab_bar->geometry(); } -void AnimeListPage::InitStyle(QStyleOptionTabWidgetFrame* option) const { +void AnimeListPage::InitStyle(QStyleOptionTabWidgetFrame *option) const +{ if (!option) return; @@ -539,7 +574,8 @@ option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, nullptr, this); } -void AnimeListPage::SetupLayout() { +void AnimeListPage::SetupLayout() +{ QStyleOptionTabWidgetFrame option; InitStyle(&option); @@ -552,7 +588,8 @@ tree_view->parentWidget()->setGeometry(contentsRect); } -void AnimeListPage::paintEvent(QPaintEvent*) { +void AnimeListPage::paintEvent(QPaintEvent *) +{ QStylePainter p(this); QStyleOptionTabWidgetFrame opt; @@ -561,26 +598,29 @@ p.drawPrimitive(QStyle::PE_FrameTabWidget, opt); } -void AnimeListPage::resizeEvent(QResizeEvent* e) { +void AnimeListPage::resizeEvent(QResizeEvent *e) +{ QWidget::resizeEvent(e); SetupLayout(); } -void AnimeListPage::showEvent(QShowEvent*) { +void AnimeListPage::showEvent(QShowEvent *) +{ SetupLayout(); Refresh(); } /* --------- QTabWidget replication end ---------- */ -AnimeListPage::AnimeListPage(QWidget* parent) : QWidget(parent) { +AnimeListPage::AnimeListPage(QWidget *parent) : QWidget(parent) +{ /* Tab bar */ tab_bar = new QTabBar(this); tab_bar->setExpanding(false); tab_bar->setDrawBase(false); /* Tree view... */ - QWidget* tree_widget = new QWidget(this); + QWidget *tree_widget = new QWidget(this); tree_view = new QTreeView(tree_widget); tree_view->setUniformRowHeights(true); tree_view->setAllColumnsShowFocus(false); @@ -594,7 +634,7 @@ for (unsigned int i = 0; i < sort_models.size(); i++) { tab_bar->addTab(Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])) + " (" + - QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")"); + QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")"); sort_models[i] = new AnimeListPageSortFilter(tree_view); sort_models[i]->setSourceModel(new AnimeListPageModel(this, Anime::ListStatuses[i])); sort_models[i]->setSortRole(Qt::UserRole); @@ -615,7 +655,7 @@ tree_view->setColumnWidth(AnimeListPageModel::AL_UPDATED, 100); tree_view->setColumnWidth(AnimeListPageModel::AL_NOTES, 100); - QHBoxLayout* layout = new QHBoxLayout(tree_widget); + QHBoxLayout *layout = new QHBoxLayout(tree_widget); layout->addWidget(tree_view); layout->setContentsMargins(0, 0, 0, 0); @@ -625,10 +665,10 @@ /* Enter & return keys */ connect(new QShortcut(Qt::Key_Return, tree_view, nullptr, nullptr, Qt::WidgetShortcut), &QShortcut::activated, this, - &AnimeListPage::ItemDoubleClicked); + &AnimeListPage::ItemDoubleClicked); connect(new QShortcut(Qt::Key_Enter, tree_view, nullptr, nullptr, Qt::WidgetShortcut), &QShortcut::activated, this, - &AnimeListPage::ItemDoubleClicked); + &AnimeListPage::ItemDoubleClicked); tree_view->header()->setStretchLastSection(false); tree_view->header()->setContextMenuPolicy(Qt::CustomContextMenu);
--- a/src/gui/pages/history.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/history.cc Fri Jul 25 10:22:04 2025 -0400 @@ -1,4 +1,5 @@ #include "gui/pages/history.h" -HistoryPage::HistoryPage(QWidget* parent) : QWidget(parent) { +HistoryPage::HistoryPage(QWidget *parent) : QWidget(parent) +{ }
--- a/src/gui/pages/now_playing.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/now_playing.cc Fri Jul 25 10:22:04 2025 -0400 @@ -15,8 +15,9 @@ namespace NowPlayingPages { -Default::Default(QWidget* parent) : QWidget(parent) { - QVBoxLayout* layout = new QVBoxLayout(this); +Default::Default(QWidget *parent) : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); title_.SetText(Strings::Translate("Now Playing")); @@ -25,12 +26,13 @@ layout->addStretch(); } -Playing::Playing(QWidget* parent) : QWidget(parent) { - QHBoxLayout* layout = new QHBoxLayout(this); +Playing::Playing(QWidget *parent) : QWidget(parent) +{ + QHBoxLayout *layout = new QHBoxLayout(this); _main.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); - QVBoxLayout* main_layout = new QVBoxLayout(&_main); + QVBoxLayout *main_layout = new QVBoxLayout(&_main); main_layout->setContentsMargins(0, 0, 0, 0); main_layout->addWidget(&_title); @@ -40,7 +42,7 @@ main_layout->addWidget(&_info); /* "sidebar", includes... just the anime image :) */ - QVBoxLayout* sidebar_layout = new QVBoxLayout(&_sidebar); + QVBoxLayout *sidebar_layout = new QVBoxLayout(&_sidebar); sidebar_layout->setContentsMargins(0, 0, 0, 0); sidebar_layout->addWidget(&_poster); @@ -53,13 +55,15 @@ layout->setContentsMargins(0, 0, 0, 0); } -int Playing::GetPlayingAnime() { +int Playing::GetPlayingAnime() +{ return _id; } -void Playing::SetPlayingAnime(const Anime::Anime& anime, const anitomy::Elements& info) { - if (_id == anime.GetId() - && _episode == Strings::ToInt(Strings::ToUtf8String(info.get(anitomy::kElementEpisodeNumber)))) +void Playing::SetPlayingAnime(const Anime::Anime &anime, const anitomy::Elements &info) +{ + if (_id == anime.GetId() && + _episode == Strings::ToInt(Strings::ToUtf8String(info.get(anitomy::kElementEpisodeNumber)))) return; _id = anime.GetId(); _episode = Strings::ToInt(Strings::ToUtf8String(info.get(anitomy::kElementEpisodeNumber))); @@ -72,9 +76,10 @@ } // namespace NowPlayingPages -NowPlayingPage::NowPlayingPage(QWidget* parent) : QFrame(parent) { +NowPlayingPage::NowPlayingPage(QWidget *parent) : QFrame(parent) +{ setBackgroundRole(QPalette::Base); - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout *layout = new QVBoxLayout(this); setFrameShape(QFrame::Box); setFrameShadow(QFrame::Sunken); @@ -87,15 +92,18 @@ SetDefault(); } -void NowPlayingPage::SetDefault() { +void NowPlayingPage::SetDefault() +{ stack_.setCurrentIndex(static_cast<int>(Subpages::Default)); } -int NowPlayingPage::GetPlayingId() { +int NowPlayingPage::GetPlayingId() +{ return playing_.GetPlayingAnime(); } -void NowPlayingPage::SetPlaying(const Anime::Anime& anime, const anitomy::Elements& info) { +void NowPlayingPage::SetPlaying(const Anime::Anime &anime, const anitomy::Elements &info) +{ playing_.SetPlayingAnime(anime, info); stack_.setCurrentIndex(static_cast<int>(Subpages::Playing)); updateGeometry();
--- a/src/gui/pages/search.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/search.cc Fri Jul 25 10:22:04 2025 -0400 @@ -23,21 +23,26 @@ #include <iostream> #include <sstream> -SearchPageSearchThread::SearchPageSearchThread(QObject* parent) : QThread(parent) { +SearchPageSearchThread::SearchPageSearchThread(QObject *parent) : QThread(parent) +{ } -void SearchPageSearchThread::SetSearch(const std::string& search) { +void SearchPageSearchThread::SetSearch(const std::string &search) +{ search_ = search; } -void SearchPageSearchThread::run() { +void SearchPageSearchThread::run() +{ emit GotResults(Services::Search(search_)); } -SearchPageListSortFilter::SearchPageListSortFilter(QObject* parent) : QSortFilterProxyModel(parent) { +SearchPageListSortFilter::SearchPageListSortFilter(QObject *parent) : QSortFilterProxyModel(parent) +{ } -bool SearchPageListSortFilter::lessThan(const QModelIndex& l, const QModelIndex& r) const { +bool SearchPageListSortFilter::lessThan(const QModelIndex &l, const QModelIndex &r) const +{ QVariant left = sourceModel()->data(l, sortRole()); QVariant right = sourceModel()->data(r, sortRole()); @@ -55,10 +60,12 @@ /* -------------------------------------------- */ -SearchPageListModel::SearchPageListModel(QObject* parent) : QAbstractListModel(parent) { +SearchPageListModel::SearchPageListModel(QObject *parent) : QAbstractListModel(parent) +{ } -void SearchPageListModel::ParseSearch(const std::vector<int>& ids) { +void SearchPageListModel::ParseSearch(const std::vector<int> &ids) +{ /* hack!!! */ if (!rowCount(index(0))) { beginInsertRows(QModelIndex(), 0, 0); @@ -72,17 +79,20 @@ endResetModel(); } -int SearchPageListModel::rowCount(const QModelIndex& parent) const { +int SearchPageListModel::rowCount(const QModelIndex &parent) const +{ return ids.size(); (void)(parent); } -int SearchPageListModel::columnCount(const QModelIndex& parent) const { +int SearchPageListModel::columnCount(const QModelIndex &parent) const +{ return NB_COLUMNS; (void)(parent); } -QVariant SearchPageListModel::headerData(const int section, const Qt::Orientation orientation, const int role) const { +QVariant SearchPageListModel::headerData(const int section, const Qt::Orientation orientation, const int role) const +{ switch (role) { case Qt::DisplayRole: { switch (section) { @@ -110,11 +120,12 @@ return QAbstractListModel::headerData(section, orientation, role); } -QVariant SearchPageListModel::data(const QModelIndex& index, int role) const { +QVariant SearchPageListModel::data(const QModelIndex &index, int role) const +{ if (!index.isValid()) return QVariant(); - const Anime::Anime& anime = Anime::db.items[ids[index.row()]]; + const Anime::Anime &anime = Anime::db.items[ids[index.row()]]; switch (role) { case Qt::DisplayRole: @@ -155,19 +166,22 @@ return QVariant(); } -Qt::ItemFlags SearchPageListModel::flags(const QModelIndex& index) const { +Qt::ItemFlags SearchPageListModel::flags(const QModelIndex &index) const +{ if (!index.isValid()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } -Anime::Anime* SearchPageListModel::GetAnimeFromIndex(const QModelIndex& index) const { +Anime::Anime *SearchPageListModel::GetAnimeFromIndex(const QModelIndex &index) const +{ return &Anime::db.items[ids[index.row()]]; } -void SearchPage::DisplayListMenu() { - QMenu* menu = new QMenu(this); +void SearchPage::DisplayListMenu() +{ + QMenu *menu = new QMenu(this); menu->setAttribute(Qt::WA_DeleteOnClose); menu->setToolTipsVisible(true); @@ -175,12 +189,12 @@ bool add_to_list_enable = true; - std::set<Anime::Anime*> animes; - for (const auto& index : selection.indexes()) { + std::set<Anime::Anime *> animes; + for (const auto &index : selection.indexes()) { if (!index.isValid()) continue; - Anime::Anime* anime = model->GetAnimeFromIndex(index); + Anime::Anime *anime = model->GetAnimeFromIndex(index); if (anime) { animes.insert(anime); if (anime->IsInUserList()) @@ -189,10 +203,10 @@ } menu->addAction(tr("Information"), [this, animes] { - for (auto& anime : animes) { - InformationDialog* dialog = new InformationDialog( + for (auto &anime : animes) { + InformationDialog *dialog = new InformationDialog( anime, - [this](Anime::Anime* anime) { + [this](Anime::Anime *anime) { // UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MAIN_INFO, this); @@ -204,10 +218,10 @@ }); menu->addSeparator(); { - QMenu* submenu = menu->addMenu(tr("Add to list...")); - for (const auto& status : Anime::ListStatuses) { + QMenu *submenu = menu->addMenu(tr("Add to list...")); + for (const auto &status : Anime::ListStatuses) { submenu->addAction(Strings::ToQString(Translate::ToLocalString(status)), [animes, status] { - for (auto& anime : animes) { + for (auto &anime : animes) { if (!anime->IsInUserList()) anime->AddToUserList(); anime->SetUserStatus(status); @@ -220,18 +234,19 @@ menu->popup(QCursor::pos()); } -void SearchPage::ItemDoubleClicked() { +void SearchPage::ItemDoubleClicked() +{ /* throw out any other garbage */ const QItemSelection selection = sort_model->mapSelectionToSource(treeview->selectionModel()->selection()); if (!selection.indexes().first().isValid()) return; const QModelIndex index = model->index(selection.indexes().first().row()); - Anime::Anime* anime = model->GetAnimeFromIndex(index); + Anime::Anime *anime = model->GetAnimeFromIndex(index); - InformationDialog* dialog = new InformationDialog( + InformationDialog *dialog = new InformationDialog( anime, - [this](Anime::Anime* anime) { + [this](Anime::Anime *anime) { // UpdateAnime(anime->GetId()); }, InformationDialog::PAGE_MAIN_INFO, this); @@ -241,21 +256,22 @@ dialog->activateWindow(); } -SearchPage::SearchPage(QWidget* parent) : QFrame(parent) { +SearchPage::SearchPage(QWidget *parent) : QFrame(parent) +{ setFrameShape(QFrame::Box); setFrameShadow(QFrame::Sunken); - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); { /* Toolbar */ - QToolBar* toolbar = new QToolBar(this); + QToolBar *toolbar = new QToolBar(this); toolbar->setMovable(false); { - QLineEdit* line_edit = new QLineEdit("", toolbar); + QLineEdit *line_edit = new QLineEdit("", toolbar); connect(line_edit, &QLineEdit::returnPressed, this, [this, line_edit] { /* static thread here. */ if (thread_.isRunning()) @@ -265,9 +281,8 @@ thread_.start(); }); - connect(&thread_, &SearchPageSearchThread::GotResults, this, [this](const std::vector<int>& search) { - model->ParseSearch(search); - }); + connect(&thread_, &SearchPageSearchThread::GotResults, this, + [this](const std::vector<int> &search) { model->ParseSearch(search); }); toolbar->addWidget(line_edit); } @@ -275,7 +290,7 @@ } { - QFrame* line = new QFrame(this); + QFrame *line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); line->setLineWidth(1);
--- a/src/gui/pages/seasons.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/seasons.cc Fri Jul 25 10:22:04 2025 -0400 @@ -2,8 +2,8 @@ #include "core/anime_db.h" #include "core/strings.h" +#include "gui/translate/anime.h" #include "gui/widgets/anime_button.h" -#include "gui/translate/anime.h" #include "services/services.h" #include <QDate> @@ -17,16 +17,19 @@ #include <iostream> -SeasonsPageSearchThread::SeasonsPageSearchThread(QObject* parent) : QThread(parent) { +SeasonsPageSearchThread::SeasonsPageSearchThread(QObject *parent) : QThread(parent) +{ } -void SeasonsPageSearchThread::AddToQueue(Anime::Season season) { +void SeasonsPageSearchThread::AddToQueue(Anime::Season season) +{ queue_mutex_.lock(); queue_.push(season); queue_mutex_.unlock(); } -void SeasonsPageSearchThread::run() { +void SeasonsPageSearchThread::run() +{ queue_mutex_.lock(); while (!queue_.empty() && !isInterruptionRequested()) { @@ -51,11 +54,13 @@ /* ------------------------------------------------------------------------------------- */ -static constexpr Date::Year GetClosestDecade(Date::Year year) { +static constexpr Date::Year GetClosestDecade(Date::Year year) +{ return year - (year % 10); } -void SeasonsPage::Refresh() { +void SeasonsPage::Refresh() +{ setUpdatesEnabled(false); if (!buttons) @@ -63,9 +68,9 @@ buttons->clear(); - for (const auto& id : Anime::db.GetAllAnimeForSeason(season_)) { - QListWidgetItem* item = new QListWidgetItem; - AnimeButton* button = new AnimeButton(this); + for (const auto &id : Anime::db.GetAllAnimeForSeason(season_)) { + QListWidgetItem *item = new QListWidgetItem; + AnimeButton *button = new AnimeButton(this); button->SetAnime(Anime::db.items[id]); item->setSizeHint(QSize(500, 200)); buttons->addItem(item); @@ -77,22 +82,24 @@ setUpdatesEnabled(true); } -void SeasonsPage::SetSeason(Anime::Season season) { +void SeasonsPage::SetSeason(Anime::Season season) +{ season_ = season; Refresh(); } -SeasonsPage::SeasonsPage(QWidget* parent) : QFrame(parent) { +SeasonsPage::SeasonsPage(QWidget *parent) : QFrame(parent) +{ setBackgroundRole(QPalette::Base); setFrameShape(QFrame::Box); setFrameShadow(QFrame::Sunken); - QVBoxLayout* full_layout = new QVBoxLayout(this); + QVBoxLayout *full_layout = new QVBoxLayout(this); { /* Toolbar */ - QToolBar* toolbar = new QToolBar(this); + QToolBar *toolbar = new QToolBar(this); toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); toolbar->setIconSize(QSize(16, 16)); toolbar->setMovable(false); @@ -104,17 +111,15 @@ const Date::Year year_before_collapse = GetClosestDecade(current_season.year) - 10; /* year -> menu for that year */ - std::map<Date::Year, QMenu*> menu_map; + std::map<Date::Year, QMenu *> menu_map; - auto create_season_menu = [&](QWidget* parent, Anime::Season season){ - QMenu*& menu = menu_map[season.year]; + auto create_season_menu = [&](QWidget *parent, Anime::Season season) { + QMenu *&menu = menu_map[season.year]; if (!menu) menu = new QMenu(QString::number(season.year), parent); - QAction* action = menu->addAction(Strings::ToQString(Translate::ToLocalString(season))); - connect(action, &QAction::triggered, this, [this, season] { - SetSeason(season); - }); + QAction *action = menu->addAction(Strings::ToQString(Translate::ToLocalString(season))); + connect(action, &QAction::triggered, this, [this, season] { SetSeason(season); }); }; for (Anime::Season s = current_season; s >= last_season; --s) @@ -123,7 +128,7 @@ /* ------------------------------------------------------- */ /* now actually generate the full menu */ - QMenu* full_menu = new QMenu(&season_button); + QMenu *full_menu = new QMenu(&season_button); for (Date::Year c = current_season.year; c >= year_before_collapse; c--) full_menu->addMenu(menu_map[c]); @@ -132,7 +137,7 @@ /* collapse each menu into a decade */ for (Date::Year c = year_before_collapse - 10; c >= last_season.year; c -= 10) { - QMenu* decade_menu = new QMenu(tr("%1s").arg(QString::number(c)), parent); + QMenu *decade_menu = new QMenu(tr("%1s").arg(QString::number(c)), parent); for (Date::Year i = c + 9; i >= c; i--) decade_menu->addMenu(menu_map[i]); full_menu->addMenu(decade_menu); @@ -147,7 +152,7 @@ toolbar->addSeparator(); { - toolbar->addAction(QIcon(":/icons/16x16/arrow-circle-315.png"), tr("Refresh data"), [this]{ + toolbar->addAction(QIcon(":/icons/16x16/arrow-circle-315.png"), tr("Refresh data"), [this] { search_thread_.AddToQueue(season_); if (!search_thread_.isRunning()) search_thread_.start(); @@ -157,11 +162,11 @@ toolbar->addSeparator(); { - QToolButton* button = new QToolButton(toolbar); + QToolButton *button = new QToolButton(toolbar); { /* links */ - QMenu* menu = new QMenu(button); + QMenu *menu = new QMenu(button); menu->addAction(tr("Airing status")); menu->addAction(tr("List status")); menu->addAction(tr("Type")); @@ -176,11 +181,11 @@ } { - QToolButton* button = new QToolButton(toolbar); + QToolButton *button = new QToolButton(toolbar); { /* links */ - QMenu* menu = new QMenu(button); + QMenu *menu = new QMenu(button); menu->addAction(tr("Airing date")); menu->addAction(tr("Episodes")); menu->addAction(tr("Popularity")); @@ -197,11 +202,11 @@ } { - QToolButton* button = new QToolButton(toolbar); + QToolButton *button = new QToolButton(toolbar); { /* links */ - QMenu* menu = new QMenu(button); + QMenu *menu = new QMenu(button); menu->addAction(tr("Images")); menu->addAction(tr("Details")); button->setMenu(menu); @@ -218,7 +223,7 @@ } { - QFrame* line = new QFrame(this); + QFrame *line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); line->setLineWidth(1);
--- a/src/gui/pages/statistics.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/statistics.cc Fri Jul 25 10:22:04 2025 -0400 @@ -17,11 +17,11 @@ #include <cmath> #include <sstream> -StatisticsPage::StatisticsPage(QWidget* parent) - : QFrame(parent) { +StatisticsPage::StatisticsPage(QWidget *parent) : QFrame(parent) +{ setBackgroundRole(QPalette::Base); - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout *layout = new QVBoxLayout(this); setFrameShape(QFrame::Box); setFrameShadow(QFrame::Sunken); @@ -29,12 +29,12 @@ setAutoFillBackground(true); const std::vector<std::pair<std::string, std::string>> al_data_template = { - {Strings::Translate("Anime count:"), ""}, - {Strings::Translate("Episode count:"), ""}, - {Strings::Translate("Time spent watching:"), ""}, - {Strings::Translate("Time to complete:"), ""}, - {Strings::Translate("Average score:"), ""}, - {Strings::Translate("Score deviation:"), ""}, + {Strings::Translate("Anime count:"), ""}, + {Strings::Translate("Episode count:"), ""}, + {Strings::Translate("Time spent watching:"), ""}, + {Strings::Translate("Time to complete:"), ""}, + {Strings::Translate("Average score:"), ""}, + {Strings::Translate("Score deviation:"), ""}, }; _anime_list.GetHeader().SetText(Strings::Translate("Anime List")); @@ -43,17 +43,17 @@ layout->addWidget(&_anime_list); { - QWidget* score_dist_widget = new QWidget(this); - QVBoxLayout* score_dist_layout = new QVBoxLayout(score_dist_widget); + QWidget *score_dist_widget = new QWidget(this); + QVBoxLayout *score_dist_layout = new QVBoxLayout(score_dist_widget); - TextWidgets::Header* hdr = new TextWidgets::Header(score_dist_widget); + TextWidgets::Header *hdr = new TextWidgets::Header(score_dist_widget); hdr->SetText(Strings::Translate("Score distribution")); score_dist_layout->addWidget(hdr); /* Ew */ { - QWidget* score_graph_parent = new QWidget(score_dist_widget); - QVBoxLayout* score_parent_layout = new QVBoxLayout(score_graph_parent); + QWidget *score_graph_parent = new QWidget(score_dist_widget); + QVBoxLayout *score_parent_layout = new QVBoxLayout(score_graph_parent); score_parent_layout->addWidget(&_score_distribution_graph); @@ -69,8 +69,8 @@ } const std::vector<std::pair<std::string, std::string>> app_data_template = { - {Strings::Translate("Uptime:"), ""}, - {Strings::Translate("Requests made:"), ""}, + {Strings::Translate("Uptime:"), ""}, + {Strings::Translate("Requests made:"), ""}, }; _application.GetHeader().SetText(Strings::Translate("Minori")); @@ -80,7 +80,7 @@ layout->addStretch(); - QTimer* timer = new QTimer(this); + QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, [this] { if (isVisible()) UpdateStatistics(); @@ -88,26 +88,31 @@ timer->start(1000); // update statistics every second } -void StatisticsPage::showEvent(QShowEvent*) { +void StatisticsPage::showEvent(QShowEvent *) +{ UpdateStatistics(); } -inline int GetTotalWithScore(const int score) { +inline int GetTotalWithScore(const int score) +{ int count = 0; - for (const auto& item : Anime::db.items) + for (const auto &item : Anime::db.items) if (item.second.IsInUserList() && item.second.GetUserScore() == score) count++; return count; } -void StatisticsPage::UpdateStatistics() { +void StatisticsPage::UpdateStatistics() +{ const std::vector<std::pair<std::string, std::string>> al_data = { - {Strings::Translate("Anime count:"), Strings::ToUtf8String(Anime::db.GetTotalAnimeAmount())}, - {Strings::Translate("Episode count:"), Strings::ToUtf8String(Anime::db.GetTotalEpisodeAmount())}, - {Strings::Translate("Time spent watching:"), Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalWatchedAmount(), 60.0)}, - {Strings::Translate("Time to complete:"), Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalPlannedAmount(), 60.0)}, - {Strings::Translate("Average score:"), Strings::ToUtf8String(Anime::db.GetAverageScore())}, - {Strings::Translate("Score deviation:"), Strings::ToUtf8String(Anime::db.GetScoreDeviation())}, + {Strings::Translate("Anime count:"), Strings::ToUtf8String(Anime::db.GetTotalAnimeAmount())}, + {Strings::Translate("Episode count:"), Strings::ToUtf8String(Anime::db.GetTotalEpisodeAmount())}, + {Strings::Translate("Time spent watching:"), + Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalWatchedAmount(), 60.0)}, + {Strings::Translate("Time to complete:"), + Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalPlannedAmount(), 60.0)}, + {Strings::Translate("Average score:"), Strings::ToUtf8String(Anime::db.GetAverageScore())}, + {Strings::Translate("Score deviation:"), Strings::ToUtf8String(Anime::db.GetScoreDeviation())}, }; _anime_list.GetContent().SetData(al_data); @@ -118,8 +123,9 @@ /* Application */ const std::vector<std::pair<std::string, std::string>> app_data_template = { - {Strings::Translate("Uptime:"), Time::GetSecondsAsAbsoluteString(Time::Units::Seconds, session.uptime() / 1000)}, - {Strings::Translate("Requests made:"), Strings::ToUtf8String(session.GetRequests())}, + {Strings::Translate("Uptime:"), + Time::GetSecondsAsAbsoluteString(Time::Units::Seconds, session.uptime() / 1000)}, + {Strings::Translate("Requests made:"), Strings::ToUtf8String(session.GetRequests())}, }; _application.GetContent().SetData(app_data_template);
--- a/src/gui/pages/torrents.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/pages/torrents.cc Fri Jul 25 10:22:04 2025 -0400 @@ -32,10 +32,12 @@ * maintain over multiple platforms. */ -TorrentsPageListSortFilter::TorrentsPageListSortFilter(QObject* parent) : QSortFilterProxyModel(parent) { +TorrentsPageListSortFilter::TorrentsPageListSortFilter(QObject *parent) : QSortFilterProxyModel(parent) +{ } -bool TorrentsPageListSortFilter::lessThan(const QModelIndex& l, const QModelIndex& r) const { +bool TorrentsPageListSortFilter::lessThan(const QModelIndex &l, const QModelIndex &r) const +{ QVariant left = sourceModel()->data(l, sortRole()); QVariant right = sourceModel()->data(r, sortRole()); @@ -52,13 +54,15 @@ /* -------------------------------------------- */ -TorrentsPageListModel::TorrentsPageListModel(QObject* parent) : QAbstractListModel(parent) { +TorrentsPageListModel::TorrentsPageListModel(QObject *parent) : QAbstractListModel(parent) +{ } -void TorrentsPageListModel::DownloadTorrents(QItemSelection selection) { +void TorrentsPageListModel::DownloadTorrents(QItemSelection selection) +{ const auto indexes = selection.indexes(); - for (const auto& index : indexes) { + for (const auto &index : indexes) { /* a torrent file IS literally text... */ const std::string link = list.at(index.row()).GetLink(); const std::string filename = list.at(index.row()).GetFilename() + ".torrent"; @@ -67,27 +71,30 @@ std::filesystem::create_directories(torrents_dir); /* this sucks */ - HTTP::RequestThread* thread = new HTTP::RequestThread(link, {}, "", HTTP::Type::Get, this); + HTTP::RequestThread *thread = new HTTP::RequestThread(link, {}, "", HTTP::Type::Get, this); - connect(thread, &HTTP::RequestThread::ReceivedData, this, [this, torrents_dir, filename](const QByteArray& data) { - std::ofstream file(torrents_dir / filename, std::ofstream::out | std::ofstream::trunc); - if (!file) - return; // wat + connect(thread, &HTTP::RequestThread::ReceivedData, this, + [this, torrents_dir, filename](const QByteArray &data) { + std::ofstream file(torrents_dir / filename, std::ofstream::out | std::ofstream::trunc); + if (!file) + return; // wat - file.write(data.data(), data.size()); - file.close(); - }); + file.write(data.data(), data.size()); + file.close(); + }); connect(thread, &HTTP::RequestThread::finished, thread, &HTTP::RequestThread::deleteLater); thread->start(); } } -QByteArray TorrentsPageListModel::DownloadTorrentList() { +QByteArray TorrentsPageListModel::DownloadTorrentList() +{ return HTTP::Request(session.config.torrents.feed_link); } -void TorrentsPageListModel::ParseFeedDescription(const std::string& description, Torrent& torrent) { +void TorrentsPageListModel::ParseFeedDescription(const std::string &description, Torrent &torrent) +{ /* Parse description... */ enum class Keys { SIZE, @@ -126,7 +133,8 @@ } } -void TorrentsPageListModel::ParseTorrentList(const QByteArray& ba) { +void TorrentsPageListModel::ParseTorrentList(const QByteArray &ba) +{ QDomDocument doc; QDomNode node; QDomNodeList node_nodes; @@ -136,7 +144,9 @@ int err_col; if (!doc.setContent(ba, &err, &err_ln, &err_col)) { - session.SetStatusBar(Strings::ToUtf8String(tr("Torrents: Failed to parse XML with error %1 at line %2, column %3").arg(err, QString::number(err_ln), QString::number(err_col)))); + session.SetStatusBar( + Strings::ToUtf8String(tr("Torrents: Failed to parse XML with error %1 at line %2, column %3") + .arg(err, QString::number(err_ln), QString::number(err_col)))); return; // peace out } } @@ -153,12 +163,18 @@ node = doc; - for (const auto& n : {"rss", "channel"}) { + for (const auto &n : {"rss", "channel"}) { node = node.namedItem(n); - if (node.isNull()) { std::cout << n << std::endl; goto end; } + if (node.isNull()) { + std::cout << n << std::endl; + goto end; + } } - if (!node.hasChildNodes()) { std::cout << "no child nodes" << std::endl; goto end; } + if (!node.hasChildNodes()) { + std::cout << "no child nodes" << std::endl; + goto end; + } node_nodes = node.childNodes(); @@ -168,15 +184,20 @@ continue; const QDomNode title = item.namedItem("title"); - if (!title.isElement()) continue; + if (!title.isElement()) + continue; const QDomNode description = item.namedItem("description"); - if (!description.isElement()) continue; + if (!description.isElement()) + continue; const QDomNode link = item.namedItem("link"); - if (!link.isElement()) continue; + if (!link.isElement()) + continue; const QDomNode guid = item.namedItem("guid"); - if (!guid.isElement()) continue; + if (!guid.isElement()) + continue; const QDomNode pubDate = item.namedItem("pubDate"); - if (!pubDate.isElement()) continue; + if (!pubDate.isElement()) + continue; TorrentModelItem torrent; torrent.SetFilename(Strings::ToUtf8String(title.toElement().text())); /* "title" == filename */ @@ -184,7 +205,7 @@ anitomy::Anitomy anitomy; anitomy.Parse(torrent.GetFilename()); - const auto& elements = anitomy.elements(); + const auto &elements = anitomy.elements(); /* todo: patch Anitomy so that it doesn't use wide strings */ torrent.SetTitle(Strings::ToUtf8String(elements.get(anitomy::kElementAnimeTitle))); @@ -209,21 +230,25 @@ endResetModel(); } -void TorrentsPageListModel::RefreshTorrentList() { +void TorrentsPageListModel::RefreshTorrentList() +{ ParseTorrentList(DownloadTorrentList()); } -int TorrentsPageListModel::rowCount(const QModelIndex& parent) const { +int TorrentsPageListModel::rowCount(const QModelIndex &parent) const +{ return list.size(); (void)(parent); } -int TorrentsPageListModel::columnCount(const QModelIndex& parent) const { +int TorrentsPageListModel::columnCount(const QModelIndex &parent) const +{ return NB_COLUMNS; (void)(parent); } -QVariant TorrentsPageListModel::headerData(const int section, const Qt::Orientation orientation, const int role) const { +QVariant TorrentsPageListModel::headerData(const int section, const Qt::Orientation orientation, const int role) const +{ switch (role) { case Qt::DisplayRole: { switch (section) { @@ -263,8 +288,9 @@ return QAbstractListModel::headerData(section, orientation, role); } -bool TorrentsPageListModel::setData(const QModelIndex& index, const QVariant& value, int role) { - TorrentModelItem& item = list.at(index.row()); +bool TorrentsPageListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + TorrentModelItem &item = list.at(index.row()); if (index.column() == 0) { switch (role) { @@ -279,11 +305,12 @@ return QAbstractItemModel::setData(index, value, role); } -QVariant TorrentsPageListModel::data(const QModelIndex& index, int role) const { +QVariant TorrentsPageListModel::data(const QModelIndex &index, int role) const +{ if (!index.isValid()) return QVariant(); - const TorrentModelItem& item = list.at(index.row()); + const TorrentModelItem &item = list.at(index.row()); switch (role) { case Qt::DisplayRole: @@ -344,24 +371,26 @@ return QVariant(); } -Qt::ItemFlags TorrentsPageListModel::flags(const QModelIndex& index) const { +Qt::ItemFlags TorrentsPageListModel::flags(const QModelIndex &index) const +{ if (!index.isValid()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } -TorrentsPage::TorrentsPage(QWidget* parent) : QFrame(parent) { +TorrentsPage::TorrentsPage(QWidget *parent) : QFrame(parent) +{ setFrameShape(QFrame::Box); setFrameShadow(QFrame::Sunken); - QVBoxLayout* layout = new QVBoxLayout(this); + QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); { /* Toolbar */ - QToolBar* toolbar = new QToolBar(this); + QToolBar *toolbar = new QToolBar(this); toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); toolbar->setIconSize(QSize(16, 16)); toolbar->setMovable(false); @@ -380,17 +409,21 @@ [this] { DownloadSelection(); }); } - { toolbar->addAction(QIcon(":/icons/16x16/cross-button.png"), tr("&Discard all")); } + { + toolbar->addAction(QIcon(":/icons/16x16/cross-button.png"), tr("&Discard all")); + } toolbar->addSeparator(); - { toolbar->addAction(QIcon(":/icons/16x16/gear.png"), tr("&Settings")); } + { + toolbar->addAction(QIcon(":/icons/16x16/gear.png"), tr("&Settings")); + } layout->addWidget(toolbar); } { - QFrame* line = new QFrame(this); + QFrame *line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); line->setLineWidth(1); @@ -437,7 +470,8 @@ } } -void TorrentsPage::DownloadSelection() { +void TorrentsPage::DownloadSelection() +{ if (!model) return; @@ -446,13 +480,14 @@ model->DownloadTorrents(selection); } -void TorrentsPage::Refresh() { +void TorrentsPage::Refresh() +{ if (!model) return; - HTTP::RequestThread* thread = new HTTP::RequestThread(session.config.torrents.feed_link); + HTTP::RequestThread *thread = new HTTP::RequestThread(session.config.torrents.feed_link); - connect(thread, &HTTP::RequestThread::ReceivedData, this, [&](const QByteArray& ba) { + connect(thread, &HTTP::RequestThread::ReceivedData, this, [&](const QByteArray &ba) { /* This is to make sure we aren't in a different thread * messing around with GUI stuff */
--- a/src/gui/translate/anilist.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/translate/anilist.cc Fri Jul 25 10:22:04 2025 -0400 @@ -4,13 +4,14 @@ namespace Translate { namespace AniList { -Anime::SeriesStatus ToSeriesStatus(const std::string& status) { +Anime::SeriesStatus ToSeriesStatus(const std::string &status) +{ static const std::unordered_map<std::string, Anime::SeriesStatus> map = { - {"FINISHED", Anime::SeriesStatus::Finished }, - {"RELEASING", Anime::SeriesStatus::Releasing }, + {"FINISHED", Anime::SeriesStatus::Finished }, + {"RELEASING", Anime::SeriesStatus::Releasing }, {"NOT_YET_RELEASED", Anime::SeriesStatus::NotYetReleased}, - {"CANCELLED", Anime::SeriesStatus::Cancelled }, - {"HIATUS", Anime::SeriesStatus::Hiatus } + {"CANCELLED", Anime::SeriesStatus::Cancelled }, + {"HIATUS", Anime::SeriesStatus::Hiatus } }; if (map.find(status) == map.end()) @@ -18,7 +19,8 @@ return map.at(status); } -Anime::Season::Name ToSeriesSeason(const std::string& season) { +Anime::Season::Name ToSeriesSeason(const std::string &season) +{ static const std::unordered_map<std::string, Anime::Season::Name> map = { {"WINTER", Anime::Season::Name::Winter}, {"SPRING", Anime::Season::Name::Spring}, @@ -31,15 +33,16 @@ return map.at(season); } -Anime::SeriesFormat ToSeriesFormat(const std::string& format) { +Anime::SeriesFormat ToSeriesFormat(const std::string &format) +{ static const std::unordered_map<std::string, enum Anime::SeriesFormat> map = { - {"TV", Anime::SeriesFormat::Tv }, + {"TV", Anime::SeriesFormat::Tv }, {"TV_SHORT", Anime::SeriesFormat::TvShort}, - {"MOVIE", Anime::SeriesFormat::Movie }, - {"SPECIAL", Anime::SeriesFormat::Special }, - {"OVA", Anime::SeriesFormat::Ova }, - {"ONA", Anime::SeriesFormat::Ona }, - {"MUSIC", Anime::SeriesFormat::Music } + {"MOVIE", Anime::SeriesFormat::Movie }, + {"SPECIAL", Anime::SeriesFormat::Special}, + {"OVA", Anime::SeriesFormat::Ova }, + {"ONA", Anime::SeriesFormat::Ona }, + {"MUSIC", Anime::SeriesFormat::Music } }; if (map.find(format) == map.end()) @@ -47,7 +50,8 @@ return map.at(format); } -std::string ToString(Anime::Season::Name season) { +std::string ToString(Anime::Season::Name season) +{ switch (season) { default: case Anime::Season::Name::Winter: return "WINTER";
--- a/src/gui/translate/anime.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/translate/anime.cc Fri Jul 25 10:22:04 2025 -0400 @@ -10,7 +10,8 @@ namespace Translate { -std::string ToString(const Anime::ListStatus status) { +std::string ToString(const Anime::ListStatus status) +{ switch (status) { case Anime::ListStatus::Current: return "Currently watching"; case Anime::ListStatus::Planning: return "Plan to watch"; @@ -22,7 +23,8 @@ } } -std::string ToString(const Anime::SeriesFormat format) { +std::string ToString(const Anime::SeriesFormat format) +{ switch (format) { case Anime::SeriesFormat::Tv: return "TV"; case Anime::SeriesFormat::TvShort: return "TV short"; @@ -36,7 +38,8 @@ } } -std::string ToString(const Anime::Season::Name season) { +std::string ToString(const Anime::Season::Name season) +{ switch (season) { case Anime::Season::Name::Winter: return "Winter"; case Anime::Season::Name::Summer: return "Summer"; @@ -47,7 +50,8 @@ } } -std::string ToString(const Anime::SeriesStatus status) { +std::string ToString(const Anime::SeriesStatus status) +{ switch (status) { case Anime::SeriesStatus::Releasing: return "Currently airing"; case Anime::SeriesStatus::Finished: return "Finished airing"; @@ -59,7 +63,8 @@ } } -std::string ToString(const Anime::Service service) { +std::string ToString(const Anime::Service service) +{ switch (service) { case Anime::Service::AniList: return "AniList"; case Anime::Service::MyAnimeList: return "MyAnimeList"; @@ -69,7 +74,8 @@ } } -std::string ToString(const Anime::TitleLanguage language) { +std::string ToString(const Anime::TitleLanguage language) +{ switch (language) { case Anime::TitleLanguage::Native: return "Native"; case Anime::TitleLanguage::English: return "English"; @@ -78,7 +84,8 @@ } } -std::string ToString(const Anime::ScoreFormat format) { +std::string ToString(const Anime::ScoreFormat format) +{ switch (format) { case Anime::ScoreFormat::Point3: return "3-point"; case Anime::ScoreFormat::Point5: return "5-point"; @@ -89,14 +96,15 @@ } } -Anime::ListStatus ToListStatus(const std::string& str) { +Anime::ListStatus ToListStatus(const std::string &str) +{ static const std::unordered_map<std::string, Anime::ListStatus> map = { - {"currently watching", Anime::ListStatus::Current }, - {"plan to watch", Anime::ListStatus::Planning }, - {"completed", Anime::ListStatus::Completed}, - {"dropped", Anime::ListStatus::Dropped }, - {"on hold", Anime::ListStatus::Paused } - }; + {"currently watching", Anime::ListStatus::Current }, + {"plan to watch", Anime::ListStatus::Planning }, + {"completed", Anime::ListStatus::Completed}, + {"dropped", Anime::ListStatus::Dropped }, + {"on hold", Anime::ListStatus::Paused } + }; std::string lower = Strings::ToLower(str); @@ -105,14 +113,15 @@ return map.at(lower); } -Anime::SeriesStatus ToSeriesStatus(const std::string& str) { +Anime::SeriesStatus ToSeriesStatus(const std::string &str) +{ static const std::unordered_map<std::string, Anime::SeriesStatus> map = { - {"currently airing", Anime::SeriesStatus::Releasing }, - {"finished airing", Anime::SeriesStatus::Finished }, - {"not yet aired", Anime::SeriesStatus::NotYetReleased}, - {"cancelled", Anime::SeriesStatus::Cancelled }, - {"on hiatus", Anime::SeriesStatus::Hiatus } - }; + {"currently airing", Anime::SeriesStatus::Releasing }, + {"finished airing", Anime::SeriesStatus::Finished }, + {"not yet aired", Anime::SeriesStatus::NotYetReleased}, + {"cancelled", Anime::SeriesStatus::Cancelled }, + {"on hiatus", Anime::SeriesStatus::Hiatus } + }; std::string lower = Strings::ToLower(str); @@ -121,13 +130,14 @@ return map.at(str); } -Anime::Season::Name ToSeriesSeason(const std::string& str) { +Anime::Season::Name ToSeriesSeason(const std::string &str) +{ static const std::unordered_map<std::string, Anime::Season::Name> map = { - {"winter", Anime::Season::Name::Winter}, - {"summer", Anime::Season::Name::Summer}, - {"fall", Anime::Season::Name::Autumn}, - {"autumn", Anime::Season::Name::Autumn}, - {"spring", Anime::Season::Name::Spring}, + {"winter", Anime::Season::Name::Winter}, + {"summer", Anime::Season::Name::Summer}, + {"fall", Anime::Season::Name::Autumn}, + {"autumn", Anime::Season::Name::Autumn}, + {"spring", Anime::Season::Name::Spring}, }; std::string lower = Strings::ToLower(str); @@ -137,16 +147,17 @@ return map.at(lower); } -Anime::SeriesFormat ToSeriesFormat(const std::string& str) { +Anime::SeriesFormat ToSeriesFormat(const std::string &str) +{ static const std::unordered_map<std::string, Anime::SeriesFormat> map = { - {"tv", Anime::SeriesFormat::Tv }, - {"tv short", Anime::SeriesFormat::TvShort}, - {"ova", Anime::SeriesFormat::Ova }, - {"movie", Anime::SeriesFormat::Movie }, - {"special", Anime::SeriesFormat::Special }, - {"ona", Anime::SeriesFormat::Ona }, - {"music", Anime::SeriesFormat::Music } - }; + {"tv", Anime::SeriesFormat::Tv }, + {"tv short", Anime::SeriesFormat::TvShort}, + {"ova", Anime::SeriesFormat::Ova }, + {"movie", Anime::SeriesFormat::Movie }, + {"special", Anime::SeriesFormat::Special}, + {"ona", Anime::SeriesFormat::Ona }, + {"music", Anime::SeriesFormat::Music } + }; std::string lower = Strings::ToLower(str); @@ -155,12 +166,13 @@ return map.at(lower); } -Anime::Service ToService(const std::string& str) { +Anime::Service ToService(const std::string &str) +{ static const std::unordered_map<std::string, Anime::Service> map = { - {"anilist", Anime::Service::AniList}, - {"myanimelist", Anime::Service::MyAnimeList}, - {"kitsu", Anime::Service::Kitsu} - }; + {"anilist", Anime::Service::AniList }, + {"myanimelist", Anime::Service::MyAnimeList}, + {"kitsu", Anime::Service::Kitsu } + }; std::string lower = Strings::ToLower(str); @@ -169,12 +181,13 @@ return map.at(lower); } -Anime::TitleLanguage ToLanguage(const std::string& str) { +Anime::TitleLanguage ToLanguage(const std::string &str) +{ static const std::unordered_map<std::string, Anime::TitleLanguage> map = { - {"romaji", Anime::TitleLanguage::Romaji }, - {"native", Anime::TitleLanguage::Native }, - {"english", Anime::TitleLanguage::English} - }; + {"romaji", Anime::TitleLanguage::Romaji }, + {"native", Anime::TitleLanguage::Native }, + {"english", Anime::TitleLanguage::English} + }; std::string lower = Strings::ToLower(str); @@ -183,19 +196,20 @@ return map.at(lower); } -Anime::ScoreFormat ToScoreFormat(const std::string& str) { +Anime::ScoreFormat ToScoreFormat(const std::string &str) +{ static const std::unordered_map<std::string, Anime::ScoreFormat> map = { - {"3-point", Anime::ScoreFormat::Point3}, - {"5-point", Anime::ScoreFormat::Point5}, - {"10-point", Anime::ScoreFormat::Point10 }, - {"10-point decimal", Anime::ScoreFormat::Point10Decimal}, - {"100-point", Anime::ScoreFormat::Point100 }, - /* old values, provided for compatibility */ - {"point_3", Anime::ScoreFormat::Point3 }, - {"point_5", Anime::ScoreFormat::Point5 }, - {"point_10", Anime::ScoreFormat::Point10 }, - {"point_10_decimal", Anime::ScoreFormat::Point10Decimal}, - {"point_100", Anime::ScoreFormat::Point100 }, + {"3-point", Anime::ScoreFormat::Point3 }, + {"5-point", Anime::ScoreFormat::Point5 }, + {"10-point", Anime::ScoreFormat::Point10 }, + {"10-point decimal", Anime::ScoreFormat::Point10Decimal}, + {"100-point", Anime::ScoreFormat::Point100 }, + /* old values, provided for compatibility */ + {"point_3", Anime::ScoreFormat::Point3 }, + {"point_5", Anime::ScoreFormat::Point5 }, + {"point_10", Anime::ScoreFormat::Point10 }, + {"point_10_decimal", Anime::ScoreFormat::Point10Decimal}, + {"point_100", Anime::ScoreFormat::Point100 }, }; std::string lower = Strings::ToLower(str); @@ -207,7 +221,8 @@ /* Localized versions of ToString() functions. Meant for display to the user. */ -std::string ToLocalString(const Anime::ListStatus status) { +std::string ToLocalString(const Anime::ListStatus status) +{ switch (status) { case Anime::ListStatus::Current: return Strings::Translate("Currently watching"); case Anime::ListStatus::Planning: return Strings::Translate("Plan to watch"); @@ -219,7 +234,8 @@ } } -std::string ToLocalString(const Anime::SeriesFormat format) { +std::string ToLocalString(const Anime::SeriesFormat format) +{ switch (format) { case Anime::SeriesFormat::Tv: return Strings::Translate("TV"); case Anime::SeriesFormat::TvShort: return Strings::Translate("TV short"); @@ -233,7 +249,8 @@ } } -static std::string ToLocalString(const Anime::Season::Name season) { +static std::string ToLocalString(const Anime::Season::Name season) +{ switch (season) { case Anime::Season::Name::Winter: return Strings::Translate("Winter"); case Anime::Season::Name::Summer: return Strings::Translate("Summer"); @@ -244,13 +261,15 @@ } } -std::string ToLocalString(const Anime::Season& season) { +std::string ToLocalString(const Anime::Season &season) +{ std::string year = (season.year) ? Strings::ToUtf8String(season.year) : Strings::Translate("Unknown"); return fmt::format(Strings::Translate("{} {}"), ToLocalString(season.season), year); } -std::string ToLocalString(const Anime::SeriesStatus status) { +std::string ToLocalString(const Anime::SeriesStatus status) +{ switch (status) { case Anime::SeriesStatus::Releasing: return Strings::Translate("Currently airing"); case Anime::SeriesStatus::Finished: return Strings::Translate("Finished airing"); @@ -262,7 +281,8 @@ } } -std::string ToLocalString(const Anime::Service service) { +std::string ToLocalString(const Anime::Service service) +{ switch (service) { case Anime::Service::AniList: return Strings::Translate("AniList"); case Anime::Service::MyAnimeList: return Strings::Translate("MyAnimeList"); @@ -272,7 +292,8 @@ } } -std::string ToLocalString(const Anime::TitleLanguage language) { +std::string ToLocalString(const Anime::TitleLanguage language) +{ switch (language) { case Anime::TitleLanguage::Native: return Strings::Translate("Native"); case Anime::TitleLanguage::English: return Strings::Translate("English"); @@ -281,13 +302,13 @@ } } -std::string ToLocalString(const Anime::ScoreFormat format) { +std::string ToLocalString(const Anime::ScoreFormat format) +{ switch (format) { case Anime::ScoreFormat::Point3: return Strings::Translate("3-point"); case Anime::ScoreFormat::Point5: return Strings::Translate("5-point"); case Anime::ScoreFormat::Point10: return Strings::Translate("10-point"); - case Anime::ScoreFormat::Point10Decimal: - return Strings::Translate("10-point Decimal"); + case Anime::ScoreFormat::Point10Decimal: return Strings::Translate("10-point Decimal"); default: case Anime::ScoreFormat::Point100: return Strings::Translate("100-point"); }
--- a/src/gui/translate/config.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/translate/config.cc Fri Jul 25 10:22:04 2025 -0400 @@ -8,11 +8,12 @@ namespace Translate { -Theme::Theme ToTheme(const std::string& theme) { +Theme::Theme ToTheme(const std::string &theme) +{ const std::unordered_map<std::string, Theme::Theme> map = { - {"Default", Theme::Theme::Default }, - {"Light", Theme::Theme::Light}, - {"Dark", Theme::Theme::Dark } + {"Default", Theme::Theme::Default}, + {"Light", Theme::Theme::Light }, + {"Dark", Theme::Theme::Dark } }; if (map.find(theme) == map.end()) @@ -20,7 +21,8 @@ return map.at(theme); } -std::string ToString(const Theme::Theme& theme) { +std::string ToString(const Theme::Theme &theme) +{ switch (theme) { default: case Theme::Theme::Default: return "Default"; @@ -29,7 +31,8 @@ } } -std::string ToLocalString(const Theme::Theme& theme) { +std::string ToLocalString(const Theme::Theme &theme) +{ switch (theme) { default: case Theme::Theme::Default: return Strings::Translate("Default");
--- a/src/gui/widgets/anime_button.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/anime_button.cc Fri Jul 25 10:22:04 2025 -0400 @@ -14,7 +14,10 @@ #include <iostream> -/* This widget is only used on the Seasons page. */ +/* This widget is only used on the Seasons page. + * + * FIXME: If the synopsis is too long, it makes this widget look + * totally fucked. */ /***********************************\ *|---------| Title * @@ -28,30 +31,31 @@ *|_________| Synopsis * \***********************************/ -AnimeButton::AnimeButton(QWidget* parent) : QFrame(parent) { +AnimeButton::AnimeButton(QWidget *parent) : QFrame(parent) +{ setFrameShadow(QFrame::Plain); setFrameShape(QFrame::Box); - QHBoxLayout* ly = new QHBoxLayout(this); + QHBoxLayout *ly = new QHBoxLayout(this); _poster.SetClickable(false); ly->addWidget(&_poster, 1, Qt::AlignTop); const std::vector<std::pair<std::string, std::string>> imap = { - {Strings::Translate("Aired:"), ""}, - {Strings::Translate("Episodes:"), ""}, - {Strings::Translate("Genres:"), ""}, - {Strings::Translate("Producers:"), ""}, - {Strings::Translate("Score:"), ""}, - {Strings::Translate("Popularity:"), ""}, + {Strings::Translate("Aired:"), ""}, + {Strings::Translate("Episodes:"), ""}, + {Strings::Translate("Genres:"), ""}, + {Strings::Translate("Producers:"), ""}, + {Strings::Translate("Score:"), ""}, + {Strings::Translate("Popularity:"), ""}, }; _info.SetData(imap); { - QWidget* misc_section = new QWidget(this); + QWidget *misc_section = new QWidget(this); - QVBoxLayout* misc_layout = new QVBoxLayout(misc_section); + QVBoxLayout *misc_layout = new QVBoxLayout(misc_section); misc_layout->setContentsMargins(0, 0, 0, 0); _title.setAutoFillBackground(true); @@ -71,9 +75,9 @@ misc_layout->addWidget(&_info); { - QWidget* dummy = new QWidget(misc_section); + QWidget *dummy = new QWidget(misc_section); dummy->setContentsMargins(4, 0, 4, 0); - QVBoxLayout* dummy_layout = new QVBoxLayout(dummy); + QVBoxLayout *dummy_layout = new QVBoxLayout(dummy); dummy_layout->setSpacing(0); dummy_layout->setContentsMargins(0, 0, 0, 0); @@ -86,23 +90,26 @@ } } -AnimeButton::AnimeButton(const Anime::Anime& anime, QWidget* parent) : AnimeButton(parent) { +AnimeButton::AnimeButton(const Anime::Anime &anime, QWidget *parent) : AnimeButton(parent) +{ SetAnime(anime); } -void AnimeButton::SetAnime(const Anime::Anime& anime) { +void AnimeButton::SetAnime(const Anime::Anime &anime) +{ _poster.SetAnime(anime); _title.setText(Strings::ToQString(anime.GetUserPreferredTitle())); - const QLocale& locale = session.config.locale.GetLocale(); + const QLocale &locale = session.config.locale.GetLocale(); const std::vector<std::pair<std::string, std::string>> imap = { - {Strings::Translate("Aired:"), Strings::ToUtf8String(locale.toString(anime.GetStartedDate().GetAsQDate(), "dd MMM yyyy"))}, - {Strings::Translate("Episodes:"), Strings::ToUtf8String(anime.GetEpisodes())}, - {Strings::Translate("Genres:"), Strings::Implode(anime.GetGenres(), ", ")}, - {Strings::Translate("Producers:"), "..."}, - {Strings::Translate("Score:"), Strings::ToUtf8String(anime.GetAudienceScore()) + "%"}, - {Strings::Translate("Popularity:"), "..."}, + {Strings::Translate("Aired:"), + Strings::ToUtf8String(locale.toString(anime.GetStartedDate().GetAsQDate(), "dd MMM yyyy"))}, + {Strings::Translate("Episodes:"), Strings::ToUtf8String(anime.GetEpisodes())}, + {Strings::Translate("Genres:"), Strings::Implode(anime.GetGenres(), ", ")}, + {Strings::Translate("Producers:"), "..."}, + {Strings::Translate("Score:"), Strings::ToUtf8String(anime.GetAudienceScore()) + "%"}, + {Strings::Translate("Popularity:"), "..."}, }; _info.SetData(imap); @@ -110,10 +117,12 @@ _synopsis.SetText(anime.GetSynopsis()); } -bool AnimeButton::hasHeightForWidth() const { +bool AnimeButton::hasHeightForWidth() const +{ return true; } -int AnimeButton::heightForWidth(int w) const { +int AnimeButton::heightForWidth(int w) const +{ return static_cast<int>(static_cast<double>(w) / 2.5); }
--- a/src/gui/widgets/anime_info.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/anime_info.cc Fri Jul 25 10:22:04 2025 -0400 @@ -8,15 +8,19 @@ #include <QHBoxLayout> #include <QTextStream> -AnimeInfoWidgetGetMetadataThread::AnimeInfoWidgetGetMetadataThread(QObject* parent) : QThread(parent) {} +AnimeInfoWidgetGetMetadataThread::AnimeInfoWidgetGetMetadataThread(QObject *parent) : QThread(parent) +{ +} -void AnimeInfoWidgetGetMetadataThread::AddToQueue(int id) { +void AnimeInfoWidgetGetMetadataThread::AddToQueue(int id) +{ const std::lock_guard<std::mutex> guard(queue_mutex_); queue_.push(id); } /* processes the queue... */ -void AnimeInfoWidgetGetMetadataThread::run() { +void AnimeInfoWidgetGetMetadataThread::run() +{ queue_mutex_.lock(); while (!queue_.empty() && !isInterruptionRequested()) { int id = queue_.front(); @@ -36,8 +40,9 @@ /* all widgets share this thread */ static AnimeInfoWidgetGetMetadataThread get_metadata_thread; -AnimeInfoWidget::AnimeInfoWidget(QWidget* parent) : QWidget(parent) { - QVBoxLayout* layout = new QVBoxLayout(this); +AnimeInfoWidget::AnimeInfoWidget(QWidget *parent) : QWidget(parent) +{ + QVBoxLayout *layout = new QVBoxLayout(this); _title.GetHeader().SetText(Strings::Translate("Alternative titles")); layout->addWidget(&_title); @@ -45,13 +50,13 @@ _details.GetHeader().SetText(Strings::Translate("Details")); const std::vector<std::pair<std::string, std::string>> items = { - {Strings::Translate("Type:"), ""}, - {Strings::Translate("Episodes:"), ""}, - {Strings::Translate("Status:"), ""}, - {Strings::Translate("Season:"), ""}, - {Strings::Translate("Genres:"), ""}, - {Strings::Translate("Producers:"), ""}, - {Strings::Translate("Score:"), ""}, + {Strings::Translate("Type:"), ""}, + {Strings::Translate("Episodes:"), ""}, + {Strings::Translate("Status:"), ""}, + {Strings::Translate("Season:"), ""}, + {Strings::Translate("Genres:"), ""}, + {Strings::Translate("Producers:"), ""}, + {Strings::Translate("Score:"), ""}, }; _details.GetContent().SetData(items); @@ -74,11 +79,13 @@ }); } -AnimeInfoWidget::AnimeInfoWidget(const Anime::Anime& anime, QWidget* parent) : AnimeInfoWidget(parent) { +AnimeInfoWidget::AnimeInfoWidget(const Anime::Anime &anime, QWidget *parent) : AnimeInfoWidget(parent) +{ SetAnime(anime); } -void AnimeInfoWidget::SetAnime(const Anime::Anime& anime) { +void AnimeInfoWidget::SetAnime(const Anime::Anime &anime) +{ setUpdatesEnabled(false); id_ = anime.GetId(); @@ -99,7 +106,8 @@ updateGeometry(); } -void AnimeInfoWidget::RefreshGenres(const Anime::Anime& anime) { +void AnimeInfoWidget::RefreshGenres(const Anime::Anime &anime) +{ /* we have to convert ALL of these strings to * QString because QTextStream sucks and assumes * Latin-1 (on Windows?) */ @@ -107,13 +115,13 @@ const auto producers = anime.GetProducers(); const std::vector<std::pair<std::string, std::string>> items = { - {Strings::Translate("Type:"), Translate::ToLocalString(anime.GetFormat())}, - {Strings::Translate("Episodes:"), Strings::ToUtf8String(anime.GetEpisodes())}, - {Strings::Translate("Status:"), Translate::ToLocalString(anime.GetAiringStatus())}, - {Strings::Translate("Season:"), Translate::ToLocalString(anime.GetSeason())}, - {Strings::Translate("Genres:"), (genres.size() > 1) ? Strings::Implode(genres, ", ") : "-"}, - {Strings::Translate("Producers:"), (producers.size() > 1) ? Strings::Implode(producers, ", ") : "-"}, - {Strings::Translate("Score:"), Strings::ToUtf8String(anime.GetAudienceScore()) + "%"}, + {Strings::Translate("Type:"), Translate::ToLocalString(anime.GetFormat())}, + {Strings::Translate("Episodes:"), Strings::ToUtf8String(anime.GetEpisodes())}, + {Strings::Translate("Status:"), Translate::ToLocalString(anime.GetAiringStatus())}, + {Strings::Translate("Season:"), Translate::ToLocalString(anime.GetSeason())}, + {Strings::Translate("Genres:"), (genres.size() > 1) ? Strings::Implode(genres, ", ") : "-"}, + {Strings::Translate("Producers:"), (producers.size() > 1) ? Strings::Implode(producers, ", ") : "-"}, + {Strings::Translate("Score:"), Strings::ToUtf8String(anime.GetAudienceScore()) + "%"}, }; _details.GetContent().SetData(items);
--- a/src/gui/widgets/clickable_label.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/clickable_label.cc Fri Jul 25 10:22:04 2025 -0400 @@ -1,12 +1,15 @@ #include "gui/widgets/clickable_label.h" -ClickableLabel::ClickableLabel(QWidget* parent) : QLabel(parent) { +ClickableLabel::ClickableLabel(QWidget *parent) : QLabel(parent) +{ setCursor(Qt::PointingHandCursor); } -ClickableLabel::~ClickableLabel() { +ClickableLabel::~ClickableLabel() +{ } -void ClickableLabel::mousePressEvent(QMouseEvent*) { +void ClickableLabel::mousePressEvent(QMouseEvent *) +{ emit clicked(); }
--- a/src/gui/widgets/drop_list_widget.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/drop_list_widget.cc Fri Jul 25 10:22:04 2025 -0400 @@ -2,27 +2,31 @@ #include <QDragMoveEvent> #include <QDropEvent> +#include <QFileInfo> #include <QMimeData> -#include <QFileInfo> /* currently this only sends local paths that are folders */ -DroppableListWidget::DroppableListWidget(QWidget* parent) : QListWidget(parent) { +DroppableListWidget::DroppableListWidget(QWidget *parent) : QListWidget(parent) +{ setAcceptDrops(true); } -void DroppableListWidget::dragMoveEvent(QDragMoveEvent* event) { +void DroppableListWidget::dragMoveEvent(QDragMoveEvent *event) +{ if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } -void DroppableListWidget::dragEnterEvent(QDragEnterEvent* event) { +void DroppableListWidget::dragEnterEvent(QDragEnterEvent *event) +{ if (event->mimeData()->hasUrls()) event->acceptProposedAction(); } -void DroppableListWidget::dropEvent(QDropEvent* event) { - const QMimeData* mime_data = event->mimeData(); +void DroppableListWidget::dropEvent(QDropEvent *event) +{ + const QMimeData *mime_data = event->mimeData(); if (!mime_data->hasUrls()) return; @@ -30,7 +34,7 @@ QStringList path_list; QList<QUrl> url_list = mime_data->urls(); - for (const auto& url : url_list) { + for (const auto &url : url_list) { if (!url.isLocalFile()) continue;
--- a/src/gui/widgets/optional_date.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/optional_date.cc Fri Jul 25 10:22:04 2025 -0400 @@ -4,12 +4,14 @@ #include <QDateEdit> #include <QHBoxLayout> -OptionalDate::OptionalDate(QWidget* parent) { +OptionalDate::OptionalDate(QWidget *parent) +{ OptionalDate(false, parent); } -OptionalDate::OptionalDate(bool enabled, QWidget* parent) : QWidget(parent) { - QHBoxLayout* layout = new QHBoxLayout(this); +OptionalDate::OptionalDate(bool enabled, QWidget *parent) : QWidget(parent) +{ + QHBoxLayout *layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); _checkbox = new QCheckBox(this); @@ -32,33 +34,40 @@ connect(_dateedit, &QDateEdit::dateChanged, this, [this](QDate) { emit DataChanged(IsEnabled(), GetDate()); }); } -void OptionalDate::SetEnabled(bool enabled) { +void OptionalDate::SetEnabled(bool enabled) +{ _checkbox->setCheckState(enabled ? Qt::Checked : Qt::Unchecked); _dateedit->setEnabled(enabled); } -bool OptionalDate::IsEnabled() { +bool OptionalDate::IsEnabled() +{ return _dateedit->isEnabled(); } -void OptionalDate::SetDate(QDate date) { +void OptionalDate::SetDate(QDate date) +{ _dateedit->setDate(date); } -void OptionalDate::SetDate(Date date) { +void OptionalDate::SetDate(Date date) +{ if (!date.IsValid()) return; SetDate(date.GetAsQDate()); } -Date OptionalDate::GetDate() { +Date OptionalDate::GetDate() +{ return Date(_dateedit->date()); } -QDateEdit* OptionalDate::GetDateEdit() { +QDateEdit *OptionalDate::GetDateEdit() +{ return _dateedit; } -QCheckBox* OptionalDate::GetCheckBox() { +QCheckBox *OptionalDate::GetCheckBox() +{ return _checkbox; }
--- a/src/gui/widgets/poster.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/poster.cc Fri Jul 25 10:22:04 2025 -0400 @@ -18,8 +18,9 @@ #include <iostream> -Poster::Poster(QWidget* parent) : QFrame(parent) { - QHBoxLayout* layout = new QHBoxLayout(this); +Poster::Poster(QWidget *parent) : QFrame(parent) +{ + QHBoxLayout *layout = new QHBoxLayout(this); layout->setContentsMargins(1, 1, 1, 1); setCursor(Qt::PointingHandCursor); @@ -34,16 +35,19 @@ connect(get_thread_, &HTTP::RequestThread::ReceivedData, this, &Poster::ImageDownloadFinished); } -Poster::Poster(const Anime::Anime& anime, QWidget* parent) : Poster(parent) { +Poster::Poster(const Anime::Anime &anime, QWidget *parent) : Poster(parent) +{ SetAnime(anime); } -Poster::~Poster() { +Poster::~Poster() +{ /* schedule deletion of the thread */ get_thread_->deleteLater(); } -void Poster::DownloadPoster() { +void Poster::DownloadPoster() +{ if (get_thread_->isRunning()) get_thread_->Stop(); get_thread_->wait(); @@ -52,7 +56,8 @@ get_thread_->start(); } -void Poster::SetAnime(const Anime::Anime& anime) { +void Poster::SetAnime(const Anime::Anime &anime) +{ label_.clear(); poster_url_ = anime.GetPosterUrl(); @@ -71,14 +76,16 @@ } } -void Poster::showEvent(QShowEvent* event) { +void Poster::showEvent(QShowEvent *event) +{ if (need_refresh_) { DownloadPoster(); need_refresh_ = false; } } -void Poster::SetClickable(bool enabled) { +void Poster::SetClickable(bool enabled) +{ clickable_ = enabled; if (clickable_ && !service_url_.isEmpty()) { @@ -91,34 +98,41 @@ } } -void Poster::ImageDownloadFinished(const QByteArray& arr) { +void Poster::ImageDownloadFinished(const QByteArray &arr) +{ img_.loadFromData(arr); RenderToLabel(); } -void Poster::RenderToLabel() { +void Poster::RenderToLabel() +{ const QPixmap pixmap = QPixmap::fromImage(img_); if (pixmap.isNull()) return; label_.setPixmap(pixmap.scaled(label_.size(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation)); } -bool Poster::hasHeightForWidth(void) const { +bool Poster::hasHeightForWidth(void) const +{ return true; } -int Poster::heightForWidth(int w) const { +int Poster::heightForWidth(int w) const +{ return static_cast<int>(static_cast<double>(w) * 225 / 150); } -void Poster::resizeEvent(QResizeEvent*) { +void Poster::resizeEvent(QResizeEvent *) +{ RenderToLabel(); } -QSize Poster::minimumSizeHint() const { +QSize Poster::minimumSizeHint() const +{ return QSize(120, heightForWidth(120)); } -QSize Poster::sizeHint() const { +QSize Poster::sizeHint() const +{ return QSize(150, heightForWidth(150)); }
--- a/src/gui/widgets/sidebar.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/sidebar.cc Fri Jul 25 10:22:04 2025 -0400 @@ -4,7 +4,8 @@ #include <QListWidgetItem> #include <QMouseEvent> -SideBar::SideBar(QWidget* parent) : QListWidget(parent) { +SideBar::SideBar(QWidget *parent) : QListWidget(parent) +{ setFrameShape(QFrame::NoFrame); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -20,27 +21,32 @@ [this](int index) { emit CurrentItemChanged(RemoveSeparatorsFromIndex(index)); }); } -void SideBar::SetCurrentItem(int index) { +void SideBar::SetCurrentItem(int index) +{ setCurrentRow(AddSeparatorsToIndex(index)); } -int SideBar::GetCurrentItem() { +int SideBar::GetCurrentItem() +{ return RemoveSeparatorsFromIndex(currentRow()); } -void SideBar::SetBackgroundTransparent(bool yes) { +void SideBar::SetBackgroundTransparent(bool yes) +{ viewport()->setAutoFillBackground(!yes); } -QListWidgetItem* SideBar::AddItem(QString name, QIcon icon) { - QListWidgetItem* item = new QListWidgetItem(this); +QListWidgetItem *SideBar::AddItem(QString name, QIcon icon) +{ + QListWidgetItem *item = new QListWidgetItem(this); item->setText(name); if (!icon.isNull()) item->setIcon(icon); return item; } -QIcon SideBar::CreateIcon(const char* file) { +QIcon SideBar::CreateIcon(const char *file) +{ QPixmap pixmap(file, "PNG"); QIcon result; result.addPixmap(pixmap, QIcon::Normal); @@ -48,9 +54,10 @@ return result; } -QListWidgetItem* SideBar::AddSeparator() { - QListWidgetItem* item = new QListWidgetItem(this); - QFrame* line = new QFrame(this); +QListWidgetItem *SideBar::AddSeparator() +{ + QListWidgetItem *item = new QListWidgetItem(this); + QFrame *line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); line->setMouseTracking(true); @@ -62,7 +69,8 @@ return item; } -int SideBar::AddSeparatorsToIndex(int index) { +int SideBar::AddSeparatorsToIndex(int index) +{ int separators = 0, items = 0; for (; items <= index;) { @@ -76,7 +84,8 @@ return index + separators; } -int SideBar::RemoveSeparatorsFromIndex(int index) { +int SideBar::RemoveSeparatorsFromIndex(int index) +{ int i = 0, items = 0; for (; i < index; i++) { if (!IndexIsSeparator(indexFromItem(item(i)))) @@ -85,17 +94,20 @@ return items; } -bool SideBar::IndexIsSeparator(QModelIndex index) const { +bool SideBar::IndexIsSeparator(QModelIndex index) const +{ return !index.isValid() || !(index.flags() & Qt::ItemIsEnabled); } -QItemSelectionModel::SelectionFlags SideBar::selectionCommand(const QModelIndex& index, const QEvent*) const { +QItemSelectionModel::SelectionFlags SideBar::selectionCommand(const QModelIndex &index, const QEvent *) const +{ if (IndexIsSeparator(index)) return QItemSelectionModel::NoUpdate; return QItemSelectionModel::ClearAndSelect; } -void SideBar::mouseMoveEvent(QMouseEvent* event) { +void SideBar::mouseMoveEvent(QMouseEvent *event) +{ if (!IndexIsSeparator(indexAt(event->pos()))) setCursor(Qt::PointingHandCursor); else
--- a/src/gui/widgets/text.cc Fri Jul 25 10:16:02 2025 -0400 +++ b/src/gui/widgets/text.cc Fri Jul 25 10:22:04 2025 -0400 @@ -5,21 +5,18 @@ #include <QDebug> #include <QFrame> #include <QLabel> +#include <QPainter> +#include <QScrollArea> #include <QTextBlock> #include <QVBoxLayout> -#include <QScrollArea> -#include <QDebug> -#include <QPainter> namespace TextWidgets { /* Generic header meant to be used in conjunction with Section<T> */ -Header::Header(QWidget* parent) - : QWidget(parent) - , title_(new QLabel) - , separator_(new QFrame) { - QVBoxLayout* layout = new QVBoxLayout(this); +Header::Header(QWidget *parent) : QWidget(parent), title_(new QLabel), separator_(new QFrame) +{ + QVBoxLayout *layout = new QVBoxLayout(this); setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); title_->setTextFormat(Qt::PlainText); @@ -40,20 +37,27 @@ layout->setContentsMargins(0, 0, 0, 0); } -void Header::SetText(const std::string& text) { +void Header::SetText(const std::string &text) +{ title_->setText(Strings::ToQString(text)); updateGeometry(); } -Label::Label(QWidget *parent) : QLabel(parent) {} -Label::Label(const QString &string, QWidget *parent) : QLabel(string, parent) {} +Label::Label(QWidget *parent) : QLabel(parent) +{ +} +Label::Label(const QString &string, QWidget *parent) : QLabel(string, parent) +{ +} -void Label::SetElidingMode(bool elide) { +void Label::SetElidingMode(bool elide) +{ elide_ = elide; update(); } -void Label::paintEvent(QPaintEvent *event) { +void Label::paintEvent(QPaintEvent *event) +{ if (elide_) { /* bruh */ if (wordWrap()) { @@ -61,27 +65,27 @@ const QString content = text(); - QPainter painter(this); - QFontMetrics fontMetrics = painter.fontMetrics(); + QPainter painter(this); + QFontMetrics fontMetrics = painter.fontMetrics(); - bool didElide = false; - int lineSpacing = fontMetrics.lineSpacing(); - int y = 0; + bool didElide = false; + int lineSpacing = fontMetrics.lineSpacing(); + int y = 0; - QTextLayout textLayout(content, painter.font()); - textLayout.beginLayout(); - for (;;) { - QTextLine line = textLayout.createLine(); + QTextLayout textLayout(content, painter.font()); + textLayout.beginLayout(); + for (;;) { + QTextLine line = textLayout.createLine(); - if (!line.isValid()) - break; + if (!line.isValid()) + break; - line.setLineWidth(width()); - int nextLineY = y + lineSpacing; + line.setLineWidth(width()); + int nextLineY = y + lineSpacing; - if (height() >= nextLineY + lineSpacing) { - line.draw(&painter, QPoint(0, y)); - y = nextLineY; + if (height() >= nextLineY + lineSpacing) { + line.draw(&painter, QPoint(0, y)); + y = nextLineY; } else { QString lastLine = content.mid(line.textStart()); QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, width()); @@ -111,7 +115,8 @@ /* ---------------------------------------------------------------------------------- */ /* "Paragraph" widgets, as in widgets meant to hold a bunch of text. */ -Paragraph::Paragraph(QWidget *parent) : QWidget(parent), label_(new QLabel) { +Paragraph::Paragraph(QWidget *parent) : QWidget(parent), label_(new QLabel) +{ QVBoxLayout *layout = new QVBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); @@ -125,26 +130,28 @@ layout->addWidget(label_.data()); } -void Paragraph::SetText(const std::string& text) { +void Paragraph::SetText(const std::string &text) +{ label_->setText(Strings::ToQString(text)); } -void Paragraph::SetSelectable(bool enable) { +void Paragraph::SetSelectable(bool enable) +{ label_->setAttribute(Qt::WidgetAttribute::WA_TransparentForMouseEvents, !enable); label_->setCursor(enable ? Qt::IBeamCursor : Qt::ArrowCursor); } -void Paragraph::SetWordWrap(bool enable) { +void Paragraph::SetWordWrap(bool enable) +{ label_->setWordWrap(enable); } /* LabelledParagraph implementation */ -LabelledParagraph::LabelledParagraph(QWidget* parent) - : QWidget(parent) - , contents_(new QWidget) - , contents_layout_(new QGridLayout) { - QHBoxLayout* ly = new QHBoxLayout(this); +LabelledParagraph::LabelledParagraph(QWidget *parent) + : QWidget(parent), contents_(new QWidget), contents_layout_(new QGridLayout) +{ + QHBoxLayout *ly = new QHBoxLayout(this); contents_layout_->setVerticalSpacing(1); contents_layout_->setHorizontalSpacing(20); @@ -157,12 +164,14 @@ ly->setContentsMargins(0, 0, 0, 0); } -LabelledParagraph::~LabelledParagraph() { +LabelledParagraph::~LabelledParagraph() +{ data_.clear(); } -void LabelledParagraph::Clear(void) { - for (auto& [label, data] : data_) { +void LabelledParagraph::Clear(void) +{ + for (auto &[label, data] : data_) { contents_layout_->removeWidget(label.data()); contents_layout_->removeWidget(data.data()); } @@ -170,7 +179,8 @@ data_.clear(); } -void LabelledParagraph::SetData(const std::vector<std::pair<std::string, std::string>>& data) { +void LabelledParagraph::SetData(const std::vector<std::pair<std::string, std::string>> &data) +{ Clear(); data_.reserve(data.size()); @@ -185,18 +195,19 @@ data_.push_back({first, second}); - contents_layout_->addWidget(first.data(), i, 0); + contents_layout_->addWidget(first.data(), i, 0); contents_layout_->addWidget(second.data(), i, 1); } } -void LabelledParagraph::SetStyle(int style) { +void LabelledParagraph::SetStyle(int style) +{ const QString style_sheet = (style & LabelledParagraph::BoldedLabels) ? "font-weight: bold;" : ""; - for (auto& [label, data] : data_) + for (auto &[label, data] : data_) label->setStyleSheet(style_sheet); if (style & LabelledParagraph::ElidedData) { - for (auto& [label, data] : data_) { + for (auto &[label, data] : data_) { data->setWordWrap(false); data->SetElidingMode(true); }