diff --git a/src/dialogs/CMakeLists.txt b/src/dialogs/CMakeLists.txt --- a/src/dialogs/CMakeLists.txt +++ b/src/dialogs/CMakeLists.txt @@ -1,6 +1,7 @@ set(dialogs_SRCS profilesdialog.cpp connectsettingsdialog.cpp + choosefiledialog.cpp ) add_library(AtelierDialogs STATIC ${dialogs_SRCS}) target_link_libraries(AtelierDialogs Qt5::Widgets Qt5::SerialPort KF5::I18n) diff --git a/src/mainwindow.h b/src/dialogs/choosefiledialog.h copy from src/mainwindow.h copy to src/dialogs/choosefiledialog.h --- a/src/mainwindow.h +++ b/src/dialogs/choosefiledialog.h @@ -1,6 +1,6 @@ /* Atelier KDE Printer Host for 3D Printing - Copyright (C) <2016> - Author: Lays Rodrigues - laysrodrigues@gmail.com + Copyright (C) <2017> + Author: Lays Rodrigues - laysrodriguessilva@gmail.com This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,30 +17,17 @@ */ #pragma once -#include +#include +#include #include -#include -namespace Ui -{ -class MainWindow; -} - -class MainWindow : public KXmlGuiWindow +class ChooseFileDialog : public QDialog { Q_OBJECT - public: - explicit MainWindow(QWidget *parent = nullptr); - ~MainWindow(); - + ChooseFileDialog(QWidget *parent=nullptr, QList files = QList()); + ~ChooseFileDialog(); + const QString& choosenFile(); private: - Ui::MainWindow *ui; - QUrl m_fileName; - void setupActions(); - void openFile(); - void newConnection(const QString& port, const QMap& profile); - -signals: - void extruderCountChanged(int count); + QString m_choosen_file; }; diff --git a/src/dialogs/choosefiledialog.cpp b/src/dialogs/choosefiledialog.cpp new file mode 100644 --- /dev/null +++ b/src/dialogs/choosefiledialog.cpp @@ -0,0 +1,55 @@ +/* Atelier KDE Printer Host for 3D Printing + Copyright (C) <2017> + Author: Lays Rodrigues - laysrodriguessilva@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#include "choosefiledialog.h" +#include +#include +#include +#include +#include + +ChooseFileDialog::ChooseFileDialog(QWidget *parent, QList files) : + QDialog(parent) +{ + auto layout = new QVBoxLayout; + auto label = new QLabel(i18n("Choose a file to print: ")); + auto listWigdet = new QListWidget(); + QStringList files_list; + foreach(const auto &file, files){ + files_list.append(file.toLocalFile()); + } + listWigdet->addItems(files_list); + connect(listWigdet, &QListWidget::currentTextChanged, [ & ](const QString& t){ + m_choosen_file = t; + }); + auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + connect(buttonBox, &QDialogButtonBox::accepted, this, &ChooseFileDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &ChooseFileDialog::reject); + layout->addWidget(label); + layout->addWidget(listWigdet); + layout->addWidget(buttonBox); + setLayout(layout); +} + +ChooseFileDialog::~ChooseFileDialog() +{ +} + +const QString& ChooseFileDialog::choosenFile() +{ + return m_choosen_file; +} 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/CMakeLists.txt b/src/widgets/CMakeLists.txt --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -1,3 +1,5 @@ +include_directories(../dialogs) + set(widgets_SRCS gcodeeditorwidget.cpp axiscontrol.cpp diff --git a/src/widgets/atcoreinstancewidget.h b/src/widgets/atcoreinstancewidget.h --- a/src/widgets/atcoreinstancewidget.h +++ b/src/widgets/atcoreinstancewidget.h @@ -21,6 +21,7 @@ #include #include #include +#include namespace Ui { @@ -46,12 +47,14 @@ ~AtCoreInstanceWidget(); void startConnection(const QString& serialPort, const QMap& profile); bool connected(); + void setOpenFiles(const QList& files); private: Ui::AtCoreInstanceWidget* ui; AtCore m_core; QToolBar *toolBar; QMap profileData; + QList m_files; void initConnectsToAtCore(); void printFile(const QUrl& fileName); void pausePrint(); @@ -65,6 +68,7 @@ void enableControls(bool b); void buildToolbar(); void setupConnections(); + void print(); signals: void extruderCountChanged(int count); diff --git a/src/widgets/atcoreinstancewidget.cpp b/src/widgets/atcoreinstancewidget.cpp --- a/src/widgets/atcoreinstancewidget.cpp +++ b/src/widgets/atcoreinstancewidget.cpp @@ -22,6 +22,7 @@ #include #include #include +#include "choosefiledialog.h" AtCoreInstanceWidget::AtCoreInstanceWidget(QWidget *parent): QWidget(parent) @@ -47,6 +48,9 @@ connect(ui->disconnectPB, &QPushButton::clicked, [ & ]{ m_core.setState(AtCore::DISCONNECTED); }); + connect(ui->printPB, &QPushButton::clicked, this, &AtCoreInstanceWidget::print); + + enableControls(false); } AtCoreInstanceWidget::~AtCoreInstanceWidget() @@ -143,6 +147,23 @@ } } +void AtCoreInstanceWidget::print(){ + switch (m_files.size()){ + case 0: + QMessageBox::warning(this, i18n("Error"), + i18n("There's no GCode File open. \n Please select a file and try again."), + QMessageBox::Ok); + break; + case 1: + printFile(m_files.at(0)); + break; + default: + auto dialog = new ChooseFileDialog(this, m_files); + if(dialog->exec() == QDialog::Accepted){ + printFile(dialog->choosenFile()); + } + } +} void AtCoreInstanceWidget::pausePrint() { if(m_core.state() == AtCore::BUSY) { @@ -288,3 +309,8 @@ { return (m_core.state() != AtCore::DISCONNECTED); } + +void AtCoreInstanceWidget::setOpenFiles(const QList& files) +{ + m_files = files; +} 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())); }