Now allows you to store a state of the current puzzle, and to restore it later on.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22843 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -37,6 +37,8 @@ const uint32 kMsgAbortSudokuGenerator = 'asgn';
|
|||||||
const uint32 kMsgSudokuGenerated = 'sugn';
|
const uint32 kMsgSudokuGenerated = 'sugn';
|
||||||
const uint32 kMsgMarkInvalid = 'minv';
|
const uint32 kMsgMarkInvalid = 'minv';
|
||||||
const uint32 kMsgMarkValidHints = 'mvht';
|
const uint32 kMsgMarkValidHints = 'mvht';
|
||||||
|
const uint32 kMsgStoreState = 'stst';
|
||||||
|
const uint32 kMsgRestoreState = 'rest';
|
||||||
const uint32 kMsgNew = 'new ';
|
const uint32 kMsgNew = 'new ';
|
||||||
const uint32 kMsgStartAgain = 'stag';
|
const uint32 kMsgStartAgain = 'stag';
|
||||||
const uint32 kMsgExportAsText = 'extx';
|
const uint32 kMsgExportAsText = 'extx';
|
||||||
@@ -133,7 +135,8 @@ GenerateSudoku::_GenerateThread(void* _self)
|
|||||||
SudokuWindow::SudokuWindow()
|
SudokuWindow::SudokuWindow()
|
||||||
: BWindow(BRect(100, 100, 500, 520), "Sudoku", B_TITLED_WINDOW,
|
: BWindow(BRect(100, 100, 500, 520), "Sudoku", B_TITLED_WINDOW,
|
||||||
B_ASYNCHRONOUS_CONTROLS),
|
B_ASYNCHRONOUS_CONTROLS),
|
||||||
fGenerator(NULL)
|
fGenerator(NULL),
|
||||||
|
fStoredState(NULL)
|
||||||
{
|
{
|
||||||
BMessage settings;
|
BMessage settings;
|
||||||
_LoadSettings(settings);
|
_LoadSettings(settings);
|
||||||
@@ -146,6 +149,14 @@ SudokuWindow::SudokuWindow()
|
|||||||
} else
|
} else
|
||||||
frame = Bounds();
|
frame = Bounds();
|
||||||
|
|
||||||
|
if (settings.HasMessage("stored state")) {
|
||||||
|
fStoredState = new BMessage;
|
||||||
|
if (settings.FindMessage("stored state", fStoredState) != B_OK) {
|
||||||
|
delete fStoredState;
|
||||||
|
fStoredState = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// create GUI
|
// create GUI
|
||||||
|
|
||||||
BMenuBar* menuBar = new BMenuBar(Bounds(), "menu");
|
BMenuBar* menuBar = new BMenuBar(Bounds(), "menu");
|
||||||
@@ -167,6 +178,7 @@ SudokuWindow::SudokuWindow()
|
|||||||
|
|
||||||
// add menu
|
// add menu
|
||||||
|
|
||||||
|
// "File" menu
|
||||||
BMenu* menu = new BMenu("File");
|
BMenu* menu = new BMenu("File");
|
||||||
menu->AddItem(new BMenuItem("New", new BMessage(kMsgNew)));
|
menu->AddItem(new BMenuItem("New", new BMessage(kMsgNew)));
|
||||||
menu->AddItem(new BMenuItem("Start Again", new BMessage(kMsgStartAgain)));
|
menu->AddItem(new BMenuItem("Start Again", new BMessage(kMsgStartAgain)));
|
||||||
@@ -204,6 +216,7 @@ SudokuWindow::SudokuWindow()
|
|||||||
item->SetTarget(be_app);
|
item->SetTarget(be_app);
|
||||||
menuBar->AddItem(menu);
|
menuBar->AddItem(menu);
|
||||||
|
|
||||||
|
// "View" menu
|
||||||
menu = new BMenu("View");
|
menu = new BMenu("View");
|
||||||
menu->AddItem(item = new BMenuItem("Mark Invalid Values",
|
menu->AddItem(item = new BMenuItem("Mark Invalid Values",
|
||||||
new BMessage(kMsgMarkInvalid)));
|
new BMessage(kMsgMarkInvalid)));
|
||||||
@@ -216,7 +229,14 @@ SudokuWindow::SudokuWindow()
|
|||||||
menu->SetTargetForItems(this);
|
menu->SetTargetForItems(this);
|
||||||
menuBar->AddItem(menu);
|
menuBar->AddItem(menu);
|
||||||
|
|
||||||
|
// "Help" menu
|
||||||
menu = new BMenu("Help");
|
menu = new BMenu("Help");
|
||||||
|
menu->AddItem(new BMenuItem("Store Current", new BMessage(kMsgStoreState)));
|
||||||
|
menu->AddItem(fRestoreStateItem = new BMenuItem("Restore Saved",
|
||||||
|
new BMessage(kMsgRestoreState)));
|
||||||
|
fRestoreStateItem->SetEnabled(fStoredState != NULL);
|
||||||
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
menu->AddItem(new BMenuItem("Solve", new BMessage(kMsgSolveSudoku)));
|
menu->AddItem(new BMenuItem("Solve", new BMessage(kMsgSolveSudoku)));
|
||||||
menu->AddItem(new BMenuItem("Solve Single Field",
|
menu->AddItem(new BMenuItem("Solve Single Field",
|
||||||
new BMessage(kMsgSolveSingle)));
|
new BMessage(kMsgSolveSingle)));
|
||||||
@@ -282,6 +302,8 @@ SudokuWindow::_SaveSettings()
|
|||||||
status = settings.AddRect("window frame", Frame());
|
status = settings.AddRect("window frame", Frame());
|
||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = fSudokuView->SaveState(settings);
|
status = fSudokuView->SaveState(settings);
|
||||||
|
if (status == B_OK && fStoredState != NULL)
|
||||||
|
status = settings.AddMessage("stored state", fStoredState);
|
||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = settings.Flatten(&file);
|
status = settings.Flatten(&file);
|
||||||
|
|
||||||
@@ -289,6 +311,15 @@ SudokuWindow::_SaveSettings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SudokuWindow::_ResetStoredState()
|
||||||
|
{
|
||||||
|
delete fStoredState;
|
||||||
|
fStoredState = NULL;
|
||||||
|
fRestoreStateItem->SetEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SudokuWindow::_MessageDropped(BMessage* message)
|
SudokuWindow::_MessageDropped(BMessage* message)
|
||||||
{
|
{
|
||||||
@@ -344,6 +375,8 @@ SudokuWindow::_Generate(int32 level)
|
|||||||
|
|
||||||
fSudokuView->SetEditable(false);
|
fSudokuView->SetEditable(false);
|
||||||
fProgressWindow->Start(this);
|
fProgressWindow->Start(this);
|
||||||
|
_ResetStoredState();
|
||||||
|
|
||||||
fGenerator = new GenerateSudoku(*fSudokuView->Field(), level,
|
fGenerator = new GenerateSudoku(*fSudokuView->Field(), level,
|
||||||
fProgressWindow, this);
|
fProgressWindow, this);
|
||||||
}
|
}
|
||||||
@@ -417,6 +450,7 @@ SudokuWindow::MessageReceived(BMessage* message)
|
|||||||
}
|
}
|
||||||
|
|
||||||
case kMsgNew:
|
case kMsgNew:
|
||||||
|
_ResetStoredState();
|
||||||
fSudokuView->ClearAll();
|
fSudokuView->ClearAll();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -442,6 +476,23 @@ SudokuWindow::MessageReceived(BMessage* message)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case kMsgStoreState:
|
||||||
|
delete fStoredState;
|
||||||
|
fStoredState = new BMessage;
|
||||||
|
fSudokuView->Field()->Archive(fStoredState, true);
|
||||||
|
fRestoreStateItem->SetEnabled(true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kMsgRestoreState:
|
||||||
|
{
|
||||||
|
if (fStoredState == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
SudokuField* field = new SudokuField(fStoredState);
|
||||||
|
fSudokuView->SetTo(field);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case kMsgSudokuSolved:
|
case kMsgSudokuSolved:
|
||||||
(new BAlert("Sudoku request",
|
(new BAlert("Sudoku request",
|
||||||
"Sudoku solved - congratulations!", "Ok", NULL, NULL,
|
"Sudoku solved - congratulations!", "Ok", NULL, NULL,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
class BFile;
|
class BFile;
|
||||||
class BFilePanel;
|
class BFilePanel;
|
||||||
|
class BMenuItem;
|
||||||
class GenerateSudoku;
|
class GenerateSudoku;
|
||||||
class ProgressWindow;
|
class ProgressWindow;
|
||||||
class SudokuView;
|
class SudokuView;
|
||||||
@@ -28,6 +29,7 @@ private:
|
|||||||
status_t _LoadSettings(BMessage& settings);
|
status_t _LoadSettings(BMessage& settings);
|
||||||
status_t _SaveSettings();
|
status_t _SaveSettings();
|
||||||
|
|
||||||
|
void _ResetStoredState();
|
||||||
void _MessageDropped(BMessage *message);
|
void _MessageDropped(BMessage *message);
|
||||||
void _Generate(int32 level);
|
void _Generate(int32 level);
|
||||||
|
|
||||||
@@ -36,6 +38,8 @@ private:
|
|||||||
ProgressWindow* fProgressWindow;
|
ProgressWindow* fProgressWindow;
|
||||||
SudokuView* fSudokuView;
|
SudokuView* fSudokuView;
|
||||||
GenerateSudoku* fGenerator;
|
GenerateSudoku* fGenerator;
|
||||||
|
BMenuItem* fRestoreStateItem;
|
||||||
|
BMessage* fStoredState;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SUDOKU_WINDOW_H
|
#endif // SUDOKU_WINDOW_H
|
||||||
|
|||||||
Reference in New Issue
Block a user