diff --git a/libs/libkis/Canvas.cpp b/libs/libkis/Canvas.cpp --- a/libs/libkis/Canvas.cpp +++ b/libs/libkis/Canvas.cpp @@ -53,7 +53,6 @@ return !(operator==(other)); } - qreal Canvas::zoomLevel() const { if (!d->canvas) return 1.0; @@ -69,10 +68,9 @@ void Canvas::resetZoom() { if (!d->canvas) return; - d->canvas->imageView()->zoomManager()->zoomTo100(); + d->canvas->imageView()->zoomManager()->zoomToPercent(1.0f); } - void Canvas::resetRotation() { if (!d->canvas) return; diff --git a/libs/ui/CMakeLists.txt b/libs/ui/CMakeLists.txt --- a/libs/ui/CMakeLists.txt +++ b/libs/ui/CMakeLists.txt @@ -228,6 +228,7 @@ widgets/kis_multi_bool_filter_widget.cc widgets/kis_multi_double_filter_widget.cc widgets/kis_multi_integer_filter_widget.cc + widgets/kis_multibutton.cpp widgets/kis_multipliers_double_slider_spinbox.cpp widgets/kis_paintop_presets_popup.cpp widgets/kis_tool_options_popup.cpp diff --git a/libs/ui/KisViewManager.cpp b/libs/ui/KisViewManager.cpp --- a/libs/ui/KisViewManager.cpp +++ b/libs/ui/KisViewManager.cpp @@ -169,7 +169,7 @@ , levelOfDetailAction(0) , showRulersAction(0) , rulersTrackMouseAction(0) - , zoomTo100pct(0) + , zoomFitPage(0) , zoomIn(0) , zoomOut(0) , selectionManager(_q) @@ -210,7 +210,7 @@ KisAction *levelOfDetailAction; KisAction *showRulersAction; KisAction *rulersTrackMouseAction; - KisAction *zoomTo100pct; + KisAction *zoomFitPage; KisAction *zoomIn; KisAction *zoomOut; KisAction *softProof; @@ -460,7 +460,8 @@ d->viewConnections.addUniqueConnection(d->currentImageView->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), d->controlFrame.paintopBox(), SLOT(slotColorSpaceChanged(const KoColorSpace*))); d->viewConnections.addUniqueConnection(d->showRulersAction, SIGNAL(toggled(bool)), imageView->zoomManager(), SLOT(setShowRulers(bool))); d->viewConnections.addUniqueConnection(d->rulersTrackMouseAction, SIGNAL(toggled(bool)), imageView->zoomManager(), SLOT(setRulersTrackMouse(bool))); - d->viewConnections.addUniqueConnection(d->zoomTo100pct, SIGNAL(triggered()), imageView->zoomManager(), SLOT(zoomTo100())); + + d->viewConnections.addUniqueConnection(d->zoomFitPage, SIGNAL(triggered()), imageView->zoomManager(), SLOT(zoomFitPage())); d->viewConnections.addUniqueConnection(d->zoomIn, SIGNAL(triggered()), imageView->zoomController()->zoomAction(), SLOT(zoomIn())); d->viewConnections.addUniqueConnection(d->zoomOut, SIGNAL(triggered()), imageView->zoomController()->zoomAction(), SLOT(zoomOut())); @@ -728,7 +729,7 @@ d->rulersTrackMouseAction->setChecked(cfg.rulersTrackMouse()); connect(d->rulersTrackMouseAction, SIGNAL(toggled(bool)), SLOT(slotSaveRulersTrackMouseState(bool))); - d->zoomTo100pct = actionManager()->createAction("zoom_to_100pct"); + d->zoomFitPage = actionManager()->createAction("zoom_fit_page"); d->zoomIn = actionManager()->createStandardAction(KStandardAction::ZoomIn, 0, ""); d->zoomOut = actionManager()->createStandardAction(KStandardAction::ZoomOut, 0, ""); diff --git a/libs/ui/kis_popup_palette.h b/libs/ui/kis_popup_palette.h --- a/libs/ui/kis_popup_palette.h +++ b/libs/ui/kis_popup_palette.h @@ -21,7 +21,6 @@ #define KIS_POPUP_PALETTE_H #include -#include #include #include "KisViewManager.h" #include "kactioncollection.h" @@ -38,6 +37,7 @@ class KisRoundHudButton; class KisCanvasResourceProvider; class KisVisualColorSelector; +class KisMultiButton; class KisPopupPalette : public QWidget { @@ -67,7 +67,6 @@ void tabletEvent(QTabletEvent *event) override; protected: - void paintEvent(QPaintEvent*) override; void resizeEvent(QResizeEvent*) override; void mouseReleaseEvent(QMouseEvent*) override; @@ -108,7 +107,6 @@ QElapsedTimer m_timeSinceOpening; bool m_hadMousePressSinceOpening {false}; - KisCoordinatesConverter *m_coordinatesConverter; KisViewManager *m_viewManager; @@ -134,9 +132,10 @@ bool m_isOverCanvasRotationIndicator {false}; bool m_isRotatingCanvasIndicator {false}; - KisHighlightedToolButton *mirrorMode {0}; + KisMultiButton *mirrorButton {0}; KisHighlightedToolButton *canvasOnlyButton {0}; - QPushButton *zoomToOneHundredPercentButton {0}; + KisMultiButton *quickZoomButton {0}; + QSlider *zoomCanvasSlider {0}; int zoomSliderMinValue {10}; int zoomSliderMaxValue {200}; @@ -169,9 +168,9 @@ void slotHide() { showPopupPalette(false); } void slotShowTagsPopup(); void showHudWidget(bool visible); - void slotmirroModeClicked(); + void slotMirrorButtonClicked(QMouseEvent *mouseEvent); void slotCanvasonlyModeClicked(); - void slotZoomToOneHundredPercentClicked(); + void slotQuickZoomClicked(QMouseEvent *mouseEvent); void slotZoomSliderChanged(int zoom); }; diff --git a/libs/ui/kis_popup_palette.cpp b/libs/ui/kis_popup_palette.cpp --- a/libs/ui/kis_popup_palette.cpp +++ b/libs/ui/kis_popup_palette.cpp @@ -19,9 +19,10 @@ */ +#include "kis_popup_palette.h" + #include "kis_canvas2.h" #include "kis_config.h" -#include "kis_popup_palette.h" #include "kis_favorite_resource_manager.h" #include "kis_icon_utils.h" #include "KisResourceServerProvider.h" @@ -39,6 +40,7 @@ #include "brushhud/kis_round_hud_button.h" #include "kis_signals_blocker.h" #include "kis_canvas_controller.h" +#include "kis_multibutton.h" class PopupColorTriangle : public KoTriangleColorSelector { @@ -163,55 +165,48 @@ const int auxButtonSize = 35; m_settingsButton = new KisRoundHudButton(this); - m_settingsButton->setGeometry(m_popupPaletteSize - 2.2 * auxButtonSize, m_popupPaletteSize - auxButtonSize, auxButtonSize, auxButtonSize); - connect(m_settingsButton, SIGNAL(clicked()), SLOT(slotShowTagsPopup())); KisConfig cfg; m_brushHudButton = new KisRoundHudButton(this); m_brushHudButton->setCheckable(true); - m_brushHudButton->setGeometry(m_popupPaletteSize - 1.0 * auxButtonSize, m_popupPaletteSize - auxButtonSize, auxButtonSize, auxButtonSize); connect(m_brushHudButton, SIGNAL(toggled(bool)), SLOT(showHudWidget(bool))); m_brushHudButton->setChecked(cfg.showBrushHud()); - // add some stuff below the pop-up palette that will make it easier to use for tablet people - QVBoxLayout* vLayout = new QVBoxLayout(this); // main layout + QVBoxLayout *vLayout = new QVBoxLayout(this); // main layout - QSpacerItem* verticalSpacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding); + QSpacerItem *verticalSpacer = new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding); vLayout->addSpacerItem(verticalSpacer); // this should push the box to the bottom - - QHBoxLayout* hLayout = new QHBoxLayout(); + QHBoxLayout *hLayout = new QHBoxLayout(); vLayout->addLayout(hLayout); - mirrorMode = new KisHighlightedToolButton(this); - mirrorMode->setCheckable(true); - mirrorMode->setFixedSize(35, 35); - - mirrorMode->setToolTip(i18n("Mirror Canvas")); - connect(mirrorMode, SIGNAL(clicked(bool)), this, SLOT(slotmirroModeClicked())); - + //Mirror Button + mirrorButton = new KisMultiButton(this); + mirrorButton->setFixedSize(35, 35); + mirrorButton->setToolTip(i18n("Mirror Canvas. Left Click: Horizontal.")); + connect(mirrorButton, SIGNAL(clicked(QMouseEvent*)), this, SLOT(slotMirrorButtonClicked(QMouseEvent*))); + //Canvas Only Button canvasOnlyButton = new KisHighlightedToolButton(this); canvasOnlyButton->setCheckable(true); canvasOnlyButton->setFixedSize(35, 35); - - canvasOnlyButton->setToolTip(i18n("Canvas Only")); + canvasOnlyButton->setToolTip(i18n("Canvas Only.")); connect(canvasOnlyButton, SIGNAL(clicked(bool)), this, SLOT(slotCanvasonlyModeClicked())); - zoomToOneHundredPercentButton = new QPushButton(this); - zoomToOneHundredPercentButton->setText(i18n("100%")); - zoomToOneHundredPercentButton->setFixedHeight(35); - - zoomToOneHundredPercentButton->setToolTip(i18n("Zoom to 100%")); - connect(zoomToOneHundredPercentButton, SIGNAL(clicked(bool)), this, SLOT(slotZoomToOneHundredPercentClicked())); + //QuickZoom Button + quickZoomButton = new KisMultiButton(this); + quickZoomButton->setFixedSize(35, 35); + quickZoomButton->setToolTip(i18n("Quick Zoom. Left Click: Zoom to 100%. Right Click: Fit to page. Shift-Left Click: Zoom to 200%.")); + connect(quickZoomButton, SIGNAL(clicked(QMouseEvent*)), this, SLOT(slotQuickZoomClicked(QMouseEvent*))); + //Zoom Slider zoomCanvasSlider = new QSlider(Qt::Horizontal, this); zoomSliderMinValue = 10; // set in % zoomSliderMaxValue = 200; // set in % @@ -227,9 +222,9 @@ slotUpdateIcons(); - hLayout->addWidget(mirrorMode); + hLayout->addWidget(mirrorButton); hLayout->addWidget(canvasOnlyButton); - hLayout->addWidget(zoomToOneHundredPercentButton); + hLayout->addWidget(quickZoomButton); hLayout->addWidget(zoomCanvasSlider); setVisible(true); @@ -328,9 +323,9 @@ void KisPopupPalette::slotUpdateIcons() { - zoomToOneHundredPercentButton->setIcon(KisIconUtils::loadIcon("zoom-original")); + quickZoomButton->setIcon(KisIconUtils::loadIcon("zoom-original")); canvasOnlyButton->setIcon(KisIconUtils::loadIcon("document-new")); - mirrorMode->setIcon(KisIconUtils::loadIcon("symmetry-horizontal")); + mirrorButton->setIcon(KisIconUtils::loadIcon("symmetry-horizontal")); m_settingsButton->setIcon(KisIconUtils::loadIcon("configure")); m_brushHud->updateIcons(); m_brushHudButton->setOnOffIcons(KisIconUtils::loadIcon("arrow-left"), KisIconUtils::loadIcon("arrow-right")); @@ -774,7 +769,7 @@ } } -void KisPopupPalette::slotmirroModeClicked() { +void KisPopupPalette::slotMirrorButtonClicked(QMouseEvent *mouseEvent) { QAction *action = m_actionCollection->action("mirror_canvas"); if (action) { @@ -790,15 +785,20 @@ } } -void KisPopupPalette::slotZoomToOneHundredPercentClicked() { - QAction *action = m_actionCollection->action("zoom_to_100pct"); - - if (action) { - action->trigger(); +void KisPopupPalette::slotQuickZoomClicked(QMouseEvent *mouseEvent) { + if (mouseEvent->button() == Qt::LeftButton) { + if(mouseEvent->modifiers() == Qt::ShiftModifier) { + zoomCanvasSlider->setValue(200); //Shift LeftClick: 200% + } else { + zoomCanvasSlider->setValue(100); //LeftClick: 100% + } + } else if (mouseEvent->button() == Qt::RightButton) { + QAction *action = m_actionCollection->action("zoom_fit_page"); + if (action) { + zoomCanvasSlider->setValue(0); //RightClick: Fit Page + action->trigger(); + } } - - // also move the zoom slider to 100% position so they are in sync - zoomCanvasSlider->setValue(100); } void KisPopupPalette::tabletEvent(QTabletEvent *event) { diff --git a/libs/ui/kis_zoom_manager.h b/libs/ui/kis_zoom_manager.h --- a/libs/ui/kis_zoom_manager.h +++ b/libs/ui/kis_zoom_manager.h @@ -71,7 +71,6 @@ qreal zoom() const; public Q_SLOTS: - void slotZoomChanged(KoZoomMode::Mode mode, qreal zoom); void slotScrollAreaSizeChanged(); void setShowRulers(bool show); @@ -79,24 +78,24 @@ void mousePositionChanged(const QPoint &viewPos); void changeAspectMode(bool aspectMode); void pageOffsetChanged(); - void zoomTo100(); + void zoomToPercent(float nPercent); + void zoomTo100(){zoomToPercent(1.0);} + void zoomFitPage(); void applyRulersUnit(const KoUnit &baseUnit); void setMinMaxZoom(); void setRulersPixelMultiple2(bool enabled); - private: void updateMouseTrackingConnections(); private: - QPointer m_view; - KoZoomHandler * m_zoomHandler; + KoZoomHandler *m_zoomHandler; KoCanvasController *m_canvasController; KoZoomController *m_zoomController; - KoRuler * m_horizontalRuler; - KoRuler * m_verticalRuler; - KoZoomAction * m_zoomAction; + KoRuler *m_horizontalRuler; + KoRuler *m_verticalRuler; + KoZoomAction *m_zoomAction; QPointer m_zoomActionWidget; QPoint m_rulersOffset; KisSignalAutoConnectionsStore m_mouseTrackingConnections; diff --git a/libs/ui/kis_zoom_manager.cc b/libs/ui/kis_zoom_manager.cc --- a/libs/ui/kis_zoom_manager.cc +++ b/libs/ui/kis_zoom_manager.cc @@ -348,7 +348,6 @@ m_view->canvasBase()->notifyZoomChanged(); } - void KisZoomManager::pageOffsetChanged() { QRectF widgetRect = m_view->canvasBase()->coordinatesConverter()->imageRectInWidgetPixels(); @@ -358,8 +357,14 @@ m_verticalRuler->setOffset(m_rulersOffset.y()); } -void KisZoomManager::zoomTo100() +void KisZoomManager::zoomToPercent(float nPercent) +{ + m_zoomController->setZoom(KoZoomMode::ZOOM_CONSTANT, nPercent); + m_view->canvasBase()->notifyZoomChanged(); +} + +void KisZoomManager::zoomFitPage() { - m_zoomController->setZoom(KoZoomMode::ZOOM_CONSTANT, 1.0); + m_zoomController->setZoom(KoZoomMode::ZOOM_PAGE, 1.0); m_view->canvasBase()->notifyZoomChanged(); } diff --git a/libs/ui/widgets/kis_multibutton.h b/libs/ui/widgets/kis_multibutton.h new file mode 100644 --- /dev/null +++ b/libs/ui/widgets/kis_multibutton.h @@ -0,0 +1,44 @@ +/* This file is part of the KDE project + * Copyright (c) 2018 Emmet O'Neill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef KIS_MULTIBUTTON_H +#define KIS_MULTIBUTTON_H + +#include +#include + +class QMouseEvent; + +/* KisMultiButton is a QPushButton subclass that responds to multiple types + * of user inputs, such as different mouse clicks with or without key modifiers. + */ +class KisMultiButton : public QPushButton { + Q_OBJECT + +public: + KisMultiButton(QWidget *parent = 0); + +Q_SIGNALS: + void clicked(QMouseEvent *); //Overloads inherited "clicked()". + +public Q_SLOTS: + void mouseReleaseEvent(QMouseEvent *mouseEvent); +}; + +#endif //KIS_MULTIBUTTON_H diff --git a/libs/ui/widgets/kis_multibutton.cpp b/libs/ui/widgets/kis_multibutton.cpp new file mode 100644 --- /dev/null +++ b/libs/ui/widgets/kis_multibutton.cpp @@ -0,0 +1,31 @@ +/* This file is part of the KDE project + * Copyright (c) 2018 Emmet O'Neill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include "kis_multibutton.h" + +#include + +KisMultiButton::KisMultiButton(QWidget *parent) + : QPushButton(parent) +{ +} + +void KisMultiButton::mouseReleaseEvent(QMouseEvent *mouseEvent){ + emit clicked(mouseEvent); +}