diff --git a/Grinder/Version.h b/Grinder/Version.h index c0b48ef6e1859115ae394713d0f845a4d11967d0..9ffc2c41644ae824f7065dde46c627d1960e8f53 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 a2ade752bd98476b4ad19fedf044e48dcab7a5cd..b7bf3bd30575d74beb8c4743784b2ec57a8ef50b 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 33ce64959667210bfd246ec82d27fc054e40872d..dd0d4e0a33ed3c1dfd0ce740cf68b762239faa38 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 d8d59abe603b05807107760bc12f77079a7313b9..7b424e6549dd9226746792130934e050103826cb 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 cdfeaaf9d6a5d7d01a2a7a5fb18b43f6b59292bf..0e1fb22432bbc5e83e6189a86526d0060d3a3e71 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 19ea798312ede02b2c626608df5642fc6ca4c212..942b69965572b3eca41500446f85353d0e415d37 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};