PlayersModel::PlayersModel(sqlite3 *db) : db(db)
{
- load_data();
+ players = load_data();
}
QVariant PlayersModel::headerData(int section, Qt::Orientation orientation, int role) const
QVariant PlayersModel::data(const QModelIndex &index, int role) const
{
+ if (role == Qt::TextAlignmentRole) {
+ if (index.column() == 0) {
+ return (Qt::AlignHCenter | Qt::AlignVCenter).toInt();
+ } else if (index.column() == 1) {
+ return (Qt::AlignHCenter | Qt::AlignVCenter).toInt();
+ } else {
+ return (Qt::AlignLeft | Qt::AlignVCenter).toInt();
+ }
+ }
if (role != Qt::DisplayRole) {
return QVariant();
}
string PlayersModel::get_player_name_by_id(unsigned player_id)
{
- auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == player_id; });
+ auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
return it->name;
}
-void PlayersModel::load_data()
+string PlayersModel::get_player_gender_by_id(unsigned player_id)
+{
+ auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
+ return it->gender;
+}
+
+void PlayersModel::edit_player(int player_id, const string &number, const string &gender, const string &name)
{
- players.clear();
+ auto it = find_if(players.begin(), players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
+ int old_row = distance(players.begin(), it);
+
+ sqlite3_stmt *stmt;
+ int ret = sqlite3_prepare_v2(db, "UPDATE player SET number=?, gender=?, name=? WHERE player=?", -1, &stmt, 0);
+ if (ret != SQLITE_OK) {
+ fprintf(stderr, "UPDATE prepare: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+
+ sqlite3_bind_text(stmt, 1, number.data(), number.size(), SQLITE_STATIC);
+ sqlite3_bind_text(stmt, 2, gender.data(), gender.size(), SQLITE_STATIC);
+ sqlite3_bind_text(stmt, 3, name.data(), name.size(), SQLITE_STATIC);
+ sqlite3_bind_int64(stmt, 4, player_id);
+
+ ret = sqlite3_step(stmt);
+ if (ret != SQLITE_DONE) {
+ fprintf(stderr, "UPDATE step: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+
+ ret = sqlite3_finalize(stmt);
+ if (ret != SQLITE_OK) {
+ fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
+ abort();
+ }
+
+ vector<Player> new_players = load_data();
+ it = find_if(new_players.begin(), new_players.end(), [player_id](const Player &p) { return p.player_id == int(player_id); });
+ int new_row = distance(new_players.begin(), it);
+
+ if (old_row == new_row) {
+ players = std::move(new_players);
+ emit dataChanged(createIndex(old_row, 0), createIndex(old_row, 2));
+ } else {
+ emit beginMoveRows(QModelIndex(), old_row, old_row, QModelIndex(), new_row);
+ players = std::move(new_players);
+ emit endInsertRows();
+ }
+}
+
+std::vector<PlayersModel::Player> PlayersModel::load_data()
+{
+ std::vector<Player> new_players;
// Read the players.
sqlite3_stmt *stmt;
p.number = (const char *)sqlite3_column_text(stmt, 1);
p.name = (const char *)sqlite3_column_text(stmt, 2);
p.gender = (const char *)sqlite3_column_text(stmt, 3);
- players.push_back(p);
+ new_players.push_back(p);
} else if (ret == SQLITE_DONE) {
break;
} else {
fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
abort();
}
+
+ return new_players;
}