diff --git a/Sources/documentwindow.cpp b/Sources/documentwindow.cpp new file mode 100644 index 0000000..b97af0e --- /dev/null +++ b/Sources/documentwindow.cpp @@ -0,0 +1,106 @@ +// ------------------------------------------------------------------------------------------------- +/** + * @file + * @brief + * @author Gerolf Reinwardt + * @date 30.01.2011 + * + * Copyright (c) 2011, Gerolf Reinwardt. All rights reserved. + * + * Simplified BSD License + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gerolf Reinwardt. + */ +// ------------------------------------------------------------------------------------------------- + +// ----- general includes -------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include + +// ----- local includes ---------------------------------------------------------------------------- +#include "documentwindow.h" + + +// ----- construction ------------------------------------------------------------------------------ +DocumentWindow::DocumentWindow(QWidget* parent, Qt::WindowFlags flags) : + QMainWindow(parent, flags) +{ + setAcceptDrops(true); +} + +DocumentWindow::~DocumentWindow() +{ +} + +// ----- operators --------------------------------------------------------------------------------- +// ----- methods ----------------------------------------------------------------------------------- +// ----- accessors --------------------------------------------------------------------------------- +// ----- public slots ------------------------------------------------------------------------------ +// ----- protected slots --------------------------------------------------------------------------- +// ----- events ------------------------------------------------------------------------------------ +void DocumentWindow::dragEnterEvent(QDragEnterEvent* event) +{ + // if some actions should not be usable, like move, this code must be adopted + event->acceptProposedAction(); +} + +void DocumentWindow::dragMoveEvent(QDragMoveEvent* event) +{ + // if some actions should not be usable, like move, this code must be adopted + event->acceptProposedAction(); +} + + +void DocumentWindow::dragLeaveEvent(QDragLeaveEvent* event) +{ + event->accept(); +} + +void DocumentWindow::dropEvent(QDropEvent* event) +{ + const QMimeData* mimeData = event->mimeData(); + + if (mimeData->hasUrls()) + { + QStringList pathList; + QList urlList = mimeData->urls(); + + for (int i = 0; i < urlList.size() && i < 32; ++i) + { + pathList.append(urlList.at(i).toLocalFile()); + } + + if(openFiles(pathList)) + event->acceptProposedAction(); + } +} + +// ----- private slots ----------------------------------------------------------------------------- +// ----- private helpers --------------------------------------------------------------------------- diff --git a/Sources/documentwindow.h b/Sources/documentwindow.h new file mode 100644 index 0000000..493c257 --- /dev/null +++ b/Sources/documentwindow.h @@ -0,0 +1,173 @@ +// ------------------------------------------------------------------------------------------------- +/** + * @file + * @brief + * @author Gerolf Reinwardt + * @date 30. march 2011 + * + * Copyright (c) 2011, Gerolf Reinwardt. All rights reserved. + * + * Simplified BSD License + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of Gerolf Reinwardt. + */ +// ------------------------------------------------------------------------------------------------- + +#ifndef WIDGET_H +#define WIDGET_H + +// ----- general includes -------------------------------------------------------------------------- +#include +#include + +// ----- local includes ---------------------------------------------------------------------------- +// ----- pre defines ------------------------------------------------------------------------------- + +// ----- class definition -------------------------------------------------------------------------- +/** + * @short + * + * The usage is fairly easy. Derive your own MainWindow class from DocumentWindow instead of QMainWindow + * and implement the pure virtual function openFiles. + * + * @code + MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags) : + DocumentWindow(parent, flags) + { + ... + + setWindowTitle(tr("MDI")); + setUnifiedTitleAndToolBarOnMac(true); + } + @endcode + * + * Aditionally, the openFiles must be implermented: + * + * @code + bool MyClass::openFiles(const QStringList& pathList) + { + bool success = true; + for (int i = 0; i < pathList.size() && i < 32; ++i) + { + MdiChild *child = createMdiChild(); + if (child->loadFile(pathList.at(i))) + { + statusBar()->showMessage(tr("File loaded"), 2000); + child->show(); + } + else + { + child->close(); + } + } + return success; + } + @endcode + * + */ +class DocumentWindow : public QMainWindow +{ + Q_OBJECT +public: + // ----- enums --------------------------------------------------------------------------------- + // ----- construction -------------------------------------------------------------------------- + /** + * Constructor. + * + * Creates a DocumentWindow with a given @arg parent and @arg flags. + */ + explicit DocumentWindow(QWidget* parent = 0, Qt::WindowFlags flags = 0); + + /** + * Destructor + */ + ~DocumentWindow(); + + // ----- operators ----------------------------------------------------------------------------- + // ----- methods ------------------------------------------------------------------------------- + // ----- accessors ----------------------------------------------------------------------------- + // ----- members ------------------------------------------------------------------------------- + +protected: + // ----- events -------------------------------------------------------------------------------- + /** + * this event is called when the mouse enters the widgets area during a drag/drop operation + */ + void dragEnterEvent(QDragEnterEvent* event); + + /** + * this event is called when the mouse moves inside the widgets area during a drag/drop operation + */ + void dragMoveEvent(QDragMoveEvent* event); + + /** + * this event is called when the mouse leaves the widgets area during a drag/drop operation + */ + void dragLeaveEvent(QDragLeaveEvent* event); + + /** + * this event is called when the drop operation is initiated at the widget + */ + void dropEvent(QDropEvent* event); + + // ----- helpers ------------------------------------------------------------------------------- + /** + * This method must be implemented by the client. It is used to opened the dropped files. + * + * @param pathList list of urls given by the drop event + * @retval true if successfull otherwise false + * + * Here is an example implementation: + * + * @code + bool MyClass::openFiles(const QStringList& pathList) + { + bool success = true; + for (int i = 0; i < pathList.size() && i < 32; ++i) + { + MdiChild *child = createMdiChild(); + if (child->loadFile(pathList.at(i))) + { + statusBar()->showMessage(tr("File loaded"), 2000); + child->show(); + } + else + { + child->close(); + } + } + return success; + } + @endcode + */ + virtual bool openFiles(const QStringList& pathList) = 0; + +private: + // ----- privat helpers ------------------------------------------------------------------------ + // ----- members ------------------------------------------------------------------------------- + // ----- not allowed members ------------------------------------------------------------------- +}; + +#endif // WIDGET_H diff --git a/Sources/stlviewer.cpp b/Sources/stlviewer.cpp index 40f0faf..c8f2125 100644 --- a/Sources/stlviewer.cpp +++ b/Sources/stlviewer.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -41,7 +42,7 @@ #include "settingsdialog.h" STLViewer::STLViewer(QWidget *parent, Qt::WFlags flags) - : QMainWindow(parent, flags) + : DocumentWindow(parent, flags) { mdiArea = new QMdiArea; mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); @@ -69,6 +70,40 @@ STLViewer::STLViewer(QWidget *parent, Qt::WFlags flags) STLViewer::~STLViewer() {} +void STLViewer::openFile(const QString& path) +{ + QMdiSubWindow *existing = findGLMdiChild(path); + if(existing) + { + mdiArea->setActiveSubWindow(existing); + } + else + { + GLMdiChild *child = createGLMdiChild(); + if(child->loadFile(path)) + { + statusBar()->showMessage(tr("File loaded"), 2000); + child->show(); + } + else + { + setActiveSubWindow(child); + mdiArea->closeActiveSubWindow(); + //child->close(); + } + } +} + +bool STLViewer::openFiles(const QStringList& pathList) +{ + bool success = true; + for (int i = 0; i < pathList.size() && i < 32; ++i) + { + openFile(pathList.at(i)); + } + return success; +} + void STLViewer::closeEvent(QCloseEvent *event) { mdiArea->closeAllSubWindows(); @@ -102,24 +137,7 @@ void STLViewer::open() if(!fileName.isEmpty()) { curDir = QFileInfo(fileName).filePath(); - QMdiSubWindow *existing = findGLMdiChild(fileName); - if(existing) - { - mdiArea->setActiveSubWindow(existing); - return; - } - GLMdiChild *child = createGLMdiChild(); - if(child->loadFile(fileName)) - { - statusBar()->showMessage(tr("File loaded"), 2000); - child->show(); - } - else - { - setActiveSubWindow(child); - mdiArea->closeActiveSubWindow(); - //child->close(); - } + openFile(fileName); } } @@ -445,7 +463,7 @@ void STLViewer::createActions() connect(showSettingsDialogAct, SIGNAL(triggered()), this, SLOT(showSettingsDialog())); closeAct = new QAction(tr("Cl&ose"), this); - closeAct->setShortcut(tr("Ctrl+W")); + //closeAct->setShortcut(tr("Ctrl+W")); closeAct->setStatusTip(tr("Close the active window")); connect(closeAct, SIGNAL(triggered()), mdiArea, SLOT(closeActiveSubWindow())); diff --git a/Sources/stlviewer.h b/Sources/stlviewer.h index 243db4d..97320d8 100644 --- a/Sources/stlviewer.h +++ b/Sources/stlviewer.h @@ -21,25 +21,24 @@ #ifndef STLVIEWER_H #define STLVIEWER_H -#include #include -#include #include #include #include -#include #include #include #include "glmdichild.h" +#include "documentwindow.h" +class Qmdiarea; class AxisGroupBox; class DimensionsGroupBox; class MeshInformationGroupBox; class PropertiesGroupBox; class SettingsDialog; -class STLViewer : public QMainWindow +class STLViewer : public DocumentWindow { Q_OBJECT @@ -83,6 +82,8 @@ class STLViewer : public QMainWindow void destroyGLMdiChild(); private: + void openFile(const QString& path); + bool openFiles(const QStringList& pathList); void createActions(); void createMenus(); void createToolBars(); diff --git a/stlviewer.pro b/stlviewer.pro index f27fb44..8b15555 100644 --- a/stlviewer.pro +++ b/stlviewer.pro @@ -17,6 +17,7 @@ win32 { meshinformationgroupbox.cpp \ propertiesgroupbox.cpp \ stlfile.cpp \ + documentwindow.cpp \ vector.cpp HEADERS += axisglwidget.h \ axisgroupbox.h \ @@ -27,6 +28,7 @@ win32 { meshinformationgroupbox.h \ propertiesgroupbox.h \ stlfile.h \ + documentwindow.h \ vector.h } unix { @@ -39,6 +41,7 @@ unix { meshinformationgroupbox.cpp \ propertiesgroupbox.cpp \ stlfile.cpp \ + documentwindow.cpp \ vector.cpp HEADERS += axisglwidget.h \ axisgroupbox.h \ @@ -49,6 +52,7 @@ unix { meshinformationgroupbox.h \ propertiesgroupbox.h \ stlfile.h \ + documentwindow.h \ vector.h } win32:debug {