| |
1 /* |
| |
2 * LDForge: LDraw parts authoring CAD |
| |
3 * Copyright (C) 2013, 2014 Santeri Piippo |
| |
4 * |
| |
5 * This program is free software: you can redistribute it and/or modify |
| |
6 * it under the terms of the GNU General Public License as published by |
| |
7 * the Free Software Foundation, either version 3 of the License, or |
| |
8 * (at your option) any later version. |
| |
9 * |
| |
10 * This program is distributed in the hope that it will be useful, |
| |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| |
13 * GNU General Public License for more details. |
| |
14 * |
| |
15 * You should have received a copy of the GNU General Public License |
| |
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
17 */ |
| |
18 |
| |
19 #ifndef LDFORGE_GUI_H |
| |
20 #define LDFORGE_GUI_H |
| |
21 |
| |
22 #include <QMainWindow> |
| |
23 #include <QAction> |
| |
24 #include <QListWidget> |
| |
25 #include <QRadioButton> |
| |
26 #include "Configuration.h" |
| |
27 #include "LDObject.h" |
| |
28 #include "ui_ldforge.h" |
| |
29 |
| |
30 class MessageManager; |
| |
31 class MainWindow; |
| |
32 class LDColor; |
| |
33 class QToolButton; |
| |
34 class QDialogButtonBox; |
| |
35 class GLRenderer; |
| |
36 class QComboBox; |
| |
37 class QProgressBar; |
| |
38 class Ui_LDForgeUI; |
| |
39 |
| |
40 // Stuff for dialogs |
| |
41 #define IMPLEMENT_DIALOG_BUTTONS \ |
| |
42 bbx_buttons = new QDialogButtonBox (QDialogButtonBox::Ok | QDialogButtonBox::Cancel); \ |
| |
43 connect (bbx_buttons, SIGNAL (accepted()), this, SLOT (accept())); \ |
| |
44 connect (bbx_buttons, SIGNAL (rejected()), this, SLOT (reject())); \ |
| |
45 |
| |
46 // ============================================================================= |
| |
47 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
48 // ============================================================================= |
| |
49 #define DEFINE_ACTION(NAME, DEFSHORTCUT) \ |
| |
50 cfg (KeySequence, key_action##NAME, DEFSHORTCUT); \ |
| |
51 void MainWindow::slot_action##NAME() |
| |
52 |
| |
53 // Convenience macros for key sequences. |
| |
54 #define KEY(N) (Qt::Key_##N) |
| |
55 #define CTRL(N) (Qt::CTRL | Qt::Key_##N) |
| |
56 #define SHIFT(N) (Qt::SHIFT | Qt::Key_##N) |
| |
57 #define CTRL_SHIFT(N) (Qt::CTRL | Qt::SHIFT | Qt::Key_##N) |
| |
58 |
| |
59 // ============================================================================= |
| |
60 class LDQuickColor |
| |
61 { |
| |
62 PROPERTY (public, LDColor*, Color, NO_OPS, STOCK_WRITE) |
| |
63 PROPERTY (public, QToolButton*, ToolButton, NO_OPS, STOCK_WRITE) |
| |
64 |
| |
65 public: |
| |
66 LDQuickColor (LDColor* color, QToolButton* toolButton); |
| |
67 bool isSeparator() const; |
| |
68 |
| |
69 static LDQuickColor getSeparator(); |
| |
70 }; |
| |
71 |
| |
72 // ============================================================================= |
| |
73 // ObjectList |
| |
74 // |
| |
75 // Object list class for MainWindow |
| |
76 // ============================================================================= |
| |
77 class ObjectList : public QListWidget |
| |
78 { |
| |
79 Q_OBJECT |
| |
80 |
| |
81 protected: |
| |
82 void contextMenuEvent (QContextMenuEvent* ev); |
| |
83 }; |
| |
84 |
| |
85 // ============================================================================= |
| |
86 // MainWindow |
| |
87 // |
| |
88 // The one main GUI class. Hosts the renderer, object list, message log. Contains |
| |
89 // slot_action, which is what all actions connect to. Manages menus and toolbars. |
| |
90 // Large and in charge. |
| |
91 // ============================================================================= |
| |
92 class MainWindow : public QMainWindow |
| |
93 { |
| |
94 Q_OBJECT |
| |
95 |
| |
96 public: |
| |
97 MainWindow(); |
| |
98 void buildObjList(); |
| |
99 void updateTitle(); |
| |
100 void doFullRefresh(); |
| |
101 void refresh(); |
| |
102 int getInsertionPoint(); |
| |
103 void updateToolBars(); |
| |
104 void updateRecentFilesMenu(); |
| |
105 void updateSelection(); |
| |
106 void updateGridToolBar(); |
| |
107 void updateEditModeActions(); |
| |
108 void updateDocumentList(); |
| |
109 void updateDocumentListItem (LDDocument* f); |
| |
110 int getSelectedColor(); |
| |
111 LDObject::Type getUniformSelectedType(); |
| |
112 void scrollToSelection(); |
| |
113 void spawnContextMenu (const QPoint pos); |
| |
114 void deleteObjects (LDObjectList objs); |
| |
115 int deleteSelection(); |
| |
116 void deleteByColor (const int colnum); |
| |
117 bool save (LDDocument* f, bool saveAs); |
| |
118 void updateActions(); |
| |
119 |
| |
120 inline GLRenderer* R() |
| |
121 { |
| |
122 return m_renderer; |
| |
123 } |
| |
124 |
| |
125 inline void setQuickColors (QList<LDQuickColor>& colors) |
| |
126 { |
| |
127 m_quickColors = colors; |
| |
128 } |
| |
129 |
| |
130 void addMessage (QString msg); |
| |
131 void refreshObjectList(); |
| |
132 void updateActionShortcuts(); |
| |
133 KeySequenceConfig* shortcutForAction (QAction* act); |
| |
134 void endAction(); |
| |
135 |
| |
136 public slots: |
| |
137 void changeCurrentFile(); |
| |
138 void slot_action(); |
| |
139 void slot_actionNew(); |
| |
140 void slot_actionNewFile(); |
| |
141 void slot_actionOpen(); |
| |
142 void slot_actionDownloadFrom(); |
| |
143 void slot_actionSave(); |
| |
144 void slot_actionSaveAs(); |
| |
145 void slot_actionSaveAll(); |
| |
146 void slot_actionClose(); |
| |
147 void slot_actionCloseAll(); |
| |
148 void slot_actionInsertFrom(); |
| |
149 void slot_actionExportTo(); |
| |
150 void slot_actionSettings(); |
| |
151 void slot_actionSetLDrawPath(); |
| |
152 void slot_actionScanPrimitives(); |
| |
153 void slot_actionExit(); |
| |
154 void slot_actionResetView(); |
| |
155 void slot_actionAxes(); |
| |
156 void slot_actionWireframe(); |
| |
157 void slot_actionBFCView(); |
| |
158 void slot_actionSetOverlay(); |
| |
159 void slot_actionClearOverlay(); |
| |
160 void slot_actionScreenshot(); |
| |
161 void slot_actionInsertRaw(); |
| |
162 void slot_actionNewSubfile(); |
| |
163 void slot_actionNewLine(); |
| |
164 void slot_actionNewTriangle(); |
| |
165 void slot_actionNewQuad(); |
| |
166 void slot_actionNewCLine(); |
| |
167 void slot_actionNewComment(); |
| |
168 void slot_actionNewBFC(); |
| |
169 void slot_actionNewVertex(); |
| |
170 void slot_actionUndo(); |
| |
171 void slot_actionRedo(); |
| |
172 void slot_actionCut(); |
| |
173 void slot_actionCopy(); |
| |
174 void slot_actionPaste(); |
| |
175 void slot_actionDelete(); |
| |
176 void slot_actionSelectAll(); |
| |
177 void slot_actionSelectByColor(); |
| |
178 void slot_actionSelectByType(); |
| |
179 void slot_actionModeDraw(); |
| |
180 void slot_actionModeSelect(); |
| |
181 void slot_actionModeCircle(); |
| |
182 void slot_actionSetDrawDepth(); |
| |
183 void slot_actionSetColor(); |
| |
184 void slot_actionAutocolor(); |
| |
185 void slot_actionUncolorize(); |
| |
186 void slot_actionInline(); |
| |
187 void slot_actionInlineDeep(); |
| |
188 void slot_actionInvert(); |
| |
189 void slot_actionMakePrimitive(); |
| |
190 void slot_actionSplitQuads(); |
| |
191 void slot_actionEditRaw(); |
| |
192 void slot_actionBorders(); |
| |
193 void slot_actionCornerVerts(); |
| |
194 void slot_actionRoundCoordinates(); |
| |
195 void slot_actionVisibilityHide(); |
| |
196 void slot_actionVisibilityReveal(); |
| |
197 void slot_actionVisibilityToggle(); |
| |
198 void slot_actionReplaceCoords(); |
| |
199 void slot_actionFlip(); |
| |
200 void slot_actionDemote(); |
| |
201 void slot_actionYtruder(); |
| |
202 void slot_actionRectifier(); |
| |
203 void slot_actionIntersector(); |
| |
204 void slot_actionIsecalc(); |
| |
205 void slot_actionCoverer(); |
| |
206 void slot_actionEdger2(); |
| |
207 void slot_actionHelp(); |
| |
208 void slot_actionAbout(); |
| |
209 void slot_actionAboutQt(); |
| |
210 void slot_actionGridCoarse(); |
| |
211 void slot_actionGridMedium(); |
| |
212 void slot_actionGridFine(); |
| |
213 void slot_actionEdit(); |
| |
214 void slot_actionMoveUp(); |
| |
215 void slot_actionMoveDown(); |
| |
216 void slot_actionMoveXNeg(); |
| |
217 void slot_actionMoveXPos(); |
| |
218 void slot_actionMoveYNeg(); |
| |
219 void slot_actionMoveYPos(); |
| |
220 void slot_actionMoveZNeg(); |
| |
221 void slot_actionMoveZPos(); |
| |
222 void slot_actionRotateXNeg(); |
| |
223 void slot_actionRotateXPos(); |
| |
224 void slot_actionRotateYNeg(); |
| |
225 void slot_actionRotateYPos(); |
| |
226 void slot_actionRotateZNeg(); |
| |
227 void slot_actionRotateZPos(); |
| |
228 void slot_actionRotationPoint(); |
| |
229 void slot_actionAddHistoryLine(); |
| |
230 void slot_actionJumpTo(); |
| |
231 void slot_actionSubfileSelection(); |
| |
232 void slot_actionDrawAngles(); |
| |
233 |
| |
234 protected: |
| |
235 void closeEvent (QCloseEvent* ev); |
| |
236 |
| |
237 private: |
| |
238 GLRenderer* m_renderer; |
| |
239 LDObjectList m_sel; |
| |
240 QList<LDQuickColor> m_quickColors; |
| |
241 QList<QToolButton*> m_colorButtons; |
| |
242 QList<QAction*> m_recentFiles; |
| |
243 MessageManager* m_msglog; |
| |
244 Ui_LDForgeUI* ui; |
| |
245 |
| |
246 private slots: |
| |
247 void slot_selectionChanged(); |
| |
248 void slot_recentFile(); |
| |
249 void slot_quickColor(); |
| |
250 void slot_lastSecondCleanup(); |
| |
251 void slot_editObject (QListWidgetItem* listitem); |
| |
252 }; |
| |
253 |
| |
254 // ----------------------------------------------------------------------------- |
| |
255 // Pointer to the instance of MainWindow. |
| |
256 extern MainWindow* g_win; |
| |
257 |
| |
258 // ----------------------------------------------------------------------------- |
| |
259 // Other GUI-related stuff not directly part of MainWindow: |
| |
260 QPixmap getIcon (QString iconName); // Get an icon from the resource dir |
| |
261 QList<LDQuickColor> quickColorsFromConfig(); // Make a list of quick colors based on config |
| |
262 bool confirm (QString title, QString msg); // Generic confirm prompt |
| |
263 bool confirm (QString msg); // Generic confirm prompt |
| |
264 void critical (QString msg); // Generic error prompt |
| |
265 QIcon makeColorIcon (LDColor* colinfo, const int size); // Makes an icon for the given color |
| |
266 void makeColorComboBox (QComboBox* box); // Fills the given combo-box with color information |
| |
267 QImage imageFromScreencap (uchar* data, int w, int h); |
| |
268 |
| |
269 // ============================================================================= |
| |
270 // ----------------------------------------------------------------------------- |
| |
271 // Takes in pairs of radio buttons and respective values and returns the value of |
| |
272 // the first found radio button that was checked. |
| |
273 // ============================================================================= |
| |
274 template<class T> |
| |
275 T radioSwitch (const T& defval, QList<pair<QRadioButton*, T>> haystack) |
| |
276 { |
| |
277 for (pair<QRadioButton*, const T&> i : haystack) |
| |
278 if (i.first->isChecked()) |
| |
279 return i.second; |
| |
280 |
| |
281 return defval; |
| |
282 } |
| |
283 |
| |
284 // ============================================================================= |
| |
285 // ----------------------------------------------------------------------------- |
| |
286 // Takes in pairs of radio buttons and respective values and checks the first |
| |
287 // found radio button to have the given value. |
| |
288 // ============================================================================= |
| |
289 template<class T> |
| |
290 void radioDefault (const T& expr, QList<pair<QRadioButton*, T>> haystack) |
| |
291 { |
| |
292 for (pair<QRadioButton*, const T&> i : haystack) |
| |
293 { |
| |
294 if (i.second == expr) |
| |
295 { |
| |
296 i.first->setChecked (true); |
| |
297 return; |
| |
298 } |
| |
299 } |
| |
300 } |
| |
301 |
| |
302 #endif // LDFORGE_GUI_H |