From 06c88c92720a72f8f9bee958dce50a7f675ec28f Mon Sep 17 00:00:00 2001 From: Pavlo Legkyi Date: Wed, 5 Feb 2025 18:21:06 +0100 Subject: [PATCH] feature: Zoom Widget for more visual screen scale change Refs #1326 --- desktop-app/src/renderer/AppContent.tsx | 2 + .../components/ToolBar/Menu/Flyout/Zoom.tsx | 4 +- .../components/ZoomWidget/ZoomWidget.tsx | 60 +++++++++++++++++++ .../renderer/store/features/renderer/index.ts | 11 ++++ 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 desktop-app/src/renderer/components/ZoomWidget/ZoomWidget.tsx diff --git a/desktop-app/src/renderer/AppContent.tsx b/desktop-app/src/renderer/AppContent.tsx index 88a63adbb..273ca67b5 100644 --- a/desktop-app/src/renderer/AppContent.tsx +++ b/desktop-app/src/renderer/AppContent.tsx @@ -13,6 +13,7 @@ import KeyboardShortcutsManager from './components/KeyboardShortcutsManager'; import { ReleaseNotes } from './components/ReleaseNotes'; import { Sponsorship } from './components/Sponsorship'; import { AboutDialog } from './components/AboutDialog'; +import { ZoomWidget } from './components/ZoomWidget/ZoomWidget'; if ((navigator as any).userAgentData.platform === 'Windows') { import('./titlebar-styles.css'); @@ -23,6 +24,7 @@ const Browser = () => {
+
); }; diff --git a/desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Zoom.tsx b/desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Zoom.tsx index 5f46f658e..4f237de65 100644 --- a/desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Zoom.tsx +++ b/desktop-app/src/renderer/components/ToolBar/Menu/Flyout/Zoom.tsx @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, ReactNode } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import Button from 'renderer/components/Button'; import useKeyboardShortcut, { @@ -11,7 +11,7 @@ import { } from 'renderer/store/features/renderer'; interface ZoomButtonProps { - children: React.ReactNode; + children: ReactNode; onClick: () => void; } diff --git a/desktop-app/src/renderer/components/ZoomWidget/ZoomWidget.tsx b/desktop-app/src/renderer/components/ZoomWidget/ZoomWidget.tsx new file mode 100644 index 000000000..51cb77fb0 --- /dev/null +++ b/desktop-app/src/renderer/components/ZoomWidget/ZoomWidget.tsx @@ -0,0 +1,60 @@ +import { useState, useEffect, FC } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; + +import { selectZoomFactor, zoomReset } from 'renderer/store/features/renderer'; +import { Icon } from '@iconify/react'; +import cx from 'classnames'; + +interface ZoomWidgetProps { + className?: string; +} + +let timeout = setTimeout(() => {}, 0); + +export const ZoomWidget: FC = ({ className = '' }) => { + const zoomfactor = useSelector(selectZoomFactor); + const [isVisible, setIsVisible] = useState(false); + const dispatch = useDispatch(); + + useEffect(() => { + if (zoomfactor === 1) { + setIsVisible(false); + } else { + clearTimeout(timeout); + setIsVisible(true); + timeout = setTimeout(() => { + setIsVisible(false); + }, 5000); + } + + return () => { + clearTimeout(timeout); + }; + }, [zoomfactor]); + + const resetZoom = () => dispatch(zoomReset()); + + if (isVisible) + return ( + + ); + + return null; +}; diff --git a/desktop-app/src/renderer/store/features/renderer/index.ts b/desktop-app/src/renderer/store/features/renderer/index.ts index 14e5b0c05..38b4c23b9 100644 --- a/desktop-app/src/renderer/store/features/renderer/index.ts +++ b/desktop-app/src/renderer/store/features/renderer/index.ts @@ -23,6 +23,7 @@ export interface RendererState { const zoomSteps = [ 0.25, 0.33, 0.5, 0.55, 0.67, 0.75, 0.8, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, ]; +const zoomDefaultStep = 8; const urlFromQueryParam = () => { const params = new URLSearchParams(window.location.search); @@ -116,6 +117,15 @@ export const rendererSlice = createSlice({ } } }, + zoomReset: (state) => { + state.zoomFactor = zoomSteps[zoomDefaultStep]; + state.individualZoomFactor = zoomSteps[zoomDefaultStep]; + window.electron.store.set( + 'renderer.individualZoomStepIndex', + zoomDefaultStep + ); + window.electron.store.set('renderer.zoomStepIndex', zoomDefaultStep); + }, setRotate: (state, action: PayloadAction) => { state.rotate = action.payload; }, @@ -147,6 +157,7 @@ export const { setAddress, zoomIn, zoomOut, + zoomReset, setRotate, setIsInspecting, setLayout,