diff --git a/qmlUiKirigami/ImageViewer.qml b/qmlUiKirigami/ImageViewer.qml --- a/qmlUiKirigami/ImageViewer.qml +++ b/qmlUiKirigami/ImageViewer.qml @@ -97,6 +97,22 @@ onTriggered: { imageDoc.rotate(90) } + }, + Kirigami.Action { + iconName: "image-flip-vertical-symbolic" + text: i18n("Flip vertically") + tooltip: i18n("Flips the image vertically") + onTriggered: { + imageDoc.flip(Koko.ImageDocument.VERTICAL) + } + }, + Kirigami.Action { + iconName: "image-flip-horizontal-symbolic" + text: i18n("Flip horizontally") + tooltip: i18n("Flips the image horizontally") + onTriggered: { + imageDoc.flip(Koko.ImageDocument.HORIZONTAL) + } } ] } diff --git a/src/imagedocument.h b/src/imagedocument.h --- a/src/imagedocument.h +++ b/src/imagedocument.h @@ -25,13 +25,19 @@ class ImageDocument : public QObject { Q_OBJECT + Q_ENUMS(FlipType) Q_PROPERTY(QString path READ path WRITE setPath NOTIFY pathChanged) Q_PROPERTY(QImage visualImage READ visualImage NOTIFY visualImageChanged) Q_PROPERTY(bool edited READ edited WRITE setEdited NOTIFY editedChanged) public: ImageDocument(); ~ImageDocument(); - + + enum FlipType { + HORIZONTAL = Qt::UserRole + 1, + VERTICAL + }; + QString path(); void setPath( QString &url); @@ -41,6 +47,7 @@ void setEdited( bool value); Q_INVOKABLE void rotate( int angle); + Q_INVOKABLE void flip(FlipType direction); Q_INVOKABLE void save( QImage image); Q_INVOKABLE void cancel(); diff --git a/src/imagedocument.cpp b/src/imagedocument.cpp --- a/src/imagedocument.cpp +++ b/src/imagedocument.cpp @@ -80,6 +80,21 @@ emit visualImageChanged(); } +void ImageDocument::flip(FlipType direction) +{ + if( direction == FlipType::VERTICAL){ + *m_image = m_image->mirrored(); + } + else if( direction == FlipType::HORIZONTAL){ + *m_image = m_image->mirrored(true, false); + } + QString location = QUrl( m_path).path(); + if (QFileInfo( location).isWritable()) { + m_image->save( location); + } + emit visualImageChanged(); +} + void ImageDocument::save( QImage image) { QString location = QUrl( m_path).path();