[haiku-commits] r35461 - haiku/trunk/src/apps/sudoku

  • From: axeld@xxxxxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 14 Feb 2010 23:29:01 +0100 (CET)

Author: axeld
Date: 2010-02-14 23:29:01 +0100 (Sun, 14 Feb 2010)
New Revision: 35461
Changeset: http://dev.haiku-os.org/changeset/35461/haiku

Modified:
   haiku/trunk/src/apps/sudoku/SudokuWindow.cpp
   haiku/trunk/src/apps/sudoku/SudokuWindow.h
Log:
* Reorganized the new/generate menus a bit; the last level will now be
  remembered, and a "new" will just continue in this level.


Modified: haiku/trunk/src/apps/sudoku/SudokuWindow.cpp
===================================================================
--- haiku/trunk/src/apps/sudoku/SudokuWindow.cpp        2010-02-14 22:22:17 UTC 
(rev 35460)
+++ haiku/trunk/src/apps/sudoku/SudokuWindow.cpp        2010-02-14 22:29:01 UTC 
(rev 35461)
@@ -1,18 +1,11 @@
 /*
- * Copyright 2007-2008, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
+ * Copyright 2007-2010, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
  * 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 @@
                }
        }
 
+       int32 level = 0;
+       settings.FindInt32("level", &level);
+
        // create GUI
 
        BMenuBar* menuBar = new BMenuBar(Bounds(), "menu");
@@ -169,10 +177,11 @@
        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 @@
 
        // "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 @@
        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 @@
        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 @@
        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 @@
        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 @@
 {
        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 @@
        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');
@@ -330,6 +343,8 @@
        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);
 
        return status;
@@ -425,15 +440,16 @@
                        _MessageDropped(message);
                        break;
 
-               case kMsgGenerateVeryEasySudoku:
-                       _Generate(0);
+               case kMsgGenerateSudoku:
+               {
+                       int32 level;
+                       if (message->FindInt32("level", &level) != B_OK)
+                               level = _Level();
+
+                       _SetLevel(level);
+                       _Generate(level);
                        break;
-               case kMsgGenerateEasySudoku:
-                       _Generate(2);
-                       break;
-               case kMsgGenerateHardSudoku:
-                       _Generate(4);
-                       break;
+               }
                case kMsgAbortSudokuGenerator:
                        if (fGenerator != NULL)
                                fGenerator->Abort();
@@ -475,14 +491,14 @@
 
                        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 @@
        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);
+       }
+}

Modified: haiku/trunk/src/apps/sudoku/SudokuWindow.h
===================================================================
--- haiku/trunk/src/apps/sudoku/SudokuWindow.h  2010-02-14 22:22:17 UTC (rev 
35460)
+++ haiku/trunk/src/apps/sudoku/SudokuWindow.h  2010-02-14 22:29:01 UTC (rev 
35461)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx All rights reserved.
+ * Copyright 2007-2010, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx
  * 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 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


Other related posts:

  • » [haiku-commits] r35461 - haiku/trunk/src/apps/sudoku - axeld