#pragma once #include #include #include #include #include "minefield.hpp" #include "board_widget.hpp" #include "leaderboard.hpp" class MainWindow : public Gtk::ApplicationWindow { public: MainWindow(); ~MainWindow() override; private: // UI Setup void setup_header_bar(); void setup_board(); void refresh_leaderboard(); // Actions void start_new_game(const GameDifficulty& difficulty); void on_game_state_changed(); bool on_timer_tick(); void show_game_over_dialog(bool won, bool new_best, int seconds); // Widgets Gtk::HeaderBar header_bar_; Gtk::Button btn_new_game_; Gtk::MenuButton btn_difficulty_; Gtk::Popover menu_difficulty_; Gtk::Box box_difficulty_; // Content for popover std::vector> difficulty_buttons_; Gtk::MenuButton btn_leaderboard_; Gtk::Popover menu_leaderboard_; Gtk::Box box_leaderboard_; // Content for popover Gtk::Label lbl_time_; Gtk::Label lbl_flags_; BoardWidget board_widget_; Leaderboard leaderboard_; // Game State std::shared_ptr minefield_; sigc::connection timer_conn_; sigc::connection dialog_timeout_conn_; GameDifficulty current_difficulty_ = Minefield::DifficultyEasy; Gtk::MessageDialog* game_over_dialog_ = nullptr; };