From 076175e99ddf53b965b110d9ca28e66b1141400d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20M=C3=BCller?= <d_muel20@uni-muenster.de> Date: Thu, 19 Jul 2018 20:15:15 +0200 Subject: [PATCH] * Layer icons are now clickable --- Grinder/Version.h | 4 +- Grinder/ui/image/LayersListItem.cpp | 12 +++++ Grinder/ui/image/LayersListItem.h | 18 +++++++ Grinder/ui/image/LayersListItemDelegate.cpp | 20 ++++---- Grinder/ui/image/LayersListWidget.cpp | 52 ++++++++++++++++++--- Grinder/ui/image/LayersListWidget.h | 6 +++ 6 files changed, 94 insertions(+), 18 deletions(-) diff --git a/Grinder/Version.h b/Grinder/Version.h index c0b48ef..9ffc2c4 100644 --- a/Grinder/Version.h +++ b/Grinder/Version.h @@ -10,14 +10,14 @@ #define GRNDR_INFO_TITLE "Grinder" #define GRNDR_INFO_COPYRIGHT "Copyright (c) WWU Muenster" -#define GRNDR_INFO_DATE "18.07.2018" +#define GRNDR_INFO_DATE "19.07.2018" #define GRNDR_INFO_COMPANY "WWU Muenster" #define GRNDR_INFO_WEBSITE "http://www.uni-muenster.de" #define GRNDR_VERSION_MAJOR 0 #define GRNDR_VERSION_MINOR 6 #define GRNDR_VERSION_REVISION 0 -#define GRNDR_VERSION_BUILD 223 +#define GRNDR_VERSION_BUILD 224 namespace grndr { diff --git a/Grinder/ui/image/LayersListItem.cpp b/Grinder/ui/image/LayersListItem.cpp index a2ade75..b7bf3bd 100644 --- a/Grinder/ui/image/LayersListItem.cpp +++ b/Grinder/ui/image/LayersListItem.cpp @@ -37,6 +37,18 @@ void LayersListItem::updateItem() updateToolTip(); } +LayersListItem::ItemArea LayersListItem::hitTest(QPoint pos) const +{ + if (_lockedIconRect.contains(pos)) + return ItemArea::LockedIcon; + else if (_renderableIconRect.contains(pos)) + return ItemArea::RenderableIcon; + else if (_preventUpdatesIconRect.contains(pos)) + return ItemArea::PreventUpdatesIcon; + else + return ItemArea::Item; +} + void LayersListItem::updateToolTip() { QStringList itemFlags; diff --git a/Grinder/ui/image/LayersListItem.h b/Grinder/ui/image/LayersListItem.h index 33ce649..dd0d4e0 100644 --- a/Grinder/ui/image/LayersListItem.h +++ b/Grinder/ui/image/LayersListItem.h @@ -13,12 +13,26 @@ namespace grndr { class LayersListItem : public ActiveObjectListItem<Layer> { + friend class LayersListItemDelegate; + + public: + enum class ItemArea + { + Item, + LockedIcon, + RenderableIcon, + PreventUpdatesIcon, + }; + public: LayersListItem(Layer* layer); public: virtual void updateItem() override; + public: + ItemArea hitTest(QPoint pos) const; + public: QString getName() const { return _object->getName(); } Layer::Type getType() const { return _object->getType(); } @@ -33,6 +47,10 @@ namespace grndr private: QFont _specialFont; QFont _specialActiveFont; + + QRect _lockedIconRect; + QRect _renderableIconRect; + QRect _preventUpdatesIconRect; }; } diff --git a/Grinder/ui/image/LayersListItemDelegate.cpp b/Grinder/ui/image/LayersListItemDelegate.cpp index d8d59ab..7b424e6 100644 --- a/Grinder/ui/image/LayersListItemDelegate.cpp +++ b/Grinder/ui/image/LayersListItemDelegate.cpp @@ -29,19 +29,19 @@ void LayersListItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem { QStyledItemDelegate::paint(painter, option, index); - auto lockedFlagRect = QRect{QPoint{0, 0}, FLAG_ICON_SIZE}; - auto renderableFlagRect = QRect{QPoint{0, 0}, FLAG_ICON_SIZE}; - auto preventUpdatesFlagRect = QRect{QPoint{0, 0}, FLAG_ICON_SIZE}; - lockedFlagRect.moveRight(option.rect.right() - (FLAG_ICON_MARGIN / 2)); - renderableFlagRect.moveRight(lockedFlagRect.left() - FLAG_ICON_MARGIN); - preventUpdatesFlagRect.moveRight(renderableFlagRect.left() - FLAG_ICON_MARGIN); - if (auto layersListItem = _widget->layersListItem(index)) { + layersListItem->_preventUpdatesIconRect = QRect{QPoint{0, 0}, FLAG_ICON_SIZE}; + layersListItem->_renderableIconRect = QRect{QPoint{0, 0}, FLAG_ICON_SIZE}; + layersListItem->_lockedIconRect = QRect{QPoint{0, 0}, FLAG_ICON_SIZE}; + layersListItem->_preventUpdatesIconRect.moveRight(option.rect.right() - (FLAG_ICON_MARGIN / 2)); + layersListItem->_renderableIconRect.moveRight(layersListItem->_preventUpdatesIconRect.left() - FLAG_ICON_MARGIN); + layersListItem->_lockedIconRect.moveRight(layersListItem->_renderableIconRect.left() - FLAG_ICON_MARGIN); + painter->save(); - drawFlagIcon(painter, _lockedIcon, lockedFlagRect, option.rect, layersListItem->hasFlag(Layer::Flag::Locked)); - drawFlagIcon(painter, _renderableIcon, renderableFlagRect, option.rect, layersListItem->hasFlag(Layer::Flag::Renderable)); - drawFlagIcon(painter, _preventUpdatesIcon, preventUpdatesFlagRect, option.rect, layersListItem->hasFlag(Layer::Flag::PreventUpdates)); + drawFlagIcon(painter, _lockedIcon, layersListItem->_lockedIconRect, option.rect, layersListItem->hasFlag(Layer::Flag::Locked)); + drawFlagIcon(painter, _renderableIcon, layersListItem->_renderableIconRect, option.rect, layersListItem->hasFlag(Layer::Flag::Renderable)); + drawFlagIcon(painter, _preventUpdatesIcon, layersListItem->_preventUpdatesIconRect, option.rect, layersListItem->hasFlag(Layer::Flag::PreventUpdates)); painter->restore(); } } diff --git a/Grinder/ui/image/LayersListWidget.cpp b/Grinder/ui/image/LayersListWidget.cpp index cdfeaaf..0e1fb22 100644 --- a/Grinder/ui/image/LayersListWidget.cpp +++ b/Grinder/ui/image/LayersListWidget.cpp @@ -16,10 +16,10 @@ #include "res/Resources.h" LayersListWidget::LayersListWidget(QWidget* parent) : MetaWidget(parent), - _sliderValueWidget{new SliderValueWidget{"Opacity:", 0, 100, "%", nullptr, false}} + _itemDelegate{new LayersListItemDelegate{this}}, _sliderValueWidget{new SliderValueWidget{"Opacity:", 0, 100, "%", nullptr, false}} { - // Set the delegate for the list items which handles drawing item flags etc. - setItemDelegate(new LayersListItemDelegate{this}); + // Set the delegate for the list items which handles drawing item flags etc. + setItemDelegate(_itemDelegate); // Create layers actions _renameLayerAction = UIUtils::createAction(this, "Rename &layer", FILE_ICON_EDIT, SLOT(renameLayer()), "Rename the selected layer", "F2"); @@ -56,12 +56,12 @@ LayersListWidget::LayersListWidget(QWidget* parent) : MetaWidget(parent), // Update the image build if the layer has been (un)checked connect(this, &LayersListWidget::itemChanged, this, &LayersListWidget::layerCheckChanged); - // Get notified when a label name has been edited - connect(itemDelegate(), &QAbstractItemDelegate::commitData, this, &LayersListWidget::layerRenamed, Qt::QueuedConnection); // Must be queued to prevent issues if renaming fails - // Listen for item selections in order to update the active layer and actions connect(this, &LayersListWidget::itemSelectionChanged, this, &LayersListWidget::selectedItemChanged); + // Get notified when a label name has been edited + connect(itemDelegate(), &QAbstractItemDelegate::commitData, this, &LayersListWidget::layerRenamed, Qt::QueuedConnection); // Must be queued to prevent issues if renaming fails + // Listen for clipboard changes to update our actions connect(&grinder()->clipboardManager(), &ClipboardManager::dataChanged, this, &LayersListWidget::updateActions); @@ -161,6 +161,46 @@ void LayersListWidget::switchToObjectItem(LayersListItem* item, bool selectItem) _imageEditor->controller().switchLayer(nullptr); } +void LayersListWidget::mousePressEvent(QMouseEvent* event) +{ + base_type::mousePressEvent(event); + + // Check if any layer flag icon was clicked + if (event->button() == Qt::LeftButton && event->modifiers() == 0) + { + if (auto itemSelected = currentObjectItem()) + { + auto itemRect = visualItemRect(itemSelected); + + if (itemRect.contains(event->pos())) + { + auto hitArea = itemSelected->hitTest(event->pos() - itemRect.topLeft()); + + switch (hitArea) + { + case LayersListItem::ItemArea::Item: + break; + + case LayersListItem::ItemArea::LockedIcon: + _lockedAction->toggle(); + setLayerLocked(); + break; + + case LayersListItem::ItemArea::RenderableIcon: + _renderableAction->toggle(); + setLayerRenderable(); + break; + + case LayersListItem::ItemArea::PreventUpdatesIcon: + _preventUpdatesAction->toggle(); + setLayerPreventUpdates(); + break; + } + } + } + } +} + void LayersListWidget::setLayerFlag(Layer::Flag flag, QAction* action) { if (auto layerSelected = currentObject()) diff --git a/Grinder/ui/image/LayersListWidget.h b/Grinder/ui/image/LayersListWidget.h index 19ea798..942b699 100644 --- a/Grinder/ui/image/LayersListWidget.h +++ b/Grinder/ui/image/LayersListWidget.h @@ -15,6 +15,7 @@ namespace grndr { class Layer; class SliderValueWidget; + class LayersListItemDelegate; using LayerObjectListWidget = ActiveObjectListWidget<Layer, LayersListItem>; @@ -40,6 +41,9 @@ namespace grndr protected: virtual void switchToObjectItem(LayersListItem* item, bool selectItem = true) override; + protected: + virtual void mousePressEvent(QMouseEvent* event) override; + private: void setLayerFlag(Layer::Flag flag, QAction* action); @@ -74,6 +78,8 @@ namespace grndr LayersListItem* layersListItem(const QModelIndex& index) const; private: + LayersListItemDelegate* _itemDelegate{nullptr}; + SliderValueWidget* _sliderValueWidget{nullptr}; QAction* _renameLayerAction{nullptr}; -- GitLab