[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);