* 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:
parent
755a1de8c1
commit
3d2b15cdf9
@ -1,18 +1,11 @@
|
||||
/*
|
||||
* Copyright 2007-2008, Axel Dörfler, axeld@pinc-software.de.
|
||||
* Copyright 2007-2010, Axel Dörfler, axeld@pinc-software.de.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
|
||||
|
||||
#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 <Alert.h>
|
||||
@ -28,40 +21,52 @@
|
||||
|
||||
#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 kMsgGenerateVeryEasySudoku = 'gnsv';
|
||||
const uint32 kMsgGenerateEasySudoku = 'gnse';
|
||||
const uint32 kMsgGenerateHardSudoku = 'gnsh';
|
||||
const uint32 kMsgGenerateSudoku = 'gnsu';
|
||||
const uint32 kMsgAbortSudokuGenerator = 'asgn';
|
||||
const uint32 kMsgSudokuGenerated = 'sugn';
|
||||
const uint32 kMsgMarkInvalid = 'minv';
|
||||
const uint32 kMsgMarkValidHints = 'mvht';
|
||||
const uint32 kMsgStoreState = 'stst';
|
||||
const uint32 kMsgRestoreState = 'rest';
|
||||
const uint32 kMsgNew = 'new ';
|
||||
const uint32 kMsgNewBlank = 'new ';
|
||||
const uint32 kMsgStartAgain = 'stag';
|
||||
const uint32 kMsgExportAs = 'expt';
|
||||
|
||||
|
||||
enum sudoku_level {
|
||||
kEasyLevel = 0,
|
||||
kAdvancedLevel = 2,
|
||||
kHardLevel = 4,
|
||||
};
|
||||
|
||||
|
||||
class GenerateSudoku {
|
||||
public:
|
||||
GenerateSudoku(SudokuField& field, int32 level, BMessenger progress,
|
||||
BMessenger target);
|
||||
~GenerateSudoku();
|
||||
GenerateSudoku(SudokuField& field, int32 level,
|
||||
BMessenger progress, BMessenger target);
|
||||
~GenerateSudoku();
|
||||
|
||||
void Abort();
|
||||
void Abort();
|
||||
|
||||
private:
|
||||
void _Generate();
|
||||
static status_t _GenerateThread(void* self);
|
||||
void _Generate();
|
||||
static status_t _GenerateThread(void* self);
|
||||
|
||||
SudokuField fField;
|
||||
BMessenger fTarget;
|
||||
BMessenger fProgress;
|
||||
thread_id fThread;
|
||||
int32 fLevel;
|
||||
bool fQuit;
|
||||
SudokuField fField;
|
||||
BMessenger fTarget;
|
||||
BMessenger fProgress;
|
||||
thread_id fThread;
|
||||
int32 fLevel;
|
||||
bool fQuit;
|
||||
};
|
||||
|
||||
|
||||
@ -158,6 +163,9 @@ SudokuWindow::SudokuWindow()
|
||||
}
|
||||
}
|
||||
|
||||
int32 level = 0;
|
||||
settings.FindInt32("level", &level);
|
||||
|
||||
// create GUI
|
||||
|
||||
BMenuBar* menuBar = new BMenuBar(Bounds(), "menu");
|
||||
@ -169,10 +177,11 @@ SudokuWindow::SudokuWindow()
|
||||
top->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
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);
|
||||
CenteredViewContainer * container = new CenteredViewContainer(fSudokuView,
|
||||
top->Bounds().InsetByCopy(10, 10),
|
||||
CenteredViewContainer* container = new CenteredViewContainer(fSudokuView,
|
||||
top->Bounds().InsetByCopy(10, 10),
|
||||
"center", B_FOLLOW_ALL);
|
||||
container->SetHighColor(top->ViewColor());
|
||||
top->AddChild(container);
|
||||
@ -181,7 +190,23 @@ SudokuWindow::SudokuWindow()
|
||||
|
||||
// "File" menu
|
||||
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->AddSeparatorItem();
|
||||
BMenu* recentsMenu = BRecentFilesList::NewFileListMenu(
|
||||
@ -191,34 +216,19 @@ SudokuWindow::SudokuWindow()
|
||||
menu->AddItem(item = new BMenuItem(recentsMenu,
|
||||
new BMessage(kMsgOpenFilePanel)));
|
||||
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();
|
||||
|
||||
subMenu = new BMenu("Export as" B_UTF8_ELLIPSIS);
|
||||
BMessage *msg;
|
||||
msg = new BMessage(kMsgExportAs);
|
||||
msg->AddInt32("as", kExportAsText);
|
||||
subMenu->AddItem(new BMenuItem("Text", msg));
|
||||
msg = new BMessage(kMsgExportAs);
|
||||
msg->AddInt32("as", kExportAsHTML);
|
||||
subMenu->AddItem(new BMenuItem("HTML", msg));
|
||||
/*
|
||||
msg = new BMessage(kMsgExportAs);
|
||||
msg->AddInt32("as", kExportAsBitmap);
|
||||
subMenu->AddItem(new BMenuItem("Bitmap" B_UTF8_ELLIPSIS, msg));
|
||||
*/
|
||||
BMenu* subMenu = new BMenu("Export as" B_UTF8_ELLIPSIS);
|
||||
message = new BMessage(kMsgExportAs);
|
||||
message->AddInt32("as", kExportAsText);
|
||||
subMenu->AddItem(new BMenuItem("Text", message));
|
||||
message= new BMessage(kMsgExportAs);
|
||||
message->AddInt32("as", kExportAsHTML);
|
||||
subMenu->AddItem(new BMenuItem("HTML", message));
|
||||
menu->AddItem(subMenu);
|
||||
|
||||
menu->AddItem(item = new BMenuItem("Copy",
|
||||
new BMessage(B_COPY), 'C'));
|
||||
menu->AddItem(item = new BMenuItem("Copy", new BMessage(B_COPY), 'C'));
|
||||
|
||||
menu->AddSeparatorItem();
|
||||
|
||||
@ -235,11 +245,11 @@ SudokuWindow::SudokuWindow()
|
||||
menu = new BMenu("View");
|
||||
menu->AddItem(item = new BMenuItem("Mark invalid values",
|
||||
new BMessage(kMsgMarkInvalid)));
|
||||
if (fSudokuView->HintFlags() & kMarkInvalid)
|
||||
if ((fSudokuView->HintFlags() & kMarkInvalid) != 0)
|
||||
item->SetMarked(true);
|
||||
menu->AddItem(item = new BMenuItem("Mark valid hints",
|
||||
new BMessage(kMsgMarkValidHints)));
|
||||
if (fSudokuView->HintFlags() & kMarkValidHints)
|
||||
if ((fSudokuView->HintFlags() & kMarkValidHints) != 0)
|
||||
item->SetMarked(true);
|
||||
menu->SetTargetForItems(this);
|
||||
menuBar->AddItem(menu);
|
||||
@ -253,7 +263,8 @@ SudokuWindow::SudokuWindow()
|
||||
fRedoItem->SetEnabled(false);
|
||||
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",
|
||||
new BMessage(kMsgRestoreState)));
|
||||
fRestoreStateItem->SetEnabled(fStoredState != NULL);
|
||||
@ -270,6 +281,8 @@ SudokuWindow::SudokuWindow()
|
||||
fSavePanel = new BFilePanel(B_SAVE_PANEL);
|
||||
fSavePanel->SetTarget(this);
|
||||
|
||||
_SetLevel(level);
|
||||
|
||||
fSudokuView->StartWatching(this, kUndoRedoChanged);
|
||||
// we like to know whenever the undo/redo state changes
|
||||
|
||||
@ -307,7 +320,7 @@ SudokuWindow::_LoadSettings(BMessage& settings)
|
||||
{
|
||||
BFile file;
|
||||
status_t status = _OpenSettings(file, B_READ_ONLY);
|
||||
if (status < B_OK)
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
|
||||
return settings.Unflatten(&file);
|
||||
@ -320,7 +333,7 @@ SudokuWindow::_SaveSettings()
|
||||
BFile file;
|
||||
status_t status = _OpenSettings(file, B_WRITE_ONLY | B_CREATE_FILE
|
||||
| B_ERASE_FILE);
|
||||
if (status < B_OK)
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
|
||||
BMessage settings('sudo');
|
||||
@ -329,6 +342,8 @@ SudokuWindow::_SaveSettings()
|
||||
status = fSudokuView->SaveState(settings);
|
||||
if (status == B_OK && fStoredState != NULL)
|
||||
status = settings.AddMessage("stored state", fStoredState);
|
||||
if (status == B_OK)
|
||||
status = settings.AddInt32("level", _Level());
|
||||
if (status == B_OK)
|
||||
status = settings.Flatten(&file);
|
||||
|
||||
@ -425,15 +440,16 @@ SudokuWindow::MessageReceived(BMessage* message)
|
||||
_MessageDropped(message);
|
||||
break;
|
||||
|
||||
case kMsgGenerateVeryEasySudoku:
|
||||
_Generate(0);
|
||||
break;
|
||||
case kMsgGenerateEasySudoku:
|
||||
_Generate(2);
|
||||
break;
|
||||
case kMsgGenerateHardSudoku:
|
||||
_Generate(4);
|
||||
case kMsgGenerateSudoku:
|
||||
{
|
||||
int32 level;
|
||||
if (message->FindInt32("level", &level) != B_OK)
|
||||
level = _Level();
|
||||
|
||||
_SetLevel(level);
|
||||
_Generate(level);
|
||||
break;
|
||||
}
|
||||
case kMsgAbortSudokuGenerator:
|
||||
if (fGenerator != NULL)
|
||||
fGenerator->Abort();
|
||||
@ -475,14 +491,14 @@ SudokuWindow::MessageReceived(BMessage* message)
|
||||
|
||||
BDirectory directory(&directoryRef);
|
||||
BEntry entry(&directory, name);
|
||||
|
||||
|
||||
entry_ref ref;
|
||||
if (entry.GetRef(&ref) == B_OK)
|
||||
fSudokuView->SaveTo(ref, fExportFormat);
|
||||
break;
|
||||
}
|
||||
|
||||
case kMsgNew:
|
||||
case kMsgNewBlank:
|
||||
_ResetStoredState();
|
||||
fSudokuView->ClearAll();
|
||||
break;
|
||||
@ -559,3 +575,34 @@ SudokuWindow::QuitRequested()
|
||||
be_app->PostMessage(B_QUIT_REQUESTED);
|
||||
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, axeld@pinc-software.de. All rights reserved.
|
||||
* Copyright 2007-2010, Axel Dörfler, axeld@pinc-software.de.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef SUDOKU_WINDOW_H
|
||||
@ -8,8 +8,10 @@
|
||||
|
||||
#include <Window.h>
|
||||
|
||||
|
||||
class BFile;
|
||||
class BFilePanel;
|
||||
class BMenu;
|
||||
class BMenuItem;
|
||||
class GenerateSudoku;
|
||||
class ProgressWindow;
|
||||
@ -18,31 +20,35 @@ class SudokuView;
|
||||
|
||||
class SudokuWindow : public BWindow {
|
||||
public:
|
||||
SudokuWindow();
|
||||
virtual ~SudokuWindow();
|
||||
SudokuWindow();
|
||||
virtual ~SudokuWindow();
|
||||
|
||||
virtual void MessageReceived(BMessage* message);
|
||||
virtual bool QuitRequested();
|
||||
virtual void MessageReceived(BMessage* message);
|
||||
virtual bool QuitRequested();
|
||||
|
||||
private:
|
||||
status_t _OpenSettings(BFile& file, uint32 mode);
|
||||
status_t _LoadSettings(BMessage& settings);
|
||||
status_t _SaveSettings();
|
||||
status_t _OpenSettings(BFile& file, uint32 mode);
|
||||
status_t _LoadSettings(BMessage& settings);
|
||||
status_t _SaveSettings();
|
||||
|
||||
void _ResetStoredState();
|
||||
void _MessageDropped(BMessage *message);
|
||||
void _Generate(int32 level);
|
||||
void _ResetStoredState();
|
||||
void _MessageDropped(BMessage *message);
|
||||
void _Generate(int32 level);
|
||||
int32 _Level() const;
|
||||
void _SetLevel(int32 level);
|
||||
|
||||
BFilePanel* fOpenPanel;
|
||||
BFilePanel* fSavePanel;
|
||||
ProgressWindow* fProgressWindow;
|
||||
SudokuView* fSudokuView;
|
||||
GenerateSudoku* fGenerator;
|
||||
BMenuItem* fRestoreStateItem;
|
||||
BMenuItem* fUndoItem;
|
||||
BMenuItem* fRedoItem;
|
||||
BMessage* fStoredState;
|
||||
uint32 fExportFormat;
|
||||
private:
|
||||
BFilePanel* fOpenPanel;
|
||||
BFilePanel* fSavePanel;
|
||||
ProgressWindow* fProgressWindow;
|
||||
SudokuView* fSudokuView;
|
||||
GenerateSudoku* fGenerator;
|
||||
BMenuItem* fRestoreStateItem;
|
||||
BMenuItem* fUndoItem;
|
||||
BMenuItem* fRedoItem;
|
||||
BMenu* fNewMenu;
|
||||
BMessage* fStoredState;
|
||||
uint32 fExportFormat;
|
||||
};
|
||||
|
||||
#endif // SUDOKU_WINDOW_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user