diff options
Diffstat (limited to 'dw/tools.cc')
-rw-r--r-- | dw/tools.cc | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/dw/tools.cc b/dw/tools.cc new file mode 100644 index 00000000..547c2585 --- /dev/null +++ b/dw/tools.cc @@ -0,0 +1,192 @@ +#include "core.hh" + +namespace dw { +namespace core { + +using namespace lout::misc; + +SizeParams::SizeParams () +{ + DBG_OBJ_CREATE ("dw::core::SizeParams"); + init (); + debugPrint (); +} + +SizeParams::SizeParams (int numPos, Widget **references, int *x, int *y) +{ + DBG_OBJ_CREATE ("dw::core::SizeParams"); + init (); + fill (numPos, references, x, y); + debugPrint (); +} + +SizeParams::SizeParams (const SizeParams &other) +{ + DBG_OBJ_CREATE ("dw::core::SizeParams"); + init (); + fill (other.numPos, other.references, other.x, other.y); + debugPrint (); +} + +SizeParams::~SizeParams () +{ + cleanup (); + DBG_OBJ_DELETE (); +} + +SizeParams &SizeParams::operator=(const SizeParams &other) +{ + cleanup (); + init (); + fill (other.numPos, other.references, other.x, other.y); + debugPrint (); + return *this; +} + +void SizeParams::init () +{ + numPos = 0; + references = NULL; + x = y = NULL; +} + +void SizeParams::cleanup () +{ + if (references) + delete[] references; + if (x) + delete[] x; + if (y) + delete[] y; + + init (); +} + +void SizeParams::fill (int numPos, Widget **references, int *x, int *y) +{ + DBG_OBJ_ENTER ("resize", 0, "fill", "%d, ...", numPos); + + cleanup (); + + this->numPos = numPos; + + this->references = new Widget*[numPos]; + this->x = new int[numPos]; + this->y = new int[numPos]; + + for (int i = 0; i < numPos; i++) { + this->references[i] = references[i]; + this->x[i] = x[i]; + this->y[i] = y[i]; + } + + debugPrint (); + + DBG_OBJ_LEAVE (); +} + +void SizeParams::forChild (Widget *parent, Widget *child, int xRel, int yRel, + SizeParams *childParams) +{ + DBG_OBJ_ENTER ("resize", 0, "forChild", "%p, %p, %d, %d, %p", + parent, child, xRel, yRel, childParams); + + int numChildReferences = child->numSizeRequestReferences (); + + childParams->numPos = 0; + childParams->references = new Widget*[numChildReferences]; + childParams->x = new int[numChildReferences]; + childParams->y = new int[numChildReferences]; + + for (int i = 0; i < numChildReferences; i++) { + Widget *childReference = child->sizeRequestReference (i); + + if (childReference == parent) { + childParams->references[childParams->numPos] = childReference; + childParams->x[childParams->numPos] = xRel; + childParams->y[childParams->numPos] = yRel; + childParams->numPos++; + } else { + bool found = false; + for (int j = 0; !found && j < numPos; j++) { + if (childReference == references[j]) { + found = true; + childParams->references[childParams->numPos] = childReference; + childParams->x[childParams->numPos] = x[j] + xRel; + childParams->y[childParams->numPos] = y[j] + yRel; + childParams->numPos++; + } + } + } + } + + childParams->debugPrint (); + + DBG_OBJ_LEAVE (); +} + +bool SizeParams::findReference (Widget *reference, int *x, int *y) +{ + DBG_OBJ_ENTER ("resize", 0, "findReference", "%p", reference); + + bool found = false; + for (int i = 0; i < numPos && !found; i++) { + if (reference == references[i]) { + if (x) + *x = this->x[i]; + if (y) + *y = this->y[i]; + found = true; + } + } + + if (found) { + if (x && y) + DBG_OBJ_LEAVE_VAL ("true, x = %d, y = %d", *x, *y); + else if (x) + DBG_OBJ_LEAVE_VAL ("true, x = %d", *x); + else if (y) + DBG_OBJ_LEAVE_VAL ("true, y = %d", *y); + else + DBG_OBJ_LEAVE_VAL ("%s", "true"); + } else + DBG_OBJ_LEAVE_VAL ("%s", "false"); + + return found; +} + +/** + * Compares two instances, but considers a change in the order of the reference + * widgets as equivalent. + */ +bool SizeParams::isEquivalent (SizeParams *other) +{ + DBG_OBJ_ENTER ("resize", 0, "isEquivalent", "%p", other); + bool result; + + if (numPos != other->numPos) + result = false; + else { + result = true; + + for (int i = 0; result && i < numPos; i++) { + bool otherFound = false; + for (int j = 0; !otherFound && j < numPos; j++) { + if (references[i] == other->references[j]) { + otherFound = true; + if (!(x[i] == other->x[j] && y[i] == other->y[j])) + result = false; + } + } + + if (!otherFound) + result = false; + } + } + + DBG_OBJ_LEAVE_VAL ("%s", boolToStr (result)); + return result; +} + +} // namespace core +} // namespace dw |