X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcontainer.cpp;h=757828aad73e064af821d04816807a82fa93702a;hb=70297ac8ec7453e4196f4b58056bcfe4b04f2aca;hp=e909c04ae14b1ba8f9a7e6c0af4b2464cf76aff0;hpb=3047a65eb459ddb4a85e1a694aa2b2491437472e;p=architektonas diff --git a/src/container.cpp b/src/container.cpp index e909c04..757828a 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -72,21 +72,18 @@ Container & Container::operator=(const Container & from) QRectF boundary; for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) -// for(int i=0; i<(int)objects.size(); i++) { -#if 0 -//printf("Container: About to draw (object = $%X)\n", objects[i]); - objects[i]->Draw(painter); - bounds = bounds.united(objects[i].RectangularExtents()); -#else (*i)->Draw(painter); boundary = boundary.united((*i)->Extents()); -#endif } - if (state == OSSelected) + if ((state == OSSelected) || hit) { - painter->SetPen(QPen(Qt::magenta, 2.0, Qt::DashLine)); + if (hit) + painter->SetPen(QPen(Qt::magenta, 1.0, Qt::DashLine)); + else + painter->SetPen(QPen(Qt::blue, 2.0, Qt::DashLine)); + painter->SetBrush(QBrush(Qt::NoBrush)); painter->DrawRect(boundary); } @@ -98,6 +95,7 @@ Container & Container::operator=(const Container & from) return position; } + /* We need at least *three* handles for this object: - one for moving @@ -163,7 +161,11 @@ printf("Container::Collided: Deleting object ($%X)\n", *i); state = (collision ? OSSelected : OSInactive); if (state == OSSelected) + { DeselectAll(); + dragging = true; + oldPoint = point; + } } return collision; @@ -191,34 +193,62 @@ class so that we can leverage that stuff here as well. // every object for collision. /*virtual*/ void Container::PointerMoved(Vector point) { + std::vector::iterator i; + if (!isTopLevelContainer) { // check for selection rectangle too + if (selectionInProgress) + { + if (selection.contains(Extents())) + state = OSSelected; + else + state = OSInactive; + return; + } - needUpdate = true; + // No need to do any checking if we're already selected... +// if (state == OSSelected) +// return; - for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) +// oldState = state; +// needUpdate = true; +// if (dragging && + bool oldHit = hit; + hit = false; + + for(i=objects.begin(); i!=objects.end(); i++) { if ((*i)->HitTest(point)) { - state = OSSelected; - return; +// state = OSSelected; +// return; + hit = true; + break; } } - state = OSInactive; + needUpdate = (oldHit != hit ? true : false); +// state = oldState; + + if (dragging) + { + Vector delta = point - oldPoint; + + for(i=objects.begin(); i!=objects.end(); i++) + (*i)->Translate(delta); + + oldPoint = point; + needUpdate = true; + } + return; } -// objectWasDragged = true; -//printf("CONTAINER: PointerMoved()\n"); - for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) -// for(int i=0; i<(int)objects.size(); i++) { -//// if (objects[i]->GetState() == OSSelected) -// objects[i]->PointerMoved(point); +// if (objects[i]->GetState() == OSSelected) (*i)->PointerMoved(point); } @@ -229,6 +259,12 @@ class so that we can leverage that stuff here as well. /*virtual*/ void Container::PointerReleased(void) { + if (!isTopLevelContainer) + { + dragging = false; + return; + } +#if 0 dragging = false; draggingHandle1 = false; draggingHandle2 = false; @@ -236,15 +272,19 @@ class so that we can leverage that stuff here as well. // Here we check for just a click: If object was clicked and dragged, then // revert to the old state (OSInactive). Otherwise, keep the new state that // we set. -/*Maybe it would be better to just check for "object was dragged" state and not have to worry -about keeping track of old states... +/* +Maybe it would be better to just check for "object was dragged" state and not +have to worry about keeping track of old states... */ if (objectWasDragged) state = oldState; //Note that the preceeding is unnecessary for a generic container! +#endif - for(int i=0; i<(int)objects.size(); i++) - objects[i]->PointerReleased(); +// for(int i=0; i<(int)objects.size(); i++) +// objects[i]->PointerReleased(); + for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) + (*i)->PointerReleased(); } @@ -425,17 +465,10 @@ void Container::ResizeAllDimensions(double newSize) { for(std::vector::iterator i=objects.begin(); i!=objects.end(); i++) { -// Object * object = *i; - if ((*i)->type == OTDimension) -// if (object->type == OTDimension) - { ((Dimension *)(*i))->size = newSize; - } if ((*i)->type == OTContainer) - { ((Container *)(*i))->ResizeAllDimensions(newSize); - } } } @@ -443,13 +476,15 @@ void Container::ResizeAllDimensions(double newSize) /*virtual*/ void Container::Enumerate(FILE * file) { // Only put "CONTAINER" markers if *not* the top level container - if (parent != NULL) +// if (parent != NULL) + if (!isTopLevelContainer) fprintf(file, "CONTAINER\n"); for(uint i=0; iEnumerate(file); - if (parent != NULL) +// if (parent != NULL) + if (!isTopLevelContainer) fprintf(file, "ENDCONTAINER\n"); }