1 /*
2 TikZiT - a GUI diagram editor for TikZ
3 Copyright (C) 2018 Aleks Kissinger
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 <https://www.gnu.org/licenses/>.
17 */
18
19 #include "mainmenu.h"
20 #include "preferencedialog.h"
21 #include "tikzit.h"
22
23 #include <QDebug>
24 #include <QSettings>
25 #include <QMessageBox>
26
MainMenu()27 MainMenu::MainMenu()
28 {
29 QSettings settings("tikzit", "tikzit");
30 ui.setupUi(this);
31
32 if (!settings.value("check-for-updates").isNull()) {
33 ui.actionCheck_for_updates_automatically->blockSignals(true);
34 ui.actionCheck_for_updates_automatically->setChecked(settings.value("check-for-updates").toBool());
35 ui.actionCheck_for_updates_automatically->blockSignals(false);
36 }
37
38 updateRecentFiles();
39 }
40
addDocks(QMenu * m)41 void MainMenu::addDocks(QMenu *m)
42 {
43 ui.menuView->addSeparator();
44 foreach (QAction *a, m->actions()) {
45 if (!a->isSeparator()) ui.menuView->addAction(a);
46 }
47 }
48
updatesAction()49 QAction *MainMenu::updatesAction()
50 {
51 return ui.actionCheck_for_updates_automatically;
52 }
53
updateRecentFiles()54 void MainMenu::updateRecentFiles()
55 {
56 QSettings settings("tikzit", "tikzit");
57 ui.menuOpen_Recent->clear();
58
59 QStringList recentFiles = settings.value("recent-files").toStringList();
60 //qDebug() << "update:" << recentFiles;
61
62 QAction *action;
63 foreach (QString f, recentFiles) {
64 QFileInfo fi(f);
65 action = new QAction(fi.fileName(), ui.menuOpen_Recent);
66 action->setData(f);
67 ui.menuOpen_Recent->addAction(action);
68 connect(action, SIGNAL(triggered()),
69 this, SLOT(openRecent()));
70 }
71
72 ui.menuOpen_Recent->addSeparator();
73 action = new QAction("Clear List", ui.menuOpen_Recent);
74 connect(action, SIGNAL(triggered()),
75 tikzit, SLOT(clearRecentFiles()));
76 ui.menuOpen_Recent->addAction(action);
77 }
78
79 // File
on_actionNew_triggered()80 void MainMenu::on_actionNew_triggered()
81 {
82 tikzit->newDoc();
83 }
84
on_actionOpen_triggered()85 void MainMenu::on_actionOpen_triggered()
86 {
87 tikzit->open();
88 }
89
on_actionClose_triggered()90 void MainMenu::on_actionClose_triggered()
91 {
92 if (tikzit->activeWindow() != 0)
93 tikzit->activeWindow()->close();
94 }
95
on_actionSave_triggered()96 void MainMenu::on_actionSave_triggered()
97 {
98 if (tikzit->activeWindow() != 0)
99 tikzit->activeWindow()->tikzDocument()->save();
100 }
101
on_actionSave_As_triggered()102 void MainMenu::on_actionSave_As_triggered()
103 {
104 if (tikzit->activeWindow() != 0)
105 tikzit->activeWindow()->tikzDocument()->saveAs();
106 }
107
on_actionExit_triggered()108 void MainMenu::on_actionExit_triggered()
109 {
110 tikzit->quit();
111 }
112
openRecent()113 void MainMenu::openRecent()
114 {
115 if (sender() != nullptr) {
116 if (QAction *action = dynamic_cast<QAction*>(sender())) {
117 tikzit->open(action->data().toString());
118 }
119 }
120 }
121
122
123 // Edit
on_actionUndo_triggered()124 void MainMenu::on_actionUndo_triggered()
125 {
126 if (tikzit->activeWindow() != 0)
127 tikzit->activeWindow()->tikzDocument()->undoStack()->undo();
128 }
129
on_actionRedo_triggered()130 void MainMenu::on_actionRedo_triggered()
131 {
132 if (tikzit->activeWindow() != 0)
133 tikzit->activeWindow()->tikzDocument()->undoStack()->redo();
134 }
135
on_actionCut_triggered()136 void MainMenu::on_actionCut_triggered()
137 {
138 if (tikzit->activeWindow() != 0)
139 tikzit->activeWindow()->tikzScene()->cutToClipboard();
140 }
141
on_actionCopy_triggered()142 void MainMenu::on_actionCopy_triggered()
143 {
144 if (tikzit->activeWindow() != 0)
145 tikzit->activeWindow()->tikzScene()->copyToClipboard();
146 }
147
on_actionPaste_triggered()148 void MainMenu::on_actionPaste_triggered()
149 {
150 if (tikzit->activeWindow() != 0)
151 tikzit->activeWindow()->tikzScene()->pasteFromClipboard();
152 }
153
on_actionDelete_triggered()154 void MainMenu::on_actionDelete_triggered()
155 {
156 if (tikzit->activeWindow() != 0)
157 tikzit->activeWindow()->tikzScene()->deleteSelectedItems();
158 }
159
on_actionSelect_All_triggered()160 void MainMenu::on_actionSelect_All_triggered()
161 {
162 if (tikzit->activeWindow() != 0)
163 tikzit->activeWindow()->tikzScene()->selectAllNodes();
164 }
165
on_actionDeselect_All_triggered()166 void MainMenu::on_actionDeselect_All_triggered()
167 {
168 if (tikzit->activeWindow() != 0)
169 tikzit->activeWindow()->tikzScene()->deselectAll();
170 }
171
on_actionReflectHorizontal_triggered()172 void MainMenu::on_actionReflectHorizontal_triggered()
173 {
174 if (tikzit->activeWindow() != 0)
175 tikzit->activeWindow()->tikzScene()->reflectNodes(true);
176 }
177
on_actionReflectVertical_triggered()178 void MainMenu::on_actionReflectVertical_triggered()
179 {
180 if (tikzit->activeWindow() != 0)
181 tikzit->activeWindow()->tikzScene()->reflectNodes(false);
182 }
183
on_actionRotateCW_triggered()184 void MainMenu::on_actionRotateCW_triggered() {
185 if (tikzit->activeWindow() != 0)
186 tikzit->activeWindow()->tikzScene()->rotateNodes(true);
187 }
188
on_actionRotateCCW_triggered()189 void MainMenu::on_actionRotateCCW_triggered() {
190 if (tikzit->activeWindow() != 0)
191 tikzit->activeWindow()->tikzScene()->rotateNodes(false);
192 }
193
on_actionBring_to_Front_triggered()194 void MainMenu::on_actionBring_to_Front_triggered()
195 {
196 if (tikzit->activeWindow() != 0)
197 tikzit->activeWindow()->tikzScene()->reorderSelection(true);
198 }
199
on_actionSend_to_Back_triggered()200 void MainMenu::on_actionSend_to_Back_triggered()
201 {
202 if (tikzit->activeWindow() != 0)
203 tikzit->activeWindow()->tikzScene()->reorderSelection(false);
204 }
205
on_actionExtendUp_triggered()206 void MainMenu::on_actionExtendUp_triggered()
207 {
208 if (tikzit->activeWindow() != 0)
209 tikzit->activeWindow()->tikzScene()->extendSelectionUp();
210 }
211
on_actionExtendDown_triggered()212 void MainMenu::on_actionExtendDown_triggered()
213 {
214 if (tikzit->activeWindow() != 0)
215 tikzit->activeWindow()->tikzScene()->extendSelectionDown();
216 }
217
on_actionExtendLeft_triggered()218 void MainMenu::on_actionExtendLeft_triggered()
219 {
220 if (tikzit->activeWindow() != 0)
221 tikzit->activeWindow()->tikzScene()->extendSelectionLeft();
222 }
223
on_actionExtendRight_triggered()224 void MainMenu::on_actionExtendRight_triggered()
225 {
226 if (tikzit->activeWindow() != 0)
227 tikzit->activeWindow()->tikzScene()->extendSelectionRight();
228 }
229
on_actionReverse_Edge_Direction_triggered()230 void MainMenu::on_actionReverse_Edge_Direction_triggered()
231 {
232 if (tikzit->activeWindow() != 0)
233 tikzit->activeWindow()->tikzScene()->reverseSelectedEdges();
234 }
235
on_actionMerge_Nodes_triggered()236 void MainMenu::on_actionMerge_Nodes_triggered()
237 {
238 if (tikzit->activeWindow() != 0)
239 tikzit->activeWindow()->tikzScene()->mergeNodes();
240 }
241
on_actionMake_Path_triggered()242 void MainMenu::on_actionMake_Path_triggered()
243 {
244 if (tikzit->activeWindow() != 0)
245 tikzit->activeWindow()->tikzScene()->makePath(false);
246 }
247
on_actionMake_Path_as_Background_triggered()248 void MainMenu::on_actionMake_Path_as_Background_triggered()
249 {
250 if (tikzit->activeWindow() != 0)
251 tikzit->activeWindow()->tikzScene()->makePath(true);
252 }
253
on_actionSplit_Path_triggered()254 void MainMenu::on_actionSplit_Path_triggered()
255 {
256 if (tikzit->activeWindow() != 0)
257 tikzit->activeWindow()->tikzScene()->splitPath();
258 }
259
260
261 // Tikz
on_actionParse_triggered()262 void MainMenu::on_actionParse_triggered()
263 {
264 MainWindow *win = tikzit->activeWindow();
265 if (win != 0) {
266 if (win->tikzScene()->parseTikz(win->tikzSource())) {
267 QList<int> sz = win->splitter()->sizes();
268 sz[0] = sz[0] + sz[1];
269 sz[1] = 0;
270 win->splitter()->setSizes(sz);
271 }
272 }
273 }
274
on_actionRevert_triggered()275 void MainMenu::on_actionRevert_triggered()
276 {
277 MainWindow *win = tikzit->activeWindow();
278 if (win != 0) {
279 win->tikzDocument()->refreshTikz();
280 win->tikzScene()->setEnabled(true);
281 }
282 }
283
on_actionJump_to_Selection_triggered()284 void MainMenu::on_actionJump_to_Selection_triggered()
285 {
286 MainWindow *win = tikzit->activeWindow();
287 if (win != 0) {
288 //qDebug() << "jump to selection on line:" << win->tikzScene()->lineNumberForSelection();
289 QList<int> sz = win->splitter()->sizes();
290 if (sz[1] == 0) {
291 sz[1] = 200;
292 win->splitter()->setSizes(sz);
293 }
294 win->setSourceLine(win->tikzScene()->lineNumberForSelection());
295 }
296 }
297
on_actionRun_LaTeX_triggered()298 void MainMenu::on_actionRun_LaTeX_triggered()
299 {
300 tikzit->makePreview();
301 }
302
on_actionPrevious_Node_Style_triggered()303 void MainMenu::on_actionPrevious_Node_Style_triggered()
304 {
305 tikzit->activeWindow()->stylePalette()->previousNodeStyle();
306 }
307
on_actionNext_Node_Style_triggered()308 void MainMenu::on_actionNext_Node_Style_triggered()
309 {
310 tikzit->activeWindow()->stylePalette()->nextNodeStyle();
311 }
312
on_actionClear_Node_Style_triggered()313 void MainMenu::on_actionClear_Node_Style_triggered()
314 {
315 tikzit->activeWindow()->stylePalette()->toggleClearNodeStyle();
316 }
317
on_actionPrevious_Edge_Style_triggered()318 void MainMenu::on_actionPrevious_Edge_Style_triggered()
319 {
320 tikzit->activeWindow()->stylePalette()->previousEdgeStyle();
321 }
322
on_actionNext_Edge_Style_triggered()323 void MainMenu::on_actionNext_Edge_Style_triggered()
324 {
325 tikzit->activeWindow()->stylePalette()->nextEdgeStyle();
326 }
327
on_actionClear_Edge_Style_triggered()328 void MainMenu::on_actionClear_Edge_Style_triggered()
329 {
330 tikzit->activeWindow()->stylePalette()->toggleClearEdgeStyle();
331 }
332
on_actionPreferences_triggered()333 void MainMenu::on_actionPreferences_triggered()
334 {
335 PreferenceDialog *d = new PreferenceDialog(this);
336 d->exec();
337 d->deleteLater();
338 }
339
340
341 // View
on_actionZoom_In_triggered()342 void MainMenu::on_actionZoom_In_triggered()
343 {
344 if (tikzit->activeWindow() != 0) tikzit->activeWindow()->tikzView()->zoomIn();
345 }
346
on_actionZoom_Out_triggered()347 void MainMenu::on_actionZoom_Out_triggered()
348 {
349 if (tikzit->activeWindow() != 0) tikzit->activeWindow()->tikzView()->zoomOut();
350 }
351
on_actionShow_Node_Labels_triggered()352 void MainMenu::on_actionShow_Node_Labels_triggered()
353 {
354 if (tikzit->activeWindow() != 0) {
355 tikzit->activeWindow()->tikzScene()->setDrawNodeLabels(ui.actionShow_Node_Labels->isChecked());
356 tikzit->activeWindow()->tikzScene()->invalidate();
357 }
358 }
359
on_actionAbout_triggered()360 void MainMenu::on_actionAbout_triggered()
361 {
362 QMessageBox::about(this,
363 "TikZiT",
364 "<h2><b>TikZiT</b></h2>"
365 "<p><i>version " TIKZIT_VERSION "</i></p>"
366 "<p>TikZiT is a GUI diagram editor for PGF/TikZ. It is licensed under the "
367 "<a href=\"https://www.gnu.org/licenses/gpl-3.0.en.html\">GNU General "
368 "Public License, version 3.0</a>.</p>"
369 "<p>For more info and updates, visit: "
370 "<a href=\"https://tikzit.github.io\">tikzit.github.io</a></p>");
371 }
372
on_actionCheck_for_updates_automatically_triggered()373 void MainMenu::on_actionCheck_for_updates_automatically_triggered()
374 {
375 tikzit->setCheckForUpdates(ui.actionCheck_for_updates_automatically->isChecked());
376 }
377
on_actionCheck_now_triggered()378 void MainMenu::on_actionCheck_now_triggered()
379 {
380 tikzit->checkForUpdates(true);
381 }
382