From 96169f027106287f49171bd4e1eb06bb432eb541 Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Sat, 11 Jan 2025 01:09:05 -0600 Subject: [PATCH 1/3] add song favoriting --- src/aoapplication.h | 3 ++ src/courtroom.cpp | 67 ++++++++++++++++++++++++++++++++++++- src/courtroom.h | 2 ++ src/packet_distribution.cpp | 6 ++-- 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/aoapplication.h b/src/aoapplication.h index 6022ca1d7..ebcdab919 100644 --- a/src/aoapplication.h +++ b/src/aoapplication.h @@ -321,6 +321,9 @@ class AOApplication : public QObject const QString default_theme = "default"; // don't change this!!! don't do it!!! + // The name of the currently connected server. + QString server_name; + // The file name of the log file in base/logs. QString log_filename; diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 349e5a5bd..cb75364ec 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -150,8 +150,9 @@ Courtroom::Courtroom(AOApplication *p_ao_app) ui_area_list->setObjectName("ui_area_list"); ui_music_list = new QTreeWidget(this); - ui_music_list->setColumnCount(2); + ui_music_list->setColumnCount(3); ui_music_list->hideColumn(1); + ui_music_list->hideColumn(2); ui_music_list->setHeaderHidden(true); ui_music_list->header()->setStretchLastSection(false); ui_music_list->header()->setSectionResizeMode(QHeaderView::ResizeToContents); @@ -1703,6 +1704,41 @@ void Courtroom::list_music() QBrush missing_brush(ao_app->get_color("missing_song_color", f_file)); QTreeWidgetItem *parent = nullptr; + + // Handle favorites first so they're at the top of the list + QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); + favorite_songs_ini.beginGroup(ao_app->server_name); + const QStringList &favorite_songs = favorite_songs_ini.allKeys().sort(); + if (!favorite_songs.isEmpty()) + { + QTreeWidgetItem *favCategory; + favCategory = new QTreeWidgetItem(ui_music_list); + favCategory->setText(0, tr("== FAVORITES ==")); + favCategory->setText(1, tr("== FAVORITES ==")); + favCategory->setText(2, "1"); + favCategory->setBackground(0, missing_brush); + for (const QString &song : favorite_songs) + { + QTreeWidgetItem *favSong = new QTreeWidgetItem(favCategory); + QString f_song_listname = song.left(song.lastIndexOf(".")); + + favSong->setText(0, f_song_listname); + favSong->setText(1, song); + favSong->setText(2, "1"); + + QString song_path = ao_app->get_real_path(ao_app->get_music_path(song)); + + if (file_exists(song_path)) + { + favSong->setBackground(0, found_brush); + } + else + { + favSong->setBackground(0, missing_brush); + } + } + } + for (int n_song = 0; n_song < music_list.size(); ++n_song) { QString i_song = music_list.at(n_song); @@ -1730,6 +1766,7 @@ void Courtroom::list_music() } treeItem->setText(0, i_song_listname); treeItem->setText(1, i_song); + treeItem->setText(2, "0"); QString song_path = ao_app->get_real_path(ao_app->get_music_path(i_song)); @@ -5749,6 +5786,18 @@ void Courtroom::on_music_list_context_menu_requested(const QPoint &pos) menu->addAction(QString(tr("Collapse All Categories")), this, &Courtroom::music_list_collapse_all); menu->addSeparator(); + QTreeWidgetItem *current_song = ui_music_list->currentItem(); + if (ui_music_list->currentItem()->text(2) == "1") + { + menu->addAction(QString(tr("Remove Favorite")), this, [this, current_song] { Courtroom::remove_favorite_song(current_song); }); + menu->addSeparator(); + } + else + { + menu->addAction(QString(tr("Add Favorite")), this, [this, current_song] { Courtroom::add_favorite_song(current_song); }); + menu->addSeparator(); + } + menu->addAction(new QAction(tr("Fade Out Previous"), this)); menu->actions().back()->setCheckable(true); menu->actions().back()->setChecked(music_flags & FADE_OUT); @@ -5777,6 +5826,22 @@ void Courtroom::on_music_list_context_menu_requested(const QPoint &pos) menu->popup(ui_music_list->mapToGlobal(pos)); } +void Courtroom::add_favorite_song(QTreeWidgetItem *p_item) +{ + QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); + favorite_songs_ini.beginGroup(ao_app->server_name); + favorite_songs_ini.setValue(p_item->text(1), 1); + list_music(); +} + +void Courtroom::remove_favorite_song(QTreeWidgetItem *p_item) +{ + QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); + favorite_songs_ini.beginGroup(ao_app->server_name); + favorite_songs_ini.remove(p_item->text(1)); + list_music(); +} + void Courtroom::music_fade_out(bool toggle) { if (toggle) diff --git a/src/courtroom.h b/src/courtroom.h index 6cae0ff48..7c075b9d7 100644 --- a/src/courtroom.h +++ b/src/courtroom.h @@ -834,6 +834,8 @@ private Q_SLOTS: void on_music_search_edited(QString p_text); void on_music_list_double_clicked(QTreeWidgetItem *p_item, int column); void on_music_list_context_menu_requested(const QPoint &pos); + void add_favorite_song(QTreeWidgetItem *p_item); + void remove_favorite_song(QTreeWidgetItem *p_item); void music_fade_out(bool toggle); void music_fade_in(bool toggle); void music_synchronize(bool toggle); diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp index 6cf5c74fc..babdae2da 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -120,7 +120,6 @@ void AOApplication::server_packet_received(AOPacket packet) int selected_server = w_lobby->get_selected_server(); QString server_address; - QString server_name; switch (w_lobby->pageSelected()) { case 0: @@ -161,10 +160,11 @@ void AOApplication::server_packet_received(AOPacket packet) // Remove any characters not accepted in folder names for the server_name // here + QString server_name_stripped = server_name; if (Options::getInstance().logToDemoFileEnabled() && server_name != "Demo playback") { - this->log_filename = QDateTime::currentDateTime().toUTC().toString("'logs/" + server_name.remove(QRegularExpression("[\\\\/:*?\"<>|\']")) + "/'yyyy-MM-dd hh-mm-ss t'.log'"); - this->write_to_file("Joined server " + server_name + " hosted on address " + server_address + " on " + QDateTime::currentDateTime().toUTC().toString(), log_filename, true); + this->log_filename = QDateTime::currentDateTime().toUTC().toString("'logs/" + server_name_stripped.remove(QRegularExpression("[\\\\/:*?\"<>|\']")) + "/'yyyy-MM-dd hh-mm-ss t'.log'"); + this->write_to_file("Joined server " + server_name_stripped + " hosted on address " + server_address + " on " + QDateTime::currentDateTime().toUTC().toString(), log_filename, true); } else { From 5f6452c5cb24cf52433daf4ed842ce9e0bf7e811 Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Sat, 11 Jan 2025 01:15:52 -0600 Subject: [PATCH 2/3] remove incorrectly placed sort() --- src/courtroom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/courtroom.cpp b/src/courtroom.cpp index cb75364ec..245044e44 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -1708,7 +1708,7 @@ void Courtroom::list_music() // Handle favorites first so they're at the top of the list QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); favorite_songs_ini.beginGroup(ao_app->server_name); - const QStringList &favorite_songs = favorite_songs_ini.allKeys().sort(); + const QStringList &favorite_songs = favorite_songs_ini.allKeys(); if (!favorite_songs.isEmpty()) { QTreeWidgetItem *favCategory; From 6cb547d24704bb9b1cc3ccfd791b127b7bcae5b7 Mon Sep 17 00:00:00 2001 From: in1tiate <32779090+in1tiate@users.noreply.github.com> Date: Sat, 11 Jan 2025 01:43:27 -0600 Subject: [PATCH 3/3] store as qstringlist instead of using keys --- src/courtroom.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 245044e44..b085f67eb 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -1707,8 +1707,7 @@ void Courtroom::list_music() // Handle favorites first so they're at the top of the list QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); - favorite_songs_ini.beginGroup(ao_app->server_name); - const QStringList &favorite_songs = favorite_songs_ini.allKeys(); + const QStringList &favorite_songs = favorite_songs_ini.value(ao_app->server_name).toStringList(); if (!favorite_songs.isEmpty()) { QTreeWidgetItem *favCategory; @@ -5829,16 +5828,20 @@ void Courtroom::on_music_list_context_menu_requested(const QPoint &pos) void Courtroom::add_favorite_song(QTreeWidgetItem *p_item) { QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); - favorite_songs_ini.beginGroup(ao_app->server_name); - favorite_songs_ini.setValue(p_item->text(1), 1); + QStringList favorite_songs = favorite_songs_ini.value(ao_app->server_name).toStringList(); + favorite_songs.append(p_item->text(1)); + + favorite_songs_ini.setValue(ao_app->server_name, favorite_songs); list_music(); } void Courtroom::remove_favorite_song(QTreeWidgetItem *p_item) { QSettings favorite_songs_ini(get_base_path() + "favorite_songs.ini", QSettings::IniFormat); - favorite_songs_ini.beginGroup(ao_app->server_name); - favorite_songs_ini.remove(p_item->text(1)); + QStringList favorite_songs = favorite_songs_ini.value(ao_app->server_name).toStringList(); + favorite_songs.removeAll(p_item->text(1)); + + favorite_songs_ini.setValue(ao_app->server_name, favorite_songs); list_music(); }