diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp index 4add7fd06..581c5073c 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.cpp @@ -18,6 +18,10 @@ #include "terminalstripeditorwindow.h" #include "ui_terminalstripeditorwindow.h" #include "terminalstriptreedockwidget.h" +#include "../terminalstrip.h" +#include "terminalstripcreatordialog.h" +#include "../UndoCommand/addterminalstripcommand.h" +#include "../../qetproject.h" /** * @brief TerminalStripEditorWindow::TerminalStripEditorWindow @@ -30,7 +34,10 @@ TerminalStripEditorWindow::TerminalStripEditorWindow(QETProject *project, QWidge m_project(project) { ui->setupUi(this); + ui->m_remove_terminal->setDisabled(true); addTreeDockWidget(); + + connect(m_tree_dock, &TerminalStripTreeDockWidget::currentStripChanged, this, &TerminalStripEditorWindow::currentStripChanged); } /** @@ -51,3 +58,71 @@ void TerminalStripEditorWindow::addTreeDockWidget() addDockWidget(Qt::LeftDockWidgetArea, m_tree_dock); } + +/** + * @brief TerminalStripEditorWindow::currentStripChanged + * @param strip + */ +void TerminalStripEditorWindow::currentStripChanged(TerminalStrip *strip) +{ + Q_UNUSED(strip) + ui->m_remove_terminal->setEnabled(m_tree_dock->currentIsStrip()); +} + +/** + * @brief TerminalStripEditorWindow::on_m_add_terminal_strip_triggered + * Action when user click on add terminal strip button + */ +void TerminalStripEditorWindow::on_m_add_terminal_strip_triggered() +{ + QScopedPointer dialog(new TerminalStripCreatorDialog(m_project, this)); + + dialog->setLocation(m_tree_dock->currentLocation()); + dialog->setInstallation(m_tree_dock->currentInstallation()); + + if (dialog->exec() == QDialog::Accepted) + { + auto ts = dialog->generatedTerminalStrip(); + m_project->undoStack()->push(new AddTerminalStripCommand(ts, m_project)); + + m_tree_dock->reload(); + m_tree_dock->setSelectedStrip(ts); + } +} + +/** + * @brief TerminalStripEditorWindow::on_m_remove_terminal_triggered + */ +void TerminalStripEditorWindow::on_m_remove_terminal_triggered() +{ + if (m_tree_dock->currentIsStrip()) + { + if (auto strip_ = m_tree_dock->currentStrip()) + { + m_project->undoStack()->push(new RemoveTerminalStripCommand(strip_, m_project)); + m_tree_dock->reload(); + } + + } +// auto item = ui->m_tree_view->currentItem(); +// if (auto strip = m_item_strip_H.value(item)) +// { +// m_item_strip_H.remove(item); +// m_uuid_strip_H.remove(strip->uuid()); +// delete item; + +// m_project->undoStack()->push(new RemoveTerminalStripCommand(strip, m_project)); +// } + +// on_m_reload_pb_clicked(); + +} + + +/** + * @brief TerminalStripEditorWindow::on_m_reload_triggered + */ +void TerminalStripEditorWindow::on_m_reload_triggered() { + m_tree_dock->reload(); +} + diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.h b/sources/TerminalStrip/ui/terminalstripeditorwindow.h index ef0c06fb6..343f02419 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.h +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.h @@ -22,6 +22,7 @@ class QETProject; class TerminalStripTreeDockWidget; +class TerminalStrip; namespace Ui { class TerminalStripEditorWindow; @@ -35,8 +36,14 @@ class TerminalStripEditorWindow : public QMainWindow explicit TerminalStripEditorWindow(QETProject *project, QWidget *parent = nullptr); ~TerminalStripEditorWindow(); + private slots: + void on_m_add_terminal_strip_triggered(); + void on_m_remove_terminal_triggered(); + void on_m_reload_triggered(); + private: void addTreeDockWidget(); + void currentStripChanged(TerminalStrip *strip); private: Ui::TerminalStripEditorWindow *ui; diff --git a/sources/TerminalStrip/ui/terminalstripeditorwindow.ui b/sources/TerminalStrip/ui/terminalstripeditorwindow.ui index e655de457..0acef215e 100644 --- a/sources/TerminalStrip/ui/terminalstripeditorwindow.ui +++ b/sources/TerminalStrip/ui/terminalstripeditorwindow.ui @@ -25,7 +25,59 @@ + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + + :/ico/16x16/list-add.png:/ico/16x16/list-add.png + + + Ajouter un bornier + + + Ajouter un bornier au projet + + + + + + :/ico/16x16/list-remove.png:/ico/16x16/list-remove.png + + + Supprimer le bornier + + + Supprimer le bornier du projet + + + + + + :/ico/16x16/view-refresh.png:/ico/16x16/view-refresh.png + + + Recharger + + + Recharger les borniers + + - + + + diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp index d4c95a9a1..825d09b0d 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.cpp @@ -49,12 +49,132 @@ TerminalStripTreeDockWidget::~TerminalStripTreeDockWidget() delete ui; } +/** + * @brief TerminalStripTreeDockWidget::reload + */ +void TerminalStripTreeDockWidget::reload() +{ + auto current_ = m_current_strip; + + ui->m_tree_view->clear(); + m_item_strip_H.clear(); + m_uuid_terminal_H.clear(); + m_uuid_strip_H.clear(); + + + buildTree(); + +#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0) + ui->m_tree_view->expandRecursively(ui->m_tree_view->rootIndex()); +#else + ui->m_terminal_strip_tw->expandAll(); +#endif + + //Reselect the tree widget item of the current edited strip + auto item = m_item_strip_H.key(current_); + if (item) { + ui->m_tree_view->setCurrentItem(item); + } +} + +/** + * @brief TerminalStripTreeDockWidget::currentIsStrip + * @return true if the current selected item is a terminal strip. + */ +bool TerminalStripTreeDockWidget::currentIsStrip() const { + return m_item_strip_H.contains(ui->m_tree_view->currentItem()); +} + +/** + * @brief TerminalStripTreeDockWidget::currentStrip + * @return The current selected strip or nullptr if there is + * no strip selected; + */ +TerminalStrip *TerminalStripTreeDockWidget::currentStrip() const { + return m_current_strip; +} + +/** + * @brief TerminalStripTreeDockWidget::currentInstallation + * @return the installation according to the current selection + */ +QString TerminalStripTreeDockWidget::currentInstallation() const +{ + if (m_current_strip) { + return m_current_strip->installation(); + } + + if (auto item = ui->m_tree_view->currentItem()) + { + if (item->type() == TerminalStripTreeWidget::Location) { + item = item->parent(); + } + if (item->type() == TerminalStripTreeWidget::Installation) { + return item->data(0, Qt::DisplayRole).toString(); + } + } + + return QString(); +} + +/** + * @brief TerminalStripTreeDockWidget::currentLocation + * @return the location according to the current selection + */ +QString TerminalStripTreeDockWidget::currentLocation() const +{ + if (m_current_strip) { + return m_current_strip->location(); + } + + if (auto item = ui->m_tree_view->currentItem()) { + if (item->type() == TerminalStripTreeWidget::Location) { + return item->data(0, Qt::DisplayRole).toString(); + } + } + + return QString(); +} + +/** + * @brief TerminalStripTreeDockWidget::setSelectedStrip + * @param strip + */ +void TerminalStripTreeDockWidget::setSelectedStrip(TerminalStrip *strip) { + ui->m_tree_view->setCurrentItem(m_item_strip_H.key(strip)); +} + +/** + * @brief TerminalStripTreeDockWidget::on_m_tree_view_currentItemChanged + * @param current + * @param previous + */ +void TerminalStripTreeDockWidget::on_m_tree_view_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +{ + Q_UNUSED(previous) + + if (!current) { + setCurrentStrip(nullptr); + return; + } + + TerminalStrip *strip_ = nullptr; + if (current->type() == TerminalStripTreeWidget::Strip) { + strip_ = m_item_strip_H.value(current); + } + else if (current->type() == TerminalStripTreeWidget::Terminal + && current->parent() + && current->parent()->type() == TerminalStripTreeWidget::Strip) { + strip_ = m_item_strip_H.value(current->parent()); + } + setCurrentStrip(strip_); +} + /** * @brief TerminalStripTreeDockWidget::buildTree */ void TerminalStripTreeDockWidget::buildTree() { - ui->m_tree_view->clear(); auto title_ = m_project->title(); if (title_.isEmpty()) { @@ -232,3 +352,9 @@ void TerminalStripTreeDockWidget::setupUndoConnections() m_project->undoStack()->push(undo); }); } + +void TerminalStripTreeDockWidget::setCurrentStrip(TerminalStrip *strip) +{ + emit currentStripChanged(strip); + m_current_strip = strip; +} diff --git a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h index 31d2f1015..87545b54a 100644 --- a/sources/TerminalStrip/ui/terminalstriptreedockwidget.h +++ b/sources/TerminalStrip/ui/terminalstriptreedockwidget.h @@ -19,6 +19,7 @@ #define TERMINALSTRIPTREEDOCKWIDGET_H #include +#include class QETProject; class QTreeWidgetItem; @@ -37,16 +38,30 @@ class TerminalStripTreeDockWidget : public QDockWidget explicit TerminalStripTreeDockWidget(QETProject *project, QWidget *parent = nullptr); ~TerminalStripTreeDockWidget(); - void buildTree(); + void reload(); + bool currentIsStrip() const; + TerminalStrip* currentStrip() const; + QString currentInstallation() const; + QString currentLocation() const; + void setSelectedStrip(TerminalStrip *strip); + + signals: + void currentStripChanged(TerminalStrip *strip); + + private slots: + void on_m_tree_view_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); private: + void buildTree(); QTreeWidgetItem* addTerminalStrip(TerminalStrip *terminal_strip); void addFreeTerminal(); void setupUndoConnections(); + void setCurrentStrip(TerminalStrip *strip); private: Ui::TerminalStripTreeDockWidget *ui; - QETProject *m_project = nullptr; + QPointer m_project; + QPointer m_current_strip; QHash m_item_strip_H; QHash> m_uuid_terminal_H;