Skip to content

Commit fa9efe5

Browse files
committed
add horizontal and vertical flip
1 parent 0df0be4 commit fa9efe5

5 files changed

Lines changed: 154 additions & 4 deletions

File tree

src/GeneralAction.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@ GeneralAction::GeneralAction(QObject* parent, const QString& title) :
1313
_colorAction(this, "Color"),
1414
_nameAction(this, "Name"),
1515
_positionAction(this, "Position"),
16-
_scaleAction(this, "Scale", 0.0f, 1000000.0f, 100.0f, 1)
16+
_scaleAction(this, "Scale", 0.0f, 1000000.0f, 100.0f, 1),
17+
_flipHorizontalAction(this, "Horizontal flip", false),
18+
_flipVerticalAction(this, "Vertical flip", false)
1719
{
1820
addAction(&_visibleAction);
1921
addAction(&_datasetNameAction);
2022
addAction(&_colorAction);
2123
addAction(&_nameAction);
2224
addAction(&_positionAction);
2325
addAction(&_scaleAction);
26+
addAction(&_flipHorizontalAction);
27+
addAction(&_flipVerticalAction);
2428

2529
_datasetNameAction.setConnectionPermissionsToForceNone();
2630
_datasetNameAction.setEnabled(false);
@@ -33,6 +37,8 @@ GeneralAction::GeneralAction(QObject* parent, const QString& title) :
3337
_datasetNameAction.setToolTip("Name of the images dataset");
3438
_nameAction.setToolTip("Name of the layer");
3539
_scaleAction.setToolTip("Layer scale in percentages");
40+
_flipHorizontalAction.setToolTip("Flip the layer horizontally");
41+
_flipVerticalAction.setToolTip("Flip the layer vertically");
3642

3743
_scaleAction.setSuffix("%");
3844
}
@@ -67,6 +73,8 @@ void GeneralAction::initialize(Layer* layer)
6773
connect(&_visibleAction, &ToggleAction::toggled, this, updateBounds);
6874
connect(&_positionAction, &PositionAction::changed, this, updateBounds);
6975
connect(&_scaleAction, &DecimalAction::valueChanged, this, updateBounds);
76+
connect(&_flipHorizontalAction, &ToggleAction::toggled, this, updateBounds);
77+
connect(&_flipVerticalAction, &ToggleAction::toggled, this, updateBounds);
7078
connect(&_colorAction, &ColorAction::colorChanged, this, updateBounds);
7179
connect(&_colorAction, &ColorAction::colorChanged, this, render);
7280

@@ -94,6 +102,8 @@ void GeneralAction::connectToPublicAction(WidgetAction* publicAction, bool recur
94102
actions().connectPrivateActionToPublicAction(&_nameAction, &publicGeneralAction->getNameAction(), recursive);
95103
actions().connectPrivateActionToPublicAction(&_positionAction, &publicGeneralAction->getPositionAction(), recursive);
96104
actions().connectPrivateActionToPublicAction(&_scaleAction, &publicGeneralAction->getScaleAction(), recursive);
105+
actions().connectPrivateActionToPublicAction(&_flipHorizontalAction, &publicGeneralAction->getFlipHorizontalAction(), recursive);
106+
actions().connectPrivateActionToPublicAction(&_flipVerticalAction, &publicGeneralAction->getFlipVerticalAction(), recursive);
97107
}
98108

99109
GroupAction::connectToPublicAction(publicAction, recursive);
@@ -110,6 +120,8 @@ void GeneralAction::disconnectFromPublicAction(bool recursive)
110120
actions().disconnectPrivateActionFromPublicAction(&_nameAction, recursive);
111121
actions().disconnectPrivateActionFromPublicAction(&_positionAction, recursive);
112122
actions().disconnectPrivateActionFromPublicAction(&_scaleAction, recursive);
123+
actions().disconnectPrivateActionFromPublicAction(&_flipHorizontalAction, recursive);
124+
actions().disconnectPrivateActionFromPublicAction(&_flipVerticalAction, recursive);
113125
}
114126

115127
GroupAction::disconnectFromPublicAction(recursive);
@@ -124,6 +136,8 @@ void GeneralAction::fromVariantMap(const QVariantMap& variantMap)
124136
_nameAction.fromParentVariantMap(variantMap);
125137
_positionAction.fromParentVariantMap(variantMap);
126138
_scaleAction.fromParentVariantMap(variantMap);
139+
_flipHorizontalAction.fromParentVariantMap(variantMap);
140+
_flipVerticalAction.fromParentVariantMap(variantMap);
127141
}
128142

129143
QVariantMap GeneralAction::toVariantMap() const
@@ -135,6 +149,8 @@ QVariantMap GeneralAction::toVariantMap() const
135149
_nameAction.insertIntoVariantMap(variantMap);
136150
_positionAction.insertIntoVariantMap(variantMap);
137151
_scaleAction.insertIntoVariantMap(variantMap);
152+
_flipHorizontalAction.insertIntoVariantMap(variantMap);
153+
_flipVerticalAction.insertIntoVariantMap(variantMap);
138154

139155
return variantMap;
140156
}

