X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fapplicationwindow.cpp;h=8bbdbc1c5646c8c996fdf33244b0f0995f711fa7;hb=41644f6a841b45cb6f1f7a96c93fd550f67a7974;hp=7dd57aca22824c70f77ff62cb782808e47814569;hpb=790c1a6d97f73f7457c7fad7e82fa29e5b6accd5;p=architektonas diff --git a/src/applicationwindow.cpp b/src/applicationwindow.cpp index 7dd57ac..8bbdbc1 100644 --- a/src/applicationwindow.cpp +++ b/src/applicationwindow.cpp @@ -28,8 +28,12 @@ #include "applicationwindow.h" +#include #include "about.h" #include "blockwidget.h" +#include "commandprocessor.h" +#include "consolewidget.h" +#include "drawingsettingsdlg.h" #include "drawingview.h" #include "fileio.h" #include "generaltab.h" @@ -42,11 +46,9 @@ #include "structs.h" #include "utils.h" - // Class variables DrawingView * ApplicationWindow::drawing; - ApplicationWindow::ApplicationWindow(): baseUnitInput(new QLineEdit), dimensionSizeInput(new QLineEdit), @@ -59,10 +61,8 @@ ApplicationWindow::ApplicationWindow(): aboutWin = new AboutWindow(this); -// ((TTEdit *)qApp)->charWnd = new CharWindow(this); - setWindowIcon(QIcon(":/res/atns-icon.png")); - setWindowTitle("Architektonas"); +// setWindowTitle("Architektonas"); CreateActions(); CreateMenus(); @@ -81,17 +81,25 @@ ApplicationWindow::ApplicationWindow(): ObjectWidget * ow = new ObjectWidget; dock3->setWidget(ow); addDockWidget(Qt::RightDockWidgetArea, dock3); + QDockWidget * dock4 = new QDockWidget(tr("Command"), this); + cw = new ConsoleWidget; + dock4->setWidget(cw); + addDockWidget(Qt::BottomDockWidgetArea, dock4); + // Needed for saveState() dock1->setObjectName("Layers"); dock2->setObjectName("Blocks"); dock3->setObjectName("Object"); + dock4->setObjectName("Commands"); // 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")); ReadSettings(); + // Make sure the bottom left corner gets owned by the right side: + setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); setUnifiedTitleAndToolBarOnMac(true); Global::font = new QFont("Verdana", 15, QFont::Bold); @@ -101,8 +109,10 @@ 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())); + connect(cw->cmdProc, SIGNAL(UpdateNeeded()), this, SLOT(UpdateFromCommand())); +} void ApplicationWindow::closeEvent(QCloseEvent * event) { @@ -111,7 +121,6 @@ void ApplicationWindow::closeEvent(QCloseEvent * event) //Do we have a memory leak here if we don't delete the font in the Object??? } - void ApplicationWindow::FileNew(void) { // Warn the user if drawing has changed and hasn't been saved... @@ -148,11 +157,11 @@ void ApplicationWindow::FileNew(void) drawing->dirty = false; drawing->update(); documentName.clear(); - setWindowTitle("Architektonas - Untitled"); +// setWindowTitle("Architektonas - Untitled"); + setWindowFilePath(documentName); statusBar()->showMessage(tr("New drawing is ready.")); } - void ApplicationWindow::FileOpen(void) { QString filename = QFileDialog::getOpenFileName(this, tr("Open Drawing"), @@ -162,6 +171,21 @@ void ApplicationWindow::FileOpen(void) if (filename.isEmpty()) return; + LoadFile(filename); +} + +void ApplicationWindow::FileOpenRecent(void) +{ + QAction * action = qobject_cast(sender()); + + if (!action) + return; + + LoadFile(action->data().toString()); +} + +void ApplicationWindow::LoadFile(QString filename) +{ FILE * file = fopen(filename.toUtf8().data(), "r"); if (file == 0) @@ -188,7 +212,6 @@ void ApplicationWindow::FileOpen(void) return; } -//printf("FileOpen: container size = %li\n", container.objects.size()); // Keep memory leaks from happening by getting rid of the old document DeleteContents(drawing->document.objects); emit ReloadLayers(); @@ -199,11 +222,11 @@ void ApplicationWindow::FileOpen(void) drawing->dirty = false; drawing->update(); documentName = filename; - setWindowTitle(QString("Architektonas - %1").arg(documentName)); +// setWindowTitle(QString("Architektonas - %1").arg(documentName)); + AdjustMRU(filename); statusBar()->showMessage(tr("Drawing loaded.")); } - void ApplicationWindow::FileSave(void) { if (documentName.isEmpty()) @@ -238,11 +261,11 @@ void ApplicationWindow::FileSave(void) } drawing->dirty = false; - setWindowTitle(QString("Architektonas - %1").arg(documentName)); +// setWindowTitle(QString("Architektonas - %1").arg(documentName)); + AdjustMRU(documentName); statusBar()->showMessage(tr("Drawing saved.")); } - void ApplicationWindow::FileSaveAs(void) { QString filename = QFileDialog::getSaveFileName(this, tr("Save Drawing As"), @@ -255,40 +278,119 @@ void ApplicationWindow::FileSaveAs(void) } } +void ApplicationWindow::PrintPreview(void) +{ + QPrintPreviewDialog * dlg = new QPrintPreviewDialog(this); + + connect(dlg, SIGNAL(paintRequested(QPrinter *)), this, SLOT(HandlePrintRequest(QPrinter *))); + + dlg->exec(); +} + +void ApplicationWindow::HandlePrintRequest(QPrinter * printer) +{ + QPainter qtPainter(printer); + Painter painter(&qtPainter); + + // Save vars for screen + Point originSave = Global::origin; + double zoomSave = Global::zoom; + Vector screenSizeSave = Global::screenSize; + + // Adjust zoom + origin to fit the paper (or NxM pages if we have 'em) + Rect r = drawing->GetObjectExtents((Object *)(&(drawing->document))); + + QPageLayout pageLayout = printer->pageLayout(); + QRect pageRect = pageLayout.paintRectPixels(printer->resolution()); + + Global::origin = r.BottomLeft(); + Global::screenSize.x = pageRect.width(); + Global::screenSize.y = pageRect.height(); + + double xScale = (double)pageRect.width() / r.Width(); + double yScale = (double)pageRect.height() / r.Height(); + Global::zoom = qMin(xScale, yScale); + + if (xScale < yScale) + Global::origin.y -= (((double)pageRect.height() / Global::zoom) - r.Height()) / 2.0; + else + Global::origin.x -= (((double)pageRect.width() / Global::zoom) - r.Width()) / 2.0; + + // Do object rendering... + for(int i=0; iRenderObjects(&painter, drawing->document.objects, i); + + // Restore vars + Global::origin = originSave; + Global::zoom = zoomSave; + Global::screenSize = screenSizeSave; +} +// +// Right-click menu +// void ApplicationWindow::contextMenuEvent(QContextMenuEvent * event) { + // Proof of concept, still need to code up the real thing QMenu menu(this); + + VPVector hovered = drawing->GetHovered(); + + if ((drawing->select.size() > 0) || (hovered.size() > 0)) + { + QMenu * layerMenu = menu.addMenu("To layer"); + + layerAct.clear(); + + for(int i=0; isetData(i); + layerMenu->addAction(act); + layerAct.append(act); + connect(act, SIGNAL(triggered()), this, SLOT(MoveToLayer())); + } + } + menu.addAction(mirrorAct); menu.addAction(rotateAct); menu.addAction(trimAct); menu.exec(event->globalPos()); } +void ApplicationWindow::MoveToLayer(void) +{ + QAction * act = qobject_cast(sender()); + + drawing->MoveSelectedToLayer(act->data().toInt()); + drawing->update(); +} + +void ApplicationWindow::UpdateFromCommand(void) +{ + cw->SetToolPrompt(); + drawing->update(); +} void ApplicationWindow::SnapToGridTool(void) { Global::snapToGrid = snapToGridAct->isChecked(); } - void ApplicationWindow::FixAngle(void) { Global::fixedAngle = fixAngleAct->isChecked(); } - void ApplicationWindow::FixLength(void) { Global::fixedLength = fixLengthAct->isChecked(); } - void ApplicationWindow::DeleteTool(void) { // For this tool, we check first to see if anything is selected. If so, we // delete those and *don't* select the delete tool. -// if (drawing->numSelected > 0) if (drawing->select.size() > 0) { DeleteSelectedObjects(drawing->document.objects); @@ -300,16 +402,15 @@ void ApplicationWindow::DeleteTool(void) // Otherwise, toggle the state of the tool ClearUIToolStatesExcept(deleteAct); SetInternalToolStates(); + Global::toolSuppressCrosshair = true; } - void ApplicationWindow::DimensionTool(void) { ClearUIToolStatesExcept(addDimensionAct); SetInternalToolStates(); } - void ApplicationWindow::RotateTool(void) { ClearUIToolStatesExcept(rotateAct); @@ -321,7 +422,6 @@ void ApplicationWindow::RotateTool(void) SetInternalToolStates(); } - void ApplicationWindow::MirrorTool(void) { ClearUIToolStatesExcept(mirrorAct); @@ -333,13 +433,19 @@ void ApplicationWindow::MirrorTool(void) SetInternalToolStates(); } - void ApplicationWindow::TrimTool(void) { ClearUIToolStatesExcept(trimAct); SetInternalToolStates(); + Global::toolSuppressCrosshair = true; } +void ApplicationWindow::ParallelTool(void) +{ + ClearUIToolStatesExcept(parallelAct); + SetInternalToolStates(); + Global::toolSuppressCrosshair = true; +} void ApplicationWindow::TriangulateTool(void) { @@ -347,124 +453,105 @@ void ApplicationWindow::TriangulateTool(void) SetInternalToolStates(); } - void ApplicationWindow::AddLineTool(void) { ClearUIToolStatesExcept(addLineAct); SetInternalToolStates(); } - void ApplicationWindow::AddCircleTool(void) { ClearUIToolStatesExcept(addCircleAct); SetInternalToolStates(); } - void ApplicationWindow::AddArcTool(void) { ClearUIToolStatesExcept(addArcAct); SetInternalToolStates(); } - void ApplicationWindow::AddPolygonTool(void) { ClearUIToolStatesExcept(addPolygonAct); SetInternalToolStates(); } - void ApplicationWindow::AddSplineTool(void) { ClearUIToolStatesExcept(addSplineAct); SetInternalToolStates(); } - 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(); - drawing->update(); - zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Global::gridSpacing)); - baseUnitInput->setText(QString("%1").arg(Global::gridSpacing)); + 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->update(); + + 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)); +} 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, parallelAct, 0 }; for(int i=0; actionList[i]!=0; i++) @@ -474,13 +561,14 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception) } } - void ApplicationWindow::SetInternalToolStates(void) { // We can be sure that if we've come here, then either an active tool is - // being deactivated, or a new tool is being created. In either case, the - // old tool needs to be deleted. + // being deactivated, or a new tool is being activated. In either case, + // the tool state needs to be reset. Also, we reset the crosshair + // suppression flag. Global::toolState = TSNone; + Global::toolSuppressCrosshair = false; if (addLineAct->isChecked()) Global::tool = TTLine; @@ -502,21 +590,22 @@ void ApplicationWindow::SetInternalToolStates(void) Global::tool = TTRotate; else if (trimAct->isChecked()) Global::tool = TTTrim; + else if (parallelAct->isChecked()) + Global::tool = TTParallel; else if (triangulateAct->isChecked()) Global::tool = TTTriangulate; else Global::tool = TTNone; + cw->SetToolPrompt(); drawing->update(); } - void ApplicationWindow::HelpAbout(void) { aboutWin->show(); } - void ApplicationWindow::Settings(void) { SettingsDialog dlg(this); @@ -530,6 +619,24 @@ void ApplicationWindow::Settings(void) WriteSettings(); } +void ApplicationWindow::DrawingSettings(void) +{ + DrawingSettingsDlg dlg(this); + dlg.baseUnit->setCurrentIndex(drawing->document.baseUnit); + dlg.unitStyle->setCurrentIndex(drawing->document.unitStyle); + dlg.decimalPrecision->setCurrentIndex(drawing->document.decimalPrecision); + dlg.fractionalPrecision->setCurrentIndex(drawing->document.fractionalPrecision); + + if (dlg.exec() == false) + return; + + // Deal with stuff here (since user hit "OK" button...) + drawing->document.baseUnit = dlg.baseUnit->currentIndex(); + drawing->document.unitStyle = dlg.unitStyle->currentIndex(); + drawing->document.decimalPrecision= dlg.decimalPrecision->currentIndex(); + drawing->document.fractionalPrecision = dlg.fractionalPrecision->currentIndex(); + drawing->update(); +} // // Group a bunch of selected objects (which can include other groups) together @@ -537,57 +644,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 +670,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 +684,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,12 +700,10 @@ else statusBar()->showMessage(QString(tr("Grouped %1 objects.")).arg(numSelected)); //printf("Group: document size = %li\n", drawing->document.objects.size()); } -#endif drawing->update(); } - void ApplicationWindow::HandleConnection(void) { #if 0 @@ -732,19 +773,16 @@ printf(" -> intersects = %i, t=%lf, u=%lf\n", intersects, t, u); #endif } - void ApplicationWindow::HandleDisconnection(void) { } - -void ApplicationWindow::HandleGridSizeInPixels(int size) +void ApplicationWindow::HandleGridSizeInPixels(int /*size*/) { - drawing->SetGridSize(size); +// drawing->SetGridSize((uint32_t)size); drawing->update(); } - void ApplicationWindow::HandleGridSizeInBaseUnits(QString text) { // Parse the text... @@ -755,19 +793,15 @@ void ApplicationWindow::HandleGridSizeInBaseUnits(QString text) if (!ok || value == 0) return; -// drawing->gridSpacing = value; -// Painter::zoom = drawing->gridPixels / drawing->gridSpacing; Global::gridSpacing = value; Global::zoom = drawing->gridPixels / Global::gridSpacing; - drawing->UpdateGridBackground(); 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; @@ -786,34 +820,42 @@ void ApplicationWindow::EditCopy(void) if (drawing->select.size() > 0) { DeleteContents(clipboard); - CopySelectedObjectsTo(clipboard, drawing->document.objects); + clipboard = CopySelectedObjects(drawing->document.objects); } } - void ApplicationWindow::EditCut(void) { if (drawing->select.size() > 0) { DeleteContents(clipboard); - MoveSelectedObjectsTo(clipboard, drawing->document.objects); + clipboard = MoveSelectedObjectsFrom(drawing->document.objects); drawing->update(); } } - 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) { @@ -882,6 +924,9 @@ void ApplicationWindow::CreateActions(void) settingsAct = CreateAction(tr("&Settings"), tr("Settings"), tr("Change certain defaults for Architektonas."), QIcon(":/res/settings.png"), QKeySequence()); connect(settingsAct, SIGNAL(triggered()), this, SLOT(Settings())); + drawingSettingsAct = CreateAction(tr("&Drawing Settings"), tr("Drawing settings"), tr("Change certain defaults for the current drawing."), QIcon(":/res/settings.png"), QKeySequence()); + connect(drawingSettingsAct, SIGNAL(triggered()), this, SLOT(DrawingSettings())); + groupAct = CreateAction(tr("&Group"), tr("Group"), tr("Group/ungroup selected objects."), QIcon(":/res/group-tool.png"), QKeySequence("g")); connect(groupAct, SIGNAL(triggered()), this, SLOT(HandleGrouping())); @@ -897,6 +942,9 @@ void ApplicationWindow::CreateActions(void) trimAct = CreateAction(tr("&Trim"), tr("Trim"), tr("Trim extraneous lines from selected objects."), QIcon(":/res/trim-tool.png"), QKeySequence("t,r"), true); connect(trimAct, SIGNAL(triggered()), this, SLOT(TrimTool())); + parallelAct = CreateAction(tr("&Parallel"), tr("Parallel"), tr("Create copies of objects parallel to the original."), QIcon(":/res/parallel-tool.png"), QKeySequence("p,l"), true); + connect(parallelAct, SIGNAL(triggered()), this, SLOT(ParallelTool())); + triangulateAct = CreateAction(tr("&Triangulate"), tr("Triangulate"), tr("Make triangles from selected lines, preserving their lengths."), QIcon(":/res/triangulate-tool.png"), QKeySequence("t,g"), true); connect(triangulateAct, SIGNAL(triggered()), this, SLOT(TriangulateTool())); @@ -909,6 +957,12 @@ 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())); + + printPreviewAct = CreateAction(tr("&Print Preview"), tr("Print Preview"), tr("Shows preview of printing operation."), QIcon(":/res/print-preview.png"), QKeySequence(tr("Ctrl+p"))); + connect(printPreviewAct, SIGNAL(triggered()), this, SLOT(PrintPreview())); + //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); @@ -917,8 +971,15 @@ void ApplicationWindow::CreateActions(void) group->addAction(addLineAct); group->addAction(addCircleAct); group->addAction(addArcAct);//*/ -} + for(int i=0; isetVisible(false); + connect(rfa, SIGNAL(triggered()), this, SLOT(FileOpenRecent())); + mruAct.append(rfa); + } +} // // Consolidates action creation from a multi-step process to a single-step one. @@ -935,7 +996,6 @@ QAction * ApplicationWindow::CreateAction(QString name, QString tooltip, return action; } - // // This is essentially the same as the previous function, but this allows more // than one key sequence to be added as key shortcuts. @@ -956,16 +1016,25 @@ QAction * ApplicationWindow::CreateAction(QString name, QString tooltip, return action; } - void ApplicationWindow::CreateMenus(void) { QMenu * menu = menuBar()->addMenu(tr("&File")); menu->addAction(fileNewAct); menu->addAction(fileOpenAct); + + QMenu * recentMenu = menu->addMenu(tr("Open &Recent")); + + for(int i=0; iaddAction(mruAct.at(i)); + + UpdateMRUActionList(); + menu->addAction(fileSaveAct); menu->addAction(fileSaveAsAct); menu->addAction(fileCloseAct); menu->addSeparator(); + menu->addAction(printPreviewAct); + menu->addSeparator(); menu->addAction(exitAct); menu = menuBar()->addMenu(tr("&View")); @@ -980,10 +1049,12 @@ void ApplicationWindow::CreateMenus(void) menu->addAction(rotateAct); menu->addAction(mirrorAct); menu->addAction(trimAct); + menu->addAction(parallelAct); menu->addAction(triangulateAct); menu->addAction(connectAct); menu->addAction(disconnectAct); menu->addSeparator(); + menu->addAction(selectAllAct); menu->addAction(editCutAct); menu->addAction(editCopyAct); menu->addAction(editPasteAct); @@ -996,13 +1067,13 @@ void ApplicationWindow::CreateMenus(void) menu->addAction(addSplineAct); menu->addAction(addDimensionAct); menu->addSeparator(); + menu->addAction(drawingSettingsAct); menu->addAction(settingsAct); menu = menuBar()->addMenu(tr("&Help")); menu->addAction(aboutAct); } - void ApplicationWindow::CreateToolbars(void) { QToolBar * toolbar = addToolBar(tr("File")); @@ -1012,7 +1083,6 @@ void ApplicationWindow::CreateToolbars(void) toolbar->addAction(fileSaveAct); toolbar->addAction(fileSaveAsAct); toolbar->addAction(fileCloseAct); -// toolbar->addAction(exitAct); toolbar = addToolBar(tr("View")); toolbar->setObjectName("View"); @@ -1021,7 +1091,6 @@ void ApplicationWindow::CreateToolbars(void) QSpinBox * spinbox = new QSpinBox; toolbar->addWidget(spinbox); -// QLineEdit * lineedit = new QLineEdit; toolbar->addWidget(baseUnitInput); toolbar->addWidget(dimensionSizeInput); @@ -1034,6 +1103,7 @@ void ApplicationWindow::CreateToolbars(void) toolbar->addAction(rotateAct); toolbar->addAction(mirrorAct); toolbar->addAction(trimAct); + toolbar->addAction(parallelAct); toolbar->addAction(triangulateAct); toolbar->addAction(editCutAct); toolbar->addAction(editCopyAct); @@ -1061,12 +1131,10 @@ void ApplicationWindow::CreateToolbars(void) toolbar->setObjectName(tr("Pen")); toolbar->addWidget(pw); connect(drawing, SIGNAL(ObjectSelected(Object *)), pw, SLOT(SetFields(Object *))); - 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->tbStamp, SIGNAL(triggered(QAction *)), drawing, SLOT(HandlePenStamp(QAction *))); + connect(pw->tbDropper, SIGNAL(triggered(QAction *)), drawing, SLOT(HandlePenDropper(QAction *))); } - void ApplicationWindow::ReadSettings(void) { QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); @@ -1078,7 +1146,6 @@ void ApplicationWindow::ReadSettings(void) restoreState(settings.value("windowState").toByteArray()); } - void ApplicationWindow::WriteSettings(void) { settings.setValue("pos", pos()); @@ -1088,3 +1155,37 @@ void ApplicationWindow::WriteSettings(void) settings.setValue("snapToGrid", snapToGridAct->isChecked()); } +void ApplicationWindow::UpdateMRUActionList(void) +{ + QStringList mruFilePaths = settings.value("recentFiles").toStringList(); + + int mruSize = (mruFilePaths.size() <= MRU_MAX ? mruFilePaths.size() : MRU_MAX); + + for(int i=0; isetText(filename); + mruAct.at(i)->setData(mruFilePaths.at(i)); + mruAct.at(i)->setVisible(true); + } + + for(int i=mruSize; isetVisible(false); +} + +void ApplicationWindow::AdjustMRU(const QString & filePath) +{ + documentName = filePath; + setWindowFilePath(documentName); + + QStringList mruFilePaths = settings.value("recentFiles").toStringList(); + mruFilePaths.removeAll(filePath); + mruFilePaths.prepend(filePath); + + while (mruFilePaths.size() > MRU_MAX) + mruFilePaths.removeLast(); + + settings.setValue("recentFiles", mruFilePaths); + + UpdateMRUActionList(); +}