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,17 @@ void setCanvas(KoCanvasBase *canvas) override; void unsetCanvas() override; +public Q_SLOTS: + void rotateCanvasView(qreal rotation); + void updateSlider(); + 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,24 +20,33 @@ #include #include +#include +#include #include +#include #include #include "kis_canvas2.h" #include +#include +#include #include #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 +63,7 @@ if(m_canvas == canvas) return; - setEnabled(canvas != 0); + setEnabled(canvas != nullptr); if (m_canvas) { m_canvas->disconnectCanvasObserver(this); @@ -64,23 +73,78 @@ 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->canvasController()->proxyObject, SIGNAL(canvasOffsetXChanged(int)), this, SLOT(updateSlider())); + + m_mirrorCanvas = new QToolButton(); + QList actions = m_canvas->viewManager()->actionCollection()->actions(); + Q_FOREACH(QAction* action, actions) { + if (action->objectName()=="mirror_canvas") { + m_mirrorCanvas->setDefaultAction(action); + } + } + 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); + } +} +