diff --git a/src/mainwindow.h b/src/mainwindow.h --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -19,6 +19,7 @@ #include #include +#include #include namespace Ui @@ -36,7 +37,9 @@ private: Ui::MainWindow *ui; - QUrl m_fileName; + QList m_openFiles; + KTextEditor::View *m_curr_editor_view; + void initWidgets(); void setupActions(); void openFile(); void newConnection(const QString& port, const QMap& profile); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -25,10 +25,12 @@ #include #include #include +#include #include MainWindow::MainWindow(QWidget *parent) : KXmlGuiWindow(parent), - ui(new Ui::MainWindow) + ui(new Ui::MainWindow), + m_curr_editor_view(nullptr) { ui->setupUi(this); setupActions(); @@ -39,6 +41,15 @@ delete ui; } +void MainWindow::initWidgets() +{ + connect(ui->gcodeEditorWidget, &GCodeEditorWidget::updateClientFactory, this, [ & ](KTextEditor::View* view){ + guiFactory()->removeClient(m_curr_editor_view); + guiFactory()->addClient(view); + m_curr_editor_view = view; + }); +} + void MainWindow::setupActions() { // Actions for the Toolbar @@ -81,13 +92,11 @@ QUrl fileNameFromDialog = QFileDialog::getOpenFileUrl(this, i18n("Open GCode"), QDir::homePath(), i18n("GCode (*.gco *.gcode)")); if (!fileNameFromDialog.isEmpty()) { - m_fileName = fileNameFromDialog; - ui->gcodeEditorWidget->loadFile(m_fileName); - guiFactory()->addClient(ui->gcodeEditorWidget->gcodeView()); - ui->view3DWidget->drawModel(m_fileName.toString()); + ui->gcodeEditorWidget->loadFile(fileNameFromDialog); + ui->view3DWidget->drawModel(fileNameFromDialog.toString()); + m_openFiles.append(fileNameFromDialog); } } - void MainWindow::newConnection(const QString& port, const QMap& profile) { const int tabs = ui->tabWidget->count(); diff --git a/src/widgets/gcodeeditorwidget.h b/src/widgets/gcodeeditorwidget.h --- a/src/widgets/gcodeeditorwidget.h +++ b/src/widgets/gcodeeditorwidget.h @@ -17,6 +17,7 @@ */ #pragma once +#include #include #include #include @@ -29,13 +30,20 @@ public: explicit GCodeEditorWidget(QWidget *parent = nullptr); - void loadFile(const QUrl &fileName); + void loadFile(const QUrl &file); KTextEditor::View *gcodeView() const; private: - KTextEditor::Editor *editor; - KTextEditor::Document *doc; - KTextEditor::View *view; - KTextEditor::ConfigInterface *interface; - void setupInterface(); + KTextEditor::Editor *m_editor; + KTextEditor::ConfigInterface *m_interface; + QTabWidget *m_tabwidget; + void setupTabWidget(); + void setupInterface(const KTextEditor::View* view); + KTextEditor::Document* newDoc(); + KTextEditor::View* newView(KTextEditor::Document* doc); + void closeTab(int index); + void currentIndexChanged(int index); + +signals: + void updateClientFactory(KTextEditor::View* view); }; diff --git a/src/widgets/gcodeeditorwidget.cpp b/src/widgets/gcodeeditorwidget.cpp --- a/src/widgets/gcodeeditorwidget.cpp +++ b/src/widgets/gcodeeditorwidget.cpp @@ -21,31 +21,69 @@ #include GCodeEditorWidget::GCodeEditorWidget(QWidget *parent) : - QWidget(parent) + QWidget(parent), + m_tabwidget(new QTabWidget()) { - editor = KTextEditor::Editor::instance(); - doc = editor->createDocument(this); - doc->setMode("G-Code"); - view = doc->createView(this); + m_editor = KTextEditor::Editor::instance(); + setupTabWidget(); QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(view); - this->setLayout(layout); - setupInterface(); + layout->addWidget(m_tabwidget); + setLayout(layout); +} +void GCodeEditorWidget::setupTabWidget() +{ + connect(m_tabwidget, &QTabWidget::tabCloseRequested, this, &GCodeEditorWidget::closeTab); + connect(m_tabwidget, &QTabWidget::currentChanged, this, &GCodeEditorWidget::currentIndexChanged); + m_tabwidget->setTabsClosable(true); + m_tabwidget->addTab(newView(newDoc()), i18n("New file")); } -void GCodeEditorWidget::loadFile(const QUrl &fileName) +KTextEditor::View* GCodeEditorWidget::gcodeView() const{ + return qobject_cast(m_editor->documents().first()->views().first()); +} +void GCodeEditorWidget::loadFile(const QUrl &file) { - doc->openUrl(fileName); + auto doc = m_editor->documents().first(); + if(!doc->isEmpty()){ + doc = newDoc(); + int t = m_tabwidget->addTab(newView(doc), file.fileName()); + m_tabwidget->setCurrentIndex(t); + } else { + m_tabwidget->setTabText(0, file.fileName()); + emit updateClientFactory(doc->views().first()); + } + doc->openUrl(file); doc->setHighlightingMode(QString("G-Code")); } -KTextEditor::View *GCodeEditorWidget::gcodeView() const +void GCodeEditorWidget::setupInterface(const KTextEditor::View* view) +{ + m_interface = qobject_cast(view); + m_interface->setConfigValue("line-numbers", true); +} + +KTextEditor::Document* GCodeEditorWidget::newDoc() { + KTextEditor::Document *doc = m_editor->createDocument(this); + doc->setMode("G-Code"); + return doc; +} + +KTextEditor::View* GCodeEditorWidget::newView(KTextEditor::Document *doc){ + auto view = doc->createView(this); + setupInterface(view); return view; } -void GCodeEditorWidget::setupInterface() +void GCodeEditorWidget::closeTab(int index) { - interface = qobject_cast(view); - interface->setConfigValue("line-numbers", true); + m_tabwidget->removeTab(index); + if(!m_tabwidget->count()){ + m_tabwidget->addTab(newView(newDoc()), i18n("New file")); + } +} + +void GCodeEditorWidget::currentIndexChanged(int index){ + if(index != -1) + emit updateClientFactory(qobject_cast(m_tabwidget->currentWidget())); }