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 &lt;paper@paper.us.eu.org&gt;</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 &lt;paper@paper.us.eu.org&gt;</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);
 		}