From b272a751482d6912f321d1f9945a56bb9c3cc2ba Mon Sep 17 00:00:00 2001 From: shun-iwasawa Date: Jan 13 2022 05:52:22 +0000 Subject: zoom contents and fit floating panel geometry --- diff --git a/toonz/sources/toonz/flipbook.cpp b/toonz/sources/toonz/flipbook.cpp index ac550ac..712f0c7 100644 --- a/toonz/sources/toonz/flipbook.cpp +++ b/toonz/sources/toonz/flipbook.cpp @@ -2117,7 +2117,7 @@ QPointF newViewerGeomCenter( //----------------------------------------------------------------------------- -void FlipBook::onDoubleClick(QMouseEvent *me) { +void FlipBook::adaptGeometryToCurrentSize() { TImageP img(m_imageViewer->getImage()); if (!img) return; @@ -2144,6 +2144,17 @@ void FlipBook::onDoubleClick(QMouseEvent *me) { //----------------------------------------------------------------------------- +void FlipBook::onDoubleClick(QMouseEvent *me) { adaptGeometryToCurrentSize(); } + +//----------------------------------------------------------------------------- + +void FlipBook::zoomAndAdaptGeometry(bool forward) { + m_imageViewer->zoomQt(forward, false); + adaptGeometryToCurrentSize(); +} + +//----------------------------------------------------------------------------- + void FlipBook::minimize(bool doMinimize) { m_imageViewer->setVisible(!doMinimize); m_flipConsole->showHideAllParts(!doMinimize); diff --git a/toonz/sources/toonz/flipbook.h b/toonz/sources/toonz/flipbook.h index 5424f69..0e8d8c8 100644 --- a/toonz/sources/toonz/flipbook.h +++ b/toonz/sources/toonz/flipbook.h @@ -236,6 +236,9 @@ public: // zoom-out the rendered image. void adaptGeometryForFullPreview(const TRect &imgRect); + void adaptGeometryToCurrentSize(); + void zoomAndAdaptGeometry(bool forward); + void reset(); void onDrawFrame(int frame, const ImagePainter::VisualSettings &vs, diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index bebaf7c..323090b 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -2738,6 +2738,12 @@ void MainWindow::defineActions() { tr("Exit Full Screen Mode")); createViewerAction(MI_CompareToSnapshot, QT_TR_NOOP("Compare to Snapshot"), ""); + createViewerAction(MI_ZoomInAndFitPanel, + QT_TR_NOOP("Zoom In And Fit Floating Panel"), + "Ctrl+Alt++"); + createViewerAction(MI_ZoomOutAndFitPanel, + QT_TR_NOOP("Zoom Out And Fit Floating Panel"), + "Ctrl+Alt+-"); // Following actions are for adding "Visualization" menu items to the command // bar. They are separated from the original actions in order to avoid diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index 004e08f..579810b 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -458,4 +458,8 @@ // mark id is added for each actual command (i.g. MI_SetCellMark1) #define MI_SetCellMark "MI_SetCellMark" + +#define MI_ZoomInAndFitPanel "MI_ZoomInAndFitPanel" +#define MI_ZoomOutAndFitPanel "MI_ZoomOutAndFitPanel" + #endif diff --git a/toonz/sources/toonz/pane.cpp b/toonz/sources/toonz/pane.cpp index 013f1fa..2e2c5c9 100644 --- a/toonz/sources/toonz/pane.cpp +++ b/toonz/sources/toonz/pane.cpp @@ -33,6 +33,7 @@ #include #include #include +#include extern TEnv::StringVar EnvSafeAreaName; @@ -175,6 +176,58 @@ void TPanel::restoreFloatingPanelState() { persistent->load(settings); } +//----------------------------------------------------------------------------- +// if the panel has no contents to be zoomed, simply resize the panel here +// currently only Flipbook and Color Model panels support resizing of contents +void TPanel::zoomContentsAndFitGeometry(bool forward) { + if (!m_floating) return; + + auto getScreen = [&]() { + QScreen *ret = nullptr; + ret = QGuiApplication::screenAt(geometry().topLeft()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().topRight()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().center()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().bottomLeft()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().bottomRight()); + return ret; + }; + + // Get screen geometry + QScreen *screen = getScreen(); + if (!screen) return; + QRect screenGeom = screen->availableGeometry(); + + QSize newSize; + if (forward) + // x1.2 scale + newSize = QSize(width() * 6 / 5, height() * 6 / 5); + else + // 1/1.2 scale + newSize = QSize(width() * 5 / 6, height() * 5 / 6); + + QRect newGeom(geometry().topLeft(), newSize); + if (!screenGeom.contains(newGeom)) { + if (newGeom.width() > screenGeom.width()) + newGeom.setWidth(screenGeom.width()); + if (newGeom.right() > screenGeom.right()) + newGeom.moveRight(screenGeom.right()); + else if (newGeom.left() < screenGeom.left()) + newGeom.moveLeft(screenGeom.left()); + + if (newGeom.height() > screenGeom.height()) + newGeom.setHeight(screenGeom.height()); + if (newGeom.bottom() > screenGeom.bottom()) + newGeom.moveBottom(screenGeom.bottom()); + else if (newGeom.top() < screenGeom.top()) + newGeom.moveTop(screenGeom.top()); + } + setGeometry(newGeom); +} + //============================================================================= // TPanelTitleBarButton //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/pane.h b/toonz/sources/toonz/pane.h index bbdb0bf..6cd40bc 100644 --- a/toonz/sources/toonz/pane.h +++ b/toonz/sources/toonz/pane.h @@ -237,6 +237,7 @@ public: }; virtual void restoreFloatingPanelState(); + virtual void zoomContentsAndFitGeometry(bool forward); protected: void paintEvent(QPaintEvent *) override; diff --git a/toonz/sources/toonz/tpanels.cpp b/toonz/sources/toonz/tpanels.cpp index 0fabc4a..70d1082 100644 --- a/toonz/sources/toonz/tpanels.cpp +++ b/toonz/sources/toonz/tpanels.cpp @@ -97,6 +97,7 @@ // Qt includes #include +#include //============================================================================= // XsheetViewer @@ -1039,7 +1040,51 @@ OpenFloatingPanel openToolOptionsCommand(MI_OpenToolOptionBar, "ToolOptions", // FlipbookFactory //----------------------------------------------------------------------------- -FlipbookPanel::FlipbookPanel(QWidget *parent) : TPanel(parent) { +void FlipbookBasePanel::zoomContentsAndFitGeometry(bool forward) { + if (!isFloating()) return; + if (!m_flipbook->getImageViewer()->getImage()) { + TPanel::zoomContentsAndFitGeometry(forward); + return; + } + // resize the window leaving the top-left corner position unchanged + // in order to gain consistency with Photoshop + auto getScreen = [&]() { + QScreen *ret = nullptr; + ret = QGuiApplication::screenAt(geometry().topLeft()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().topRight()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().center()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().bottomLeft()); + if (ret) return ret; + ret = QGuiApplication::screenAt(geometry().bottomRight()); + return ret; + }; + // Get screen geometry + QScreen *screen = getScreen(); + if (!screen) return; + QRect screenGeom = screen->availableGeometry(); + QPoint oldTopLeft = geometry().topLeft(); + + m_flipbook->zoomAndAdaptGeometry(forward); + + QRect newGeom(geometry()); + newGeom.moveTopLeft(oldTopLeft); + if (newGeom.right() > screenGeom.right()) + newGeom.moveRight(screenGeom.right()); + else if (newGeom.left() < screenGeom.left()) + newGeom.moveLeft(screenGeom.left()); + if (newGeom.bottom() > screenGeom.bottom()) + newGeom.moveBottom(screenGeom.bottom()); + else if (newGeom.top() < screenGeom.top()) + newGeom.moveTop(screenGeom.top()); + setGeometry(newGeom); +} + +//----------------------------------------------------------------------------- + +FlipbookPanel::FlipbookPanel(QWidget *parent) : FlipbookBasePanel(parent) { m_flipbook = new FlipBook(this); setWidget(m_flipbook); // minimize button and safearea toggle @@ -1216,10 +1261,18 @@ public: class ColorModelViewerFactory final : public TPanelFactory { public: ColorModelViewerFactory() : TPanelFactory("ColorModel") {} - void initialize(TPanel *panel) override { - panel->setWidget(new ColorModelViewer(panel)); - panel->resize(400, 300); + + TPanel *createPanel(QWidget *parent) override { + FlipbookBasePanel *panel = new FlipbookBasePanel(parent); + ColorModelViewer *colorModel = new ColorModelViewer(panel); + panel->setWidget(colorModel); + panel->setFlipbook(colorModel); + panel->setObjectName(getPanelType()); + panel->setWindowTitle(getPanelType()); + return panel; } + + void initialize(TPanel *panel) override { assert(0); } } colorModelViewerFactory; //============================================================================= @@ -1550,3 +1603,26 @@ public: OpenFloatingPanel openVectorGuidedDrawingPanelCommand( MI_OpenGuidedDrawingControls, "VectorGuidedDrawingPanel", QObject::tr("Vector Guided Drawing")); + +//----------------------------------------------------------------------------- + +namespace { + +void zoomAndFitPanel(bool forward) { + TPanel *panel = dynamic_cast(qApp->activeWindow()); + if (panel) panel->zoomContentsAndFitGeometry(forward); +} + +} // namespace + +class ZoomInAndFitPanel final : public MenuItemHandler { +public: + ZoomInAndFitPanel() : MenuItemHandler("MI_ZoomInAndFitPanel") {} + void execute() override { zoomAndFitPanel(true); } +} zoomInAndFitPanel; + +class ZoomOutAndFitPanel final : public MenuItemHandler { +public: + ZoomOutAndFitPanel() : MenuItemHandler("MI_ZoomOutAndFitPanel") {} + void execute() override { zoomAndFitPanel(false); } +} zoomOutAndFitPanel; \ No newline at end of file diff --git a/toonz/sources/toonz/tpanels.h b/toonz/sources/toonz/tpanels.h index 35a8eb7..c06bc53 100644 --- a/toonz/sources/toonz/tpanels.h +++ b/toonz/sources/toonz/tpanels.h @@ -249,11 +249,21 @@ public: //========================================================= // FlipbookPanel //--------------------------------------------------------- - -class FlipbookPanel final : public TPanel { +// share the base class between Flipbook and Color Model panels +class FlipbookBasePanel : public TPanel { Q_OBJECT +protected: FlipBook *m_flipbook; +public: + FlipbookBasePanel(QWidget *parent) : TPanel(parent) {} + void zoomContentsAndFitGeometry(bool forward) override; + void setFlipbook(FlipBook *fb) { m_flipbook = fb; } +}; + +class FlipbookPanel final : public FlipbookBasePanel { + Q_OBJECT + QSize m_floatingSize; TPanelTitleBarButton *m_button;