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;