]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Added automagically resizing grid. :-D
[architektonas] / src / applicationwindow.cpp
index 7dd57aca22824c70f77ff62cb782808e47814569..773146fa63348865180b5159d56e0e785231313f 100644 (file)
@@ -87,7 +87,7 @@ ApplicationWindow::ApplicationWindow():
        dock3->setObjectName("Object");
 
        // Create status bar
-       zoomIndicator = new QLabel("Grid: 12.0\" BU: Inch");
+       zoomIndicator = new QLabel("Zoom: 100% Grid: 12.0\" BU: Inch");
        statusBar()->addPermanentWidget(zoomIndicator);
        statusBar()->showMessage(tr("Ready"));
 
@@ -101,6 +101,7 @@ ApplicationWindow::ApplicationWindow():
        connect(this, SIGNAL(ReloadLayers()), lw, SLOT(Reload()));
 
        connect(drawing, SIGNAL(ObjectHovered(Object *)), ow, SLOT(ShowInfo(Object *)));
+       connect(drawing, SIGNAL(NeedZoomUpdate()), this, SLOT(UpdateZoom()));
 }
 
 
@@ -385,78 +386,68 @@ void ApplicationWindow::AddSplineTool(void)
 
 void ApplicationWindow::ZoomInTool(void)
 {
-       double zoomFactor = 2.0;
-/*
-We need to find the center of the screen, then figure out where the new corner
-will be in the zoomed in window.
-
-So we know in Qt coords, the center is found via:
-size.width()  / 2 --> xCenter
-size.height() / 2 --> yCenter
-
-transform x/yCenter to Cartesian coordinates. So far, so good.
-
-when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin.y) / 2
-(after subtracting from center, that is...)
-*/
+       double zoomFactor = 1.20;
        QSize size = drawing->size();
-       Vector center(size.width() / 2.0, size.height() / 2.0);
-//printf("Zoom in... Center=%.2f,%.2f; ", center.x, center.y);
-       center = Painter::QtToCartesianCoords(center);
-//printf("(%.2f,%.2f); origin=%.2f,%.2f; ", center.x, center.y, Painter::origin.x, Painter::origin.y);
-       Vector newOrigin = center - ((center - Global::origin) / zoomFactor);
-//printf("newOrigin=%.2f,%.2f;\n", newOrigin.x, newOrigin.y);
-       Global::origin = newOrigin;
-
-//printf("Zoom in... level going from %02f to ", Painter::zoom);
-       // This just zooms leaving origin intact... should zoom in at the current
-       // center! [DONE]
+       Vector center = Painter::QtToCartesianCoords(Vector(size.width() / 2.0, size.height() / 2.0));
+
+       Global::origin = center - ((center - Global::origin) / zoomFactor);
        Global::zoom *= zoomFactor;
-       Global::gridSpacing = drawing->gridPixels / Global::zoom;
-       drawing->UpdateGridBackground();
-       drawing->update();
 
-       zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing));
-       baseUnitInput->setText(QString("%1").arg(Global::gridSpacing));
+       UpdateZoom();
 }
 
 
 void ApplicationWindow::ZoomOutTool(void)
 {
-/*
-Ok, real example.
-center = (436, 311)
-origin = (223, 160.5)
-newOrigin should be (-10, -10)
-Why isn't it?
-
-center - origin = (213, 150.5)
-origin - center = (-213, -150.5)
-x 2 = (-426, -301)
-+ center = (-10, -10)
-
-*/
-       double zoomFactor = 2.0;
+       double zoomFactor = 1.20;
        QSize size = drawing->size();
-       Vector center(size.width() / 2.0, size.height() / 2.0);
-//printf("Zoom out... Center=%.2f,%.2f; ", center.x, center.y);
-       center = Painter::QtToCartesianCoords(center);
-//printf("(%.2f,%.2f); origin=%.2f,%.2f; ", center.x, center.y, Painter::origin.x, Painter::origin.y);
-//     Vector newOrigin = (center - Painter::origin) * zoomFactor;
-//     Vector newOrigin = center - (Painter::origin * zoomFactor);
-       Vector newOrigin = center + ((Global::origin - center) * zoomFactor);
-//printf("newOrigin=%.2f,%.2f;\n", newOrigin.x, newOrigin.y);
-       Global::origin = newOrigin;
-//printf("Zoom out...\n");
-       // This just zooms leaving origin intact... should zoom out at the current
-       // center! [DONE]
+       Vector center = Painter::QtToCartesianCoords(Vector(size.width() / 2.0, size.height() / 2.0));
+
+       Global::origin = center + ((Global::origin - center) * zoomFactor);
        Global::zoom /= zoomFactor;
-       Global::gridSpacing = drawing->gridPixels / Global::zoom;
-       drawing->UpdateGridBackground();
+
+       UpdateZoom();
+}
+
+
+void ApplicationWindow::UpdateZoom(void)
+{
+       // And now, a bunch of heuristics to select the right grid size--autogrid!
+       // :-P
+       if (Global::zoom < 0.25)
+               Global::gridSpacing = 48.0;
+       else if (Global::zoom >= 0.25 && Global::zoom < 0.50)
+               Global::gridSpacing = 36.0;
+       else if (Global::zoom >= 0.50 && Global::zoom < 1.00)
+               Global::gridSpacing = 24.0;
+       else if (Global::zoom >= 1.00 && Global::zoom < 2.00)
+               Global::gridSpacing = 12.0;
+       else if (Global::zoom >= 2.00 && Global::zoom < 4.00)
+               Global::gridSpacing = 6.0;
+       else if (Global::zoom >= 4.00 && Global::zoom < 8.00)
+               Global::gridSpacing = 3.0;
+       else if (Global::zoom >= 8.00 && Global::zoom < 16.00)
+               Global::gridSpacing = 1.0;
+       else if (Global::zoom >= 16.00 && Global::zoom < 32.00)
+               Global::gridSpacing = 0.5;
+       else if (Global::zoom >= 32.00 && Global::zoom < 64.00)
+               Global::gridSpacing = 0.25;
+       else if (Global::zoom >= 64.00 && Global::zoom < 128.00)
+               Global::gridSpacing = 0.125;
+       else if (Global::zoom >= 128.00 && Global::zoom < 256.00)
+               Global::gridSpacing = 0.0625;
+       else if (Global::zoom >= 256.00 && Global::zoom < 512.00)
+               Global::gridSpacing = 0.03125;
+       else
+               Global::gridSpacing = 0.015625;
+
+       drawing->SetGridSize((double)(Global::gridSpacing * Global::zoom));
        drawing->update();
 
-       zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing));
-       baseUnitInput->setText(QString("%1").arg(Global::gridSpacing));
+       zoomIndicator->setText(QString("Zoom: %1% Grid: %2\" BU: Inch").arg(Global::zoom * 100.0).arg(Global::gridSpacing));
+
+       // This is the problem...  Changing this causes the state to update itself again, screwing up the origin...  !!! FIX !!! (commented out for now)
+//     baseUnitInput->setText(QString("%1").arg(Global::gridSpacing));
 }
 
 