src/GeneralAction.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class GeneralAction : public GroupAction
7575
StringAction& getNameAction() { return _nameAction; }
7676
PositionAction& getPositionAction() { return _positionAction; }
7777
DecimalAction& getScaleAction() { return _scaleAction; }
78+
ToggleAction& getFlipHorizontalAction() { return _flipHorizontalAction; }
79+
ToggleAction& getFlipVerticalAction() { return _flipVerticalAction; }
7880

7981
protected:
8082
Layer* _layer; /** Pointer to owning layer */
@@ -84,6 +86,8 @@ class GeneralAction : public GroupAction
8486
StringAction _nameAction; /** Name action */
8587
PositionAction _positionAction; /** Position action */
8688
DecimalAction _scaleAction; /** Scale action */
89+
ToggleAction _flipHorizontalAction; /** Flip horizontal action */
90+
ToggleAction _flipVerticalAction; /** Flip vertical action */
8791
};
8892

8993
Q_DECLARE_METATYPE(GeneralAction)

src/Layer.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ void Layer::initialize(ImageViewerPlugin* imageViewerPlugin, const mv::Dataset<I
120120

121121
connect(&_generalAction.getScaleAction(), &DecimalAction::valueChanged, this, updateModelMatrixAndReRender);
122122
connect(&_generalAction.getPositionAction(), &PositionAction::changed, this, updateModelMatrixAndReRender);
123+
connect(&_generalAction.getFlipHorizontalAction(), &ToggleAction::toggled, this, updateModelMatrixAndReRender);
124+
connect(&_generalAction.getFlipVerticalAction(), &ToggleAction::toggled, this, updateModelMatrixAndReRender);
123125

124126
updateChannelScalarData(_imageSettingsAction.getScalarChannel1Action());
125127
updateChannelScalarData(_imageSettingsAction.getScalarChannel2Action());
@@ -253,7 +255,20 @@ void Layer::updateModelMatrix()
253255
// Get reference to general action for getting the layer position and scale
254256
auto& generalAction = _generalAction;
255257

256-
QMatrix4x4 translateMatrix, scaleMatrix;
258+
QMatrix4x4 translateMatrix, scaleMatrix, flipMatrix;
259+
// Compute the flip matrix
260+
if (generalAction.getFlipHorizontalAction().isChecked() && generalAction.getFlipVerticalAction().isChecked())
261+
{
262+
flipMatrix.scale(-1.0f, -1.0f, 1.0f);
263+
}
264+
else if (generalAction.getFlipHorizontalAction().isChecked())
265+
{
266+
flipMatrix.scale(-1.0f, 1.0f, 1.0f);
267+
}
268+
else if (generalAction.getFlipVerticalAction().isChecked())
269+
{
270+
flipMatrix.scale(1.0f, -1.0f, 1.0f);
271+
}
257272

258273
// Compute the translation matrix
259274
translateMatrix.translate(generalAction.getPositionAction().getXAction().getValue(), generalAction.getPositionAction().getYAction().getValue(), 0.0f);
@@ -265,7 +280,7 @@ void Layer::updateModelMatrix()
265280
scaleMatrix.scale(scaleFactor, scaleFactor, scaleFactor);
266281

267282
// Assign model matrix
268-
setModelMatrix(translateMatrix * scaleMatrix);
283+
setModelMatrix(translateMatrix * scaleMatrix * flipMatrix);
269284
}
270285
catch (std::exception& e)
271286
{

src/LayersModel.cpp

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,78 @@ void LayersModel::VisibleItem::setData(const QVariant& value, int role /* = Qt::
113113
}
114114
}
115115

116+
LayersModel::FlipHorizontalItem::FlipHorizontalItem(Layer* layer) :
117+
Item(layer)
118+
{
119+
setCheckable(true);
120+
setCheckState(getLayer()->getGeneralAction().getFlipHorizontalAction().isChecked() ? Qt::Checked : Qt::Unchecked);
121+
}
122+
123+
QVariant LayersModel::FlipHorizontalItem::data(int role /*= Qt::UserRole + 1*/) const
124+
{
125+
switch (role) {
126+
case Qt::EditRole:
127+
return getLayer()->getGeneralAction().getFlipHorizontalAction().isChecked();
128+
129+
case Qt::ToolTipRole:
130+
return QString("Layer is flipped horizontally: %1").arg(data(Qt::EditRole).toBool() ? "yes" : "no");
131+
132+
case Qt::CheckStateRole:
133+
return data(Qt::EditRole).toBool() ? Qt::CheckState::Checked : Qt::CheckState::Unchecked;
134+
135+
default:
136+
break;
137+
}
138+
139+
return Item::data(role);
140+
}
141+
void LayersModel::FlipHorizontalItem::setData(const QVariant& value, int role /* = Qt::UserRole + 1 */)
142+
{
143+
switch (role) {
144+
case Qt::CheckStateRole:
145+
getLayer()->getGeneralAction().getFlipHorizontalAction().setChecked(value.toBool());
146+
break;
147+
148+
default:
149+
Item::setData(value, role);
150+
}
151+
}
152+
LayersModel::FlipVerticalItem::FlipVerticalItem(Layer* layer) :
153+
Item(layer)
154+
{
155+
setCheckable(true);
156+
setCheckState(getLayer()->getGeneralAction().getFlipVerticalAction().isChecked() ? Qt::Checked : Qt::Unchecked);
157+
}
158+
QVariant LayersModel::FlipVerticalItem::data(int role /*= Qt::UserRole + 1*/) const
159+
{
160+
switch (role) {
161+
case Qt::EditRole:
162+
return getLayer()->getGeneralAction().getFlipVerticalAction().isChecked();
163+
164+
case Qt::ToolTipRole:
165+
return QString("Layer is flipped vertically: %1").arg(data(Qt::EditRole).toBool() ? "yes" : "no");
166+
167+
case Qt::CheckStateRole:
168+
return data(Qt::EditRole).toBool() ? Qt::CheckState::Checked : Qt::CheckState::Unchecked;
169+
170+
default:
171+
break;
172+
}
173+
174+
return Item::data(role);
175+
}
176+
void LayersModel::FlipVerticalItem::setData(const QVariant& value, int role /* = Qt::UserRole + 1 */)
177+
{
178+
switch (role) {
179+
case Qt::CheckStateRole:
180+
getLayer()->getGeneralAction().getFlipVerticalAction().setChecked(value.toBool());
181+
break;
182+
183+
default:
184+
Item::setData(value, role);
185+
}
186+
}
187+
116188
LayersModel::ColorItem::ColorItem(Layer* layer) :
117189
Item(layer)
118190
{
@@ -389,6 +461,8 @@ LayersModel::Row::Row(Layer* layer)
389461
append(new HeightItem(layer));
390462
append(new ScaleItem(layer));
391463
append(new OpacityItem(layer));
464+
append(new FlipHorizontalItem(layer));
465+
append(new FlipVerticalItem(layer));
392466
}
393467

394468
QMap<LayersModel::Column, LayersModel::ColumHeaderInfo> LayersModel::columnInfo = QMap<LayersModel::Column, LayersModel::ColumHeaderInfo>({
@@ -400,7 +474,9 @@ QMap<LayersModel::Column, LayersModel::ColumHeaderInfo> LayersModel::columnInfo
400474
{ LayersModel::Column::ImageWidth, { "Width", "Width", "Width of the image" } },
401475
{ LayersModel::Column::ImageHeight, { "Height", "Height", "Height of the image" } },
402476
{ LayersModel::Column::Scale, { "Scale", "Scale", "Scale of the image" } },
403-
{ LayersModel::Column::Opacity, { "Opacity", "Opacity", "Layer transparency" } }
477+
{ LayersModel::Column::Opacity, { "Opacity", "Opacity", "Layer transparency" } },
478+
{ LayersModel::Column::FlipHorizontal, { "Horizontal Flip", "Horizontal Flip", "Whether the layer is flipped horizontally or not" } },
479+
{ LayersModel::Column::FlipVertical, { "Vertical Flip", "Vertical Flip", "Whether the layer is flipped vertically or not" } }
404480
});
405481

406482
LayersModel::LayersModel(ImageViewerPlugin* imageViewerPlugin) :

src/LayersModel.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class LayersModel final : public QStandardItemModel, public mv::util::Serializab
2828
ImageHeight, /** Height of the image(s) */
2929
Scale, /** Layer scale */
3030
Opacity, /** Layer opacity */
31+
FlipHorizontal, /** Flip layer horizontally */
32+
FlipVertical, /** Flip layer vertically */
3133

3234
Count
3335
};
@@ -115,6 +117,43 @@ class LayersModel final : public QStandardItemModel, public mv::util::Serializab
115117
void setData(const QVariant& value, int role /* = Qt::UserRole + 1 */) override;
116118
};
117119

