From 1cfbfd51a70ae61279f53a1b14dbc0c81fe1d259 Mon Sep 17 00:00:00 2001 From: Leifa♥ <26681464+TrickyLeifa@users.noreply.github.com> Date: Sun, 31 Jul 2022 04:57:01 +0200 Subject: Added server list context menu, ... (#835) * Added server list context menu, ... Resolve #832, #560 * The demo server listing now always appears at the top for consistency. * Add a context menu to server listing. Only appears during favorite server listing. Requires a valid item under cursor. Cannot be the demo server item. * Add a new UI element: `remove_from_fav` Only appears during favorite server listing. Require a selection to remove. Cannot be the demo server. Uses `removefromfav.png` and `removefromfav_pressed.png` images as textures. * Favorite servers are now loaded whenever the Lobby is created in addition to refresh and server listing switch. * `serverlist.txt` is now renamed to `(deprecated)serverlist.txt` if read from. * Updated comments * Typos --- src/lobby.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 5 deletions(-) (limited to 'src/lobby.cpp') diff --git a/src/lobby.cpp b/src/lobby.cpp index 8fb8e5da..6f3486b6 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -6,14 +6,14 @@ #include "demoserver.h" #include "networkmanager.h" +#include #include +#include Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() { ao_app = p_ao_app; - - // this->setWindowTitle(tr("Attorney Online %1").arg(ao_app->applicationVersion())); this->setWindowIcon(QIcon(":/logo.png")); this->setWindowFlags( (this->windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowMaximizeButtonHint); @@ -28,6 +28,9 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() ui_refresh->setObjectName("ui_refresh"); ui_add_to_fav = new AOButton(this, ao_app); ui_add_to_fav->setObjectName("ui_add_to_fav"); + ui_remove_from_fav = new AOButton(this, ao_app); + ui_remove_from_fav->setObjectName("ui_remove_from_fav"); + ui_remove_from_fav->hide(); ui_connect = new AOButton(this, ao_app); ui_connect->setObjectName("ui_connect"); ui_version = new QLabel(this); @@ -45,6 +48,7 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() ui_server_list->setColumnWidth(0, 0); ui_server_list->setIndentation(0); ui_server_list->setObjectName("ui_server_list"); + ui_server_list->setContextMenuPolicy(Qt::CustomContextMenu); ui_server_search = new QLineEdit(this); ui_server_search->setFrame(false); @@ -79,6 +83,10 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() &Lobby::on_add_to_fav_pressed); connect(ui_add_to_fav, &AOButton::released, this, &Lobby::on_add_to_fav_released); + connect(ui_remove_from_fav, &AOButton::pressed, this, + &Lobby::on_remove_from_fav_pressed); + connect(ui_remove_from_fav, &AOButton::released, this, + &Lobby::on_remove_from_fav_released); connect(ui_connect, &AOButton::pressed, this, &Lobby::on_connect_pressed); connect(ui_connect, &AOButton::released, this, &Lobby::on_connect_released); connect(ui_about, &AOButton::clicked, this, &Lobby::on_about_clicked); @@ -87,6 +95,8 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() &Lobby::on_server_list_clicked); connect(ui_server_list, &QTreeWidget::itemDoubleClicked, this, &Lobby::on_server_list_doubleclicked); + connect(ui_server_list, &QTreeWidget::customContextMenuRequested, this, + &Lobby::on_server_list_context_menu_requested); connect(ui_server_search, &QLineEdit::textChanged, this, &Lobby::on_server_search_edited); connect(ui_cancel, &AOButton::clicked, ao_app, &AOApplication::loading_cancelled); @@ -145,6 +155,9 @@ void Lobby::set_widgets() set_size_and_pos(ui_add_to_fav, "add_to_fav"); ui_add_to_fav->set_image("addtofav"); + set_size_and_pos(ui_remove_from_fav, "remove_from_fav"); + ui_remove_from_fav->set_image("removefromfav"); + set_size_and_pos(ui_connect, "connect"); ui_connect->set_image("connect"); @@ -300,6 +313,8 @@ void Lobby::on_public_servers_clicked() { ui_public_servers->set_image("publicservers_selected"); ui_favorites->set_image("favorites"); + ui_add_to_fav->show(); + ui_remove_from_fav->hide(); reset_selection(); @@ -310,12 +325,14 @@ void Lobby::on_public_servers_clicked() void Lobby::on_favorites_clicked() { - ui_favorites->set_image("favorites_selected"); ui_public_servers->set_image("publicservers"); + ui_favorites->set_image("favorites_selected"); + ui_add_to_fav->hide(); + ui_remove_from_fav->show(); reset_selection(); - ao_app->set_favorite_list(); + ao_app->load_favorite_list(); public_servers_selected = false; @@ -342,7 +359,7 @@ void Lobby::on_refresh_released() ao_app->net_manager->get_server_list(std::bind(&Lobby::list_servers, this)); get_motd(); } else { - ao_app->set_favorite_list(); + ao_app->load_favorite_list(); list_favorites(); } } @@ -363,6 +380,25 @@ void Lobby::on_add_to_fav_released() } } +void Lobby::on_remove_from_fav_pressed() +{ + ui_remove_from_fav->set_image("removefromfav_pressed"); +} + +void Lobby::on_remove_from_fav_released() +{ + ui_remove_from_fav->set_image("removefromfav"); + if (public_servers_selected) { + return; + } + + int selection = get_selected_server(); + if (selection > 0) { + ao_app->remove_favorite_server(selection); + list_favorites(); + } +} + void Lobby::on_connect_pressed() { ui_connect->set_image("connect_pressed"); } void Lobby::on_connect_released() @@ -479,6 +515,31 @@ void Lobby::on_server_list_doubleclicked(QTreeWidgetItem *p_item, int column) //on_connect_released(); } +void Lobby::on_server_list_context_menu_requested(const QPoint &point) +{ + if (public_servers_selected) { + return; + } + + auto *item = ui_server_list->itemAt(point); + if (item == nullptr) { + qInfo() << "no favorite server item; skipping context menu"; + return; + } + const int server_index = item->data(0, Qt::DisplayRole).toInt(); + if (server_index == 0) { + qInfo() << "demo server has no context menu to display"; + return; + } + + auto *menu = new QMenu(this); + menu->addAction(tr("Remove"), ao_app, [this,server_index](){ + ao_app->remove_favorite_server(server_index); + list_favorites(); + }); + menu->popup(ui_server_list->mapToGlobal(point)); +} + void Lobby::on_server_search_edited(QString p_text) { // Iterate through all QTreeWidgetItem items -- cgit