@@ -464,7 +455,8 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception)
 {
        QAction * actionList[] = {
                addArcAct, addLineAct, addCircleAct, addDimensionAct, addPolygonAct,
-               addSplineAct, deleteAct, rotateAct, mirrorAct, trimAct, triangulateAct, 0
+               addSplineAct, deleteAct, rotateAct, mirrorAct, trimAct,
+               triangulateAct, 0
        };
 
        for(int i=0; actionList[i]!=0; i++)
@@ -537,57 +529,6 @@ void ApplicationWindow::Settings(void)
 //
 void ApplicationWindow::HandleGrouping(void)
 {
-#if 0
-       int itemsSelected = drawing->document.ItemsSelected();
-
-       // If nothing selected, do nothing
-       if (itemsSelected == 0)
-       {
-               statusBar()->showMessage(tr("No objects selected to make a group from."));
-               return;
-       }
-
-       // If it's a group that's selected, ungroup it and leave the objects in a
-       // selected state
-       if (itemsSelected == 1)
-       {
-               Object * object = drawing->document.SelectedItem(0);
-
-#if 0
-if (object == NULL)
-       printf("SelectedItem = NULL!\n");
-else
-       printf("SelectedItem = %08X, type = %i\n", object, object->type);
-#endif
-
-               if (object == NULL || object->type != OTContainer)
-               {
-                       statusBar()->showMessage(tr("A group requires two or more selected objects."));
-                       return;
-               }
-
-               // Need the parent of the group, we're assuming here that the parent is
-               // the drawing's document. Does it matter? Maybe...
-               // Could just stipulate that grouping like this only takes place where
-               // the parent of the group is the drawing's document. Makes life much
-               // simpler.
-               ((Container *)object)->SelectAll();
-               ((Container *)object)->MoveContentsTo(&(drawing->document));
-               drawing->document.Delete(object);
-               statusBar()->showMessage(tr("Objects ungrouped."));
-       }
-       // Otherwise, if it's a group of 2 or more objects (which can be groups too)
-       // group them and select the group
-       else if (itemsSelected > 1)
-       {
-               Container * container = new Container(Vector(), &(drawing->document));
-               drawing->document.MoveSelectedContentsTo(container);
-               drawing->document.Add(container);
-               container->DeselectAll();
-               container->state = OSSelected;
-               statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(itemsSelected));
-       }
-#else
        int numSelected = drawing->select.size();
 
        // If nothing selected, do nothing
@@ -614,13 +555,8 @@ else
                // Could just stipulate that grouping like this only takes place where
                // the parent of the group is the drawing's document. Makes life much
                // simpler.
-//             ((Container *)object)->SelectAll();
-//             ((Container *)object)->MoveContentsTo(&(drawing->document));
-//             drawing->document.Delete(object);
                Container * c = (Container *)obj;
-//printf("Ungroup: container size = %li\n", c->objects.size());
                SelectAll(c->objects);
-//printf("Ungroup: document size = %li (pre-AddObjectsTo)\n", drawing->document.objects.size());
                RemoveSelectedObjects(drawing->document.objects);
                AddObjectsTo(drawing->document.objects, c->objects);
                drawing->select.clear();
@@ -633,20 +569,12 @@ else
        // group them and select the group
        else if (numSelected > 1)
        {
-//             Container * container = new Container(Vector(), &(drawing->document));
-//             drawing->document.MoveSelectedContentsTo(container);
-//             drawing->document.Add(container);
-//             container->DeselectAll();
-//             container->state = OSSelected;
-
                Container * c = new Container();
-//             AddObjectsTo(c->objects, drawing->select);
-//             RemoveSelectedObjects(drawing->document.objects);
                MoveSelectedObjectsTo(c->objects, drawing->document.objects);
                drawing->document.objects.push_back(c);
                ClearSelected(c->objects);
                c->selected = true;
-               c->layer = Global::currentLayer;
+               c->layer = Global::activeLayer;
 
                Rect r = drawing->GetObjectExtents((Object *)c);
                c->p[0] = r.TopLeft();
@@ -657,7 +585,6 @@ else
                statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(numSelected));
 //printf("Group: document size = %li\n", drawing->document.objects.size());
        }
