[games/chessament] src: Add Arbiters helper class

Manuel Alcaraz Zambrano <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit 47f9be29a17bbe73e93d8f4d9a9bcb1b12ce4b85 by Manuel Alcaraz Zambrano.
Committed on 06/08/2026 at 15:33.
Pushed by manuelal into branch 'master'.

Add Arbiters helper class

M  +6    -8    src/arbitersmodel.cpp
M  +93   -0    src/tournament/arbiter.cpp
M  +21   -0    src/tournament/arbiter.h
M  +4    -23   src/tournament/tournament.cpp
M  +2    -2    src/tournament/tournament.h
M  +2    -2    src/tournament/trf/reader.cpp
M  +1    -1    src/tournament/trf/writer.cpp

https://invent.kde.org/games/chessament/-/commit/47f9be29a17bbe73e93d8f4d9a9bcb1b12ce4b85

diff --git a/src/arbitersmodel.cpp b/src/arbitersmodel.cpp
index eebc549..8dd3ecc 100644
--- a/src/arbitersmodel.cpp
+++ b/src/arbitersmodel.cpp
@@ -32,7 +32,7 @@ int ArbitersModel::rowCount(const QModelIndex &parent) const
 {
     Q_UNUSED(parent);
 
-    return static_cast<int>(m_tournament->arbiters().size());
+    return m_tournament->arbiters().size();
 }
 
 QVariant ArbitersModel::data(const QModelIndex &index, int role) const
