diff --git a/src/common/style/vars.scss b/src/common/style/vars.scss index 31adbe904dbc41ff076f74b0bf36b2c455664a38..769c67b8535a86f5034618363581d41097af810d 100644 --- a/src/common/style/vars.scss +++ b/src/common/style/vars.scss @@ -3,6 +3,10 @@ $primary-color: red; $desk-background1: rgba(32, 32, 32, 0.75); $desk-background2: rgba(255, 255, 255, 0.1); +$right-mouse-menu-background: rgba(32, 32, 32, 0.75); +$right-mouse-menu-width: 220px; +$right-mouse-menu-height: 184px; + $hover-background1: rgba(255, 255, 255, 0.25); $hover-background2: rgba(255, 255, 255, 0.15); @@ -22,5 +26,7 @@ $start-menu-height: 550px; $view-border-color: #555; :export { - startToolsBarHeight: $start-tools-bar-height + startToolsBarHeight: $start-tools-bar-height; + rightMouseMenuWidth: $right-mouse-menu-width; + rightMouseMenuHeight: $right-mouse-menu-height; } diff --git a/src/pages/desktop/Desk/index.tsx b/src/pages/desktop/Desk/index.tsx index d2b020c810be4d4ae78eda387f2f15d93fafd0f3..62c7198e6b4b998adaed198b3c2d0ddc0ae39b9a 100644 --- a/src/pages/desktop/Desk/index.tsx +++ b/src/pages/desktop/Desk/index.tsx @@ -10,6 +10,9 @@ const Desk: React.FC = () => { const setStartMenuList = useStore((state: MyState) => state.setStartMenuList) const setUserInfo = useStore((state: MyState) => state.setUserInfo) const setRoleInfo = useStore((state: MyState) => state.setRoleInfo) + const openRightMouseMenu = useStore( + (state: MyState) => state.openRightMouseMenu + ) React.useEffect(() => { getUserInfo(res => { const { data } = res @@ -22,6 +25,11 @@ const Desk: React.FC = () => { return (
{ + event.stopPropagation() + event.preventDefault() + openRightMouseMenu(event) + }} style={{ backgroundImage: `url(${backgroundImg})` }}>
diff --git a/src/pages/desktop/Mask/index.tsx b/src/pages/desktop/Mask/index.tsx index e9070ea28c79c208f937518d57fce19ed8a393c3..d0f929d2f9b36bf103d524524a4e18346d4e21a4 100644 --- a/src/pages/desktop/Mask/index.tsx +++ b/src/pages/desktop/Mask/index.tsx @@ -4,11 +4,29 @@ import useStore, { MyState } from '@/store' const Mask: React.FC = () => { const setShowStartMenu = useStore((state: MyState) => state.setShowStartMenu) + const rightMouseMenu = useStore((state: MyState) => state.rightMouseMenu) + const closeRightMouseMenu = useStore( + (state: MyState) => state.closeRightMouseMenu + ) + const openRightMouseMenu = useStore( + (state: MyState) => state.openRightMouseMenu + ) + const showStartMenu = useStore((state: MyState) => state.showStartMenu) return (
{ + event.stopPropagation() + event.preventDefault() + showStartMenu && setShowStartMenu(false) + openRightMouseMenu(event) + }} + style={{ + display: showStartMenu || rightMouseMenu.show ? 'block' : 'none' + }} onClick={() => { - setShowStartMenu(false) + showStartMenu && setShowStartMenu(false) + rightMouseMenu.show && closeRightMouseMenu() }} /> ) diff --git a/src/pages/desktop/RightMouseMenu/index.module.scss b/src/pages/desktop/RightMouseMenu/index.module.scss new file mode 100644 index 0000000000000000000000000000000000000000..3eeeaada7111043957f444e8262586783fae99ba --- /dev/null +++ b/src/pages/desktop/RightMouseMenu/index.module.scss @@ -0,0 +1,38 @@ +.rightMouseMenuBox { + position: absolute; + z-index: 10002; + border: 1px solid #555; + border-radius: 3px; + width: $right-mouse-menu-width; + height: $right-mouse-menu-height; + background: $right-mouse-menu-background; + backdrop-filter: saturate(3) blur(20px); +} + +.item { + display: flex; + padding: 4px 15px; + cursor: pointer; + user-select: none; + + &:hover { + background: $hover-background2; + } +} + +.name { + display: flex; + flex-grow: 1; +} + +.bottom { + border-bottom: 1px solid #555; +} + +.icon { + margin-right: 12px; +} + +.keyboard { + color: #666; +} diff --git a/src/pages/desktop/RightMouseMenu/index.tsx b/src/pages/desktop/RightMouseMenu/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6b1c5437b6b39999df6a9d83bd7438b501e1eb84 --- /dev/null +++ b/src/pages/desktop/RightMouseMenu/index.tsx @@ -0,0 +1,86 @@ +import React from 'react' +import { + RedoOutlined, + SortAscendingOutlined, + PictureOutlined, + UserOutlined, + FieldTimeOutlined, + SettingOutlined +} from '@ant-design/icons' +import styles from './index.module.scss' +import classnames from 'classnames' +import useStore, { MyState } from '@/store' + +const RightMouseMenu: React.FC = () => { + const rightMouseMenu = useStore((state: MyState) => state.rightMouseMenu) + const closeRightMouseMenu = useStore( + (state: MyState) => state.closeRightMouseMenu + ) + return ( +
closeRightMouseMenu()}> +
+
+
+ +
+ 按日期排序 +
+
+
+
+
+ +
+ 按名称排序 +
+
+
{ + window.location.reload() + }}> +
+
+ +
+ 刷新 +
+
F5
+
+
+
+
+ +
+ 设置 +
+
+
+
+
+ +
+ 个人中心 +
+
+
+
+
+ +
+ 自定义背景 +
+
+
+ ) +} + +export default RightMouseMenu diff --git a/src/pages/desktop/StartMenu/index.tsx b/src/pages/desktop/StartMenu/index.tsx index 8b9116e922a2489fbef6ddc687b4eddce342c990..4e09daf76abec4dfca85beca8d3f30c6fb3e673e 100644 --- a/src/pages/desktop/StartMenu/index.tsx +++ b/src/pages/desktop/StartMenu/index.tsx @@ -5,7 +5,12 @@ import Application from './Application' const StartMenu: React.FC = () => { return ( -
+
{ + event.stopPropagation() + event.preventDefault() + }} + className={styles.startMenuBox}>
diff --git a/src/pages/desktop/StartToolsBar/DateTime/index.module.scss b/src/pages/desktop/StartToolsBar/DateTime/index.module.scss index 6ca657b20d87141439f88f34175cb275c4f670d5..b1dd2cee2def96e6b4d3d0981093655572a1da07 100644 --- a/src/pages/desktop/StartToolsBar/DateTime/index.module.scss +++ b/src/pages/desktop/StartToolsBar/DateTime/index.module.scss @@ -5,3 +5,20 @@ font-weight: lighter; user-select: none; } + +.timeBox { + display: flex; +} + +.time { + font-size: 13px; +} + +.week { + margin-left: 4px; + font-size: 12px; +} + +.date { + font-size: 12px; +} diff --git a/src/pages/desktop/StartToolsBar/DateTime/index.tsx b/src/pages/desktop/StartToolsBar/DateTime/index.tsx index 2fd42d91da4e91dace1a05053bd41f98aa253026..c979c316dffa069a044b83d2bbc48238d95aa647 100644 --- a/src/pages/desktop/StartToolsBar/DateTime/index.tsx +++ b/src/pages/desktop/StartToolsBar/DateTime/index.tsx @@ -53,9 +53,22 @@ const DateTime: React.FC = () => { } }) return ( -
-
{`${dataTime.hour}:${dataTime.minute} 周${dataTime.week}`}
-
{`${dataTime.year}/${dataTime.month}/${dataTime.day}`}
+
{ + event.stopPropagation() + event.preventDefault() + }}> +
+
+ {`${dataTime.hour}:${dataTime.minute}`} +
+
{`周${dataTime.week}`}
+
+
{`${dataTime.year}/${dataTime.month}/${dataTime.day}`}
) } diff --git a/src/pages/desktop/StartToolsBar/WindonBar/index.tsx b/src/pages/desktop/StartToolsBar/WindonBar/index.tsx index 52cd93e786c676c9f7a0168ef57b9130ffbf3e4d..fe3a268d1c9feb85be5f6b8028ee7d6f0a3d9b97 100644 --- a/src/pages/desktop/StartToolsBar/WindonBar/index.tsx +++ b/src/pages/desktop/StartToolsBar/WindonBar/index.tsx @@ -13,7 +13,12 @@ const WindowBar: React.FC = () => { ) const closeWindow = useStore((state: MyState) => state.closeWindow) return ( -
+
{ + event.stopPropagation() + event.preventDefault() + }}> {windowList.map(window => (
{ const setShowStartMenu = useStore((state: MyState) => state.setShowStartMenu) + const closeRightMouseMenu = useStore( + (state: MyState) => state.closeRightMouseMenu + ) + const rightMouseMenu = useStore((state: MyState) => state.rightMouseMenu) const toggleShowStartMenu = useStore( (state: MyState) => state.toggleShowStartMenu ) return (
setShowStartMenu(false)}> + onClick={() => { + setShowStartMenu(false) + rightMouseMenu.show && closeRightMouseMenu() + }}>
{ event.stopPropagation() event.preventDefault() + rightMouseMenu.show && closeRightMouseMenu() toggleShowStartMenu() }}> startLogo diff --git a/src/pages/desktop/index.tsx b/src/pages/desktop/index.tsx index 91c1cfa1ba63d804742f435c04ef78e05d8e7ae6..8bdd2a0c4ee5cc258884d45743feac8c36e7d450 100644 --- a/src/pages/desktop/index.tsx +++ b/src/pages/desktop/index.tsx @@ -6,6 +6,7 @@ import styles from './index.module.scss' import StartMenu from './StartMenu' import Mask from './Mask' import Window from './Window' +import RightMouseMenu from './RightMouseMenu' const Desktop: React.FC = () => { const showStartMenu = useStore((state: MyState) => state.showStartMenu) @@ -18,7 +19,8 @@ const Desktop: React.FC = () => { ))} {showStartMenu && } - {showStartMenu && } + +
) } diff --git a/src/store/deskSlice.ts b/src/store/deskSlice.ts index 73fc88364aa5b5ac2f0612f0897e004c84ce2238..b5d2cdec9c8a621a345398a596b99ddd914f699e 100644 --- a/src/store/deskSlice.ts +++ b/src/store/deskSlice.ts @@ -1,6 +1,9 @@ +import React from 'react' import { StoreApi } from 'zustand' import { MyState } from './index' import { Image } from '@/components/ImageComponent' +import getId from '@utils/getId' +import vars from '@/common/style/vars.scss' export interface App { id: number @@ -15,9 +18,19 @@ export interface OpenWith { name?: string } +export interface RightMouseMenu { + id: string + show: boolean + top?: number + left?: number +} + export interface DeskSlice { appList: App[] setAppList: (value: App[]) => void + rightMouseMenu: RightMouseMenu + openRightMouseMenu: (event: React.MouseEvent) => void + closeRightMouseMenu: () => void } const deskSlice = ( @@ -27,6 +40,38 @@ const deskSlice = ( appList: [] as App[], setAppList: (value: App[]) => { set(() => ({ appList: value })) + }, + rightMouseMenu: { + id: getId(), + show: false + }, + openRightMouseMenu: (event: React.MouseEvent) => { + set(({ rightMouseMenu }) => { + const menu: RightMouseMenu = { + ...rightMouseMenu, + show: true, + top: event.clientY, + left: event.clientX + } + if ( + document.body.clientWidth < + event.clientX + parseInt(vars.rightMouseMenuWidth) + ) { + menu.left = event.clientX - parseInt(vars.rightMouseMenuWidth) + } + if ( + document.body.clientHeight - parseInt(vars.startToolsBarHeight) < + event.clientY + parseInt(vars.rightMouseMenuHeight) + ) { + menu.top = event.clientY - parseInt(vars.rightMouseMenuHeight) + } + return { rightMouseMenu: menu } + }) + }, + closeRightMouseMenu: () => { + set(({ rightMouseMenu }) => ({ + rightMouseMenu: { ...rightMouseMenu, show: false } + })) } })