From b45ec9dfa571914148474c056d7d8bd99f91baed Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 15 Oct 2023 22:23:39 -0500 Subject: [PATCH] Enable/disable layer move buttons according to selection --- scwx-qt/source/scwx/qt/model/layer_model.cpp | 12 ++++ scwx-qt/source/scwx/qt/model/layer_model.hpp | 2 + scwx-qt/source/scwx/qt/ui/layer_dialog.cpp | 64 +++++++++++++++++++- 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/scwx-qt/source/scwx/qt/model/layer_model.cpp b/scwx-qt/source/scwx/qt/model/layer_model.cpp index e9bbc0dd..8ced1199 100644 --- a/scwx-qt/source/scwx/qt/model/layer_model.cpp +++ b/scwx-qt/source/scwx/qt/model/layer_model.cpp @@ -164,6 +164,18 @@ Qt::DropActions LayerModel::supportedDropActions() const return Qt::DropAction::MoveAction; } +bool LayerModel::IsMovable(int row) const +{ + bool movable = false; + + if (0 <= row && static_cast(row) < p->layers_.size()) + { + movable = p->layers_.at(row).movable_; + } + + return movable; +} + QVariant LayerModel::data(const QModelIndex& index, int role) const { static const QString enabledString = QObject::tr("Enabled"); diff --git a/scwx-qt/source/scwx/qt/model/layer_model.hpp b/scwx-qt/source/scwx/qt/model/layer_model.hpp index ef0aebde..b63a6f9c 100644 --- a/scwx-qt/source/scwx/qt/model/layer_model.hpp +++ b/scwx-qt/source/scwx/qt/model/layer_model.hpp @@ -43,6 +43,8 @@ public: Qt::ItemFlags flags(const QModelIndex& index) const override; Qt::DropActions supportedDropActions() const override; + bool IsMovable(int row) const; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, diff --git a/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp b/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp index 88d3515e..71783e36 100644 --- a/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/layer_dialog.cpp @@ -18,11 +18,14 @@ class LayerDialogImpl { public: explicit LayerDialogImpl(LayerDialog* self) : - layerModel_ {new model::LayerModel(self)} + self_ {self}, layerModel_ {new model::LayerModel(self)} { } ~LayerDialogImpl() = default; + void ConnectSignals(); + + LayerDialog* self_; model::LayerModel* layerModel_; }; @@ -49,6 +52,14 @@ LayerDialog::LayerDialog(QWidget* parent) : QHeaderView::ResizeMode::ResizeToContents); } } + + // Disable move buttons + ui->moveTopButton->setEnabled(false); + ui->moveUpButton->setEnabled(false); + ui->moveDownButton->setEnabled(false); + ui->moveBottomButton->setEnabled(false); + + p->ConnectSignals(); } LayerDialog::~LayerDialog() @@ -56,6 +67,57 @@ LayerDialog::~LayerDialog() delete ui; } +void LayerDialogImpl::ConnectSignals() +{ + QObject::connect( + self_->ui->layerTreeView->selectionModel(), + &QItemSelectionModel::selectionChanged, + self_, + [this](const QItemSelection& /* selected */, + const QItemSelection& /* deselected */) + { + QModelIndexList selectedRows = + self_->ui->layerTreeView->selectionModel()->selectedRows(); + + bool itemsSelected = selectedRows.size() > 0; + bool itemsMovableUp = itemsSelected; + bool itemsMovableDown = itemsSelected; + int rowCount = layerModel_->rowCount(); + + for (auto& rowIndex : selectedRows) + { + int row = rowIndex.row(); + if (!layerModel_->IsMovable(row)) + { + // If an item in the selection is not movable, disable all moves + itemsMovableUp = false; + itemsMovableDown = false; + break; + } + else + { + // If the first row is selected, items cannot be moved up + if (row == 0) + { + itemsMovableUp = false; + } + + // If the last row is selected, items cannot be moved down + if (row == rowCount - 1) + { + itemsMovableDown = false; + } + } + } + + // Enable move buttons according to selection + self_->ui->moveTopButton->setEnabled(itemsMovableUp); + self_->ui->moveUpButton->setEnabled(itemsMovableUp); + self_->ui->moveDownButton->setEnabled(itemsMovableDown); + self_->ui->moveBottomButton->setEnabled(itemsMovableDown); + }); +} + } // namespace ui } // namespace qt } // namespace scwx