* Reorganized the new/generate menus a bit; the last level will now be
remembered, and a "new" will just continue in this level. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35461 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,18 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2007-2008, Axel Dörfler, [email protected].
|
* Copyright 2007-2010, Axel Dörfler, [email protected].
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "SudokuWindow.h"
|
#include "SudokuWindow.h"
|
||||||
|
|
||||||
#include "CenteredViewContainer.h"
|
|
||||||
#include "ProgressWindow.h"
|
|
||||||
#include "Sudoku.h"
|
|
||||||
#include "SudokuField.h"
|
|
||||||
#include "SudokuGenerator.h"
|
|
||||||
#include "SudokuView.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <Alert.h>
|
#include <Alert.h>
|
||||||
@@ -28,40 +21,52 @@
|
|||||||
|
|
||||||
#include <be_apps/Tracker/RecentItems.h>
|
#include <be_apps/Tracker/RecentItems.h>
|
||||||
|
|
||||||
|
#include "CenteredViewContainer.h"
|
||||||
|
#include "ProgressWindow.h"
|
||||||
|
#include "Sudoku.h"
|
||||||
|
#include "SudokuField.h"
|
||||||
|
#include "SudokuGenerator.h"
|
||||||
|
#include "SudokuView.h"
|
||||||
|
|
||||||
|
|
||||||
const uint32 kMsgOpenFilePanel = 'opfp';
|
const uint32 kMsgOpenFilePanel = 'opfp';
|
||||||
const uint32 kMsgGenerateVeryEasySudoku = 'gnsv';
|
const uint32 kMsgGenerateSudoku = 'gnsu';
|
||||||
const uint32 kMsgGenerateEasySudoku = 'gnse';
|
|
||||||
const uint32 kMsgGenerateHardSudoku = 'gnsh';
|
|
||||||
const uint32 kMsgAbortSudokuGenerator = 'asgn';
|
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 kMsgStoreState = 'stst';
|
||||||
const uint32 kMsgRestoreState = 'rest';
|
const uint32 kMsgRestoreState = 'rest';
|
||||||
const uint32 kMsgNew = 'new ';
|
const uint32 kMsgNewBlank = 'new ';
|
||||||
const uint32 kMsgStartAgain = 'stag';
|
const uint32 kMsgStartAgain = 'stag';
|
||||||
const uint32 kMsgExportAs = 'expt';
|
const uint32 kMsgExportAs = 'expt';
|
||||||
|
|
||||||
|
|
||||||
|
enum sudoku_level {
|
||||||
|
kEasyLevel = 0,
|
||||||
|
kAdvancedLevel = 2,
|
||||||
|
kHardLevel = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class GenerateSudoku {
|
class GenerateSudoku {
|
||||||
public:
|
public:
|
||||||
GenerateSudoku(SudokuField& field, int32 level, BMessenger progress,
|
GenerateSudoku(SudokuField& field, int32 level,
|
||||||
BMessenger target);
|
BMessenger progress, BMessenger target);
|
||||||
~GenerateSudoku();
|
~GenerateSudoku();
|
||||||
|
|
||||||
void Abort();
|
void Abort();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _Generate();
|
void _Generate();
|
||||||
static status_t _GenerateThread(void* self);
|
static status_t _GenerateThread(void* self);
|
||||||
|
|
||||||
SudokuField fField;
|
SudokuField fField;
|
||||||
BMessenger fTarget;
|
BMessenger fTarget;
|
||||||
BMessenger fProgress;
|
BMessenger fProgress;
|
||||||
thread_id fThread;
|
thread_id fThread;
|
||||||
int32 fLevel;
|
int32 fLevel;
|
||||||
bool fQuit;
|
bool fQuit;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -158,6 +163,9 @@ SudokuWindow::SudokuWindow()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32 level = 0;
|
||||||
|
settings.FindInt32("level", &level);
|
||||||
|
|
||||||
// create GUI
|
// create GUI
|
||||||
|
|
||||||
BMenuBar* menuBar = new BMenuBar(Bounds(), "menu");
|
BMenuBar* menuBar = new BMenuBar(Bounds(), "menu");
|
||||||
@@ -169,9 +177,10 @@ SudokuWindow::SudokuWindow()
|
|||||||
top->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
top->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||||
AddChild(top);
|
AddChild(top);
|
||||||
|
|
||||||
fSudokuView = new SudokuView(top->Bounds().InsetByCopy(10, 10).OffsetToSelf(0, 0),
|
fSudokuView = new SudokuView(
|
||||||
|
top->Bounds().InsetByCopy(10, 10).OffsetToSelf(0, 0),
|
||||||
"sudoku view", settings, B_FOLLOW_NONE);
|
"sudoku view", settings, B_FOLLOW_NONE);
|
||||||
CenteredViewContainer * container = new CenteredViewContainer(fSudokuView,
|
CenteredViewContainer* container = new CenteredViewContainer(fSudokuView,
|
||||||
top->Bounds().InsetByCopy(10, 10),
|
top->Bounds().InsetByCopy(10, 10),
|
||||||
"center", B_FOLLOW_ALL);
|
"center", B_FOLLOW_ALL);
|
||||||
container->SetHighColor(top->ViewColor());
|
container->SetHighColor(top->ViewColor());
|
||||||
@@ -181,7 +190,23 @@ SudokuWindow::SudokuWindow()
|
|||||||
|
|
||||||
// "File" menu
|
// "File" menu
|
||||||
BMenu* menu = new BMenu("File");
|
BMenu* menu = new BMenu("File");
|
||||||
menu->AddItem(new BMenuItem("New", new BMessage(kMsgNew)));
|
fNewMenu = new BMenu("New");
|
||||||
|
menu->AddItem(new BMenuItem(fNewMenu, new BMessage(kMsgGenerateSudoku)));
|
||||||
|
fNewMenu->Superitem()->SetShortcut('N', B_COMMAND_KEY);
|
||||||
|
|
||||||
|
BMessage* message = new BMessage(kMsgGenerateSudoku);
|
||||||
|
message->AddInt32("level", kEasyLevel);
|
||||||
|
fNewMenu->AddItem(new BMenuItem("Easy", message));
|
||||||
|
message = new BMessage(kMsgGenerateSudoku);
|
||||||
|
message->AddInt32("level", kAdvancedLevel);
|
||||||
|
fNewMenu->AddItem(new BMenuItem("Advanced", message));
|
||||||
|
message = new BMessage(kMsgGenerateSudoku);
|
||||||
|
message->AddInt32("level", kHardLevel);
|
||||||
|
fNewMenu->AddItem(new BMenuItem("Hard", message));
|
||||||
|
|
||||||
|
fNewMenu->AddSeparatorItem();
|
||||||
|
fNewMenu->AddItem(new BMenuItem("Blank", new BMessage(kMsgNewBlank)));
|
||||||
|
|
||||||
menu->AddItem(new BMenuItem("Start again", new BMessage(kMsgStartAgain)));
|
menu->AddItem(new BMenuItem("Start again", new BMessage(kMsgStartAgain)));
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
BMenu* recentsMenu = BRecentFilesList::NewFileListMenu(
|
BMenu* recentsMenu = BRecentFilesList::NewFileListMenu(
|
||||||
@@ -191,34 +216,19 @@ SudokuWindow::SudokuWindow()
|
|||||||
menu->AddItem(item = new BMenuItem(recentsMenu,
|
menu->AddItem(item = new BMenuItem(recentsMenu,
|
||||||
new BMessage(kMsgOpenFilePanel)));
|
new BMessage(kMsgOpenFilePanel)));
|
||||||
item->SetShortcut('O', B_COMMAND_KEY);
|
item->SetShortcut('O', B_COMMAND_KEY);
|
||||||
BMenu* subMenu = new BMenu("Generate");
|
|
||||||
subMenu->AddItem(new BMenuItem("Easy",
|
|
||||||
new BMessage(kMsgGenerateVeryEasySudoku)));
|
|
||||||
subMenu->AddItem(new BMenuItem("Advanced",
|
|
||||||
new BMessage(kMsgGenerateEasySudoku)));
|
|
||||||
subMenu->AddItem(new BMenuItem("Hard",
|
|
||||||
new BMessage(kMsgGenerateHardSudoku)));
|
|
||||||
menu->AddItem(subMenu);
|
|
||||||
|
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
subMenu = new BMenu("Export as" B_UTF8_ELLIPSIS);
|
BMenu* subMenu = new BMenu("Export as" B_UTF8_ELLIPSIS);
|
||||||
BMessage *msg;
|
message = new BMessage(kMsgExportAs);
|
||||||
msg = new BMessage(kMsgExportAs);
|
message->AddInt32("as", kExportAsText);
|
||||||
msg->AddInt32("as", kExportAsText);
|
subMenu->AddItem(new BMenuItem("Text", message));
|
||||||
subMenu->AddItem(new BMenuItem("Text", msg));
|
message= new BMessage(kMsgExportAs);
|
||||||
msg = new BMessage(kMsgExportAs);
|
message->AddInt32("as", kExportAsHTML);
|
||||||
msg->AddInt32("as", kExportAsHTML);
|
subMenu->AddItem(new BMenuItem("HTML", message));
|
||||||
subMenu->AddItem(new BMenuItem("HTML", msg));
|
|
||||||
/*
|
|
||||||
msg = new BMessage(kMsgExportAs);
|
|
||||||
msg->AddInt32("as", kExportAsBitmap);
|
|
||||||
subMenu->AddItem(new BMenuItem("Bitmap" B_UTF8_ELLIPSIS, msg));
|
|
||||||
*/
|
|
||||||
menu->AddItem(subMenu);
|
menu->AddItem(subMenu);
|
||||||
|
|
||||||
menu->AddItem(item = new BMenuItem("Copy",
|
menu->AddItem(item = new BMenuItem("Copy", new BMessage(B_COPY), 'C'));
|
||||||
new BMessage(B_COPY), 'C'));
|
|
||||||
|
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
@@ -235,11 +245,11 @@ SudokuWindow::SudokuWindow()
|
|||||||
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)));
|
||||||
if (fSudokuView->HintFlags() & kMarkInvalid)
|
if ((fSudokuView->HintFlags() & kMarkInvalid) != 0)
|
||||||
item->SetMarked(true);
|
item->SetMarked(true);
|
||||||
menu->AddItem(item = new BMenuItem("Mark valid hints",
|
menu->AddItem(item = new BMenuItem("Mark valid hints",
|
||||||
new BMessage(kMsgMarkValidHints)));
|
new BMessage(kMsgMarkValidHints)));
|
||||||
if (fSudokuView->HintFlags() & kMarkValidHints)
|
if ((fSudokuView->HintFlags() & kMarkValidHints) != 0)
|
||||||
item->SetMarked(true);
|
item->SetMarked(true);
|
||||||
menu->SetTargetForItems(this);
|
menu->SetTargetForItems(this);
|
||||||
menuBar->AddItem(menu);
|
menuBar->AddItem(menu);
|
||||||
@@ -253,7 +263,8 @@ SudokuWindow::SudokuWindow()
|
|||||||
fRedoItem->SetEnabled(false);
|
fRedoItem->SetEnabled(false);
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
menu->AddItem(new BMenuItem("Snapshot current", new BMessage(kMsgStoreState)));
|
menu->AddItem(new BMenuItem("Snapshot current",
|
||||||
|
new BMessage(kMsgStoreState)));
|
||||||
menu->AddItem(fRestoreStateItem = new BMenuItem("Restore snapshot",
|
menu->AddItem(fRestoreStateItem = new BMenuItem("Restore snapshot",
|
||||||
new BMessage(kMsgRestoreState)));
|
new BMessage(kMsgRestoreState)));
|
||||||
fRestoreStateItem->SetEnabled(fStoredState != NULL);
|
fRestoreStateItem->SetEnabled(fStoredState != NULL);
|
||||||
@@ -270,6 +281,8 @@ SudokuWindow::SudokuWindow()
|
|||||||
fSavePanel = new BFilePanel(B_SAVE_PANEL);
|
fSavePanel = new BFilePanel(B_SAVE_PANEL);
|
||||||
fSavePanel->SetTarget(this);
|
fSavePanel->SetTarget(this);
|
||||||
|
|
||||||
|
_SetLevel(level);
|
||||||
|
|
||||||
fSudokuView->StartWatching(this, kUndoRedoChanged);
|
fSudokuView->StartWatching(this, kUndoRedoChanged);
|
||||||
// we like to know whenever the undo/redo state changes
|
// we like to know whenever the undo/redo state changes
|
||||||
|
|
||||||
@@ -307,7 +320,7 @@ SudokuWindow::_LoadSettings(BMessage& settings)
|
|||||||
{
|
{
|
||||||
BFile file;
|
BFile file;
|
||||||
status_t status = _OpenSettings(file, B_READ_ONLY);
|
status_t status = _OpenSettings(file, B_READ_ONLY);
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
return settings.Unflatten(&file);
|
return settings.Unflatten(&file);
|
||||||
@@ -320,7 +333,7 @@ SudokuWindow::_SaveSettings()
|
|||||||
BFile file;
|
BFile file;
|
||||||
status_t status = _OpenSettings(file, B_WRITE_ONLY | B_CREATE_FILE
|
status_t status = _OpenSettings(file, B_WRITE_ONLY | B_CREATE_FILE
|
||||||
| B_ERASE_FILE);
|
| B_ERASE_FILE);
|
||||||
if (status < B_OK)
|
if (status != B_OK)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
BMessage settings('sudo');
|
BMessage settings('sudo');
|
||||||
@@ -329,6 +342,8 @@ SudokuWindow::_SaveSettings()
|
|||||||
status = fSudokuView->SaveState(settings);
|
status = fSudokuView->SaveState(settings);
|
||||||
if (status == B_OK && fStoredState != NULL)
|
if (status == B_OK && fStoredState != NULL)
|
||||||
status = settings.AddMessage("stored state", fStoredState);
|
status = settings.AddMessage("stored state", fStoredState);
|
||||||
|
if (status == B_OK)
|
||||||
|
status = settings.AddInt32("level", _Level());
|
||||||
if (status == B_OK)
|
if (status == B_OK)
|
||||||
status = settings.Flatten(&file);
|
status = settings.Flatten(&file);
|
||||||
|
|
||||||
@@ -425,15 +440,16 @@ SudokuWindow::MessageReceived(BMessage* message)
|
|||||||
_MessageDropped(message);
|
_MessageDropped(message);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kMsgGenerateVeryEasySudoku:
|
case kMsgGenerateSudoku:
|
||||||
_Generate(0);
|
{
|
||||||
break;
|
int32 level;
|
||||||
case kMsgGenerateEasySudoku:
|
if (message->FindInt32("level", &level) != B_OK)
|
||||||
_Generate(2);
|
level = _Level();
|
||||||
break;
|
|
||||||
case kMsgGenerateHardSudoku:
|
_SetLevel(level);
|
||||||
_Generate(4);
|
_Generate(level);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case kMsgAbortSudokuGenerator:
|
case kMsgAbortSudokuGenerator:
|
||||||
if (fGenerator != NULL)
|
if (fGenerator != NULL)
|
||||||
fGenerator->Abort();
|
fGenerator->Abort();
|
||||||
@@ -482,7 +498,7 @@ SudokuWindow::MessageReceived(BMessage* message)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case kMsgNew:
|
case kMsgNewBlank:
|
||||||
_ResetStoredState();
|
_ResetStoredState();
|
||||||
fSudokuView->ClearAll();
|
fSudokuView->ClearAll();
|
||||||
break;
|
break;
|
||||||
@@ -559,3 +575,34 @@ SudokuWindow::QuitRequested()
|
|||||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
be_app->PostMessage(B_QUIT_REQUESTED);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
SudokuWindow::_Level() const
|
||||||
|
{
|
||||||
|
BMenuItem* item = fNewMenu->FindMarked();
|
||||||
|
if (item == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
BMessage* message = item->Message();
|
||||||
|
if (message == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return message->FindInt32("level");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
SudokuWindow::_SetLevel(int32 level)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < fNewMenu->CountItems(); i++) {
|
||||||
|
BMenuItem* item = fNewMenu->ItemAt(i);
|
||||||
|
|
||||||
|
BMessage* message = item->Message();
|
||||||
|
if (message != NULL && message->HasInt32("level")
|
||||||
|
&& message->FindInt32("level") == level)
|
||||||
|
item->SetMarked(true);
|
||||||
|
else
|
||||||
|
item->SetMarked(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2007, Axel Dörfler, [email protected]. All rights reserved.
|
* Copyright 2007-2010, Axel Dörfler, [email protected].
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*/
|
*/
|
||||||
#ifndef SUDOKU_WINDOW_H
|
#ifndef SUDOKU_WINDOW_H
|
||||||
@@ -8,8 +8,10 @@
|
|||||||
|
|
||||||
#include <Window.h>
|
#include <Window.h>
|
||||||
|
|
||||||
|
|
||||||
class BFile;
|
class BFile;
|
||||||
class BFilePanel;
|
class BFilePanel;
|
||||||
|
class BMenu;
|
||||||
class BMenuItem;
|
class BMenuItem;
|
||||||
class GenerateSudoku;
|
class GenerateSudoku;
|
||||||
class ProgressWindow;
|
class ProgressWindow;
|
||||||
@@ -18,31 +20,35 @@ class SudokuView;
|
|||||||
|
|
||||||
class SudokuWindow : public BWindow {
|
class SudokuWindow : public BWindow {
|
||||||
public:
|
public:
|
||||||
SudokuWindow();
|
SudokuWindow();
|
||||||
virtual ~SudokuWindow();
|
virtual ~SudokuWindow();
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* message);
|
virtual void MessageReceived(BMessage* message);
|
||||||
virtual bool QuitRequested();
|
virtual bool QuitRequested();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
status_t _OpenSettings(BFile& file, uint32 mode);
|
status_t _OpenSettings(BFile& file, uint32 mode);
|
||||||
status_t _LoadSettings(BMessage& settings);
|
status_t _LoadSettings(BMessage& settings);
|
||||||
status_t _SaveSettings();
|
status_t _SaveSettings();
|
||||||
|
|
||||||
void _ResetStoredState();
|
void _ResetStoredState();
|
||||||
void _MessageDropped(BMessage *message);
|
void _MessageDropped(BMessage *message);
|
||||||
void _Generate(int32 level);
|
void _Generate(int32 level);
|
||||||
|
int32 _Level() const;
|
||||||
|
void _SetLevel(int32 level);
|
||||||
|
|
||||||
BFilePanel* fOpenPanel;
|
private:
|
||||||
BFilePanel* fSavePanel;
|
BFilePanel* fOpenPanel;
|
||||||
ProgressWindow* fProgressWindow;
|
BFilePanel* fSavePanel;
|
||||||
SudokuView* fSudokuView;
|
ProgressWindow* fProgressWindow;
|
||||||
GenerateSudoku* fGenerator;
|
SudokuView* fSudokuView;
|
||||||
BMenuItem* fRestoreStateItem;
|
GenerateSudoku* fGenerator;
|
||||||
BMenuItem* fUndoItem;
|
BMenuItem* fRestoreStateItem;
|
||||||
BMenuItem* fRedoItem;
|
BMenuItem* fUndoItem;
|
||||||
BMessage* fStoredState;
|
BMenuItem* fRedoItem;
|
||||||
uint32 fExportFormat;
|
BMenu* fNewMenu;
|
||||||
|
BMessage* fStoredState;
|
||||||
|
uint32 fExportFormat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SUDOKU_WINDOW_H
|
#endif // SUDOKU_WINDOW_H
|
||||||
|
|||||||
Reference in New Issue
Block a user