Skip to content

Commit

Permalink
Client|GuiWidget: GL init/deinit mechanism, checking for widget movement
Browse files Browse the repository at this point in the history
  • Loading branch information
skyjake committed May 18, 2013
1 parent f330060 commit 901f470
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 4 deletions.
16 changes: 16 additions & 0 deletions doomsday/client/include/ui/widgets/guiwidget.h
Expand Up @@ -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 &currentPlace);

private:
DENG2_PRIVATE(d)
};
Expand Down
60 changes: 56 additions & 4 deletions doomsday/client/src/ui/widgets/guiwidget.cpp
Expand Up @@ -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))
Expand Down Expand Up @@ -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 &currentPlace)
{
currentPlace = rule().recti();
bool changed = (d->savedPos != currentPlace);
d->savedPos = currentPlace;
return changed;
}

0 comments on commit 901f470

Please sign in to comment.