From b559be6b7d8362ec1d2fe9277cb8e9cfb9a6559e Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 1 May 2023 15:15:28 +0200 Subject: [PATCH] Make it possible to delete events. --- events.cpp | 35 +++++++++++++++++++++++++++++++++-- events.h | 3 ++- mainwindow.h | 1 + mainwindow.ui | 3 +++ stats.cpp | 14 ++++++++++++++ 5 files changed, 53 insertions(+), 3 deletions(-) diff --git a/events.cpp b/events.cpp index 381991a..428ca73 100644 --- a/events.cpp +++ b/events.cpp @@ -120,11 +120,11 @@ void EventsModel::refresh_if_needed() const //emit dataChanged(QModelIndex( } -int EventsModel::insert_event(uint64_t t, int player_id) +unsigned EventsModel::insert_event(uint64_t t, int player_id) { auto it = lower_bound(events.begin(), events.end(), t, [](const Event &e, uint64_t t) { return e.t < t; }); - int pos = distance(events.begin(), it); + unsigned pos = distance(events.begin(), it); beginInsertRows(QModelIndex(), pos, pos); Event e; @@ -163,6 +163,37 @@ int EventsModel::insert_event(uint64_t t, int player_id) return pos; } +void EventsModel::delete_event(unsigned pos) +{ + int event_id = events[pos].event_id; + + beginRemoveRows(QModelIndex(), pos, pos); + events.erase(events.begin() + pos); + endRemoveRows(); + + // Delete the row from the database. + sqlite3_stmt *stmt; + int ret = sqlite3_prepare_v2(db, "DELETE FROM event WHERE event=?", -1, &stmt, 0); + if (ret != SQLITE_OK) { + fprintf(stderr, "DELETE prepare: %s\n", sqlite3_errmsg(db)); + abort(); + } + + sqlite3_bind_int64(stmt, 1, event_id); + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + fprintf(stderr, "DELETE step: %s\n", sqlite3_errmsg(db)); + abort(); + } + + ret = sqlite3_finalize(stmt); + if (ret != SQLITE_OK) { + fprintf(stderr, "DELETE finalize: %s\n", sqlite3_errmsg(db)); + abort(); + } +} + void EventsModel::set_event_type(unsigned pos, const string &type) { events[pos].type = type; diff --git a/events.h b/events.h index 2652468..9dba9cf 100644 --- a/events.h +++ b/events.h @@ -25,7 +25,8 @@ public: QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant data(const QModelIndex &index, int role) const override; - int insert_event(uint64_t t, int player_id); + unsigned insert_event(uint64_t t, int player_id); // Returns the row. + void delete_event(unsigned row); void set_event_type(unsigned row, const std::string &type); private: diff --git a/mainwindow.h b/mainwindow.h index 4e7095f..e78463d 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -18,6 +18,7 @@ public: private: void seek(int64_t delta_ms); void set_current_event_type(const std::string &type); + void delete_current_event(); Ui::MainWindow *ui; EventsModel *model; diff --git a/mainwindow.ui b/mainwindow.ui index 91ef5e5..580fbb4 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -405,6 +405,9 @@ Delete (⌫) + + Backspace + diff --git a/stats.cpp b/stats.cpp index 6a96266..437e0ee 100644 --- a/stats.cpp +++ b/stats.cpp @@ -109,6 +109,10 @@ MainWindow::MainWindow() connect(ui->offensive_soft_minus, &QPushButton::clicked, [this]() { set_current_event_type("offensive_soft_minus"); }); connect(ui->pull, &QPushButton::clicked, [this]() { set_current_event_type("pull"); }); connect(ui->pull_landed, &QPushButton::clicked, [this]() { set_current_event_type("pull_landed"); }); + + QShortcut *key_delete = new QShortcut(QKeySequence(Qt::Key_Delete), this); + connect(key_delete, &QShortcut::activated, [this]() { ui->delete_->animateClick(); }); + connect(ui->delete_, &QPushButton::clicked, [this]() { delete_current_event(); }); } void MainWindow::setModel(EventsModel *model) @@ -138,6 +142,16 @@ void MainWindow::set_current_event_type(const string &type) model->set_event_type(row, type); } +void MainWindow::delete_current_event() +{ + QItemSelectionModel *select = ui->event_view->selectionModel(); + if (!select->hasSelection()) { + return; + } + int row = select->selectedRows().front().row(); // Should only be one, due to our selection behavior. + model->delete_event(row); +} + sqlite3 *open_db(const char *filename) { sqlite3 *db; -- 2.39.2