From edf5f28e2faeb1b8c073ec653ab890f40d67bd81 Mon Sep 17 00:00:00 2001 From: Katerina Savinskaya Date: Tue, 9 May 2023 11:23:28 +0300 Subject: [PATCH] Add template tool --- sources/kbe/main.cpp | 6 +- sources/plugins/scg/gwf/gwffilewriter.cpp | 28 ++++ sources/plugins/scg/gwf/gwffilewriter.h | 3 +- .../plugins/scg/media/icons/template-tool.png | Bin 0 -> 295 bytes sources/plugins/scg/scg.qrc | 1 + sources/plugins/scg/scgview.cpp | 38 +++++- sources/plugins/scg/scgview.h | 3 + sources/plugins/scg/scgwindow.cpp | 120 +++++++++++++++++- sources/plugins/scg/scgwindow.h | 6 +- 9 files changed, 198 insertions(+), 7 deletions(-) create mode 100644 sources/plugins/scg/media/icons/template-tool.png diff --git a/sources/kbe/main.cpp b/sources/kbe/main.cpp index 85431e1..6d60ad8 100644 --- a/sources/kbe/main.cpp +++ b/sources/kbe/main.cpp @@ -9,13 +9,13 @@ #include "platform.h" #include "mainwindow.h" #include "guidedialog.h" - #include #include #include #include #include #include +#include #include #include #include @@ -75,8 +75,10 @@ int main(int argc, char *argv[]) QString arg = a.arguments().at(i); MainWindow::getInstance()->load(arg); } - + QDir dir(QCoreApplication::applicationDirPath( )); + dir.mkdir("templates"); QSettings settings; + settings.setValue("templateStorage", dir.absolutePath()+"/templates/"); // check if startup dialog property exist if (!settings.contains(Config::settingsShowStartupDialog)) settings.setValue(Config::settingsShowStartupDialog, QVariant(true)); diff --git a/sources/plugins/scg/gwf/gwffilewriter.cpp b/sources/plugins/scg/gwf/gwffilewriter.cpp index 3199c41..e928e40 100644 --- a/sources/plugins/scg/gwf/gwffilewriter.cpp +++ b/sources/plugins/scg/gwf/gwffilewriter.cpp @@ -58,3 +58,31 @@ bool GWFFileWriter::save(QString file_name, QObject *input) fileOut.close(); return true; } +bool GWFFileWriter::saveTemp(QString file_name, QList items) +{ + + QFile fileOut(file_name); + if (!fileOut.open(QFile::WriteOnly | QFile::Text)) { + QMessageBox::warning(0, qAppName(), + QObject::tr("File saving error.\nCannot write file %1:\n%2.") + .arg(file_name) + .arg(fileOut.errorString())); + return false; + } + stream.setDevice(&fileOut); + stream.startWriting("UTF-8"); + QGraphicsItem * item; + foreach (item, items) + { + if(SCgObject::isSCgObjectType(item->type()) ) + { + SCgObject *obj = static_cast(item); + stream.writeObject(obj); + } + } + + stream.finishWriting(); + + fileOut.close(); + return true; +} diff --git a/sources/plugins/scg/gwf/gwffilewriter.h b/sources/plugins/scg/gwf/gwffilewriter.h index e1b0194..2d2541f 100644 --- a/sources/plugins/scg/gwf/gwffilewriter.h +++ b/sources/plugins/scg/gwf/gwffilewriter.h @@ -5,7 +5,7 @@ */ #pragma once - +#include #include "gwfstreamwriter.h" //! TODO: add error messages @@ -26,6 +26,7 @@ class GWFFileWriter @return If file saved, then return true, else - false. */ bool save(QString file_name, QObject *input); + bool saveTemp(QString file_name,QList items); private: diff --git a/sources/plugins/scg/media/icons/template-tool.png b/sources/plugins/scg/media/icons/template-tool.png new file mode 100644 index 0000000000000000000000000000000000000000..1290d391282c4cb7f762d76f414dadf61dba6575 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-&H|6fVg?3oVGw3ym^DWND0tJ; z#WAE}&fCccc@G)zxZam!d&Q-2%{f*6MoSS>DO>RZ4-Z|9TxSvW|DO9SvL1!sR%j83 zyUC=!fL-VFi$<{L{7H@4yatTVh+A(9ZMBtnbaUZ35)=8Yt zs@|5Db{$E2DXlg!2*@vUQBsukbez<;#9^`P+0$~|oeTPw+@F}SJ9LZ3xfw2dN{`Gr o+TqRSdh?7$ziEpA6T1!L=f{TAUU7P60X@m!>FVdQ&MBb@07RZ}LI3~& literal 0 HcmV?d00001 diff --git a/sources/plugins/scg/scg.qrc b/sources/plugins/scg/scg.qrc index 3bc30fc..c529ece 100644 --- a/sources/plugins/scg/scg.qrc +++ b/sources/plugins/scg/scg.qrc @@ -31,5 +31,6 @@ media/icons/tool-select-subgraph.png media/translations/scg_en_EN.qm media/translations/scg_ru_RU.qm + media/icons/template-tool.png diff --git a/sources/plugins/scg/scgview.cpp b/sources/plugins/scg/scgview.cpp index 4d0b547..d0ca199 100644 --- a/sources/plugins/scg/scgview.cpp +++ b/sources/plugins/scg/scgview.cpp @@ -12,7 +12,7 @@ #include "scgcontentchangedialog.h" #include "scgwindow.h" #include "scgtypedialog.h" - +#include #include #include #include @@ -45,6 +45,7 @@ SCgView::SCgView(QWidget *parent, SCgWindow *window) : mActionSelectAll(0), mContextMenu(0), mContextObject(0), + mActionSaveTemp(0), mWindow(window), isSceneRectControlled(false) { @@ -72,6 +73,10 @@ void SCgView::createActions() sep->setSeparator(true); mActionsList.append(sep); + mActionSaveTemp = new QAction(tr("Save as template"), mWindow); + mWindow->addAction(mActionSaveTemp); + connect(mActionSaveTemp, SIGNAL(triggered(bool)), this, SLOT(showSaveTempDialog())); + mActionChangeType = new QAction(tr("Select type"), mWindow); mActionChangeType->setShortcut(QKeySequence( tr("T") )); mWindow->addAction(mActionChangeType); @@ -145,6 +150,7 @@ void SCgView::createActions() mActionsList.append(mActionShowAllContent); mActionsList.append(mActionHideAllContent); mActionsList.append(mActionDeleteContent); + mActionsList.append(mActionSaveTemp); sep = new QAction(this); sep->setSeparator(true); @@ -240,6 +246,7 @@ void SCgView::updateActionsState(int idx) mActionDelete->setEnabled(isAnySelected); mActionCut->setEnabled(isAnySelected); mActionCopy->setEnabled(isAnySelected); + mActionSaveTemp->setEnabled(isAnySelected); //check for showed/hidden contents items = scene()->items(); @@ -302,6 +309,7 @@ void SCgView::selectAllCommand() const (*it)->setSelected(true); } + void SCgView::keyPressEvent(QKeyEvent *event) { QGraphicsView::keyPressEvent(event); @@ -402,6 +410,34 @@ void SCgView::swapPairOrient() static_cast(scene())->swapPairOrientCommand(pair); } +void SCgView::showSaveTempDialog() +{ + QDialog dialog(this); + dialog.setWindowTitle(tr("Save template")); + QLineEdit* lineEdit = new QLineEdit(&dialog); + QLabel* label = new QLabel(tr("File name:"),&dialog); + + QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok + | QDialogButtonBox::Cancel); + buttonBox->setParent(&dialog); + + connect(buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject())); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(label); + layout->addWidget(lineEdit); + layout->addWidget(buttonBox); + dialog.setLayout(layout); + QSettings set; + QString fileName ; + if(dialog.exec() == QDialog::Accepted) + { + fileName = set.value("templateStorage").toString() + lineEdit->text() + ".gwf"; + mWindow->saveTempToFile(fileName); + } +} + void SCgView::changeIdentifier() { Q_ASSERT(mContextObject); diff --git a/sources/plugins/scg/scgview.h b/sources/plugins/scg/scgview.h index a4f87bf..baf4c76 100644 --- a/sources/plugins/scg/scgview.h +++ b/sources/plugins/scg/scgview.h @@ -51,6 +51,7 @@ Q_OBJECT * \defgroup menu Actions * @{ */ + QAction* mActionSaveTemp; QAction* mActionChangeType; QAction* mActionChangeContent; QAction* mActionShowContent; @@ -112,6 +113,8 @@ public slots: void setScene(SCgScene* scene); private slots: + void showSaveTempDialog(); + //! Delete selected sc.g-elements void deleteSelected(); diff --git a/sources/plugins/scg/scgwindow.cpp b/sources/plugins/scg/scgwindow.cpp index df489f3..57a8538 100644 --- a/sources/plugins/scg/scgwindow.cpp +++ b/sources/plugins/scg/scgwindow.cpp @@ -5,8 +5,10 @@ */ #include "scgwindow.h" - #include +#include +#include +#include #include #include #include @@ -21,6 +23,9 @@ #include #include #include +#include +#include +#include #include "scglayoutmanager.h" #include "arrangers/scgarrangervertical.h" @@ -158,10 +163,10 @@ void SCgWindow::createWidgetsForDocks() } + void SCgWindow::createToolBar() { mToolBar = new QToolBar(this); - mToolBar->setIconSize(QSize(32, 32)); QActionGroup* group = new QActionGroup(mToolBar); @@ -170,6 +175,7 @@ void SCgWindow::createToolBar() QAction *action = new QAction(findIcon("tool-select.png"), tr("Selection mode"), mToolBar); action->setCheckable(true); action->setChecked(true); + action->setToolTip(""); action->setShortcut(QKeySequence(tr("1", "Selection mode"))); group->addAction(action); mToolBar->addAction(action); @@ -202,6 +208,14 @@ void SCgWindow::createToolBar() mToolBar->addAction(action); mMode2Action[SCgScene::Mode_Contour] = action; connect(action, SIGNAL(triggered()), this, SLOT(onContourMode())); + + //Template tool + action = new QAction(findIcon("template-tool.png"), tr("Create template"), mToolBar); + action->setCheckable(false); + group->addAction(action); + mToolBar->addAction(action); + connect(action, SIGNAL(triggered()), this, SLOT(onTemplateTool())); + // mToolBar->addSeparator(); // @@ -220,6 +234,7 @@ void SCgWindow::createToolBar() alignButton->addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(onGridAlignment())); + // tuple alignment action = new QAction(findIcon("tool-align-tuple.png"), tr("Tuple alignment"), mToolBar); action->setCheckable(false); @@ -241,6 +256,7 @@ void SCgWindow::createToolBar() alignButton->addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(onHorizontalAlignment())); + // selection group button QToolButton *selectButton = new QToolButton(mToolBar); selectButton->setIcon(findIcon("tool-select-group.png")); @@ -327,6 +343,16 @@ bool SCgWindow::loadFromFile(const QString &fileName) }else return false; } +bool SCgWindow::saveTempToFile(const QString &fileName) +{ + GWFFileWriter writer; + + if (writer.saveTemp(fileName, mView->scene()->selectedItems())) + { + return true; + }else + return false; +} bool SCgWindow::saveToFile(const QString &fileName) { @@ -385,6 +411,96 @@ void SCgWindow::onGridAlignment() SCgLayoutManager::instance().arrange(mView, SCgGridArranger::Type); } +void SCgWindow::onTemplateTool() +{ + QSettings set; + QDir dir = QDir(set.value("templateStorage").toString()); + QStringList allFiles = dir.entryList(QStringList()<<"*.gwf"); + QDialog dialog(this); + dialog.setWindowTitle(tr("Create template")); + QComboBox* list = new QComboBox(); + + QLabel* label = new QLabel(tr("Choose template")); + + QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok + | QDialogButtonBox::Cancel); + + connect(buttonBox, SIGNAL(accepted()), &dialog, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), &dialog, SLOT(reject())); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(label); + layout->addWidget(list); + layout->addWidget(buttonBox); + dialog.setLayout(layout); + list->addItems(allFiles); + if(dialog.exec() == QDialog::Accepted) + { + SCgScene* scene = new SCgScene(new QUndoStack(this), this); + GWFFileLoader loader; + loader.load(set.value("templateStorage").toString()+list->currentText(), scene); + QList listIdtf; + foreach(QGraphicsItem* item, scene->items()) + if(SCgObject::isSCgObjectType(item->type())) + { + if(static_cast (item)->typeAlias().split('/').contains("var")) + { + listIdtf< (item)->idtfValue(); + static_cast (item)->positionChanged(); + + } + } + QDialog dialogCreate(this); + dialogCreate.setWindowTitle(tr("Create fragment")); + QDialogButtonBox* bttnBox = new QDialogButtonBox(QDialogButtonBox::Ok + | QDialogButtonBox::Cancel); + + connect(bttnBox, SIGNAL(accepted()), &dialogCreate, SLOT(accept())); + connect(bttnBox, SIGNAL(rejected()), &dialogCreate, SLOT(reject())); + QVBoxLayout* mainLay = new QVBoxLayout(); + QVBoxLayout* fields = new QVBoxLayout(); + QList newIdtf; + foreach(QString idtf, listIdtf) + { + QHBoxLayout* row = new QHBoxLayout(); + QLabel* var = new QLabel(idtf); + QLineEdit* lineEdit = new QLineEdit(); + row->addWidget(var); + row->addWidget(lineEdit); + fields->addLayout(row); + newIdtf<addLayout(fields); + mainLay->addWidget(bttnBox); + dialogCreate.setLayout(mainLay); + if(dialogCreate.exec() == QDialog::Accepted){ + for(int i =0;iitems()){ + if(SCgObject::isSCgObjectType(item->type())){ + if(static_cast(item)->idtfValue() == listIdtf[i]){ + scene->changeIdtfCommand(static_cast(item), newIdtf[i]->text()); + QList type = static_cast(item)->typeAlias().split('/'); + type.replace(type.indexOf("var"), "const"); + QString newType=""; + foreach(QString t, type) + newType += t + "/"; + newType.chop(1); + static_cast(item)->setTypeAlias(newType); + } + } + + } + } + foreach(QGraphicsItem* item, scene->items()){ + if(SCgObject::isSCgObjectType(item->type())){ + item->setSelected(true); + mView->scene()->addItem(item); + } + } + } + } +} + void SCgWindow::onTupleAlignment() { SCgLayoutManager::instance().arrange(mView, SCgTupleArranger::Type); diff --git a/sources/plugins/scg/scgwindow.h b/sources/plugins/scg/scgwindow.h index 256a7d6..a720416 100644 --- a/sources/plugins/scg/scgwindow.h +++ b/sources/plugins/scg/scgwindow.h @@ -11,6 +11,8 @@ #include #include +#include + class SCgMinimap; class SCgView; @@ -43,6 +45,7 @@ class SCgWindow : public QWidget, //! @copydoc EditorInterface::saveToFile bool saveToFile(const QString &fileName); + bool saveTempToFile(const QString &fileName); /*! Update window immediately */ @@ -179,6 +182,8 @@ private slots: void onVerticalAlignment(); //! Slot to handle a horizontal alignment action void onHorizontalAlignment(); + //! Slot to handle a template creation action + void onTemplateTool(); //! Slot to handle select input/output action void onSelectInputOutput(); //! Slot to handle select subgraph action @@ -191,7 +196,6 @@ private slots: void onZoomOut(); //! Slot to set zoom factor value. void onViewScaleChanged(qreal newScaleValue); - //! Handle find next button pressed event void findNext();