diff --git a/doomsday/client/include/ui/widgets/guiwidget.h b/doomsday/client/include/ui/widgets/guiwidget.h index e792a40011..a1040574b1 100644 --- a/doomsday/client/include/ui/widgets/guiwidget.h +++ b/doomsday/client/include/ui/widgets/guiwidget.h @@ -52,8 +52,24 @@ class GuiWidget : public de::Widget void deleteLater(); // Events. + void initialize(); + void deinitialize(); void update(); +protected: + virtual void glInit(); + virtual void glDeinit(); + + /** + * Checks if the widget's rectangle has changed. + * + * @param currentPlace The widget's current placement is returned here. + * + * @return @c true, if the place of the widget has changed since the + * last call to checkPlace(); otherwise, @c false. + */ + bool checkPlace(de::Rectanglei ¤tPlace); + private: DENG2_PRIVATE(d) }; diff --git a/doomsday/client/src/ui/widgets/guiwidget.cpp b/doomsday/client/src/ui/widgets/guiwidget.cpp index 2ee73ee6ca..0ee98a1e22 100644 --- a/doomsday/client/src/ui/widgets/guiwidget.cpp +++ b/doomsday/client/src/ui/widgets/guiwidget.cpp @@ -26,9 +26,16 @@ using namespace de; DENG2_PIMPL(GuiWidget) { RuleRectangle rule; - bool needInit; + Rectanglei savedPos; + bool inited; - Instance(Public *i) : Base(i), needInit(true) {} + Instance(Public *i) : Base(i), inited(false) {} + + ~Instance() + { + // Deinitialize now if it hasn't been done already. + self.deinitialize(); + } }; GuiWidget::GuiWidget(String const &name) : Widget(name), d(new Instance(this)) @@ -64,11 +71,56 @@ void GuiWidget::deleteLater() Garbage_TrashInstance(this, deleteGuiWidget); } +void GuiWidget::initialize() +{ + if(d->inited) return; + + try + { + d->inited = true; + glInit(); + } + catch(Error const &er) + { + LOG_WARNING("Error when initializing widget '%s':\n") + << name() << er.asText(); + } +} + +void GuiWidget::deinitialize() +{ + if(!d->inited) return; + + try + { + d->inited = false; + glDeinit(); + } + catch(Error const &er) + { + LOG_WARNING("Error when deinitializing widget '%s':\n") + << name() << er.asText(); + } +} + void GuiWidget::update() { - if(d->needInit) + if(!d->inited) { initialize(); - d->needInit = false; } } + +void GuiWidget::glInit() +{} + +void GuiWidget::glDeinit() +{} + +bool GuiWidget::checkPlace(Rectanglei ¤tPlace) +{ + currentPlace = rule().recti(); + bool changed = (d->savedPos != currentPlace); + d->savedPos = currentPlace; + return changed; +}