]> Shamusworld >> Repos - architektonas/blobdiff - src/applicationwindow.cpp
Miscellaneous fixes/updates:
[architektonas] / src / applicationwindow.cpp
index 773146fa63348865180b5159d56e0e785231313f..2f78dfc61a6f92ac53229faba2091adea2ac1847 100644 (file)
 
 #include "applicationwindow.h"
 
+#include <QPrintPreviewDialog>
 #include "about.h"
 #include "blockwidget.h"
+#include "consolewidget.h"
 #include "drawingview.h"
 #include "fileio.h"
 #include "generaltab.h"
 #include "structs.h"
 #include "utils.h"
 
-
 // Class variables
 DrawingView * ApplicationWindow::drawing;
 
-
 ApplicationWindow::ApplicationWindow():
        baseUnitInput(new QLineEdit),
        dimensionSizeInput(new QLineEdit),
@@ -81,10 +81,16 @@ ApplicationWindow::ApplicationWindow():
        ObjectWidget * ow = new ObjectWidget;
        dock3->setWidget(ow);
        addDockWidget(Qt::RightDockWidgetArea, dock3);
+       QDockWidget * dock4 = new QDockWidget(tr("Command"), this);
+       ConsoleWidget * 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("Zoom: 100% Grid: 12.0\" BU: Inch");
@@ -104,7 +110,6 @@ ApplicationWindow::ApplicationWindow():
        connect(drawing, SIGNAL(NeedZoomUpdate()), this, SLOT(UpdateZoom()));
 }
 
-
 void ApplicationWindow::closeEvent(QCloseEvent * event)
 {
        WriteSettings();
@@ -112,7 +117,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...
@@ -153,7 +157,6 @@ void ApplicationWindow::FileNew(void)
        statusBar()->showMessage(tr("New drawing is ready."));
 }
 
-
 void ApplicationWindow::FileOpen(void)
 {
        QString filename = QFileDialog::getOpenFileName(this, tr("Open Drawing"),
@@ -204,7 +207,6 @@ void ApplicationWindow::FileOpen(void)
        statusBar()->showMessage(tr("Drawing loaded."));
 }
 
-
 void ApplicationWindow::FileSave(void)
 {
        if (documentName.isEmpty())
@@ -243,7 +245,6 @@ void ApplicationWindow::FileSave(void)
        statusBar()->showMessage(tr("Drawing saved."));
 }
 
-
 void ApplicationWindow::FileSaveAs(void)
 {
        QString filename = QFileDialog::getSaveFileName(this, tr("Save Drawing As"),
@@ -256,9 +257,57 @@ 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; i<Global::numLayers; i++)
+               drawing->RenderObjects(&painter, drawing->document.objects, i);
+
+       // Restore vars
+       Global::origin = originSave;
+       Global::zoom = zoomSave;
+       Global::screenSize = screenSizeSave;
+}
 
 void ApplicationWindow::contextMenuEvent(QContextMenuEvent * event)
 {
+       // Proof of concept, still need to code up the real thing
        QMenu menu(this);
        menu.addAction(mirrorAct);
        menu.addAction(rotateAct);
@@ -266,25 +315,21 @@ void ApplicationWindow::contextMenuEvent(QContextMenuEvent * event)
        menu.exec(event->globalPos());
 }
 
-
 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
@@ -303,14 +348,12 @@ void ApplicationWindow::DeleteTool(void)
        SetInternalToolStates();
 }
 
-
 void ApplicationWindow::DimensionTool(void)
 {
        ClearUIToolStatesExcept(addDimensionAct);
        SetInternalToolStates();
 }
 
-
 void ApplicationWindow::RotateTool(void)
 {
        ClearUIToolStatesExcept(rotateAct);
@@ -322,7 +365,6 @@ void ApplicationWindow::RotateTool(void)
        SetInternalToolStates();
 }
 
-
 void ApplicationWindow::MirrorTool(void)
 {
        ClearUIToolStatesExcept(mirrorAct);
@@ -334,13 +376,17 @@ void ApplicationWindow::MirrorTool(void)
        SetInternalToolStates();
 }
 
-
 void ApplicationWindow::TrimTool(void)
 {
        ClearUIToolStatesExcept(trimAct);
        SetInternalToolStates();
 }
 
+void ApplicationWindow::ParallelTool(void)
+{
+       ClearUIToolStatesExcept(parallelAct);
+       SetInternalToolStates();
+}
 
 void ApplicationWindow::TriangulateTool(void)
 {
@@ -348,42 +394,36 @@ 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 = 1.20;
@@ -396,7 +436,6 @@ void ApplicationWindow::ZoomInTool(void)
        UpdateZoom();
 }
 
-
 void ApplicationWindow::ZoomOutTool(void)
 {
        double zoomFactor = 1.20;
@@ -409,7 +448,6 @@ void ApplicationWindow::ZoomOutTool(void)
        UpdateZoom();
 }
 
