diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ I18n XmlGui ConfigWidgets + TextEditor ) find_package(Qt5 REQUIRED COMPONENTS diff --git a/src/mainwindow.h b/src/mainwindow.h --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -18,11 +18,13 @@ #pragma once #include +#include #include #include #include #include + namespace Ui { class MainWindow; @@ -40,7 +42,7 @@ Ui::MainWindow *ui; AtCore core; QStringList firmwaresList; - QString fileName; + QUrl fileName; void initConnectsToAtCore(); void initLocalVariables(); void initWidgets(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -93,12 +93,6 @@ ui->gcodeEditorWidget->setVisible(!ui->gcodeEditorWidget->isVisible()); }); - action = actionCollection()->addAction(QStringLiteral("edit_gcode")); - action->setText(i18n("&Edit GCode")); - connect(action, &QAction::triggered, this, [ = ] { - ui->gcodeEditorWidget->setVisible(!ui->gcodeEditorWidget->isVisible()); - }); - QAction *quit = KStandardAction::quit(qApp, SLOT(quit()), actionCollection()); setupGUI(Default, "atelierui.rc"); @@ -109,7 +103,7 @@ QUrl fileNameFromDialog = QFileDialog::getOpenFileUrl(this, i18n("Open GCode"), QDir::homePath(), i18n("GCode (*.gco *.gcode)")); if (!fileNameFromDialog.isEmpty()) { - fileName = fileNameFromDialog.toLocalFile(); + fileName = fileNameFromDialog; ui->gcodeEditorWidget->loadFile(fileName); } } @@ -127,7 +121,8 @@ void MainWindow::printFile() { if (!fileName.isEmpty() && (core.state() == PrinterState::IDLE)) { - core.print(fileName); + QString f = fileName.toLocalFile(); + core.print(f); } } diff --git a/src/mainwindow.ui b/src/mainwindow.ui --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 102 - 132 + 94 + 123 @@ -21,7 +21,7 @@ - + @@ -31,8 +31,8 @@ 0 0 - 102 - 30 + 94 + 19 diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt --- a/src/widgets/CMakeLists.txt +++ b/src/widgets/CMakeLists.txt @@ -6,4 +6,4 @@ add_library(AtelierWidgets STATIC ${widgets_SRCS}) -target_link_libraries(AtelierWidgets Qt5::Core Qt5::Widgets Qt5::SerialPort KF5::Solid KF5::I18n) +target_link_libraries(AtelierWidgets Qt5::Core Qt5::Widgets Qt5::SerialPort KF5::Solid KF5::I18n KF5::TextEditor) diff --git a/src/widgets/gcodeeditorwidget.h b/src/widgets/gcodeeditorwidget.h --- a/src/widgets/gcodeeditorwidget.h +++ b/src/widgets/gcodeeditorwidget.h @@ -18,6 +18,9 @@ #pragma once #include +#include +#include +#include namespace Ui { @@ -31,8 +34,12 @@ public: explicit GCodeEditorWidget(QWidget *parent = nullptr); ~GCodeEditorWidget(); - void loadFile(const QString &fileName); + void loadFile(const QUrl &fileName); private: + KTextEditor::Editor *editor; + KTextEditor::Document *doc; + KTextEditor::View *view; Ui::GCodeEditorWidget *ui; + void setupToolbar(); }; diff --git a/src/widgets/gcodeeditorwidget.cpp b/src/widgets/gcodeeditorwidget.cpp --- a/src/widgets/gcodeeditorwidget.cpp +++ b/src/widgets/gcodeeditorwidget.cpp @@ -18,46 +18,55 @@ #include "gcodeeditorwidget.h" #include "ui_gcodeeditorwidget.h" #include +#include +#include +#include + GCodeEditorWidget::GCodeEditorWidget(QWidget *parent) : QWidget(parent), ui(new Ui::GCodeEditorWidget) { ui->setupUi(this); + setupToolbar(); + editor = KTextEditor::Editor::instance(); + doc = editor->createDocument(this); + doc->setHighlightingMode(QString("G-Code")); + view = doc->createView(ui->containerWidget); + QVBoxLayout *layout = new QVBoxLayout(); + layout->addWidget(view); + ui->containerWidget->setLayout(layout); + } GCodeEditorWidget::~GCodeEditorWidget() { delete ui; } -void GCodeEditorWidget::loadFile(const QString &fileName) +void GCodeEditorWidget::loadFile(const QUrl &fileName) +{ + doc->openUrl(fileName); + doc->setHighlightingMode(QString("G-Code")); +} + +void GCodeEditorWidget::setupToolbar() { - QRegularExpression cacthMov("G(?.) .*\\bX(?[0-9.-]+) Y(?[0-9.-]+) Z(?[0-9].+)"); - QRegularExpression catchEnd(";(\\s?)(End)(\\s?\\w+\\s?(\\w+)?)"); - catchEnd.setPatternOptions(QRegularExpression::CaseInsensitiveOption); - QRegularExpressionMatch match; - QFile gcode(fileName); - if (!gcode.open(QFile::ReadOnly)) { - return; - } - QTextStream gcodeStream(&gcode); - QString content = gcodeStream.readAll(); - //TODO: Send this content to 3DView - QStringList list = content.split(QStringLiteral("\n"), QString::SkipEmptyParts); - QString header, footer; - foreach (const auto &line, list) { - match = cacthMov.match(line); - if (match.hasMatch()) { - break; + ui->savePB->setIcon(QIcon::fromTheme("document-save")); + connect(ui->savePB, &QPushButton::clicked, [ = ](){ + if(doc->isModified()) { + doc->documentSave(); } - header += (line + QStringLiteral("\n")); - } - int last = list.lastIndexOf(catchEnd); - if (last != -1) { - for (int i = last; i <= list.size() - 1; ++i) { - footer += (list.at(i) + QStringLiteral("\n")); + }); + ui->saveAsPB->setIcon(QIcon::fromTheme("document-save-as")); + connect(ui->saveAsPB, &QPushButton::clicked, [ = ] () { + if(doc->isModified()) { + doc->documentSaveAs(); } - } - ui->headerPT->setPlainText(header); - ui->footerPT->setPlainText(footer); + }); + ui->redoPB->setIcon(QIcon::fromTheme("edit-redo")); + ui->undoPB->setIcon(QIcon::fromTheme("edit-undo")); + ui->cancelPB->setIcon(QIcon::fromTheme("edit-clear")); + connect(ui->cancelPB, &QPushButton::clicked,[ = ] () { + doc->documentReload(); + }); } diff --git a/src/widgets/gcodeeditorwidget.ui b/src/widgets/gcodeeditorwidget.ui --- a/src/widgets/gcodeeditorwidget.ui +++ b/src/widgets/gcodeeditorwidget.ui @@ -13,24 +13,15 @@ Form - - + + - - Qt::LeftToRight - - Header - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + GCode Editor - - - - + @@ -40,53 +31,37 @@ - + - Cancel + Save As - + - Undo + Redo - + - Redo + Undo - - - Qt::Horizontal - - - - 40 - 20 - + + + Cancel - + - - - - Footer - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - + +