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