-
 void ApplicationWindow::UpdateZoom(void)
 {
        // And now, a bunch of heuristics to select the right grid size--autogrid!
@@ -441,7 +479,7 @@ void ApplicationWindow::UpdateZoom(void)
        else
                Global::gridSpacing = 0.015625;
 
-       drawing->SetGridSize((double)(Global::gridSpacing * Global::zoom));
+//     drawing->SetGridSize((double)(Global::gridSpacing * Global::zoom));
        drawing->update();
 
        zoomIndicator->setText(QString("Zoom: %1% Grid: %2\" BU: Inch").arg(Global::zoom * 100.0).arg(Global::gridSpacing));
@@ -450,7 +488,6 @@ void ApplicationWindow::UpdateZoom(void)
 //     baseUnitInput->setText(QString("%1").arg(Global::gridSpacing));
 }
 
-
 void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception)
 {
        QAction * actionList[] = {
@@ -466,7 +503,6 @@ 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
@@ -494,6 +530,8 @@ 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
@@ -502,13 +540,11 @@ void ApplicationWindow::SetInternalToolStates(void)
        drawing->update();
 }
 
-
 void ApplicationWindow::HelpAbout(void)
 {
        aboutWin->show();
 }
 
-
 void ApplicationWindow::Settings(void)
 {
        SettingsDialog dlg(this);
@@ -522,7 +558,6 @@ void ApplicationWindow::Settings(void)
        WriteSettings();
 }
 
-
 //
 // Group a bunch of selected objects (which can include other groups) together
 // or ungroup a selected group.
@@ -589,7 +624,6 @@ void ApplicationWindow::HandleGrouping(void)
        drawing->update();
 }
 
-
 void ApplicationWindow::HandleConnection(void)
 {
 #if 0
@@ -659,19 +693,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((uint32_t)size);
+//     drawing->SetGridSize((uint32_t)size);
        drawing->update();
 }
 
-
 void ApplicationWindow::HandleGridSizeInBaseUnits(QString text)
 {
        // Parse the text...
@@ -686,11 +717,10 @@ void ApplicationWindow::HandleGridSizeInBaseUnits(QString text)
 //     Painter::zoom = drawing->gridPixels / drawing->gridSpacing;
        Global::gridSpacing = value;
        Global::zoom = drawing->gridPixels / Global::gridSpacing;
-       drawing->UpdateGridBackground();
+//     drawing->UpdateGridBackground();
        drawing->update();
 }
 
-
 void ApplicationWindow::HandleDimensionSize(QString text)
 {
 /*
@@ -717,7 +747,6 @@ void ApplicationWindow::EditCopy(void)
        }
 }
 
-
 void ApplicationWindow::EditCut(void)
 {
        if (drawing->select.size() > 0)
@@ -728,7 +757,6 @@ void ApplicationWindow::EditCut(void)
        }
 }
 
-
 void ApplicationWindow::EditPaste(void)
 {
        if (clipboard.size() > 0)
@@ -741,7 +769,6 @@ void ApplicationWindow::EditPaste(void)
        }
 }
 
-
 //
 // Select all *visible* objects.  If an object is on a layer that is not
 // visible, skip it.
@@ -753,7 +780,6 @@ void ApplicationWindow::SelectAllObjects(void)
        drawing->update();
 }
 
-
 void ApplicationWindow::CreateActions(void)
 {
        exitAct = CreateAction(tr("&Quit"), tr("Quit"), tr("Exits the application."),
@@ -836,6 +862,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,a"), 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()));
 
@@ -851,6 +880,9 @@ void ApplicationWindow::CreateActions(void)
        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);
@@ -861,7 +893,6 @@ void ApplicationWindow::CreateActions(void)
        group->addAction(addArcAct);//*/
 }
 
-
 //
 // Consolidates action creation from a multi-step process to a single-step one.
 //
@@ -877,7 +908,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.
@@ -898,7 +928,6 @@ QAction * ApplicationWindow::CreateAction(QString name, QString tooltip,
        return action;
 }
 
-
 void ApplicationWindow::CreateMenus(void)
 {
        QMenu * menu = menuBar()->addMenu(tr("&File"));
@@ -908,6 +937,8 @@ void ApplicationWindow::CreateMenus(void)
        menu->addAction(fileSaveAsAct);
        menu->addAction(fileCloseAct);
        menu->addSeparator();
+       menu->addAction(printPreviewAct);
+       menu->addSeparator();
        menu->addAction(exitAct);
 
        menu = menuBar()->addMenu(tr("&View"));
@@ -922,6 +953,7 @@ 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);
@@ -945,7 +977,6 @@ void ApplicationWindow::CreateMenus(void)
        menu->addAction(aboutAct);
 }
 
-
 void ApplicationWindow::CreateToolbars(void)
 {
        QToolBar * toolbar = addToolBar(tr("File"));
@@ -977,6 +1008,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);
@@ -1007,10 +1039,11 @@ 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)));
+//     connect(pw, SIGNAL(StampSelected(void)), drawing, SLOT(HandlePenStamp(QAction *)));
+       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();
@@ -1022,7 +1055,6 @@ void ApplicationWindow::ReadSettings(void)
        restoreState(settings.value("windowState").toByteArray());
 }
 
-
 void ApplicationWindow::WriteSettings(void)
 {
        settings.setValue("pos", pos());
@@ -1031,4 +1063,3 @@ void ApplicationWindow::WriteSettings(void)
        settings.setValue("useAntialiasing", drawing->useAntialiasing);
        settings.setValue("snapToGrid", snapToGridAct->isChecked());
 }
-