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"));
connect(this, SIGNAL(ReloadLayers()), lw, SLOT(Reload()));
connect(drawing, SIGNAL(ObjectHovered(Object *)), ow, SLOT(ShowInfo(Object *)));
+ connect(drawing, SIGNAL(NeedZoomUpdate()), this, SLOT(UpdateZoom()));
}
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));
}
{
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++)
void ApplicationWindow::HandleGridSizeInPixels(int size)
{
- drawing->SetGridSize(size);
+ drawing->SetGridSize((uint32_t)size);
drawing->update();
}
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;
if (drawing->select.size() > 0)
{
DeleteContents(clipboard);
- CopySelectedObjectsTo(clipboard, drawing->document.objects);
+ clipboard = CopySelectedObjects(drawing->document.objects);
}
}
if (drawing->select.size() > 0)
{
DeleteContents(clipboard);
- MoveSelectedObjectsTo(clipboard, drawing->document.objects);
+ clipboard = MoveSelectedObjectsFrom(drawing->document.objects);
drawing->update();
}
}
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."),
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);
menu->addAction(connectAct);
menu->addAction(disconnectAct);
menu->addSeparator();
+ menu->addAction(selectAllAct);
menu->addAction(editCutAct);
menu->addAction(editCopyAct);
menu->addAction(editPasteAct);
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)));
}