120+
class FlipHorizontalItem final : public Item {
121+
public:
122+
123+
/**
124+
* Construct with \p layer
125+
* @param layer Pointer to layer to display item for
126+
*/
127+
FlipHorizontalItem(Layer* layer);
128+
129+
/**
130+
* Get model data for \p role
131+
* @return Data for \p role in variant form
132+
*/
133+
QVariant data(int role = Qt::UserRole + 1) const override;
134+
135+
/** Set model data to \p value for \p role */
136+
void setData(const QVariant& value, int role /* = Qt::UserRole + 1 */) override;
137+
};
138+
class FlipVerticalItem final : public Item {
139+
public:
140+
141+
/**
142+
* Construct with \p layer
143+
* @param layer Pointer to layer to display item for
144+
*/
145+
FlipVerticalItem(Layer* layer);
146+
147+
/**
148+
* Get model data for \p role
149+
* @return Data for \p role in variant form
150+
*/
151+
QVariant data(int role = Qt::UserRole + 1) const override;
152+
153+
/** Set model data to \p value for \p role */
154+
void setData(const QVariant& value, int role /* = Qt::UserRole + 1 */) override;
155+
};
156+
118157
/** Standard model item class for the layer color */
119158
class ColorItem final : public Item {
120159
public:

0 commit comments

Comments
 (0)