aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dw/layout.cc24
-rw-r--r--dw/layout.hh8
-rw-r--r--dw/ui.cc16
-rw-r--r--dw/ui.hh2
-rw-r--r--dw/widget.cc2
-rw-r--r--lout/object.cc26
-rw-r--r--lout/object.hh17
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
diff --git a/dw/ui.cc b/dw/ui.cc
index 75314342..8fb34c96 100644
--- a/dw/ui.cc
+++ b/dw/ui.cc
@@ -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 ()
diff --git a/dw/ui.hh b/dw/ui.hh
index 75d69341..cab67e17 100644
--- a/dw/ui.hh
+++ b/dw/ui.hh
@@ -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.