From d6e44c9c822d666923f1af3e30cd63e65a64e61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 16 May 2012 02:05:09 +0200 Subject: [PATCH] If all fields for a specific value are set, mark it. * In this case, the value is drawn a bit less intense than incomplete values. * Make the keyboard focus background color depend on the actual background color. * No longer allow to drag remove random hint values after removing a value from a field. --- src/apps/sudoku/SudokuField.cpp | 15 ++++++++++++++ src/apps/sudoku/SudokuField.h | 1 + src/apps/sudoku/SudokuView.cpp | 36 ++++++++++++++++++++++----------- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/apps/sudoku/SudokuField.cpp b/src/apps/sudoku/SudokuField.cpp index 62a3ddcd54..a139d473b9 100644 --- a/src/apps/sudoku/SudokuField.cpp +++ b/src/apps/sudoku/SudokuField.cpp @@ -251,6 +251,21 @@ SudokuField::IsEmpty() const } +bool +SudokuField::IsValueCompleted(uint32 value) const +{ + uint32 count = 0; + for (uint32 y = 0; y < fSize; y++) { + for (uint32 x = 0; x < fSize; x++) { + if (ValueAt(x, y) == value) + count++; + } + } + + return count == Size(); +} + + void SudokuField::SetHintMaskAt(uint32 x, uint32 y, uint32 hintMask) { diff --git a/src/apps/sudoku/SudokuField.h b/src/apps/sudoku/SudokuField.h index f16b3f6488..2b0bbf6fe9 100644 --- a/src/apps/sudoku/SudokuField.h +++ b/src/apps/sudoku/SudokuField.h @@ -33,6 +33,7 @@ public: bool IsSolved() const; bool IsEmpty() const; + bool IsValueCompleted(uint32 value) const; uint32 Size() const { return fSize; } uint32 BlockSize() const { return fBlockSize; } diff --git a/src/apps/sudoku/SudokuView.cpp b/src/apps/sudoku/SudokuView.cpp index b34b1ce6bf..653316241f 100644 --- a/src/apps/sudoku/SudokuView.cpp +++ b/src/apps/sudoku/SudokuView.cpp @@ -814,21 +814,30 @@ SudokuView::MouseDown(BPoint where) | B_TERTIARY_MOUSE_BUTTON)) != 0) { // double click or other buttons set a value if ((fField->FlagsAt(x, y) & kInitialValue) == 0) { + bool wasCompleted; if (fField->ValueAt(x, y) > 0) { + value = fField->ValueAt(x, y) - 1; + wasCompleted = fField->IsValueCompleted(value + 1); + fField->SetValueAt(x, y, 0); fShowHintX = x; fShowHintY = y; } else { + wasCompleted = fField->IsValueCompleted(value + 1); + fField->SetValueAt(x, y, value + 1); BMessenger(this).SendMessage(kMsgCheckSolved); + + // allow dragging to remove the hint from other fields + fLastHintValueSet = false; + fLastHintValue = value; + fLastField = field; } - _InvalidateField(x, y); - - // allow dragging to remove the hint from other fields - fLastHintValueSet = false; - fLastHintValue = value; - fLastField = field; + if (wasCompleted != fField->IsValueCompleted(value + 1)) + Invalidate(); + else + _InvalidateField(x, y); } return; } @@ -1204,8 +1213,8 @@ SudokuView::Draw(BRect /*updateRect*/) || (fShowKeyboardFocus && x == fKeyboardX && y == fKeyboardY)) && (fField->FlagsAt(x, y) & kInitialValue) == 0) { - //SetLowColor(tint_color(ViewColor(), B_DARKEN_1_TINT)); - SetLowColor(255, 255, 210); + // TODO: make color more intense + SetLowColor(tint_color(fBackgroundColor, B_DARKEN_2_TINT)); FillRect(_Frame(x, y), B_SOLID_LOW); } else { SetLowColor(fBackgroundColor); @@ -1222,13 +1231,16 @@ SudokuView::Draw(BRect /*updateRect*/) } SetFont(&fFieldFont); - if (fField->FlagsAt(x, y) & kInitialValue) + if ((fField->FlagsAt(x, y) & kInitialValue) != 0) SetHighColor(0, 0, 0); else { if ((fHintFlags & kMarkInvalid) == 0 - || fField->ValidMaskAt(x, y) & (1UL << (value - 1))) - SetHighColor(0, 0, 200); - else + || fField->ValidMaskAt(x, y) & (1UL << (value - 1))) { + if (fField->IsValueCompleted(value)) + SetHighColor(60, 60, 150); + else + SetHighColor(0, 0, 220); + } else SetHighColor(200, 0, 0); }