diff options
author | Sebastian Geerken <devnull@localhost> | 2014-05-06 20:23:53 +0200 |
---|---|---|
committer | Sebastian Geerken <devnull@localhost> | 2014-05-06 20:23:53 +0200 |
commit | 5e8dec509c8402a8f761e3156bd22278c332c5fc (patch) | |
tree | 41a62bd0d660b93a5758a9b36cbfb6e6046f741d | |
parent | e0d27594996a9aca98ae1c25b64f14ff2dfeb1de (diff) |
New signal "resizeQueued" for Layout. It is used by ComplexButtonResource, instead of "canvasSizeChange"; this seems to fix a CPU hogging problem.
-rw-r--r-- | dw/layout.cc | 24 | ||||
-rw-r--r-- | dw/layout.hh | 8 | ||||
-rw-r--r-- | dw/ui.cc | 16 | ||||
-rw-r--r-- | dw/ui.hh | 2 | ||||
-rw-r--r-- | dw/widget.cc | 2 | ||||
-rw-r--r-- | lout/object.cc | 26 | ||||
-rw-r--r-- | lout/object.hh | 17 |
7 files changed, 80 insertions, 15 deletions
diff --git a/dw/layout.cc b/dw/layout.cc index b93a1b70..f9b3f763 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -91,6 +91,10 @@ void Layout::LayoutImgRenderer::draw (int x, int y, int width, int height) // ---------------------------------------------------------------------- +void Layout::Receiver::resizeQueued (bool extremesChanged) +{ +} + void Layout::Receiver::canvasSizeChanged (int width, int ascent, int descent) { } @@ -110,6 +114,10 @@ bool Layout::Emitter::emitToReceiver (lout::signal::Receiver *receiver, ((Integer*)argv[2])->getValue ()); break; + case RESIZE_QUEUED: + layoutReceiver->resizeQueued (((Boolean*)argv[0])->getValue ()); + break; + default: misc::assertNotReached (); } @@ -117,6 +125,13 @@ bool Layout::Emitter::emitToReceiver (lout::signal::Receiver *receiver, return false; } +void Layout::Emitter::emitResizeQueued (bool extremesChanged) +{ + Boolean ec (extremesChanged); + Object *argv[1] = { &ec }; + emitVoid (RESIZE_QUEUED, 1, argv); +} + void Layout::Emitter::emitCanvasSizeChanged (int width, int ascent, int descent) { @@ -963,9 +978,10 @@ void Layout::queueDrawExcept (int x, int y, int width, int height, queueDraw (ix2, iy1, x + width - ix2, iy2 - iy1); } -void Layout::queueResize () +void Layout::queueResize (bool extremesChanged) { - DBG_OBJ_MSG ("resize", 0, "<b>queueResize</b>"); + DBG_OBJ_MSGF ("resize", 0, "<b>queueResize</b> (%s)", + extremesChanged ? "true" : "false"); DBG_OBJ_MSG_START (); if (resizeIdleId == -1) { @@ -975,6 +991,8 @@ void Layout::queueResize () DBG_OBJ_MSGF ("resize", 1, "setting resizeIdleId = %d", resizeIdleId); } + emitter.emitResizeQueued (extremesChanged); + DBG_OBJ_MSG_END (); } @@ -1261,7 +1279,7 @@ void Layout::viewportSizeChanged (View *view, int width, int height) // similar to addWidget() topLevel->queueResize (-1, false); else - queueResize (); + queueResize (false); } viewportWidth = width; diff --git a/dw/layout.hh b/dw/layout.hh index 6b6ceadb..2120d877 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -42,11 +42,12 @@ public: /** * \brief Receiver interface different signals. * - * May be extended + * May be extended. */ class Receiver: public lout::signal::Receiver { public: + virtual void resizeQueued (bool extremesChanged); virtual void canvasSizeChanged (int width, int ascent, int descent); }; @@ -126,7 +127,7 @@ private: class Emitter: public lout::signal::Emitter { private: - enum { CANVAS_SIZE_CHANGED }; + enum { RESIZE_QUEUED, CANVAS_SIZE_CHANGED }; protected: bool emitToReceiver (lout::signal::Receiver *receiver, int signalNo, @@ -135,6 +136,7 @@ private: public: inline void connectLayout (Receiver *receiver) { connect (receiver); } + void emitResizeQueued (bool extremesChanged); void emitCanvasSizeChanged (int width, int ascent, int descent); }; @@ -252,7 +254,7 @@ private: void queueDraw (int x, int y, int width, int height); void queueDrawExcept (int x, int y, int width, int height, int ex, int ey, int ewidth, int eheight); - void queueResize (); + void queueResize (bool extremesChanged); void removeWidget (); /* For tests regarding the respective Layout and (mostly) Widget @@ -288,14 +288,16 @@ Iterator *LabelButtonResource::iterator (Content::Type mask, bool atEnd) // ---------------------------------------------------------------------- -void ComplexButtonResource::LayoutReceiver::canvasSizeChanged (int width, - int ascent, - int descent) +void ComplexButtonResource::LayoutReceiver::resizeQueued (bool extremesChanged) { - /** - * \todo Verify that this is correct. - */ - resource->queueResize (resource->childWidget->extremesQueued ()); + DBG_OBJ_MSGF_O ("resize", 0, resource, + "LayoutReceiver::<b>resizeQueued</b> (%s)", + extremesChanged ? "true" : "false"); + DBG_OBJ_MSG_START_O (resource); + + resource->queueResize (extremesChanged); + + DBG_OBJ_MSG_END_O (resource); } ComplexButtonResource::ComplexButtonResource () @@ -378,7 +378,7 @@ private: public: ComplexButtonResource *resource; - void canvasSizeChanged (int width, int ascent, int descent); + void resizeQueued (bool extremesChanged); }; friend class LayoutReceiver; diff --git a/dw/widget.cc b/dw/widget.cc index 0ef1fc78..82677cc8 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -262,7 +262,7 @@ void Widget::actualQueueResize (int ref, bool extremesChanged) } if (layout) - layout->queueResize (); + layout->queueResize (extremesChanged); leaveQueueResize (); diff --git a/lout/object.cc b/lout/object.cc index 74328d22..e4e0152a 100644 --- a/lout/object.cc +++ b/lout/object.cc @@ -211,6 +211,32 @@ int Integer::compareTo(Comparable *other) return value - ((Integer*)other)->value; } +// ------------- +// Boolean +// ------------- + +bool Boolean::equals(Object *other) +{ + bool value2 = ((Boolean*)other)->value; + // TODO Does "==" work? + return (value && value2) || (!value && value2); +} + +int Boolean::hashValue() +{ + return value ? 1 : 0; +} + +void Boolean::intoStringBuffer(misc::StringBuffer *sb) +{ + sb->append(value ? "true" : "false"); +} + +int Boolean::compareTo(Comparable *other) +{ + return (value ? 1 : 0) - (((Boolean*)other)->value ? 1 : 0); +} + // ----------------- // ConstString // ----------------- diff --git a/lout/object.hh b/lout/object.hh index 5a4935c5..3ba7b590 100644 --- a/lout/object.hh +++ b/lout/object.hh @@ -138,6 +138,23 @@ public: /** + * \brief An object::Object wrapper for bool's. + */ +class Boolean: public Comparable +{ + bool value; + +public: + Boolean(bool value) { this->value = value; } + bool equals(Object *other); + int hashValue(); + void intoStringBuffer(misc::StringBuffer *sb); + int compareTo(Comparable *other); + inline bool getValue() { return value; } +}; + + +/** * \brief An object::Object wrapper for constant strings (char*). * * As opposed to object::String, the char array is not copied. |