aboutsummaryrefslogtreecommitdiff
path: root/gui/InterfaceManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/InterfaceManager.cpp')
-rw-r--r--gui/InterfaceManager.cpp52
1 files changed, 38 insertions, 14 deletions
diff --git a/gui/InterfaceManager.cpp b/gui/InterfaceManager.cpp
index f7a197f2fb..d4a0a167ff 100644
--- a/gui/InterfaceManager.cpp
+++ b/gui/InterfaceManager.cpp
@@ -81,9 +81,6 @@ InterfaceManager::InterfaceManager() :
_graphicsMode = kGfxAntialias16bit; // default GFX mode
// TODO: load this from a config file
-
-// setGraphicsMode(kGfxStandard16bit);
-// printf("Singleton init!");
}
template<typename PixelType>
@@ -96,6 +93,15 @@ void InterfaceManager::screenInit() {
}
void InterfaceManager::setGraphicsMode(Graphics_Mode mode) {
+
+ // FIXME: reload theme everytime we change resolution...
+ // what if we change the renderer too?
+ // ...We may need to reload it to re-cache the widget
+ // surfaces
+ if (_system->getOverlayWidth() != _screen->w ||
+ _system->getOverlayHeight() != _screen->h)
+ _needThemeLoad = true;
+
switch (mode) {
case kGfxStandard16bit:
case kGfxAntialias16bit:
@@ -132,6 +138,8 @@ bool InterfaceManager::addDrawData(DrawData data_id, bool cached) {
}
bool InterfaceManager::loadTheme(Common::String themeName) {
+ unloadTheme();
+
if (!loadThemeXML(themeName)) {
warning("Could not parse custom theme '%s'.\nFalling back to default theme", themeName.c_str());
@@ -150,6 +158,7 @@ bool InterfaceManager::loadTheme(Common::String themeName) {
}
}
+ _needThemeLoad = false;
_themeOk = true;
return true;
}
@@ -260,38 +269,52 @@ void InterfaceManager::drawScrollbar(const Common::Rect &r, int sliderY, int sli
return;
}
+void InterfaceManager::redrawDialogStack() {
+ _vectorRenderer->clearSurface();
+
+ for (int i = 0; i < _dialogStack.size(); ++i)
+ _dialogStack[i]->draw();
+}
+
int InterfaceManager::runGUI() {
+ init();
+
if (!ready())
return 0;
Common::EventManager *eventMan = _system->getEventManager();
Dialog *activeDialog = getTopDialog();
+ Dialog *lastDialog = 0;
if (!activeDialog)
return 0;
bool didSaveState = false;
- bool running = true;
+ bool stackChange = true;
int button;
uint32 time;
- while (!_dialogStack.empty() && activeDialog == getTopDialog()) { // draw!!
+ _system->showOverlay();
- drawDD(kDDMainDialogBackground, Common::Rect());
- drawDD(kDDButtonIdle, Common::Rect(32, 32, 128, 128));
+ while (activeDialog) { // draw!!
+ stackChange = (activeDialog != lastDialog);
+ lastDialog = activeDialog;
- _vectorRenderer->copyFrame(_system);
+ if (stackChange || needRedraw())
+ redrawDialogStack();
+
+ if (!_dirtyScreen.empty()) {
+ for (uint i = 0; i < _dirtyScreen.size(); ++i)
+ _vectorRenderer->copyFrame(_system, _dirtyScreen[i]);
+ _system->updateScreen();
+ _dirtyScreen.clear();
+ }
Common::Event event;
- _system->delayMillis(100);
while (eventMan->pollEvent(event)) {
-
- if (activeDialog != getTopDialog() &&
- event.type != Common::EVENT_QUIT &&
- event.type != Common::EVENT_SCREEN_CHANGED)
- continue;
+ activeDialog->handleTickle();
Common::Point mouse(event.mouse.x - activeDialog->_x, event.mouse.y - activeDialog->_y);
@@ -352,6 +375,7 @@ int InterfaceManager::runGUI() {
}
}
+ activeDialog = getTopDialog();
_system->delayMillis(10);
}