@@ -59,7 +59,7 @@ bool ArbitersModel::setData(const QModelIndex &index, const QVariant &value, int
 {
     Q_ASSERT(checkIndex(index, CheckIndexOption::IndexIsValid | CheckIndexOption::ParentIsInvalid));
 
-    const auto &arbiter = m_tournament->arbiters().at(index.row());
+    auto arbiter = m_tournament->arbiters().at(index.row());
 
     switch (role) {
     case ArbitersModel::Roles::Role: {
@@ -82,6 +82,7 @@ bool ArbitersModel::setData(const QModelIndex &index, const QVariant &value, int
         return false;
     }
 
+    m_tournament->arbiters().setArbiter(index.row(), std::move(arbiter));
     m_tournament->saveArbiters();
 
     Q_EMIT dataChanged(this->index(index.row()), this->index(index.row()));
@@ -102,8 +103,7 @@ QHash<int, QByteArray> ArbitersModel::roleNames() const
 void ArbitersModel::addArbiter()
 {
     beginInsertRows({}, rowCount(), rowCount());
-    auto arbiter = std::make_unique<Arbiter>();
-    m_tournament->arbiters().push_back(std::move(arbiter));
+    m_tournament->arbiters().addArbiter(std::make_unique<Arbiter>());
     endInsertRows();
 
     m_tournament->saveArbiters();
@@ -112,12 +112,10 @@ void ArbitersModel::addArbiter()
 void ArbitersModel::deleteArbiter(int row)
 {
     beginRemoveRows({}, row, row);
+    m_tournament->arbiters().removeArbiter(row);
+    endRemoveRows();
 
-    auto &arbiters = m_tournament->arbiters();
-    arbiters.erase(arbiters.begin() + row);
     m_tournament->saveArbiters();
-
-    endRemoveRows();
 }
 
 #include "moc_arbitersmodel.cpp"
diff --git a/src/tournament/arbiter.cpp b/src/tournament/arbiter.cpp
index 928908a..f5537bf 100644
--- a/src/tournament/arbiter.cpp
+++ b/src/tournament/arbiter.cpp
@@ -6,6 +6,8 @@
 #include <KLocalizedString>
 #include <QJsonArray>
 
+#include "utils.h"
+
 using namespace Qt::StringLiterals;
 
 Arbiter::Arbiter(const QString &name)
@@ -122,4 +124,95 @@ std::unique_ptr<Arbiter> Arbiter::fromTrf(const QString &text)
     return arbiter;
 }
 
+int Arbiters::size() const
+{
+    const auto value = m_json["arbiters"_L1];
+    if (!value.isArray()) {
+        return 0;
+    }
+
+    return static_cast<int>(value.toArray().size());
+}
+
+std::vector<std::unique_ptr<Arbiter>> Arbiters::all() const
+{
+    std::vector<std::unique_ptr<Arbiter>> result;
+
+    const auto arbiters = m_json["arbiters"_L1].toArray();
+    result.reserve(arbiters.size());
+
+    for (const auto arbiter : arbiters) {
+        result.push_back(Arbiter::fromJson(arbiter.toObject()));
+    }
+
+    return result;
+}
+
+std::unique_ptr<Arbiter> Arbiters::at(int index) const
+{
+    Q_ASSERT(index >= 0);
+
+    const auto arbiters = m_json["arbiters"_L1].toArray();
+    Q_ASSERT(index < arbiters.size());
+
+    return Arbiter::fromJson(arbiters[index].toObject());
+}
+
+void Arbiters::addArbiter(std::unique_ptr<Arbiter> arbiter)
+{
+    auto value = m_json["arbiters"_L1];
+    QJsonArray arbiters;
+
+    if (value.isArray()) {
+        arbiters = value.toArray();
+    }
+
+    arbiters << arbiter->toJson();
+    value = arbiters;
+}
+
+void Arbiters::setArbiter(int index, std::unique_ptr<Arbiter> arbiter)
+{
+    Q_ASSERT(index >= 0);
+
+    auto value = m_json["arbiters"_L1];
+    Q_ASSERT(value.isArray());
+
+    auto arbiters = value.toArray();
+    Q_ASSERT(index < arbiters.size());
+
+    auto json = arbiters[index].toObject();
+    Utils::updateObject(&json, arbiter->toJson());
+    arbiters[index] = json;
+
+    value = arbiters;
+}
+
+void Arbiters::removeArbiter(int index)
+{
+    Q_ASSERT(index >= 0);
+
+    auto value = m_json["arbiters"_L1];
+    Q_ASSERT(value.isArray());
+
+    auto arbiters = value.toArray();
+    Q_ASSERT(index < arbiters.size());
+
+    arbiters.erase(arbiters.begin() + index);
+
+    value = arbiters;
+}
+
+QJsonObject Arbiters::toJson() const
+{
+    return m_json;
+}
+
+Arbiters Arbiters::fromJson(const QJsonObject &json)
+{
+    Arbiters arbiters;
+    arbiters.m_json = json;
+    return arbiters;
+}
+
 #include "moc_arbiter.cpp"
diff --git a/src/tournament/arbiter.h b/src/tournament/arbiter.h
index 766188b..1996664 100644
--- a/src/tournament/arbiter.h
+++ b/src/tournament/arbiter.h
@@ -56,3 +56,24 @@ Q_SIGNALS:
 private:
     QJsonObject m_json;
 };
+
+struct Arbiters {
+    [[nodiscard]] int size() const;
+
+    [[nodiscard]] std::vector<std::unique_ptr<Arbiter>> all() const;
+
+    [[nodiscard]] std::unique_ptr<Arbiter> at(int index) const;
+
+    void addArbiter(std::unique_ptr<Arbiter> arbiter);
+
+    void setArbiter(int index, std::unique_ptr<Arbiter> arbiter);
+
+    void removeArbiter(int index);
+
+    [[nodiscard]] QJsonObject toJson() const;
+
+    static Arbiters fromJson(const QJsonObject &json);
+
+private:
+    QJsonObject m_json;
+};
diff --git a/src/tournament/tournament.cpp b/src/tournament/tournament.cpp
index d8be452..567f7e6 100644
--- a/src/tournament/tournament.cpp
+++ b/src/tournament/tournament.cpp
@@ -92,21 +92,16 @@ void Tournament::setFederation(const QString &federation)
     Q_EMIT federationChanged();
 }
 
-std::vector<std::unique_ptr<Arbiter>> &Tournament::arbiters()
+Arbiters &Tournament::arbiters()
 {
     return m_arbiters;
 }
 
 void Tournament::saveArbiters()
 {
-    QJsonArray values;
-
-    for (const auto &arbiter : m_arbiters) {
-        values << arbiter->toJson();
-    }
+    const auto text = QJsonDocument{m_arbiters.toJson()}.toJson(QJsonDocument::JsonFormat::Compact);
 
-    const auto doc = QJsonDocument{QJsonObject{{"arbiters"_L1, values}}};
-    const auto text = doc.toJson(QJsonDocument::Compact);
+    qDebug() << m_arbiters.toJson();
 
     setOption("arbiters"_L1, text);
 }
@@ -1488,21 +1483,7 @@ std::expected<void, QString> Tournament::loadTiebreaks()
 std::expected<void, QString> Tournament::loadArbiters()
 {
     const auto json = QJsonDocument::fromJson(option("arbiters"_L1).toByteArray());
-
-    if (const auto arbiters = json["arbiters"_L1]; arbiters.isArray()) {
-        m_arbiters.clear();
-
-        const auto values = arbiters.toArray();
-        for (const auto value : values) {
-            if (!value.isObject()) {
-                continue;
-            }
-
-            auto arbiter = Arbiter::fromJson(value.toObject());
-
-            m_arbiters.push_back(std::move(arbiter));
-        }
-    }
+    m_arbiters = Arbiters::fromJson(json.object());
 
     return {};
 }
diff --git a/src/tournament/tournament.h b/src/tournament/tournament.h
index 1654ce2..904db2c 100644
--- a/src/tournament/tournament.h
+++ b/src/tournament/tournament.h
@@ -84,7 +84,7 @@ public:
      */
     [[nodiscard]] QString federation() const;
 
-    [[nodiscard]] std::vector<std::unique_ptr<Arbiter>> &arbiters();
+    [[nodiscard]] Arbiters &arbiters();
 
     void saveArbiters();
 
@@ -418,7 +418,7 @@ private:
     QString m_name;
     QString m_city;
     QString m_federation;
-    std::vector<std::unique_ptr<Arbiter>> m_arbiters;
+    Arbiters m_arbiters;
     TimeControl m_timeControl;
     int m_numberOfRounds = 1;
     int m_currentRound = 0;
diff --git a/src/tournament/trf/reader.cpp b/src/tournament/trf/reader.cpp
index c96c5a8..8eb2804 100644
--- a/src/tournament/trf/reader.cpp
+++ b/src/tournament/trf/reader.cpp
@@ -122,13 +122,13 @@ std::expected<void, QString> TrfReader::readField(QStringView line)
     case Trf::Field::ChiefArbiter: {
         auto arbiter = Arbiter::fromTrf(value.toString());
         arbiter->setRole(Arbiter::Role::Chief);
-        m_tournament->arbiters().push_back(std::move(arbiter));
+        m_tournament->arbiters().addArbiter(std::move(arbiter));
         break;
     }
     case Trf::Field::DeputyChiefArbiter: {
         auto arbiter = Arbiter::fromTrf(value.toString());
         arbiter->setRole(Arbiter::Role::Deputy);
-        m_tournament->arbiters().push_back(std::move(arbiter));
+        m_tournament->arbiters().addArbiter(std::move(arbiter));
         break;
     }
     case Trf::Field::TimeControl:
diff --git a/src/tournament/trf/writer.cpp b/src/tournament/trf/writer.cpp
index 2ce3664..6302c24 100644
--- a/src/tournament/trf/writer.cpp
+++ b/src/tournament/trf/writer.cpp
@@ -58,7 +58,7 @@ void TrfWriter::writeTournamentInformation(QTextStream &stream)
 
 void TrfWriter::writeArbiters(QTextStream &stream)
 {
-    for (const auto &arbiter : m_tournament->arbiters()) {
+    for (const auto &arbiter : m_tournament->arbiters().all()) {
         switch (arbiter->role()) {
         case Arbiter::Role::Chief:
             stream << Trf::reportFieldString(Trf::Field::ChiefArbiter);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.