diff --git a/qelectrotech.pro b/qelectrotech.pro index 8915d1daf..997e6511f 100644 --- a/qelectrotech.pro +++ b/qelectrotech.pro @@ -201,6 +201,9 @@ SOURCES += $$files(sources/*.cpp) \ $$files(sources/TerminalStrip/ui/*.cpp) \ $$files(sources/TerminalStrip/UndoCommand/*.cpp) +# Needed for use promote QTreeWidget in terminalstripeditor.ui +INCLUDEPATH += sources/TerminalStrip/ui + # Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt RESOURCES += qelectrotech.qrc diff --git a/sources/TerminalStrip/ui/terminalstripeditor.cpp b/sources/TerminalStrip/ui/terminalstripeditor.cpp index a396fae9b..b1451e9aa 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditor.cpp @@ -23,6 +23,7 @@ #include "../elementprovider.h" #include "../qetgraphicsitem/terminalelement.h" #include "../UndoCommand/addterminalstripcommand.h" +#include "terminalstriptreewidget.h" #include @@ -61,10 +62,10 @@ void TerminalStripEditor::buildTree() } QStringList strl{title}; - new QTreeWidgetItem(ui->m_terminal_strip_tw, strl, TerminalStripEditor::Root); + new QTreeWidgetItem(ui->m_terminal_strip_tw, strl, TerminalStripTreeWidget::Root); QStringList ftstrl(tr("Bornes indépendante")); - new QTreeWidgetItem(ui->m_terminal_strip_tw, ftstrl, TerminalStripEditor::FreeTerminal); + new QTreeWidgetItem(ui->m_terminal_strip_tw, ftstrl, TerminalStripTreeWidget::FreeTerminalSection); auto ts_vector = m_project->terminalStrip(); std::sort(ts_vector.begin(), ts_vector.end(), [](TerminalStrip *a, TerminalStrip *b) { @@ -105,7 +106,7 @@ QTreeWidgetItem* TerminalStripEditor::addTerminalStrip(TerminalStrip *terminal_s } if (!inst_qtwi) { QStringList inst_strl{installation_str}; - inst_qtwi = new QTreeWidgetItem(root_item, inst_strl, TerminalStripEditor::Inst); + inst_qtwi = new QTreeWidgetItem(root_item, inst_strl, TerminalStripTreeWidget::Inst); } //Check if location already exist @@ -121,12 +122,12 @@ QTreeWidgetItem* TerminalStripEditor::addTerminalStrip(TerminalStrip *terminal_s } if (!loc_qtwi) { QStringList loc_strl{location_str}; - loc_qtwi = new QTreeWidgetItem(inst_qtwi, loc_strl, TerminalStripEditor::Loc); + loc_qtwi = new QTreeWidgetItem(inst_qtwi, loc_strl, TerminalStripTreeWidget::Loc); } //Add the terminal strip QStringList name{terminal_strip->name()}; - auto item = new QTreeWidgetItem(loc_qtwi, name, TerminalStripEditor::Strip); + auto item = new QTreeWidgetItem(loc_qtwi, name, TerminalStripTreeWidget::Strip); m_H_item_strip.insert(item, terminal_strip); return item; } @@ -155,7 +156,8 @@ void TerminalStripEditor::addFreeTerminal() for (const auto terminal : qAsConst(vector_)) { QStringList strl{terminal->actualLabel()}; - new QTreeWidgetItem(free_terminal_item, strl, TerminalStripEditor::FreeTerminal); + auto item = new QTreeWidgetItem(free_terminal_item, strl, TerminalStripTreeWidget::FreeTerminal); + item->setData(0, TerminalStripTreeWidget::UUID_USER_ROLE, terminal->uuid().toString()); } } @@ -169,14 +171,14 @@ void TerminalStripEditor::on_m_add_terminal_strip_pb_clicked() if (auto item = ui->m_terminal_strip_tw->currentItem()) { - if (item->type() == TerminalStripEditor::Strip) { + if (item->type() == TerminalStripTreeWidget::Strip) { item = item->parent(); } - if (item->type() == TerminalStripEditor::Loc) { + if (item->type() == TerminalStripTreeWidget::Loc) { dialog->setLocation(item->data(0, Qt::DisplayRole).toString()); item = item->parent(); } - if (item->type() == TerminalStripEditor::Inst) { + if (item->type() == TerminalStripTreeWidget::Inst) { dialog->setInstallation(item->data(0, Qt::DisplayRole).toString()); } } diff --git a/sources/TerminalStrip/ui/terminalstripeditor.h b/sources/TerminalStrip/ui/terminalstripeditor.h index b88467199..dc86fcded 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.h +++ b/sources/TerminalStrip/ui/terminalstripeditor.h @@ -38,14 +38,6 @@ class TerminalStripEditor : public QDialog { Q_OBJECT - enum TreeWidgetType{ - Root, - FreeTerminal, - Inst, - Loc, - Strip - }; - public: explicit TerminalStripEditor(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditor() override; diff --git a/sources/TerminalStrip/ui/terminalstripeditor.ui b/sources/TerminalStrip/ui/terminalstripeditor.ui index 87c211cda..850bf05f1 100644 --- a/sources/TerminalStrip/ui/terminalstripeditor.ui +++ b/sources/TerminalStrip/ui/terminalstripeditor.ui @@ -32,7 +32,16 @@ - + + + false + + + QAbstractItemView::InternalMove + + + 500 + true @@ -45,6 +54,13 @@ + + + TerminalStripTreeWidget + QTreeWidget +
terminalstriptreewidget.h
+
+
diff --git a/sources/TerminalStrip/ui/terminalstriptreewidget.cpp b/sources/TerminalStrip/ui/terminalstriptreewidget.cpp new file mode 100644 index 000000000..be35b36a9 --- /dev/null +++ b/sources/TerminalStrip/ui/terminalstriptreewidget.cpp @@ -0,0 +1,78 @@ +/* + Copyright 2006-2021 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech 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 2 of the License, or + (at your option) any later version. + + QElectroTech 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 QElectroTech. If not, see . +*/ +#include "terminalstriptreewidget.h" +#include "../../qeticons.h" + +#include +#include +#include +#include + +int TerminalStripTreeWidget::UUID_USER_ROLE = Qt::UserRole + 1; + +TerminalStripTreeWidget::TerminalStripTreeWidget(QWidget *parent) : + QTreeWidget(parent) +{} + +QStringList TerminalStripTreeWidget::mimeTypes() const +{ + QStringList strl(QStringLiteral("application/x-qet-terminal-strip-tree-item")); + + return strl; +} + +void TerminalStripTreeWidget::startDrag(Qt::DropActions supportedActions) +{ + Q_UNUSED(supportedActions) + + auto item = currentItem(); + + if (!item || + item->type() != TerminalStripTreeWidget::FreeTerminal) { + return; + } + + QDrag drag(this); + auto mime_data = new QMimeData(); + mime_data->setData("application/x-qet-terminal-strip-tree-item", item->data(0, UUID_USER_ROLE).toString().toLatin1()); + + drag.setMimeData(mime_data); + drag.setPixmap(QET::Icons::ElementTerminal.pixmap(16,16)); + drag.exec(Qt::MoveAction); +} + +void TerminalStripTreeWidget::dragMoveEvent(QDragMoveEvent *event) +{ + QTreeWidget::dragMoveEvent(event); + + auto item = itemAt(event->pos()); + + if (item && + item->type() == TerminalStripTreeWidget::Strip) { + event->accept(); + } else { + event->ignore(); + } +} + +void TerminalStripTreeWidget::dropEvent(QDropEvent *event) +{} + +Qt::DropActions TerminalStripTreeWidget::supportedDropActions() const { + return Qt::MoveAction; +} diff --git a/sources/TerminalStrip/ui/terminalstriptreewidget.h b/sources/TerminalStrip/ui/terminalstriptreewidget.h new file mode 100644 index 000000000..78f144620 --- /dev/null +++ b/sources/TerminalStrip/ui/terminalstriptreewidget.h @@ -0,0 +1,54 @@ +/* + Copyright 2006-2021 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech 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 2 of the License, or + (at your option) any later version. + + QElectroTech 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 QElectroTech. If not, see . +*/ +#ifndef TERMINALSTRIPTREEWIDGET_H +#define TERMINALSTRIPTREEWIDGET_H + +#include + +/** + * @brief The TerminalStripTreeWidget class + * Derived class use to implement custom drag and drop + */ +class TerminalStripTreeWidget : public QTreeWidget +{ + Q_OBJECT + public : + enum TreeWidgetType{ + Root, + FreeTerminal, + FreeTerminalSection, + Inst, + Loc, + Strip + }; + + //Role used for data in QTreeWidgetItem + static int UUID_USER_ROLE; + + public: + TerminalStripTreeWidget(QWidget *parent = nullptr); + + protected: + QStringList mimeTypes() const override; + void startDrag(Qt::DropActions supportedActions) override; + void dragMoveEvent(QDragMoveEvent *event) override; + void dropEvent(QDropEvent *event) override; + Qt::DropActions supportedDropActions() const override; +}; + +#endif // TERMINALSTRIPTREEWIDGET_H