diff --git a/libs/ui/canvas/kis_canvas_controller.h b/libs/ui/canvas/kis_canvas_controller.h --- a/libs/ui/canvas/kis_canvas_controller.h +++ b/libs/ui/canvas/kis_canvas_controller.h @@ -68,6 +68,16 @@ Q_SIGNALS: void documentSizeChanged(); + /** + * @brief canvasMirrored + * emited when the canvas is mirrored. + */ + void canvasMirrored(const bool); + /** + * @brief canvasRotated + * emited when the canvas is rotated. + */ + void canvasRotated(const qreal); private: struct Private; diff --git a/libs/ui/canvas/kis_canvas_controller.cpp b/libs/ui/canvas/kis_canvas_controller.cpp --- a/libs/ui/canvas/kis_canvas_controller.cpp +++ b/libs/ui/canvas/kis_canvas_controller.cpp @@ -201,6 +201,7 @@ m_d->updateDocumentSizeAfterTransform(); setScrollBarValue(newOffset); m_d->paintOpTransformationConnector->notifyTransformationChanged(); + emit(canvasMirrored(enable)); m_d->showMirrorStateOnCanvas(); } @@ -220,6 +221,7 @@ m_d->updateDocumentSizeAfterTransform(); setScrollBarValue(newOffset); m_d->paintOpTransformationConnector->notifyTransformationChanged(); + emit(canvasRotated(angle)); m_d->showRotationValueOnCanvas(); } diff --git a/plugins/dockers/overview/overviewdocker_dock.h b/plugins/dockers/overview/overviewdocker_dock.h --- a/plugins/dockers/overview/overviewdocker_dock.h +++ b/plugins/dockers/overview/overviewdocker_dock.h @@ -20,11 +20,14 @@ #include #include +#include #include #include class QVBoxLayout; +class QHBoxLayout; +class QToolButton; class OverviewWidget; class OverviewDockerDock : public QDockWidget, public KoCanvasObserverBase { @@ -35,10 +38,19 @@ void setCanvas(KoCanvasBase *canvas) override; void unsetCanvas() override; +public Q_SLOTS: + void rotateCanvasView(qreal rotation); + void updateSlider(); + void mirrorCanvas(bool mirror); + void updateMirrorButton(); + private: QVBoxLayout *m_layout; + QHBoxLayout *m_horizontalLayout; OverviewWidget *m_overviewWidget; QWidget *m_zoomSlider; + KisDoubleSliderSpinBox *m_rotateSlider; + QToolButton *m_mirrorCanvas; QPointer m_canvas; }; diff --git a/plugins/dockers/overview/overviewdocker_dock.cpp b/plugins/dockers/overview/overviewdocker_dock.cpp --- a/plugins/dockers/overview/overviewdocker_dock.cpp +++ b/plugins/dockers/overview/overviewdocker_dock.cpp @@ -20,7 +20,10 @@ #include #include +#include +#include #include +#include #include #include "kis_canvas2.h" @@ -29,15 +32,19 @@ #include "kis_image.h" #include "kis_paint_device.h" #include "kis_signal_compressor.h" - +#include "kis_canvas_controller.h" +#include "kis_icon_utils.h" OverviewDockerDock::OverviewDockerDock( ) : QDockWidget(i18n("Overview")) - , m_zoomSlider(0) - , m_canvas(0) + , m_zoomSlider(nullptr) + , m_rotateSlider(nullptr) + , m_mirrorCanvas(nullptr) + , m_canvas(nullptr) { QWidget *page = new QWidget(this); m_layout = new QVBoxLayout(page); + m_horizontalLayout = new QHBoxLayout(); m_overviewWidget = new OverviewWidget(this); m_overviewWidget->setMinimumHeight(50); @@ -54,7 +61,7 @@ if(m_canvas == canvas) return; - setEnabled(canvas != 0); + setEnabled(canvas != nullptr); if (m_canvas) { m_canvas->disconnectCanvasObserver(this); @@ -64,23 +71,91 @@ if (m_zoomSlider) { m_layout->removeWidget(m_zoomSlider); delete m_zoomSlider; - m_zoomSlider = 0; + m_zoomSlider = nullptr; + } + + if (m_rotateSlider) { + m_horizontalLayout->removeWidget(m_rotateSlider); + delete m_rotateSlider; + m_rotateSlider = nullptr; } + if (m_mirrorCanvas) { + m_horizontalLayout->removeWidget(m_mirrorCanvas); + delete m_mirrorCanvas; + m_mirrorCanvas = nullptr; + } + + m_layout->removeItem(m_horizontalLayout); + m_canvas = dynamic_cast(canvas); m_overviewWidget->setCanvas(canvas); if (m_canvas && m_canvas->viewManager() && m_canvas->viewManager()->zoomController() && m_canvas->viewManager()->zoomController()->zoomAction()) { m_zoomSlider = m_canvas->viewManager()->zoomController()->zoomAction()->createWidget(m_canvas->imageView()->KisView::statusBar()); m_layout->addWidget(m_zoomSlider); + + m_rotateSlider = new KisDoubleSliderSpinBox(); + m_rotateSlider->setRange(-180, 180, 2); + m_rotateSlider->setValue(m_canvas->rotationAngle()); + m_rotateSlider->setPrefix(i18n("Rotation: ")); + m_rotateSlider->setSuffix("°"); + connect(m_rotateSlider, SIGNAL(valueChanged(qreal)), this, SLOT(rotateCanvasView(qreal)), Qt::UniqueConnection); + connect(m_canvas->imageView()->canvasController(), SIGNAL(canvasRotated(qreal)), this, SLOT(updateSlider())); + + m_mirrorCanvas = new QToolButton(); + m_mirrorCanvas->setCheckable(true); + m_mirrorCanvas->setIcon(KisIconUtils::loadIcon("mirror-view")); + m_mirrorCanvas->setChecked(m_canvas->xAxisMirrored()); + connect(m_mirrorCanvas, SIGNAL(toggled(bool)), this, SLOT(mirrorCanvas(bool))); + connect(m_canvas->imageView()->canvasController(), SIGNAL(canvasMirrored(bool)), this, SLOT(updateMirrorButton())); + m_horizontalLayout->addWidget(m_mirrorCanvas); + m_horizontalLayout->addWidget(m_rotateSlider); + m_layout->addLayout(m_horizontalLayout); } } void OverviewDockerDock::unsetCanvas() { setEnabled(false); - m_canvas = 0; + m_canvas = nullptr; m_overviewWidget->unsetCanvas(); } +void OverviewDockerDock::rotateCanvasView(qreal rotation) +{ + KisCanvasController *canvasController = + dynamic_cast(m_canvas->viewManager()->canvasBase()->canvasController()); + if (canvasController) { + canvasController->rotateCanvas(rotation-m_canvas->rotationAngle()); + } +} + +void OverviewDockerDock::updateSlider() +{ + qreal rotation = m_canvas->rotationAngle(); + if (rotation > 180) { + rotation = rotation - 360; + } else if (rotation < -180) { + rotation = rotation + 360; + } + if (m_rotateSlider->value() != rotation) { + m_rotateSlider->setValue(rotation); + } +} + +void OverviewDockerDock::mirrorCanvas(bool mirror) +{ + KisCanvasController *canvasController = + dynamic_cast(m_canvas->viewManager()->canvasBase()->canvasController()); + if (canvasController) { + canvasController->mirrorCanvas(mirror); + } +} + +void OverviewDockerDock::updateMirrorButton() +{ + m_mirrorCanvas->setChecked(m_canvas->xAxisMirrored()); +} +