6
6
7
7
#include " Game.h"
8
8
#include < Games/Solitaire/SolitaireGML.h>
9
+ #include < LibCore/ConfigFile.h>
9
10
#include < LibCore/Timer.h>
10
11
#include < LibGUI/Action.h>
11
12
#include < LibGUI/ActionGroup.h>
12
13
#include < LibGUI/Application.h>
13
14
#include < LibGUI/Icon.h>
14
15
#include < LibGUI/Menu.h>
15
16
#include < LibGUI/Menubar.h>
17
+ #include < LibGUI/MessageBox.h>
16
18
#include < LibGUI/Statusbar.h>
17
19
#include < LibGUI/Window.h>
18
20
#include < stdio.h>
@@ -22,8 +24,9 @@ int main(int argc, char** argv)
22
24
{
23
25
auto app = GUI::Application::construct (argc, argv);
24
26
auto app_icon = GUI::Icon::default_icon (" app-solitaire" );
27
+ auto config = Core::ConfigFile::get_for_app (" Solitaire" );
25
28
26
- if (pledge (" stdio recvfd sendfd rpath" , nullptr ) < 0 ) {
29
+ if (pledge (" stdio recvfd sendfd rpath wpath cpath " , nullptr ) < 0 ) {
27
30
perror (" pledge" );
28
31
return 1 ;
29
32
}
@@ -33,6 +36,11 @@ int main(int argc, char** argv)
33
36
return 1 ;
34
37
}
35
38
39
+ if (unveil (config->filename ().characters (), " crw" ) < 0 ) {
40
+ perror (" unveil" );
41
+ return 1 ;
42
+ }
43
+
36
44
if (unveil (nullptr , nullptr ) < 0 ) {
37
45
perror (" unveil" );
38
46
return 1 ;
@@ -41,6 +49,18 @@ int main(int argc, char** argv)
41
49
auto window = GUI::Window::construct ();
42
50
window->set_title (" Solitaire" );
43
51
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
+
44
64
auto & widget = window->set_main_widget <GUI::Widget>();
45
65
widget.load_from_gml (solitaire_gml);
46
66
@@ -91,23 +111,26 @@ int main(int argc, char** argv)
91
111
draw_settng_actions.set_exclusive (true );
92
112
93
113
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);
95
116
});
96
- single_card_draw_action->set_checked (true );
117
+ single_card_draw_action->set_checked (mode == Solitaire::Mode::SingleCardDraw );
97
118
single_card_draw_action->set_status_tip (" Draw one card at a time" );
98
119
draw_settng_actions.add_action (single_card_draw_action);
99
120
100
121
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);
102
124
});
125
+ three_card_draw_action->set_checked (mode == Solitaire::Mode::ThreeCardDraw);
103
126
three_card_draw_action->set_status_tip (" Draw three cards at a time" );
104
127
draw_settng_actions.add_action (three_card_draw_action);
105
128
106
129
auto menubar = GUI::Menubar::construct ();
107
130
auto & game_menu = menubar->add_menu (" &Game" );
108
131
109
132
game_menu.add_action (GUI::Action::create (" &New Game" , { Mod_None, Key_F2 }, [&](auto &) {
110
- game.setup (game. mode () );
133
+ game.setup (mode);
111
134
}));
112
135
game_menu.add_separator ();
113
136
game_menu.add_action (single_card_draw_action);
@@ -123,7 +146,7 @@ int main(int argc, char** argv)
123
146
window->set_menubar (move (menubar));
124
147
window->set_icon (app_icon.bitmap_for_size (16 ));
125
148
window->show ();
126
- game.setup (game. mode () );
149
+ game.setup (mode);
127
150
128
151
return app->exec ();
129
152
}
0 commit comments