Skip to content

Commit 7d062d0

Browse files
trflynn89awesomekling
authored andcommitted
Solitaire: Persist game mode to config file
1 parent 5a8c220 commit 7d062d0

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

Userland/Games/Solitaire/Game.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ void Game::mousedown_event(GUI::MouseEvent& event)
196196
case Mode::ThreeCardDraw:
197197
cards_to_draw = 3;
198198
break;
199+
default:
200+
VERIFY_NOT_REACHED();
201+
break;
199202
}
200203

201204
update(stock.bounding_box());

Userland/Games/Solitaire/Game.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212

1313
namespace Solitaire {
1414

15-
enum class Mode {
15+
enum class Mode : u8 {
1616
SingleCardDraw,
1717
ThreeCardDraw,
18+
__Count
1819
};
1920

2021
class Game final : public GUI::Frame {

Userland/Games/Solitaire/main.cpp

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
#include "Game.h"
88
#include <Games/Solitaire/SolitaireGML.h>
9+
#include <LibCore/ConfigFile.h>
910
#include <LibCore/Timer.h>
1011
#include <LibGUI/Action.h>
1112
#include <LibGUI/ActionGroup.h>
1213
#include <LibGUI/Application.h>
1314
#include <LibGUI/Icon.h>
1415
#include <LibGUI/Menu.h>
1516
#include <LibGUI/Menubar.h>
17+
#include <LibGUI/MessageBox.h>
1618
#include <LibGUI/Statusbar.h>
1719
#include <LibGUI/Window.h>
1820
#include <stdio.h>
@@ -22,8 +24,9 @@ int main(int argc, char** argv)
2224
{
2325
auto app = GUI::Application::construct(argc, argv);
2426
auto app_icon = GUI::Icon::default_icon("app-solitaire");
27+
auto config = Core::ConfigFile::get_for_app("Solitaire");
2528

26-
if (pledge("stdio recvfd sendfd rpath", nullptr) < 0) {
29+
if (pledge("stdio recvfd sendfd rpath wpath cpath", nullptr) < 0) {
2730
perror("pledge");
2831
return 1;
2932
}
@@ -33,6 +36,11 @@ int main(int argc, char** argv)
3336
return 1;
3437
}
3538

39+
if (unveil(config->filename().characters(), "crw") < 0) {
40+
perror("unveil");
41+
return 1;
42+
}
43+
3644
if (unveil(nullptr, nullptr) < 0) {
3745
perror("unveil");
3846
return 1;
@@ -41,6 +49,18 @@ int main(int argc, char** argv)
4149
auto window = GUI::Window::construct();
4250
window->set_title("Solitaire");
4351

52+
auto mode = static_cast<Solitaire::Mode>(config->read_num_entry("Settings", "Mode", static_cast<int>(Solitaire::Mode::SingleCardDraw)));
53+
54+
auto update_mode = [&](Solitaire::Mode new_mode) {
55+
mode = new_mode;
56+
config->write_num_entry("Settings", "Mode", static_cast<int>(mode));
57+
if (!config->sync())
58+
GUI::MessageBox::show(window, "Configuration could not be saved", "Error", GUI::MessageBox::Type::Error);
59+
};
60+
61+
if (mode >= Solitaire::Mode::__Count)
62+
update_mode(Solitaire::Mode::SingleCardDraw);
63+
4464
auto& widget = window->set_main_widget<GUI::Widget>();
4565
widget.load_from_gml(solitaire_gml);
4666

@@ -91,23 +111,26 @@ int main(int argc, char** argv)
91111
draw_settng_actions.set_exclusive(true);
92112

93113
auto single_card_draw_action = GUI::Action::create_checkable("&Single Card Draw", [&](auto&) {
94-
game.setup(Solitaire::Mode::SingleCardDraw);
114+
update_mode(Solitaire::Mode::SingleCardDraw);
115+
game.setup(mode);
95116
});
96-
single_card_draw_action->set_checked(true);
117+
single_card_draw_action->set_checked(mode == Solitaire::Mode::SingleCardDraw);
97118
single_card_draw_action->set_status_tip("Draw one card at a time");
98119
draw_settng_actions.add_action(single_card_draw_action);
99120

100121
auto three_card_draw_action = GUI::Action::create_checkable("&Three Card Draw", [&](auto&) {
101-
game.setup(Solitaire::Mode::ThreeCardDraw);
122+
update_mode(Solitaire::Mode::ThreeCardDraw);
123+
game.setup(mode);
102124
});
125+
three_card_draw_action->set_checked(mode == Solitaire::Mode::ThreeCardDraw);
103126
three_card_draw_action->set_status_tip("Draw three cards at a time");
104127
draw_settng_actions.add_action(three_card_draw_action);
105128

106129
auto menubar = GUI::Menubar::construct();
107130
auto& game_menu = menubar->add_menu("&Game");
108131

109132
game_menu.add_action(GUI::Action::create("&New Game", { Mod_None, Key_F2 }, [&](auto&) {
110-
game.setup(game.mode());
133+
game.setup(mode);
111134
}));
112135
game_menu.add_separator();
113136
game_menu.add_action(single_card_draw_action);
@@ -123,7 +146,7 @@ int main(int argc, char** argv)
123146
window->set_menubar(move(menubar));
124147
window->set_icon(app_icon.bitmap_for_size(16));
125148
window->show();
126-
game.setup(game.mode());
149+
game.setup(mode);
127150

128151
return app->exec();
129152
}

0 commit comments

Comments
 (0)