File indexing completed on 2024-05-12 16:07:25
0001 /* This file is part of the TikZKit project 0002 * 0003 * Copyright (C) 2013 Dominik Haumann <dhaumann@kde.org> 0004 * 0005 * This program is free software; you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation, either version 2 or the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0013 * Library General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License 0016 * along with this program; If not, see <http://www.gnu.org/licenses/>. 0017 */ 0018 #include "MainWindow.h" 0019 #include "TikzKit.h" 0020 #include "ViewManager.h" 0021 #include "DocumentManager.h" 0022 #include "PdfGenerator.h" 0023 0024 #include <tikz/ui/Editor.h> 0025 #include <tikz/ui/MainWindow.h> 0026 #include <tikz/ui/Document.h> 0027 #include <tikz/ui/View.h> 0028 #include <tikz/ui/NodeItem.h> 0029 #include <tikz/ui/PathItem.h> 0030 #include <tikz/ui/TikzScene.h> 0031 #include <tikz/ui/TikzToolBox.h> 0032 #include <tikz/ui/ArrowComboBox.h> 0033 #include <tikz/ui/ColorWidget.h> 0034 #include <tikz/ui/PropertyBrowser.h> 0035 #include <tikz/ui/ZoomController.h> 0036 0037 #include <tikz/core/Style.h> 0038 #include <tikz/core/tikz.h> 0039 #include <tikz/core/Path.h> 0040 #include <tikz/core/EdgePath.h> 0041 #include <tikz/core/EllipsePath.h> 0042 0043 #include <QApplication> 0044 #include <QComboBox> 0045 #include <QDockWidget> 0046 #include <QFileDialog> 0047 #include <QHBoxLayout> 0048 #include <QLabel> 0049 #include <QMenu> 0050 #include <QMenuBar> 0051 #include <QStatusBar> 0052 #include <QTabBar> 0053 #include <QTextEdit> 0054 #include <QToolBar> 0055 #include <QToolButton> 0056 #include <QTreeView> 0057 #include <QUrl> 0058 #include <QVBoxLayout> 0059 #include <QListWidget> 0060 0061 #include <QDebug> 0062 0063 MainWindow::MainWindow() 0064 : QMainWindow() 0065 , m_wrapper(new tikz::ui::MainWindow(this)) 0066 { 0067 setWindowTitle("TikZKit - The Graphical Editor for PGF/TikZ"); 0068 setDockOptions(QMainWindow::AnimatedDocks | QMainWindow::ForceTabbedDocks); 0069 0070 m_pdfGenerator = nullptr; 0071 0072 auto mainWidget = new QWidget(this); 0073 setCentralWidget(mainWidget); 0074 0075 auto hbox = new QHBoxLayout(mainWidget); 0076 hbox->setContentsMargins(0, 0, 0, 0); 0077 hbox->setSpacing(0); 0078 0079 m_toolBox = new tikz::ui::TikzToolBox(m_wrapper); 0080 hbox->addWidget(m_toolBox); 0081 0082 m_viewManager = new ViewManager(this, this); 0083 hbox->addWidget(m_viewManager); 0084 0085 setupUi(); 0086 setupActions(); 0087 setupStatusBar(); 0088 0089 // add arrow head/tail combos 0090 auto arrowTailCombo = new ArrowComboBox(false, nullptr); 0091 auto arrowHeadCombo = new ArrowComboBox(true, nullptr); 0092 m_toolBar->addWidget(arrowTailCombo); 0093 m_toolBar->addWidget(arrowHeadCombo); 0094 arrowHeadCombo->setMinimumWidth(40); 0095 0096 // color button 0097 QToolButton * colorBtn = new QToolButton(this); 0098 colorBtn->setIcon(QIcon::fromTheme("org.kde.plasma.colorpicker")); 0099 auto colorWidget = new tikz::ui::ColorWidget(colorBtn); 0100 colorWidget->setWindowFlags(Qt::Popup); 0101 colorWidget->setFrameStyle(QFrame::StyledPanel | QFrame::Raised); 0102 colorWidget->setFocusPolicy(Qt::NoFocus); 0103 colorWidget->setFocusProxy(this); 0104 colorWidget->hide(); 0105 connect(colorBtn, SIGNAL(clicked()), colorWidget, SLOT(show())); 0106 m_toolBar->addWidget(colorBtn); 0107 0108 // 0109 // initialize tikz::ui::MainWindow wrapper object (forward signals from the 0110 // ViewManager to this MainWindow) 0111 // 0112 connect(this, SIGNAL(viewCreated(tikz::ui::View *)), m_wrapper, SIGNAL(viewCreated(tikz::ui::View *))); 0113 connect(this, SIGNAL(viewCreated(tikz::ui::View *)), this, SLOT(mergeView(tikz::ui::View *))); 0114 connect(this, SIGNAL(viewChanged(tikz::ui::View *)), m_wrapper, SIGNAL(viewChanged(tikz::ui::View *))); 0115 connect(m_viewManager, SIGNAL(viewCreated(tikz::ui::View *)), this, SIGNAL(viewCreated(tikz::ui::View *))); 0116 connect(m_viewManager, SIGNAL(viewChanged(tikz::ui::View *)), this, SLOT(slotViewChanged(tikz::ui::View *))); 0117 0118 // further connections 0119 connect(m_viewManager, SIGNAL(closeDocumentRequested(tikz::ui::Document *)), this, SLOT(closeDocument(tikz::ui::Document*))); 0120 connect(m_viewManager, SIGNAL(viewChanged(tikz::ui::View *)), this, SLOT(updateWindowTitle())); 0121 0122 // register ourself as MainWindow 0123 TikzKit::self()->registerMainWindow(this); 0124 0125 // auto view = openUrl(QUrl("output.tikzkit")); 0126 slotViewChanged(activeView()); 0127 0128 tikz::setLogFunction([this](tikz::LogType logType, const QString & text) { 0129 this->logMessage(logType, text); 0130 }); 0131 } 0132 0133 MainWindow::~MainWindow() 0134 { 0135 tikz::unsetLogFunction(); 0136 0137 // unregister this MainWindow 0138 TikzKit::self()->unregisterMainWindow(this); 0139 } 0140 0141 void MainWindow::setupUi() 0142 { 0143 // 0144 // menubar and status bar 0145 // 0146 m_fileMenu = new QMenu(menuBar()); 0147 m_fileMenu->setTitle(QApplication::translate("TikZKit", "&File", nullptr)); 0148 menuBar()->addAction(m_fileMenu->menuAction()); 0149 0150 m_viewMenu = new QMenu(menuBar()); 0151 m_viewMenu->setTitle(QApplication::translate("TikZKit", "&View", nullptr)); 0152 menuBar()->addAction(m_viewMenu->menuAction()); 0153 0154 m_toolBar = new QToolBar("Main Toolbar", this); 0155 m_toolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); 0156 addToolBar(m_toolBar); 0157 0158 // 0159 // dock widgets 0160 // 0161 auto propertiesDockWidget = new QDockWidget("Properties", this); 0162 m_browser = new tikz::ui::PropertyBrowser(propertiesDockWidget); 0163 propertiesDockWidget->setWidget(m_browser); 0164 0165 addDockWidget(Qt::RightDockWidgetArea, propertiesDockWidget); 0166 0167 // 0168 // undo history 0169 // 0170 auto historyDockWidget = new QDockWidget("History", this); 0171 m_historyView = new QTreeView(historyDockWidget); 0172 m_historyView->setHeaderHidden(true); 0173 m_historyView->setAlternatingRowColors(true); 0174 historyDockWidget->setWidget(m_historyView); 0175 addDockWidget(Qt::RightDockWidgetArea, historyDockWidget); 0176 0177 tabifyDockWidget(propertiesDockWidget, historyDockWidget); 0178 // setTabPosition(Qt::BottomDockWidgetArea, QTabWidget::West); 0179 0180 // 0181 // TikZ code 0182 // 0183 auto tikzDockWidget = new QDockWidget("TikZ Code", this); 0184 m_textEdit = new QTextEdit(tikzDockWidget); 0185 tikzDockWidget->setWidget(m_textEdit); 0186 addDockWidget(Qt::BottomDockWidgetArea, tikzDockWidget); 0187 0188 // 0189 // Messages 0190 // 0191 auto messageDockWidget = new QDockWidget("Messages", this); 0192 m_logWidget = new QListWidget(messageDockWidget); 0193 m_logWidget->setAlternatingRowColors(true); 0194 messageDockWidget->setWidget(m_logWidget); 0195 addDockWidget(Qt::BottomDockWidgetArea, messageDockWidget); 0196 0197 tabifyDockWidget(tikzDockWidget, messageDockWidget); 0198 setTabPosition(Qt::BottomDockWidgetArea, QTabWidget::West); 0199 0200 // 0201 // Properties and TikZ dock widgets should have focus 0202 // 0203 propertiesDockWidget->raise(); 0204 tikzDockWidget->raise(); 0205 } 0206 0207 void MainWindow::setupActions() 0208 { 0209 m_fileNew = new QAction(this); 0210 m_fileNew->setIcon(QIcon::fromTheme("document-new")); 0211 m_fileNew->setText(QApplication::translate("MainWindow", "&New", nullptr)); 0212 m_fileNew->setShortcut(QApplication::translate("MainWindow", "Ctrl+N", nullptr)); 0213 0214 m_fileOpen = new QAction(this); 0215 m_fileOpen->setIcon(QIcon::fromTheme("document-open")); 0216 m_fileOpen->setText(QApplication::translate("MainWindow", "&Open", nullptr)); 0217 m_fileOpen->setShortcut(QApplication::translate("MainWindow", "Ctrl+O", nullptr)); 0218 0219 m_fileSave = new QAction(this); 0220 m_fileSave->setIcon(QIcon::fromTheme("document-save")); 0221 m_fileSave->setText(QApplication::translate("MainWindow", "&Save", nullptr)); 0222 m_fileSave->setShortcut(QApplication::translate("MainWindow", "Ctrl+S", nullptr)); 0223 0224 m_fileClose = new QAction(this); 0225 m_fileClose->setIcon(QIcon::fromTheme("document-close")); 0226 m_fileClose->setText(QApplication::translate("MainWindow", "&Close", nullptr)); 0227 m_fileClose->setShortcut(QApplication::translate("MainWindow", "Ctrl+W", nullptr)); 0228 0229 m_fileQuit = new QAction(this); 0230 m_fileQuit->setIcon(QIcon::fromTheme("application-exit")); 0231 m_fileQuit->setText(QApplication::translate("MainWindow", "&Quit", nullptr)); 0232 m_fileQuit->setShortcut(QApplication::translate("MainWindow", "Ctrl+Q", nullptr)); 0233 0234 m_filePreview = new QAction(this); 0235 m_filePreview->setIcon(QIcon::fromTheme("application-pdf")); 0236 m_filePreview->setText(QApplication::translate("MainWindow", "Preview", nullptr)); 0237 0238 m_editUndo = new QAction(this); 0239 m_editUndo->setIcon(QIcon::fromTheme("edit-undo", QIcon(":/icons/icons/edit-undo.png"))); 0240 m_editUndo->setText(QApplication::translate("MainWindow", "&Undo", nullptr)); 0241 m_editUndo->setShortcut(QApplication::translate("MainWindow", "Ctrl+Z", nullptr)); 0242 0243 m_editRedo = new QAction(this); 0244 m_editRedo->setIcon(QIcon::fromTheme("edit-redo", QIcon(":/icons/icons/edit-redo.png"))); 0245 m_editRedo->setText(QApplication::translate("MainWindow", "&Redo", nullptr)); 0246 m_editRedo->setShortcut(QApplication::translate("MainWindow", "Ctrl+Shift+Z", nullptr)); 0247 0248 m_aZoomIn = new QAction(this); 0249 m_aZoomIn->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/icons/icons/edit-redo.png"))); 0250 m_aZoomIn->setText(QApplication::translate("MainWindow", "&Zoom In", nullptr)); 0251 m_aZoomIn->setShortcut(QApplication::translate("MainWindow", "Ctrl++", nullptr)); 0252 0253 m_aResetZoom = new QAction(this); 0254 m_aResetZoom->setIcon(QIcon::fromTheme("zoom-original", QIcon(":/icons/icons/edit-redo.png"))); 0255 m_aResetZoom->setText(QApplication::translate("MainWindow", "&Rest Zoom", nullptr)); 0256 m_aResetZoom->setShortcut(QApplication::translate("MainWindow", "Ctrl+Space", nullptr)); 0257 0258 m_aZoomOut = new QAction(this); 0259 m_aZoomOut->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/icons/icons/edit-redo.png"))); 0260 m_aZoomOut->setText(QApplication::translate("MainWindow", "&Zoom Out", nullptr)); 0261 m_aZoomOut->setShortcut(QApplication::translate("MainWindow", "Ctrl+-", nullptr)); 0262 0263 // 0264 // File menu 0265 // 0266 m_fileMenu->addAction(m_fileNew); 0267 m_fileMenu->addAction(m_fileOpen); 0268 m_fileMenu->addSeparator(); 0269 m_fileMenu->addAction(m_fileSave); 0270 m_fileMenu->addSeparator(); 0271 m_fileMenu->addAction(m_fileClose); 0272 m_fileMenu->addSeparator(); 0273 m_fileMenu->addAction(m_fileQuit); 0274 0275 // 0276 // View menu 0277 // 0278 m_viewMenu->addAction(m_aZoomIn); 0279 m_viewMenu->addAction(m_aResetZoom); 0280 m_viewMenu->addAction(m_aZoomOut); 0281 0282 m_toolBar->addAction(m_fileNew); 0283 m_toolBar->addAction(m_fileOpen); 0284 m_toolBar->addSeparator()->setData(QStringLiteral("merge-point-save")); 0285 m_toolBar->addAction(m_fileSave); 0286 m_toolBar->addSeparator()->setData(QStringLiteral("merge-point-close")); 0287 m_toolBar->addAction(m_fileClose); 0288 m_toolBar->addSeparator()->setData(QStringLiteral("merge-point-undo")); 0289 m_toolBar->addAction(m_editUndo); 0290 m_toolBar->addAction(m_editRedo); 0291 m_toolBar->addSeparator(); 0292 m_toolBar->addAction(m_filePreview); 0293 0294 connect(m_fileNew, SIGNAL(triggered()), this, SLOT(slotDocumentNew())); 0295 connect(m_fileSave, SIGNAL(triggered()), this, SLOT(slotDocumentSave())); 0296 connect(m_fileOpen, SIGNAL(triggered()), this, SLOT(slotDocumentOpen())); 0297 connect(m_fileClose, SIGNAL(triggered()), this, SLOT(slotCloseActiveView())); 0298 connect(m_fileQuit, SIGNAL(triggered()), this, SLOT(close())); 0299 connect(m_filePreview, SIGNAL(triggered()), this, SLOT(previewPdf())); 0300 } 0301 0302 void MainWindow::setupStatusBar() 0303 { 0304 // unit/position combo box 0305 m_positionLabel = new QLabel(this); 0306 m_unitComboBox = new QComboBox(this); 0307 m_unitComboBox->addItem("pt", "pt"); 0308 m_unitComboBox->addItem("mm", "mm"); 0309 m_unitComboBox->addItem("cm", "cm"); 0310 m_unitComboBox->addItem("in", "in"); 0311 m_unitComboBox->setCurrentIndex(2); 0312 0313 connect(m_unitComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotPreferredUnitChanged(int))); 0314 0315 m_zoomComboBox = new QComboBox(this); 0316 0317 statusBar()->addPermanentWidget(m_positionLabel); 0318 statusBar()->addPermanentWidget(m_unitComboBox); 0319 statusBar()->addPermanentWidget(m_zoomComboBox); 0320 } 0321 0322 void MainWindow::mergeView(tikz::ui::View * view) 0323 { 0324 if (! view) { 0325 return; 0326 } 0327 0328 // undo and redo 0329 connect(view->document(), SIGNAL(undoAvailableChanged(bool)), m_editUndo, SLOT(setEnabled(bool))); 0330 connect(view->document(), SIGNAL(redoAvailableChanged(bool)), m_editRedo, SLOT(setEnabled(bool))); 0331 0332 connect(m_editUndo, SIGNAL(triggered()), view->document(), SLOT(undo())); 0333 connect(m_editRedo, SIGNAL(triggered()), view->document(), SLOT(redo())); 0334 0335 connect(view->document(), SIGNAL(modifiedChanged()), this, SLOT(updateWindowTitle())); 0336 connect(view->document(), SIGNAL(changed()), this, SLOT(updateTikzCode())); 0337 connect(view->document(), SIGNAL(changed()), this, SLOT(updateActions())); 0338 connect(view, SIGNAL(mousePositionChanged(tikz::Pos)), this, SLOT(updateMousePosition(tikz::Pos))); 0339 0340 // zoom 0341 connect(m_aZoomIn, SIGNAL(triggered()), view->zoomController(), SLOT(zoomIn())); 0342 connect(m_aResetZoom, SIGNAL(triggered()), view->zoomController(), SLOT(resetZoom())); 0343 connect(m_aZoomOut, SIGNAL(triggered()), view->zoomController(), SLOT(zoomOut())); 0344 0345 // edit mode 0346 connect(m_toolBox, SIGNAL(editModeChanged(TikzEditMode)), view, SLOT(setEditMode(TikzEditMode))); 0347 0348 updateWindowTitle(); 0349 updateTikzCode(); 0350 updateActions(); 0351 0352 // attach zoom combo box 0353 view->zoomController()->attachToComboBox(m_zoomComboBox); 0354 0355 // track preferred unit 0356 const auto unit = activeView()->document()->preferredUnit(); 0357 const auto unitString = tikz::toString(unit); 0358 const auto unitIndex = m_unitComboBox->findData(unitString); 0359 m_unitComboBox->setCurrentIndex(unitIndex); 0360 0361 m_toolBox->setEditMode(view->editMode()); 0362 0363 m_browser->setView(view); 0364 } 0365 0366 void MainWindow::unmergeView(tikz::ui::View * view) 0367 { 0368 m_browser->setView(view); 0369 0370 if (! view) { 0371 return; 0372 } 0373 0374 view->zoomController()->attachToComboBox(nullptr); 0375 0376 // disconnect actions from current view 0377 disconnect(m_aZoomIn, SIGNAL(triggered()), view->zoomController(), SLOT(zoomIn())); 0378 disconnect(m_aResetZoom, SIGNAL(triggered()), view->zoomController(), SLOT(resetZoom())); 0379 disconnect(m_aZoomOut, SIGNAL(triggered()), view->zoomController(), SLOT(zoomOut())); 0380 0381 // edit mode 0382 disconnect(m_toolBox, SIGNAL(editModeChanged(TikzEditMode)), view, SLOT(setEditMode(TikzEditMode))); 0383 0384 disconnect(view->document(), SIGNAL(undoAvailableChanged(bool)), m_editUndo, SLOT(setEnabled(bool))); 0385 disconnect(view->document(), SIGNAL(redoAvailableChanged(bool)), m_editRedo, SLOT(setEnabled(bool))); 0386 0387 disconnect(m_editUndo, SIGNAL(triggered()), view->document(), SLOT(undo())); 0388 disconnect(m_editRedo, SIGNAL(triggered()), view->document(), SLOT(redo())); 0389 0390 disconnect(view->document(), SIGNAL(modifiedChanged()), this, SLOT(updateWindowTitle())); 0391 disconnect(view->document(), SIGNAL(changed()), this, SLOT(updateTikzCode())); 0392 disconnect(view->document(), SIGNAL(changed()), this, SLOT(updateActions())); 0393 disconnect(view, SIGNAL(mousePositionChanged(tikz::Pos)), this, SLOT(updateMousePosition(tikz::Pos))); 0394 } 0395 0396 void MainWindow::slotDocumentNew() 0397 { 0398 auto doc = TikzKit::self()->documentManager()->createDocument(); 0399 m_viewManager->activateView(doc); 0400 } 0401 0402 void MainWindow::slotDocumentOpen() 0403 { 0404 QUrl baseUrl; 0405 if (tikz::ui::View *cv = m_viewManager->activeView()) { 0406 baseUrl = cv->document()->url(); 0407 } 0408 0409 const QUrl file = QFileDialog::getOpenFileUrl(this, "Open File", baseUrl, "TikZKit (*.tikzkit)"); 0410 qDebug() << "attempting to open file" << file; 0411 if (! QFileInfo::exists(file.toLocalFile())) { 0412 return; 0413 } 0414 0415 openUrl(file); 0416 0417 // TODO add to open-recent file menu 0418 // if (!doc->url().isEmpty()) { 0419 // mainWindow()->fileOpenRecent()->addUrl(doc->url()); 0420 // } 0421 } 0422 0423 void MainWindow::slotDocumentSave() 0424 { 0425 auto view = m_viewManager->activeView(); 0426 Q_ASSERT(view); 0427 0428 QUrl url = view->document()->url(); 0429 0430 if (url.isEmpty()) { 0431 url = QFileDialog::getSaveFileUrl(this, "Save File", QUrl(), "*.tikzkit"); 0432 view->document()->saveAs(url); 0433 } else { 0434 view->document()->save(); 0435 } 0436 } 0437 0438 void MainWindow::slotCloseActiveView() 0439 { 0440 auto view = m_viewManager->activeView(); 0441 Q_ASSERT(view); 0442 0443 closeDocument(view->document()); 0444 } 0445 0446 void MainWindow::closeDocument(tikz::ui::Document * doc) 0447 { 0448 // close the document 0449 TikzKit::self()->documentManager()->closeDocument(doc); 0450 } 0451 0452 void MainWindow::previewPdf() 0453 { 0454 delete m_pdfGenerator; 0455 m_pdfGenerator = new tex::PdfGenerator(this); 0456 connect(m_pdfGenerator, SIGNAL(finished(const QString&)), this, SLOT(previewPdf(const QString&))); 0457 0458 m_pdfGenerator->generatePdf(activeView()->document()->tikzCode()); 0459 } 0460 0461 void MainWindow::previewPdf(const QString & pdfFile) 0462 { 0463 qDebug() << "previewPdF:" << pdfFile; 0464 QProcess::startDetached("okular", QStringList() << pdfFile); 0465 } 0466 0467 void MainWindow::updateWindowTitle() 0468 { 0469 auto view = m_viewManager->activeView(); 0470 if (view) { 0471 auto modified = view->document()->isModified(); 0472 setWindowTitle(view->document()->documentName() 0473 + (modified ? QString(" [modified]") : QString()) 0474 + " - TikZ Kit"); 0475 } else { 0476 setWindowTitle("TikZ Kit"); 0477 } 0478 } 0479 0480 void MainWindow::updateTikzCode() 0481 { 0482 auto view = activeView(); 0483 if (!view) { 0484 m_textEdit->clear(); 0485 return; 0486 } 0487 0488 m_textEdit->setText(view->document()->tikzCode()); 0489 } 0490 0491 void MainWindow::updateActions() 0492 { 0493 auto view = activeView(); 0494 if (view) { 0495 m_editUndo->setEnabled(activeView()->document()->undoAvailable()); 0496 m_editRedo->setEnabled(activeView()->document()->redoAvailable()); 0497 } else { 0498 m_editUndo->setEnabled(false); 0499 m_editRedo->setEnabled(false); 0500 } 0501 } 0502 0503 void MainWindow::slotViewChanged(tikz::ui::View * view) 0504 { 0505 if (m_activeView == view) { 0506 return; 0507 } 0508 0509 if (m_activeView) { 0510 unmergeView(m_activeView); 0511 } 0512 0513 m_activeView = view; 0514 0515 if (m_activeView) { 0516 mergeView(m_activeView); 0517 m_historyView->setModel(m_activeView->document()->historyModel()); 0518 } 0519 0520 qDebug() << "the active view changed to" << view; 0521 0522 // forward viewChanged() signal 0523 Q_EMIT viewChanged(view); 0524 } 0525 0526 tikz::ui::MainWindow * MainWindow::wrapper() const 0527 { 0528 return m_wrapper; 0529 } 0530 0531 QVector<tikz::ui::View *> MainWindow::views() const 0532 { 0533 return m_viewManager->views(); 0534 } 0535 0536 tikz::ui::View * MainWindow::activeView() 0537 { 0538 return m_viewManager->activeView(); 0539 } 0540 0541 tikz::ui::View *MainWindow::activateView(tikz::ui::Document *document) 0542 { 0543 return m_viewManager->activateView(document); 0544 } 0545 0546 tikz::ui::View *MainWindow::openUrl(const QUrl &url) 0547 { 0548 auto doc = TikzKit::self()->documentManager()->openUrl(url); 0549 return m_viewManager->activateView(doc); 0550 } 0551 0552 void MainWindow::closeView(tikz::ui::View *view) 0553 { 0554 m_viewManager->closeView(view); 0555 } 0556 0557 void MainWindow::updateMousePosition(const tikz::Pos & pos) 0558 { 0559 const QString x = QString::number(pos.x().value(), 'f', 2); 0560 const QString y = QString::number(pos.y().value(), 'f', 2); 0561 m_positionLabel->setText(x + QLatin1String(", ") + y); 0562 m_unitComboBox->setCurrentText(tikz::toString(pos.x().unit())); 0563 } 0564 0565 void MainWindow::slotPreferredUnitChanged(int index) 0566 { 0567 auto unit = tikz::toEnum<tikz::Unit>(m_unitComboBox->itemData(index).toString()); 0568 activeView()->document()->setPreferredUnit(unit); 0569 } 0570 0571 void MainWindow::logMessage(tikz::LogType logType, const QString & text) 0572 { 0573 const QIcon icon 0574 = logType == tikz::LogType::Debug ? QIcon::fromTheme("dialog-debug", QIcon(":/icons/icons/log-debug.png")) 0575 : logType == tikz::LogType::Info ? QIcon::fromTheme("dialog-information", QIcon(":/icons/icons/log-info.png")) 0576 : logType == tikz::LogType::Warning ? QIcon::fromTheme("dialog-warning", QIcon(":/icons/icons/log-warn.png")) 0577 : QIcon::fromTheme("code-context", QIcon(":/icons/icons/log-error.png")); 0578 auto item = new QListWidgetItem(icon, text); 0579 m_logWidget->addItem(item); 0580 } 0581 0582 // kate: indent-width 4; replace-tabs on;