X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fapplicationwindow.cpp;h=5261dd11a2488037d601f1b0e44e836edb51f16f;hb=4d6ba8a6eb781dbee818b6a55d21df7b52468936;hp=03f8cb5b167ef94c60c0c18d0b786032beb3e898;hpb=2af76acd67a2703859c11446be3be4d3ff8ff4b4;p=architektonas diff --git a/src/applicationwindow.cpp b/src/applicationwindow.cpp index 03f8cb5..5261dd1 100644 --- a/src/applicationwindow.cpp +++ b/src/applicationwindow.cpp @@ -30,18 +30,35 @@ #include "about.h" #include "blockwidget.h" +#include "dimension.h" #include "drawingview.h" +#include "drawarcaction.h" +#include "drawcircleaction.h" +#include "drawdimensionaction.h" +#include "drawlineaction.h" #include "fileio.h" #include "generaltab.h" +#include "geometry.h" #include "layerwidget.h" +#include "line.h" +#include "mirroraction.h" #include "painter.h" +#include "rotateaction.h" #include "settingsdialog.h" -ApplicationWindow::ApplicationWindow(): settings("Underground Software", "Architektonas") +// Class variables +DrawingView * ApplicationWindow::drawing; + + +ApplicationWindow::ApplicationWindow(): + baseUnitInput(new QLineEdit), + dimensionSizeInput(new QLineEdit), + settings("Underground Software", "Architektonas") { drawing = new DrawingView(this); drawing->setMouseTracking(true); // We want *all* mouse events...! + drawing->setFocusPolicy(Qt::StrongFocus); setCentralWidget(drawing); aboutWin = new AboutWindow(this); @@ -69,13 +86,15 @@ ApplicationWindow::ApplicationWindow(): settings("Underground Software", "Archit dock2->setObjectName("Blocks"); // Create status bar - zoomIndicator = new QLabel("Grid: 12.0\" Zoom: 12.5%"); + zoomIndicator = new QLabel("Grid: 12.0\" BU: Inch"); statusBar()->addPermanentWidget(zoomIndicator); statusBar()->showMessage(tr("Ready")); ReadSettings(); setUnifiedTitleAndToolBarOnMac(true); Object::SetFont(new QFont("Verdana", 15, QFont::Bold)); + + connect(lw, SIGNAL(LayerSelected(int)), drawing, SLOT(SetCurrentLayer(int))); } @@ -102,6 +121,11 @@ void ApplicationWindow::FileOpen(void) { QString filename = QFileDialog::getOpenFileName(this, tr("Open Drawing"), "", tr("Architektonas files (*.drawing)")); + + // User cancelled open + if (filename.isEmpty()) + return; + FILE * file = fopen(filename.toAscii().data(), "r"); if (file == 0) @@ -162,7 +186,8 @@ void ApplicationWindow::FileSave(void) msg.setIcon(QMessageBox::Critical); msg.exec(); // In this case, we should unlink the created file, since it's not right... - unlink(documentName.toAscii().data()); +// unlink(documentName.toAscii().data()); + QFile::remove(documentName); return; } @@ -235,6 +260,13 @@ void ApplicationWindow::RotateTool(void) } +void ApplicationWindow::MirrorTool(void) +{ + ClearUIToolStatesExcept(mirrorAct); + SetInternalToolStates(); +} + + void ApplicationWindow::AddLineTool(void) { ClearUIToolStatesExcept(addLineAct); @@ -289,14 +321,15 @@ when zooming in, new origin will be (xCenter - origin.x) / 2, (yCenter - origin. Painter::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] - // This should actually be calculated by drawing->gridPixels / grid size. + // This just zooms leaving origin intact... should zoom in at the current + // center! [DONE] Painter::zoom *= zoomFactor; - drawing->gridSpacing = 12.0 / Painter::zoom; -// zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing)); - zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(drawing->gridSpacing)); + Object::gridSpacing = drawing->gridPixels / Painter::zoom; drawing->UpdateGridBackground(); drawing->update(); + + zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing)); + baseUnitInput->setText(QString("%1").arg(Object::gridSpacing)); } @@ -327,13 +360,15 @@ x 2 = (-426, -301) //printf("newOrigin=%.2f,%.2f;\n", newOrigin.x, newOrigin.y); Painter::origin = newOrigin; //printf("Zoom out...\n"); - // This just zooms leaving origin intact... should zoom out at the current center! [DONE] + // This just zooms leaving origin intact... should zoom out at the current + // center! [DONE] Painter::zoom /= zoomFactor; - drawing->gridSpacing = 12.0 / Painter::zoom; -// zoomIndicator->setText(QString("Grid: %2\" Zoom: %1%").arg(Painter::zoom * 100.0 * SCREEN_ZOOM).arg(drawing->gridSpacing)); - zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(drawing->gridSpacing)); + Object::gridSpacing = drawing->gridPixels / Painter::zoom; drawing->UpdateGridBackground(); drawing->update(); + + zoomIndicator->setText(QString("Grid: %1\", BU: Inch").arg(Object::gridSpacing)); + baseUnitInput->setText(QString("%1").arg(Object::gridSpacing)); } @@ -359,6 +394,9 @@ void ApplicationWindow::ClearUIToolStatesExcept(QAction * exception) if (exception != rotateAct) rotateAct->setChecked(false); + + if (exception != mirrorAct) + mirrorAct->setChecked(false); } @@ -366,7 +404,6 @@ void ApplicationWindow::SetInternalToolStates(void) { Object::SetDeleteActive(deleteAct->isChecked()); Object::SetDimensionActive(addDimensionAct->isChecked()); - drawing->SetRotateToolActive(rotateAct->isChecked()); // 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 @@ -375,11 +412,20 @@ void ApplicationWindow::SetInternalToolStates(void) { delete drawing->toolAction; drawing->toolAction = NULL; + Object::ignoreClicks = false; } - drawing->SetAddLineToolActive(addLineAct->isChecked()); - drawing->SetAddCircleToolActive(addCircleAct->isChecked()); - drawing->SetAddDimensionToolActive(addDimensionAct->isChecked()); + drawing->SetToolActive(addLineAct->isChecked() ? new DrawLineAction() : NULL); + drawing->SetToolActive(addCircleAct->isChecked() ? new DrawCircleAction() : NULL); + drawing->SetToolActive(addArcAct->isChecked() ? new DrawArcAction() : NULL); + drawing->SetToolActive(addDimensionAct->isChecked() ? new DrawDimensionAction() : NULL); + drawing->SetToolActive(mirrorAct->isChecked() ? new MirrorAction() : NULL); + drawing->SetToolActive(rotateAct->isChecked() ? new RotateAction() : NULL); + + if (drawing->toolAction) + Object::ignoreClicks = true; + + drawing->update(); } @@ -462,6 +508,78 @@ else } +void ApplicationWindow::HandleConnection(void) +{ +//double tt = Geometry::ParameterOfLineAndPoint(Vector(0, 0), Vector(10, 0), Vector(8, 2)); +//printf("Parameter of point @ (8,2) of line (0,0), (10,0): %lf\n", tt); + int itemsSelected = drawing->document.ItemsSelected(); + + // If nothing selected, do nothing + if (itemsSelected == 0) + { + statusBar()->showMessage(tr("No objects selected to connect.")); + return; + } + + // If one thing selected, do nothing + if (itemsSelected == 1) + { + statusBar()->showMessage(tr("Nothing to connect object to.")); + return; + } + + // This is O(n^2 / 2) :-P + for(int i=0; idocument.SelectedItem(i); + + for(int j=i+1; jdocument.SelectedItem(j); + double t, u, v, w; + +// if ((obj1->type != OTLine) || (obj2->type != OTLine)) +// continue; + + if ((obj1->type == OTLine) && (obj2->type == OTLine)) + { +//printf("Testing objects for intersection (%X, %X)...\n", obj1, obj2); + int intersects = Geometry::Intersects((Line *)obj1, (Line *)obj2, &t, &u); +//printf(" (%s) --> t=%lf, u=%lf\n", (intersects ? "true" : "FALSE"), t, u); + + if (intersects) + { + //printf("Connecting objects (%X, %X)...\n", obj1, obj2); + obj1->Connect(obj2, u); + obj2->Connect(obj1, t); + } + } + else if (((obj1->type == OTLine) && (obj2->type == OTDimension)) + || ((obj2->type == OTLine) && (obj1->type == OTDimension))) + { +printf("Testing Line<->Dimension intersection...\n"); + Line * line = (Line *)(obj1->type == OTLine ? obj1 : obj2); + Dimension * dim = (Dimension *)(obj1->type == OTDimension ? obj1 : obj2); + + int intersects = Geometry::Intersects(line, dim, &t, &u); +printf(" -> intersects = %i, t=%lf, u=%lf\n", intersects, t, u); + + if (intersects) + { + obj1->Connect(obj2, u); + obj2->Connect(obj1, t); + } + } + } + } +} + + +void ApplicationWindow::HandleDisconnection(void) +{ +} + + void ApplicationWindow::HandleGridSizeInPixels(int size) { drawing->SetGridSize(size); @@ -469,6 +587,43 @@ void ApplicationWindow::HandleGridSizeInPixels(int size) } +void ApplicationWindow::HandleGridSizeInBaseUnits(QString text) +{ + // Parse the text... + bool ok; + double value = text.toDouble(&ok); + + // Nothing parsable to a double, so quit... + if (!ok || value == 0) + return; + +// drawing->gridSpacing = value; +// Painter::zoom = drawing->gridPixels / drawing->gridSpacing; + Object::gridSpacing = value; + Painter::zoom = drawing->gridPixels / Object::gridSpacing; + drawing->UpdateGridBackground(); + drawing->update(); +} + + +void ApplicationWindow::HandleDimensionSize(QString text) +{ + // Parse the text... + bool ok; + double value = text.toDouble(&ok); + + // Nothing parsable to a double, so quit... + if (!ok || value == 0) + return; + + drawing->document.ResizeAllDimensions(value); +// drawing->gridSpacing = value; +// Painter::zoom = drawing->gridPixels / drawing->gridSpacing; +// drawing->UpdateGridBackground(); + drawing->update(); +} + + void ApplicationWindow::CreateActions(void) { exitAct = CreateAction(tr("&Quit"), tr("Quit"), tr("Exits the application."), @@ -516,26 +671,36 @@ void ApplicationWindow::CreateActions(void) zoomOutAct = CreateAction(tr("Zoom &Out"), tr("Zoom Out"), tr("Zoom out of the document."), QIcon(":/res/zoom-out.png"), QKeySequence(tr("-"))); connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(ZoomOutTool())); - fileNewAct = CreateAction(tr("&New Drawing"), tr("New Drawing"), tr("Creates a new drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+n"))); + fileNewAct = CreateAction(tr("&New Drawing"), tr("New Drawing"), tr("Creates a new drawing."), QIcon(":/res/file-new.png"), QKeySequence(tr("Ctrl+n"))); connect(fileNewAct, SIGNAL(triggered()), this, SLOT(FileNew())); - fileOpenAct = CreateAction(tr("&Open Drawing"), tr("Open Drawing"), tr("Opens an existing drawing from a file."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+o"))); + fileOpenAct = CreateAction(tr("&Open Drawing"), tr("Open Drawing"), tr("Opens an existing drawing from a file."), QIcon(":/res/file-open.png"), QKeySequence(tr("Ctrl+o"))); connect(fileOpenAct, SIGNAL(triggered()), this, SLOT(FileOpen())); - fileSaveAct = CreateAction(tr("&Save Drawing"), tr("Save Drawing"), tr("Saves the current drawing to a file."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+s"))); + fileSaveAct = CreateAction(tr("&Save Drawing"), tr("Save Drawing"), tr("Saves the current drawing to a file."), QIcon(":/res/file-save.png"), QKeySequence(tr("Ctrl+s"))); connect(fileSaveAct, SIGNAL(triggered()), this, SLOT(FileSave())); - fileSaveAsAct = CreateAction(tr("Save Drawing &As"), tr("Save As"), tr("Saves the current drawing to a file with a different name."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+Shift+s"))); + fileSaveAsAct = CreateAction(tr("Save Drawing &As"), tr("Save As"), tr("Saves the current drawing to a file with a different name."), QIcon(":/res/file-save-as.png"), QKeySequence(tr("Ctrl+Shift+s"))); connect(fileSaveAsAct, SIGNAL(triggered()), this, SLOT(FileSaveAs())); - fileCloseAct = CreateAction(tr("&Close Drawing"), tr("Close Drawing"), tr("Closes the current drawing."), QIcon(":/res/generic-tool.png"), QKeySequence(tr("Ctrl+w"))); + fileCloseAct = CreateAction(tr("&Close Drawing"), tr("Close Drawing"), tr("Closes the current drawing."), QIcon(":/res/file-close.png"), QKeySequence(tr("Ctrl+w"))); - settingsAct = CreateAction(tr("&Settings"), tr("Settings"), tr("Change certain defaults for Architektonas."), QIcon(":/res/generic-tool.png"), QKeySequence()); + settingsAct = CreateAction(tr("&Settings"), tr("Settings"), tr("Change certain defaults for Architektonas."), QIcon(":/res/settings.png"), QKeySequence()); connect(settingsAct, SIGNAL(triggered()), this, SLOT(Settings())); 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())); + connectAct = CreateAction(tr("&Connect"), tr("Connect"), tr("Connect objects at point."), QIcon(":/res/connect-tool.png"), QKeySequence("c,c")); + connect(connectAct, SIGNAL(triggered()), this, SLOT(HandleConnection())); + + disconnectAct = CreateAction(tr("&Disconnect"), tr("Disconnect"), tr("Disconnect objects joined at point."), QIcon(":/res/disconnect-tool.png"), QKeySequence("d,d")); + connect(disconnectAct, SIGNAL(triggered()), this, SLOT(HandleDisconnection())); + + mirrorAct = CreateAction(tr("&Mirror"), tr("Mirror"), tr("Mirror selected objects around a line."), QIcon(":/res/mirror-tool.png"), QKeySequence("m,i"), true); + connect(mirrorAct, SIGNAL(triggered()), this, SLOT(MirrorTool())); + + //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); @@ -604,6 +769,9 @@ void ApplicationWindow::CreateMenus(void) menu->addAction(fixAngleAct); menu->addAction(fixLengthAct); menu->addAction(rotateAct); + menu->addAction(mirrorAct); + menu->addAction(connectAct); + menu->addAction(disconnectAct); menu->addSeparator(); menu->addAction(deleteAct); menu->addSeparator(); @@ -624,14 +792,23 @@ void ApplicationWindow::CreateToolbars(void) { QToolBar * toolbar = addToolBar(tr("File")); toolbar->setObjectName("File"); // Needed for saveState() - toolbar->addAction(exitAct); + toolbar->addAction(fileNewAct); + toolbar->addAction(fileOpenAct); + toolbar->addAction(fileSaveAct); + toolbar->addAction(fileSaveAsAct); + toolbar->addAction(fileCloseAct); +// toolbar->addAction(exitAct); toolbar = addToolBar(tr("View")); toolbar->setObjectName("View"); toolbar->addAction(zoomInAct); toolbar->addAction(zoomOutAct); + QSpinBox * spinbox = new QSpinBox; toolbar->addWidget(spinbox); +// QLineEdit * lineedit = new QLineEdit; + toolbar->addWidget(baseUnitInput); + toolbar->addWidget(dimensionSizeInput); toolbar = addToolBar(tr("Edit")); toolbar->setObjectName("Edit"); @@ -640,7 +817,10 @@ void ApplicationWindow::CreateToolbars(void) toolbar->addAction(fixAngleAct); toolbar->addAction(fixLengthAct); toolbar->addAction(rotateAct); + toolbar->addAction(mirrorAct); toolbar->addAction(deleteAct); + toolbar->addAction(connectAct); + toolbar->addAction(disconnectAct); toolbar->addSeparator(); toolbar->addAction(addLineAct); toolbar->addAction(addCircleAct); @@ -650,7 +830,10 @@ void ApplicationWindow::CreateToolbars(void) spinbox->setRange(4, 256); spinbox->setValue(12); + baseUnitInput->setText("12"); connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(HandleGridSizeInPixels(int))); + connect(baseUnitInput, SIGNAL(textChanged(QString)), this, SLOT(HandleGridSizeInBaseUnits(QString))); + connect(dimensionSizeInput, SIGNAL(textChanged(QString)), this, SLOT(HandleDimensionSize(QString))); }