diff options
| author | Leifa♥ <26681464+TrickyLeifa@users.noreply.github.com> | 2022-07-31 04:57:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-31 05:57:01 +0300 |
| commit | 1cfbfd51a70ae61279f53a1b14dbc0c81fe1d259 (patch) | |
| tree | 65bb1eee810a15016498740c0c8d23d073e664b3 /src/text_file_functions.cpp | |
| parent | 14731a0fca83f3ce193ec03a19bc2f5fefe70c6c (diff) | |
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
Diffstat (limited to 'src/text_file_functions.cpp')
| -rw-r--r-- | src/text_file_functions.cpp | 127 |
1 files changed, 73 insertions, 54 deletions
diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp index 908bbce5..d9c81620 100644 --- a/src/text_file_functions.cpp +++ b/src/text_file_functions.cpp @@ -243,78 +243,97 @@ bool AOApplication::append_to_file(QString p_text, QString p_file, return false; } -QVector<server_type> AOApplication::read_serverlist_txt() +QVector<server_type> AOApplication::read_favorite_servers() { - QVector<server_type> f_server_list; + QVector<server_type> serverlist; - QFile serverlist_txt(get_base_path() + "serverlist.txt"); - QFile serverlist_ini(get_base_path() + "favorite_servers.ini"); + // demo server is always at the top + server_type demo_server; + demo_server.ip = "127.0.0.1"; + demo_server.port = 99999; + demo_server.name = tr("Demo playback"); + demo_server.desc = tr("Play back demos you have previously recorded"); + serverlist.append(demo_server); - if (serverlist_txt.exists() && !serverlist_ini.exists()) { - migrate_serverlist_txt(serverlist_txt); + QString fav_servers_ini_path(get_base_path() + "favorite_servers.ini"); + if (!QFile::exists(fav_servers_ini_path)) { + qWarning() << "failed to locate favorite_servers.ini, falling back to legacy serverlist.txt"; + serverlist += read_legacy_favorite_servers(); } + else { + QSettings fav_servers_ini(fav_servers_ini_path, QSettings::IniFormat); + fav_servers_ini.setIniCodec("UTF-8"); + + auto grouplist = fav_servers_ini.childGroups(); + { // remove all negative and non-numbers + auto filtered_grouplist = grouplist; + for (const QString &group : qAsConst(grouplist)) { + bool ok = false; + const int l_num = group.toInt(&ok); + if (ok && l_num >= 0) { + continue; + } + filtered_grouplist.append(group); + } + std::sort(filtered_grouplist.begin(), filtered_grouplist.end(), [](const auto &a, const auto &b) -> bool { + return a.toInt() < b.toInt(); + }); + grouplist = std::move(filtered_grouplist); + } - if (serverlist_ini.exists()) { - QSettings l_favorite_ini(get_base_path() + "favorite_servers.ini", QSettings::IniFormat); - l_favorite_ini.setIniCodec("UTF-8"); - for(QString &fav_index: l_favorite_ini.childGroups()) { + for(const QString &group: qAsConst(grouplist)) { server_type f_server; - l_favorite_ini.beginGroup(fav_index); - f_server.ip = l_favorite_ini.value("address", "127.0.0.1").toString(); - f_server.port = l_favorite_ini.value("port", 27016).toInt(); - f_server.name = l_favorite_ini.value("name", "Missing Name").toString(); - f_server.desc = l_favorite_ini.value("desc", "No description").toString(); - f_server.socket_type = to_connection_type.value(l_favorite_ini.value("protocol", "tcp").toString()); - f_server_list.append(f_server); - l_favorite_ini.endGroup(); + fav_servers_ini.beginGroup(group); + f_server.ip = fav_servers_ini.value("address", "127.0.0.1").toString(); + f_server.port = fav_servers_ini.value("port", 27016).toInt(); + f_server.name = fav_servers_ini.value("name", "Missing Name").toString(); + f_server.desc = fav_servers_ini.value("desc", "No description").toString(); + f_server.socket_type = to_connection_type.value(fav_servers_ini.value("protocol", "tcp").toString()); + serverlist.append(std::move(f_server)); + fav_servers_ini.endGroup(); } } - server_type demo_server; - demo_server.ip = "127.0.0.1"; - demo_server.port = 99999; - demo_server.name = tr("Demo playback"); - demo_server.desc = tr("Play back demos you have previously recorded"); - f_server_list.append(demo_server); - - return f_server_list; + return serverlist; } -void AOApplication::migrate_serverlist_txt(QFile &p_serverlist_txt) +QVector<server_type> AOApplication::read_legacy_favorite_servers() { - // We migrate our legacy serverlist.txt to a QSettings object. - // Then we write it to disk. - QSettings l_settings(get_base_path() + "favorite_servers.ini", QSettings::IniFormat); - l_settings.setIniCodec("UTF-8"); - if (p_serverlist_txt.open(QIODevice::ReadOnly)) { - QTextStream l_favorite_textstream(&p_serverlist_txt); - l_favorite_textstream.setCodec("UTF-8"); - int l_entry_index = 0; + QVector<server_type> serverlist; - while (!l_favorite_textstream.atEnd()) { - QString l_favorite_line = l_favorite_textstream.readLine(); - QStringList l_line_contents = l_favorite_line.split(":"); + QFile serverlist_txt(get_base_path() + "serverlist.txt"); + if (!serverlist_txt.exists()) { + qWarning() << "serverlist.txt does not exist"; + } else if (!serverlist_txt.open(QIODevice::ReadOnly)) { + qWarning() << "failed to open serverlist.txt"; + } else { + QTextStream stream(&serverlist_txt); + stream.setCodec("UTF-8"); + + while (!stream.atEnd()) + { + QStringList contents = stream.readLine().split(":"); - if (l_line_contents.size() >= 3) { - l_settings.beginGroup(QString::number(l_entry_index)); - l_settings.setValue("name", l_line_contents.at(2)); - l_settings.setValue("address", l_line_contents.at(0)); - l_settings.setValue("port", l_line_contents.at(1)); + int item_count = contents.size(); + if (item_count < 3 || item_count > 4) { + continue; + } - if (l_line_contents.size() >= 4) { - l_settings.setValue("protocol", l_line_contents.at(3)); - } - else { - l_settings.setValue("protocol","tcp"); - } - l_settings.endGroup(); - l_entry_index++; + server_type server; + server.ip = contents.at(0); + server.port = contents.at(1).toInt(); + server.name = contents.at(2); + if (item_count == 4) { + server.socket_type = connection_type(contents.at(3).toInt()); + } else { + server.socket_type = TCP; } + serverlist.append(std::move(server)); } - l_settings.sync(); + serverlist_txt.close(); } - p_serverlist_txt.close(); - p_serverlist_txt.rename(get_base_path() + "serverlist_deprecated.txt"); + + return serverlist; } QString AOApplication::read_design_ini(QString p_identifier, |
