diff --git a/src/leaderboard.cpp b/src/leaderboard.cpp index e47503a..dfdad8e 100644 --- a/src/leaderboard.cpp +++ b/src/leaderboard.cpp @@ -3,6 +3,7 @@ #include #include #include +#include namespace { std::string file_path() { @@ -19,9 +20,11 @@ void Leaderboard::load() { auto path = file_path(); auto legacy = Glib::build_filename( Glib::get_user_config_dir(), "minesweeper", "leaderboard.ini"); + bool migrated = false; if (!Glib::file_test(path, Glib::FileTest::EXISTS) && Glib::file_test(legacy, Glib::FileTest::EXISTS)) { path = legacy; + migrated = true; } try { @@ -32,6 +35,11 @@ void Leaderboard::load() { times_[group.raw()] = kf->get_integer(group, "best"); } } + if (migrated) { + // Stale legacy files can hold outdated/experimental data; drop it + // so it can never be re-imported after the current file is gone. + g_remove(legacy.c_str()); + } } catch (const Glib::Error&) { // No file yet or unreadable — start with an empty leaderboard } @@ -52,6 +60,12 @@ std::optional Leaderboard::best_time(const std::string& difficulty) const { return it->second; } +void Leaderboard::clear() { + load(); + times_.clear(); + save(); +} + void Leaderboard::save() { auto kf = Glib::KeyFile::create(); for (const auto& [difficulty, seconds] : times_) { diff --git a/src/leaderboard.hpp b/src/leaderboard.hpp index 9c363db..9882129 100644 --- a/src/leaderboard.hpp +++ b/src/leaderboard.hpp @@ -15,6 +15,9 @@ public: // Best time in seconds for the difficulty, if one exists. std::optional best_time(const std::string& difficulty) const; + // Removes all recorded scores and rewrites the file. + void clear(); + private: void load(); void save(); diff --git a/src/window.cpp b/src/window.cpp index 278ba6c..2ec3101 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -178,6 +178,14 @@ void MainWindow::refresh_leaderboard() { row->set_text(diff.name + ": " + time_str); box_leaderboard_.append(*row); } + + auto* clear_btn = Gtk::make_managed("Clear scores"); + clear_btn->set_margin_top(8); + clear_btn->signal_clicked().connect([this]() { + leaderboard_.clear(); + menu_leaderboard_.popdown(); // Rebuilds on next show + }); + box_leaderboard_.append(*clear_btn); } void MainWindow::setup_board() {