-#endif
 
        drawing->update();
 }
@@ -740,7 +667,7 @@ void ApplicationWindow::HandleDisconnection(void)
 
 void ApplicationWindow::HandleGridSizeInPixels(int size)
 {
-       drawing->SetGridSize(size);
+       drawing->SetGridSize((uint32_t)size);
        drawing->update();
 }
 
@@ -767,7 +694,7 @@ void ApplicationWindow::HandleGridSizeInBaseUnits(QString text)
 void ApplicationWindow::HandleDimensionSize(QString text)
 {
 /*
-This is the third input on the view toolbar; not sure what it was supposed to do...
+This is the third input on the view toolbar; not sure what it was supposed to do... (resize all dimensions in the drawing?)
 */
        // Parse the text...
        bool ok;
@@ -786,7 +713,7 @@ void ApplicationWindow::EditCopy(void)
        if (drawing->select.size() > 0)
        {
                DeleteContents(clipboard);
-               CopySelectedObjectsTo(clipboard, drawing->document.objects);
+               clipboard = CopySelectedObjects(drawing->document.objects);
        }
 }
 
@@ -796,7 +723,7 @@ void ApplicationWindow::EditCut(void)
        if (drawing->select.size() > 0)
        {
                DeleteContents(clipboard);
-               MoveSelectedObjectsTo(clipboard, drawing->document.objects);
+               clipboard = MoveSelectedObjectsFrom(drawing->document.objects);
                drawing->update();
        }
 }
