Browse Source

Minesweeper: Allow single-click chording

This is how other Minesweeper games I've played usually behave.
Single-click chording can be disabled from the menu or config file.
Jookia 6 years ago
parent
commit
9dbf453015
3 changed files with 26 additions and 2 deletions
  1. 9 2
      Games/Minesweeper/Field.cpp
  2. 3 0
      Games/Minesweeper/Field.h
  3. 14 0
      Games/Minesweeper/main.cpp

+ 9 - 2
Games/Minesweeper/Field.cpp

@@ -43,8 +43,9 @@ public:
 
     virtual void mousedown_event(GMouseEvent& event) override
     {
-        if (event.buttons() == (GMouseButton::Right | GMouseButton::Left)) {
-            if (event.button() == GMouseButton::Left || event.button() == GMouseButton::Right) {
+        if (event.button() == GMouseButton::Right || event.button() == GMouseButton::Left) {
+            if (event.buttons() == (GMouseButton::Right | GMouseButton::Left) ||
+                  m_square.field->is_single_chording()) {
                 m_chord = true;
                 m_square.field->set_chord_preview(m_square, true);
             }
@@ -461,6 +462,12 @@ void Field::set_field_size(int rows, int columns, int mine_count)
         on_size_changed();
 }
 
+void Field::set_single_chording(bool enabled) {
+    auto config = CConfigFile::get_for_app("Minesweeper");
+    m_single_chording = enabled;
+    config->write_bool_entry("Minesweeper", "SingleChording", m_single_chording);
+}
+
 Square::~Square()
 {
     delete label;

+ 3 - 0
Games/Minesweeper/Field.h

@@ -43,8 +43,10 @@ public:
     int columns() const { return m_columns; }
     int mine_count() const { return m_mine_count; }
     int square_size() const { return 15; }
+    bool is_single_chording() const { return m_single_chording; }
 
     void set_field_size(int rows, int columns, int mine_count);
+    void set_single_chording(bool new_val);
 
     void reset();
 
@@ -100,4 +102,5 @@ private:
     Face m_face { Face::Default };
     bool m_chord_preview { false };
     bool m_first_click { true };
+    bool m_single_chording { true };
 };

+ 14 - 0
Games/Minesweeper/main.cpp

@@ -49,15 +49,29 @@ int main(int argc, char** argv)
 
     {
         auto config = CConfigFile::get_for_app("Minesweeper");
+        bool single_chording = config->read_num_entry("Minesweeper", "SingleChording", false);
         int mine_count = config->read_num_entry("Game", "MineCount", 10);
         int rows = config->read_num_entry("Game", "Rows", 9);
         int columns = config->read_num_entry("Game", "Columns", 9);
         field->set_field_size(rows, columns, mine_count);
+        field->set_single_chording(single_chording);
     }
 
     auto menubar = make<GMenuBar>();
 
     auto app_menu = make<GMenu>("Minesweeper");
+
+    RefPtr<GAction> chord_toggler_action;
+    chord_toggler_action = GAction::create("Single-click chording", [&](const GAction&) {
+        bool toggled = !field->is_single_chording();
+        field->set_single_chording(toggled);
+        chord_toggler_action->set_checked(toggled);
+    });
+    chord_toggler_action->set_checkable(true);
+    chord_toggler_action->set_checked(field->is_single_chording());
+    app_menu->add_action(*chord_toggler_action);
+    app_menu->add_separator();
+
     app_menu->add_action(GAction::create("Quit", { Mod_Alt, Key_F4 }, [](const GAction&) {
         GApplication::the().quit(0);
         return;