diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp index 6fa34aa04ae..ebab4b1b2b3 100644 --- a/gui/GuiManager.cpp +++ b/gui/GuiManager.cpp @@ -139,20 +139,29 @@ void GuiManager::redraw() { if (_dialogStack.empty()) return; - if (_dialogStack.size() > 1) { - _theme->clearAll(); - _theme->openDialog(true); + switch (_redrawStatus) { + case kRedrawCloseDialog: + case kRedrawFull: + case kRedrawTopDialog: + _theme->clearAll(); + _theme->openDialog(true); - for (i = 0; i < _dialogStack.size() - 1; i++) - _dialogStack[i]->drawDialog(); + for (i = 0; i < _dialogStack.size() - 1; i++) { + _dialogStack[i]->drawDialog(); + } - _theme->finishBuffering(); - _theme->updateScreen(); - } + _theme->finishBuffering(); - _theme->openDialog(true, (ThemeEngine::ShadingStyle)xmlEval()->getVar("Dialog." + _dialogStack.top()->_name + ".Shading", 0)); - _dialogStack.top()->drawDialog(); - _theme->finishBuffering(); + case kRedrawOpenDialog: + _theme->updateScreen(); + _theme->openDialog(true, (ThemeEngine::ShadingStyle)xmlEval()->getVar("Dialog." + _dialogStack.top()->_name + ".Shading", 0)); + _dialogStack.top()->drawDialog(); + _theme->finishBuffering(); + break; + + default: + return; + } _theme->updateScreen(); _redrawStatus = kRedrawDisabled; @@ -238,6 +247,8 @@ void GuiManager::runLoop() { if (_useStdCursor) setupCursor(); +// _theme->refresh(); + _themeChange = false; _redrawStatus = kRedrawFull; redraw(); @@ -336,7 +347,8 @@ void GuiManager::restoreState() { void GuiManager::openDialog(Dialog *dialog) { _dialogStack.push(dialog); - _redrawStatus = kRedrawFull; + if (_redrawStatus != kRedrawFull) + _redrawStatus = kRedrawOpenDialog; // We reflow the dialog just before opening it. If the screen changed // since the last time we looked, also refresh the loaded theme, @@ -352,7 +364,8 @@ void GuiManager::closeTopDialog() { // Remove the dialog from the stack _dialogStack.pop(); - _redrawStatus = kRedrawFull; + if (_redrawStatus != kRedrawFull) + _redrawStatus = kRedrawCloseDialog; } void GuiManager::setupCursor() { diff --git a/gui/GuiManager.h b/gui/GuiManager.h index 9bdacb5459f..12c9a25f624 100644 --- a/gui/GuiManager.h +++ b/gui/GuiManager.h @@ -91,6 +91,9 @@ public: protected: enum RedrawStatus { kRedrawDisabled = 0, + kRedrawOpenDialog, + kRedrawCloseDialog, + kRedrawTopDialog, kRedrawFull }; diff --git a/gui/browser.cpp b/gui/browser.cpp index f4719f48506..48382e880b0 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -43,7 +43,7 @@ enum { */ BrowserDialog::BrowserDialog(const char *title, bool dirBrowser) - : Dialog("Browser") { + : Dialog("browser") { _titleRef = CFStringCreateWithCString(0, title, CFStringGetSystemEncoding()); _isDirBrowser = dirBrowser; } diff --git a/gui/dialog.cpp b/gui/dialog.cpp index fe01228f5b0..bca1be3d0e5 100644 --- a/gui/dialog.cpp +++ b/gui/dialog.cpp @@ -131,7 +131,11 @@ void Dialog::releaseFocus() { } void Dialog::draw() { - g_gui._redrawStatus = GUI::GuiManager::kRedrawFull; + //TANOKU - FIXME when is this enabled? what does this do? + // Update: called on tab drawing, mainly... + // we can pass this as open a new dialog or something +// g_gui._needRedraw = true; + g_gui._redrawStatus = GUI::GuiManager::kRedrawTopDialog; } void Dialog::drawDialog() { diff --git a/gui/options.cpp b/gui/options.cpp index 02325722ab6..78010e351a3 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -251,8 +251,6 @@ void OptionsDialog::open() { _subMode = getSubtitleMode(ConfMan.getBool("subtitles", _domain), ConfMan.getBool("speech_mute", _domain)); _subToggleButton->setLabel(_subModeDesc[_subMode]); - _subToggleButton->draw(); - // Engines that reuse the subtitle speed widget set their own max value. // Scale the config value accordingly (see addSubtitleControls) diff --git a/gui/widget.cpp b/gui/widget.cpp index 46d7ac80b74..412e50f79c3 100644 --- a/gui/widget.cpp +++ b/gui/widget.cpp @@ -199,7 +199,15 @@ void StaticTextWidget::setValue(int value) { void StaticTextWidget::setLabel(const Common::String &label) { _label = label; - this->draw(); + + // get parent's size + const uint16 w = _boss->getWidth(); + const uint16 h = _boss->getHeight(); + const int16 x = _boss->getAbsX(); + const int16 y = _boss->getAbsY(); + + // restore the parent's background and redraw it again. + g_gui.theme()->restoreBackground(Common::Rect(x, y, x + w, y + h)); _boss->draw(); }