@@ -807,14 +734,26 @@ void ApplicationWindow::EditPaste(void)
        if (clipboard.size() > 0)
        {
                // We want to maybe make it so that the pasted objects are being moved in a "mouse drag" state...
-               // This only moves the cut/copied from the clipboard to the drawing.
-//             AddObjectsTo(drawing->document.objects, clipboard);
-               CopyObjects(clipboard, drawing->document.objects);
+               ClearSelected(drawing->document.objects);
+               SelectAll(clipboard);
+               drawing->document.Add(CopyObjects(clipboard));
                drawing->update();
        }
 }
 
 
+//
+// Select all *visible* objects.  If an object is on a layer that is not
+// visible, skip it.
+//
+void ApplicationWindow::SelectAllObjects(void)
+{
+       // Set object's state & update the drawing
+       SelectAll(drawing->document.objects);
+       drawing->update();
+}
+
+
 void ApplicationWindow::CreateActions(void)
 {
        exitAct = CreateAction(tr("&Quit"), tr("Quit"), tr("Exits the application."),
@@ -909,6 +848,9 @@ void ApplicationWindow::CreateActions(void)
        editPasteAct = CreateAction(tr("&Paste Objects"), tr("Paste Objects"), tr("Paste objects from the clipboard to the drawing."), QIcon(":/res/editpaste2.png"), QKeySequence(tr("Ctrl+v")));
        connect(editPasteAct, SIGNAL(triggered()), this, SLOT(EditPaste()));
 
+       selectAllAct = CreateAction(tr("Select &All"), tr("Select All Objects"), tr("Select all objects in the drawing."), QIcon(), QKeySequence(tr("Ctrl+a")));
+       connect(selectAllAct, SIGNAL(triggered()), this, SLOT(SelectAllObjects()));
+
 //Hm. I think we'll have to have separate logic to do the "Radio Group Toolbar" thing...
 // Yup, in order to turn them off, we'd have to have an "OFF" toolbar button. Ick.
 /*     QActionGroup * group = new QActionGroup(this);
@@ -984,6 +926,7 @@ void ApplicationWindow::CreateMenus(void)
        menu->addAction(connectAct);
        menu->addAction(disconnectAct);
        menu->addSeparator();
+       menu->addAction(selectAllAct);
        menu->addAction(editCutAct);
        menu->addAction(editCopyAct);
        menu->addAction(editPasteAct);
@@ -1064,6 +1007,7 @@ void ApplicationWindow::CreateToolbars(void)
        connect(pw, SIGNAL(WidthSelected(float)), drawing, SLOT(HandlePenWidth(float)));
        connect(pw, SIGNAL(StyleSelected(int)), drawing, SLOT(HandlePenStyle(int)));
        connect(pw, SIGNAL(ColorSelected(uint32_t)), drawing, SLOT(HandlePenColor(uint32_t)));
+       connect(pw, SIGNAL(StampSelected(void)), drawing, SLOT(HandlePenStamp(void)));
 }