diff --git a/src/apps/seelenweg/i18n/translations/en.yml b/src/apps/seelenweg/i18n/translations/en.yml index 188829c1..49cf42fc 100644 --- a/src/apps/seelenweg/i18n/translations/en.yml +++ b/src/apps/seelenweg/i18n/translations/en.yml @@ -11,6 +11,9 @@ app_menu: pin_to_right: Pin to Right run_as: Run as Administrator unpin: Unpin +context_menu: + reorder_disable: Lock taskbar + reorder_enable: Unlock taskbar media: not_playing: Nothing is playing media_menu: diff --git a/src/apps/seelenweg/modules/bar/index.tsx b/src/apps/seelenweg/modules/bar/index.tsx index e282e276..6237623d 100644 --- a/src/apps/seelenweg/modules/bar/index.tsx +++ b/src/apps/seelenweg/modules/bar/index.tsx @@ -64,6 +64,7 @@ export function SeelenWeg() { const settings = useSelector(Selectors.settings); const isOverlaped = useSelector(Selectors.isOverlaped); + let isReorderDisabled: boolean = useSelector(Selectors.reorderDisabled); const pinnedOnLeft = useSelector(Selectors.itemsOnLeft); const pinnedOnCenter = useSelector(Selectors.itemsOnCenter); const pinnedOnRight = useSelector(Selectors.itemsOnRight); @@ -162,7 +163,7 @@ export function SeelenWeg() { setAssociatedViewCounter((current) => calculateAssociatedViewCounter(current, isOpen)); }, []); - const projectSwItem = (item: SwItem) => ItemByType(item, shit); + const projectSwItem = (item: SwItem) => ItemByType(item, !isReorderDisabled, shit); return ( @@ -224,27 +225,27 @@ export function SeelenWeg() { ); } -function ItemByType(item: SwItem, callback: (isOpen: boolean) => void) { +function ItemByType(item: SwItem, drag: boolean, callback: (isOpen: boolean) => void) { if (item.type === WegItemType.Pinned) { if ( item.path.toLowerCase().endsWith('.exe') || item.relaunchCommand.toLowerCase().includes('.exe') ) { - return ; + return ; } return ; } if (item.type === WegItemType.Temporal) { - return ; + return ; } if (item.type === WegItemType.Media) { - return ; + return ; } if (item.type === WegItemType.StartMenu) { - return ; + return ; } return null; diff --git a/src/apps/seelenweg/modules/bar/menu.tsx b/src/apps/seelenweg/modules/bar/menu.tsx index 0de5efe8..748f5755 100644 --- a/src/apps/seelenweg/modules/bar/menu.tsx +++ b/src/apps/seelenweg/modules/bar/menu.tsx @@ -2,15 +2,18 @@ import { SeelenCommand } from '@seelen-ui/lib'; import { invoke } from '@tauri-apps/api/core'; import { ItemType } from 'antd/es/menu/interface'; import { TFunction } from 'i18next'; +import { useSelector } from 'react-redux'; import { store } from '../shared/store/infra'; import { dialog } from 'src/apps/settings/modules/shared/tauri/infra'; -import { RootActions } from '../shared/store/app'; +import { RootActions, Selectors } from '../shared/store/app'; import { Icon } from '../../../shared/components/Icon'; export function getSeelenWegMenu(t: TFunction, restrictedBar?: boolean): ItemType[] { + let isReorderDisabled: boolean = useSelector(Selectors.reorderDisabled); + if (!!restrictedBar) { return [ { @@ -32,6 +35,14 @@ export function getSeelenWegMenu(t: TFunction, restrictedBar?: boolean): ItemTyp ]; } else { return [ + { + key: 'reoder', + icon: , + label: t(!isReorderDisabled ? 'context_menu.reorder_disable' : 'context_menu.reorder_enable' ), + onClick() { + store.dispatch(RootActions.setWegReorderDisabled(!isReorderDisabled)); + }, + }, { key: 'add-media-module', label: t('taskbar_menu.media'), diff --git a/src/apps/seelenweg/modules/item/infra/DraggableItem.tsx b/src/apps/seelenweg/modules/item/infra/DraggableItem.tsx index e4337976..8e9ce77b 100644 --- a/src/apps/seelenweg/modules/item/infra/DraggableItem.tsx +++ b/src/apps/seelenweg/modules/item/infra/DraggableItem.tsx @@ -8,9 +8,10 @@ import { cx } from '../../../../shared/styles'; interface Props extends PropsWithChildren { item: SwItem; className?: String; + drag?: boolean; } -export function DraggableItem({ children, item, className }: Props) { +export function DraggableItem({ children, item, className, drag }: Props) { const ref = useRef(null); return ( @@ -18,7 +19,7 @@ export function DraggableItem({ children, item, className }: Props) { as="div" ref={ref} value={item} - drag + drag={drag} className={cx('weg-item-drag-container', className)} onDragStart={() => { ref.current?.classList.add('dragging'); diff --git a/src/apps/seelenweg/modules/item/infra/MediaSession.tsx b/src/apps/seelenweg/modules/item/infra/MediaSession.tsx index 3821665e..23bf1221 100644 --- a/src/apps/seelenweg/modules/item/infra/MediaSession.tsx +++ b/src/apps/seelenweg/modules/item/infra/MediaSession.tsx @@ -25,7 +25,7 @@ const MAX_LUMINANCE = 210; const MIN_LUMINANCE = 40; const BRIGHTNESS_MULTIPLIER = 1.5; // used in css -export function MediaSession({ item }: { item: MediaWegItem }) { +export function MediaSession({ item, drag }: { item: MediaWegItem; drag: boolean }) { const [luminance, setLuminance] = useState(0); const dockPosition = useSelector(Selectors.settings.position); @@ -61,7 +61,7 @@ export function MediaSession({ item }: { item: MediaWegItem }) { const isHorizontal = dockPosition === SeelenWegSide.Bottom || dockPosition === SeelenWegSide.Top; return ( - +
{ +export const StartMenu = memo(({ item, drag }: Props) => { const focused = useSelector(Selectors.focusedApp); const { t } = useTranslation(); @@ -28,7 +29,7 @@ export const StartMenu = memo(({ item }: Props) => { const isStartMenuOpen = startMenuExes.some((program) => (focused?.exe || '').endsWith(program)); return ( - +
void; } -export const UserApplication = memo(({ item, onAssociatedViewOpenChanged }: Props) => { +export const UserApplication = memo(({ item, drag, onAssociatedViewOpenChanged }: Props) => { const [openPreview, setOpenPreview] = useState(false); const [openContextMenu, setOpenContextMenu] = useState(false); const [blockUntil, setBlockUntil] = useState(moment(new Date())); @@ -88,6 +89,7 @@ export const UserApplication = memo(({ item, onAssociatedViewOpenChanged }: Prop return ( ) { + state.reorderDisabled = isDisabled.payload; + savePinnedItems(current(state)); + }, }, }); diff --git a/src/apps/seelenweg/modules/shared/store/domain.ts b/src/apps/seelenweg/modules/shared/store/domain.ts index 8771fbfd..f25d7040 100644 --- a/src/apps/seelenweg/modules/shared/store/domain.ts +++ b/src/apps/seelenweg/modules/shared/store/domain.ts @@ -34,6 +34,7 @@ export interface RootState extends IRootState { itemsOnLeft: SwItem[]; itemsOnCenter: SwItem[]; itemsOnRight: SwItem[]; + reorderDisabled: boolean; // ---------------------- focusedApp: FocusedApp | null; isOverlaped: boolean; diff --git a/src/apps/seelenweg/modules/shared/store/infra.ts b/src/apps/seelenweg/modules/shared/store/infra.ts index 60638814..dbe7e6be 100644 --- a/src/apps/seelenweg/modules/shared/store/infra.ts +++ b/src/apps/seelenweg/modules/shared/store/infra.ts @@ -112,6 +112,7 @@ function loadSettingsToStore(settings: Settings) { } function loadWegItemsToStore(items: WegItems) { + store.dispatch(RootActions.setReorderDisabled(items.inner.is_reorder_disabled)); store.dispatch(RootActions.setItemsOnLeft(items.inner.left)); store.dispatch(RootActions.setItemsOnCenter(items.inner.center)); store.dispatch(RootActions.setItemsOnRight(items.inner.right)); diff --git a/src/apps/seelenweg/modules/shared/store/storeApi.ts b/src/apps/seelenweg/modules/shared/store/storeApi.ts index a86b8237..5dbda2b3 100644 --- a/src/apps/seelenweg/modules/shared/store/storeApi.ts +++ b/src/apps/seelenweg/modules/shared/store/storeApi.ts @@ -16,6 +16,7 @@ export const savePinnedItems = debounce( }; const data = new WegItems({ + is_reorder_disabled: state.reorderDisabled, left: state.itemsOnLeft.filter(cb), center: state.itemsOnCenter.filter(cb), right: state.itemsOnRight.filter(cb), diff --git a/src/apps/toolbar/i18n/translations/en.yml b/src/apps/toolbar/i18n/translations/en.yml index 74869b55..f17b986d 100644 --- a/src/apps/toolbar/i18n/translations/en.yml +++ b/src/apps/toolbar/i18n/translations/en.yml @@ -2,6 +2,8 @@ context_menu: add_module: Add Module remove: Remove Module settings: Settings + reorder_disable: Lock toolbar + reorder_enable: Unlock toolbar task_manager: Task Manager media: device: diff --git a/src/apps/toolbar/modules/item/infra/Inner.tsx b/src/apps/toolbar/modules/item/infra/Inner.tsx index d780ffc2..4703ecb8 100644 --- a/src/apps/toolbar/modules/item/infra/Inner.tsx +++ b/src/apps/toolbar/modules/item/infra/Inner.tsx @@ -173,6 +173,8 @@ export function InnerItem(props: InnerItemProps) { } = props; const { template, tooltip, onClick: oldOnClick, onClickV2, style, id, badge } = module; + const structure = useSelector(Selectors.items); + const [mounted, setMounted] = React.useState(false); const env = useSelector(Selectors.env); @@ -226,6 +228,7 @@ export function InnerItem(props: InnerItemProps) { , + label: t(!items.isReorderDisabled ? 'context_menu.reorder_disable' : 'context_menu.reorder_enable' ), + onClick() { + dispatch(RootActions.setToolbarReorderDisabled(!items.isReorderDisabled)); + SaveToolbarItems(); + }, + }, + { + type: 'divider', + }, { key: 'task_manager', icon: , diff --git a/src/apps/toolbar/modules/main/infra.tsx b/src/apps/toolbar/modules/main/infra.tsx index 472b9fef..775c6851 100644 --- a/src/apps/toolbar/modules/main/infra.tsx +++ b/src/apps/toolbar/modules/main/infra.tsx @@ -112,6 +112,10 @@ export function ToolBar() { }, [isOverlaped, hideMode]); const onReorderPinned = useCallback((apps: (ToolbarItem | string)[]) => { + if (structure.isReorderDisabled) { + return; + } + let dividerStart = apps.indexOf(DividerStart); let dividerEnd = apps.indexOf(DividerEnd); diff --git a/src/apps/toolbar/modules/shared/store/app.ts b/src/apps/toolbar/modules/shared/store/app.ts index b1b32628..2b9a2f89 100644 --- a/src/apps/toolbar/modules/shared/store/app.ts +++ b/src/apps/toolbar/modules/shared/store/app.ts @@ -110,6 +110,12 @@ export const RootSlice = createSlice({ state.items.right = state.items.right.filter(filter); } }, + setToolbarReorderDisabled(state, action: PayloadAction) { + let enabled = action.payload; + if (state.items) { + state.items.isReorderDisabled = enabled; + } + }, }, }); diff --git a/src/background/state/application/toolbar_items.rs b/src/background/state/application/toolbar_items.rs index e08801c6..4ce4e90e 100644 --- a/src/background/state/application/toolbar_items.rs +++ b/src/background/state/application/toolbar_items.rs @@ -13,6 +13,7 @@ use super::FullState; impl FullState { fn initial_toolbar_items() -> Placeholder { Placeholder { + is_reorder_disabled: false, left: vec![ ToolbarItem2::Plugin("@default/user-folder".into()), ToolbarItem2::Inline(ToolbarItem::Text(TextToolbarItem {