--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/MainWindow.h Tue Jan 21 02:03:27 2014 +0200 @@ -0,0 +1,302 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013, 2014 Santeri Piippo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef LDFORGE_GUI_H +#define LDFORGE_GUI_H + +#include <QMainWindow> +#include <QAction> +#include <QListWidget> +#include <QRadioButton> +#include "Configuration.h" +#include "LDObject.h" +#include "ui_ldforge.h" + +class MessageManager; +class MainWindow; +class LDColor; +class QToolButton; +class QDialogButtonBox; +class GLRenderer; +class QComboBox; +class QProgressBar; +class Ui_LDForgeUI; + +// Stuff for dialogs +#define IMPLEMENT_DIALOG_BUTTONS \ + bbx_buttons = new QDialogButtonBox (QDialogButtonBox::Ok | QDialogButtonBox::Cancel); \ + connect (bbx_buttons, SIGNAL (accepted()), this, SLOT (accept())); \ + connect (bbx_buttons, SIGNAL (rejected()), this, SLOT (reject())); \ + +// ============================================================================= +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +// ============================================================================= +#define DEFINE_ACTION(NAME, DEFSHORTCUT) \ + cfg (KeySequence, key_action##NAME, DEFSHORTCUT); \ + void MainWindow::slot_action##NAME() + +// Convenience macros for key sequences. +#define KEY(N) (Qt::Key_##N) +#define CTRL(N) (Qt::CTRL | Qt::Key_##N) +#define SHIFT(N) (Qt::SHIFT | Qt::Key_##N) +#define CTRL_SHIFT(N) (Qt::CTRL | Qt::SHIFT | Qt::Key_##N) + +// ============================================================================= +class LDQuickColor +{ + PROPERTY (public, LDColor*, Color, NO_OPS, STOCK_WRITE) + PROPERTY (public, QToolButton*, ToolButton, NO_OPS, STOCK_WRITE) + + public: + LDQuickColor (LDColor* color, QToolButton* toolButton); + bool isSeparator() const; + + static LDQuickColor getSeparator(); +}; + +// ============================================================================= +// ObjectList +// +// Object list class for MainWindow +// ============================================================================= +class ObjectList : public QListWidget +{ + Q_OBJECT + + protected: + void contextMenuEvent (QContextMenuEvent* ev); +}; + +// ============================================================================= +// MainWindow +// +// The one main GUI class. Hosts the renderer, object list, message log. Contains +// slot_action, which is what all actions connect to. Manages menus and toolbars. +// Large and in charge. +// ============================================================================= +class MainWindow : public QMainWindow +{ + Q_OBJECT + + public: + MainWindow(); + void buildObjList(); + void updateTitle(); + void doFullRefresh(); + void refresh(); + int getInsertionPoint(); + void updateToolBars(); + void updateRecentFilesMenu(); + void updateSelection(); + void updateGridToolBar(); + void updateEditModeActions(); + void updateDocumentList(); + void updateDocumentListItem (LDDocument* f); + int getSelectedColor(); + LDObject::Type getUniformSelectedType(); + void scrollToSelection(); + void spawnContextMenu (const QPoint pos); + void deleteObjects (LDObjectList objs); + int deleteSelection(); + void deleteByColor (const int colnum); + bool save (LDDocument* f, bool saveAs); + void updateActions(); + + inline GLRenderer* R() + { + return m_renderer; + } + + inline void setQuickColors (QList<LDQuickColor>& colors) + { + m_quickColors = colors; + } + + void addMessage (QString msg); + void refreshObjectList(); + void updateActionShortcuts(); + KeySequenceConfig* shortcutForAction (QAction* act); + void endAction(); + + public slots: + void changeCurrentFile(); + void slot_action(); + void slot_actionNew(); + void slot_actionNewFile(); + void slot_actionOpen(); + void slot_actionDownloadFrom(); + void slot_actionSave(); + void slot_actionSaveAs(); + void slot_actionSaveAll(); + void slot_actionClose(); + void slot_actionCloseAll(); + void slot_actionInsertFrom(); + void slot_actionExportTo(); + void slot_actionSettings(); + void slot_actionSetLDrawPath(); + void slot_actionScanPrimitives(); + void slot_actionExit(); + void slot_actionResetView(); + void slot_actionAxes(); + void slot_actionWireframe(); + void slot_actionBFCView(); + void slot_actionSetOverlay(); + void slot_actionClearOverlay(); + void slot_actionScreenshot(); + void slot_actionInsertRaw(); + void slot_actionNewSubfile(); + void slot_actionNewLine(); + void slot_actionNewTriangle(); + void slot_actionNewQuad(); + void slot_actionNewCLine(); + void slot_actionNewComment(); + void slot_actionNewBFC(); + void slot_actionNewVertex(); + void slot_actionUndo(); + void slot_actionRedo(); + void slot_actionCut(); + void slot_actionCopy(); + void slot_actionPaste(); + void slot_actionDelete(); + void slot_actionSelectAll(); + void slot_actionSelectByColor(); + void slot_actionSelectByType(); + void slot_actionModeDraw(); + void slot_actionModeSelect(); + void slot_actionModeCircle(); + void slot_actionSetDrawDepth(); + void slot_actionSetColor(); + void slot_actionAutocolor(); + void slot_actionUncolorize(); + void slot_actionInline(); + void slot_actionInlineDeep(); + void slot_actionInvert(); + void slot_actionMakePrimitive(); + void slot_actionSplitQuads(); + void slot_actionEditRaw(); + void slot_actionBorders(); + void slot_actionCornerVerts(); + void slot_actionRoundCoordinates(); + void slot_actionVisibilityHide(); + void slot_actionVisibilityReveal(); + void slot_actionVisibilityToggle(); + void slot_actionReplaceCoords(); + void slot_actionFlip(); + void slot_actionDemote(); + void slot_actionYtruder(); + void slot_actionRectifier(); + void slot_actionIntersector(); + void slot_actionIsecalc(); + void slot_actionCoverer(); + void slot_actionEdger2(); + void slot_actionHelp(); + void slot_actionAbout(); + void slot_actionAboutQt(); + void slot_actionGridCoarse(); + void slot_actionGridMedium(); + void slot_actionGridFine(); + void slot_actionEdit(); + void slot_actionMoveUp(); + void slot_actionMoveDown(); + void slot_actionMoveXNeg(); + void slot_actionMoveXPos(); + void slot_actionMoveYNeg(); + void slot_actionMoveYPos(); + void slot_actionMoveZNeg(); + void slot_actionMoveZPos(); + void slot_actionRotateXNeg(); + void slot_actionRotateXPos(); + void slot_actionRotateYNeg(); + void slot_actionRotateYPos(); + void slot_actionRotateZNeg(); + void slot_actionRotateZPos(); + void slot_actionRotationPoint(); + void slot_actionAddHistoryLine(); + void slot_actionJumpTo(); + void slot_actionSubfileSelection(); + void slot_actionDrawAngles(); + + protected: + void closeEvent (QCloseEvent* ev); + + private: + GLRenderer* m_renderer; + LDObjectList m_sel; + QList<LDQuickColor> m_quickColors; + QList<QToolButton*> m_colorButtons; + QList<QAction*> m_recentFiles; + MessageManager* m_msglog; + Ui_LDForgeUI* ui; + + private slots: + void slot_selectionChanged(); + void slot_recentFile(); + void slot_quickColor(); + void slot_lastSecondCleanup(); + void slot_editObject (QListWidgetItem* listitem); +}; + +// ----------------------------------------------------------------------------- +// Pointer to the instance of MainWindow. +extern MainWindow* g_win; + +// ----------------------------------------------------------------------------- +// Other GUI-related stuff not directly part of MainWindow: +QPixmap getIcon (QString iconName); // Get an icon from the resource dir +QList<LDQuickColor> quickColorsFromConfig(); // Make a list of quick colors based on config +bool confirm (QString title, QString msg); // Generic confirm prompt +bool confirm (QString msg); // Generic confirm prompt +void critical (QString msg); // Generic error prompt +QIcon makeColorIcon (LDColor* colinfo, const int size); // Makes an icon for the given color +void makeColorComboBox (QComboBox* box); // Fills the given combo-box with color information +QImage imageFromScreencap (uchar* data, int w, int h); + +// ============================================================================= +// ----------------------------------------------------------------------------- +// Takes in pairs of radio buttons and respective values and returns the value of +// the first found radio button that was checked. +// ============================================================================= +template<class T> +T radioSwitch (const T& defval, QList<pair<QRadioButton*, T>> haystack) +{ + for (pair<QRadioButton*, const T&> i : haystack) + if (i.first->isChecked()) + return i.second; + + return defval; +} + +// ============================================================================= +// ----------------------------------------------------------------------------- +// Takes in pairs of radio buttons and respective values and checks the first +// found radio button to have the given value. +// ============================================================================= +template<class T> +void radioDefault (const T& expr, QList<pair<QRadioButton*, T>> haystack) +{ + for (pair<QRadioButton*, const T&> i : haystack) + { + if (i.second == expr) + { + i.first->setChecked (true); + return; + } + } +} + +#endif // LDFORGE_GUI_H