1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Fix double-clicking and dragging of window from top bar

Co-authored-by: Mikko Aspiala <mikko.aspiala@gmail.com>

Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
Janne Savolainen 2022-08-17 15:14:36 +03:00
parent 76991b59e6
commit 2d97f2313b
No known key found for this signature in database
GPG Key ID: 8C6CFB2FFFE8F68A
12 changed files with 103 additions and 65 deletions

View File

@ -4,7 +4,7 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import topBarItemInjectionToken from "../../../../../../renderer/components/layout/top-bar/top-bar-items/top-bar-item-injection-token";
import { topBarItemOnRightSideInjectionToken } from "../../../../../../renderer/components/layout/top-bar/top-bar-items/top-bar-item-injection-token";
import { UpdateButton } from "./update-button";
import updateWarningLevelInjectable from "./update-warning-level.injectable";
@ -22,7 +22,7 @@ const updateApplicationTopBarItemInjectable = getInjectable({
};
},
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnRightSideInjectionToken,
});
export default updateApplicationTopBarItemInjectable;

View File

@ -7,7 +7,7 @@ import { reject } from "lodash/fp";
import { extensionRegistratorInjectionToken } from "../../../../extensions/extension-loader/extension-registrator-injection-token";
import type { LensRendererExtension } from "../../../../extensions/lens-renderer-extension";
import { pipeline } from "@ogre-tools/fp";
import topBarItemInjectionToken from "../../../../renderer/components/layout/top-bar/top-bar-items/top-bar-item-injection-token";
import { topBarItemOnRightSideInjectionToken } from "../../../../renderer/components/layout/top-bar/top-bar-items/top-bar-item-injection-token";
import { computed } from "mobx";
const legacyExtensionApiRegistratorForTopBarItemsInjectable = getInjectable({
@ -28,7 +28,7 @@ const legacyExtensionApiRegistratorForTopBarItemsInjectable = getInjectable({
return getInjectable({
id,
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnRightSideInjectionToken,
instantiate: () => ({
id,

View File

@ -7,7 +7,7 @@ import isLinuxInjectable from "../../../../../../common/vars/is-linux.injectable
import isWindowsInjectable from "../../../../../../common/vars/is-windows.injectable";
import { computed } from "mobx";
import { ContextMenu } from "./context-menu";
import topBarItemInjectionToken from "../top-bar-item-injection-token";
import { topBarItemOnLeftSideInjectionToken } from "../top-bar-item-injection-token";
const contextMenuTopBarItemInjectable = getInjectable({
id: "context-menu-top-bar-item",
@ -24,7 +24,7 @@ const contextMenuTopBarItemInjectable = getInjectable({
};
},
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnLeftSideInjectionToken,
});
export default contextMenuTopBarItemInjectable;

View File

@ -4,7 +4,7 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import topBarItemInjectionToken from "../top-bar-item-injection-token";
import { topBarItemOnLeftSideInjectionToken } from "../top-bar-item-injection-token";
import { NavigationToBack } from "./navigation-to-back";
const navigationToBackTopBarItemInjectable = getInjectable({
@ -17,7 +17,7 @@ const navigationToBackTopBarItemInjectable = getInjectable({
Component: NavigationToBack,
}),
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnLeftSideInjectionToken,
});
export default navigationToBackTopBarItemInjectable;

View File

@ -4,8 +4,8 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import topBarItemInjectionToken from "../top-bar-item-injection-token";
import { NavigationToForward } from "./navigation-to-forward";
import { topBarItemOnLeftSideInjectionToken } from "../top-bar-item-injection-token";
const navigationToForwardTopBarItemInjectable = getInjectable({
id: "navigation-to-forward-top-bar-item",
@ -17,7 +17,7 @@ const navigationToForwardTopBarItemInjectable = getInjectable({
Component: NavigationToForward,
}),
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnLeftSideInjectionToken,
});
export default navigationToForwardTopBarItemInjectable;

View File

@ -4,8 +4,8 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import topBarItemInjectionToken from "../top-bar-item-injection-token";
import { NavigationToHome } from "./navigation-to-home";
import { topBarItemOnLeftSideInjectionToken } from "../top-bar-item-injection-token";
const navigationToHomeTopBarItemInjectable = getInjectable({
id: "navigation-to-home-top-bar-item",
@ -17,7 +17,7 @@ const navigationToHomeTopBarItemInjectable = getInjectable({
Component: NavigationToHome,
}),
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnLeftSideInjectionToken,
});
export default navigationToHomeTopBarItemInjectable;

View File

@ -13,8 +13,10 @@ export interface TopBarItem {
Component: React.ComponentType;
}
const topBarItemInjectionToken = getInjectionToken<TopBarItem>({
id: "top-bar-item-injection-token",
export const topBarItemOnRightSideInjectionToken = getInjectionToken<TopBarItem>({
id: "top-bar-item-on-right-side-injection-token",
});
export default topBarItemInjectionToken;
export const topBarItemOnLeftSideInjectionToken = getInjectionToken<TopBarItem>({
id: "top-bar-item-on-left-side-injection-token",
});

View File

@ -7,15 +7,15 @@ import { getInjectable } from "@ogre-tools/injectable";
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
import { filter, sortBy } from "lodash/fp";
import { computed } from "mobx";
import topBarItemInjectionToken from "./top-bar-item-injection-token";
import { topBarItemOnLeftSideInjectionToken } from "./top-bar-item-injection-token";
const topBarItemsInjectable = getInjectable({
id: "top-bar-items",
const topBarItemsOnLeftSideInjectable = getInjectable({
id: "top-bar-items-on-left-side",
instantiate: (di) => {
const computedInjectMany = di.inject(computedInjectManyInjectable);
const items = computedInjectMany(topBarItemInjectionToken);
const items = computedInjectMany(topBarItemOnLeftSideInjectionToken);
return computed(() =>
pipeline(
@ -27,4 +27,4 @@ const topBarItemsInjectable = getInjectable({
},
});
export default topBarItemsInjectable;
export default topBarItemsOnLeftSideInjectable;

View File

@ -0,0 +1,30 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { pipeline } from "@ogre-tools/fp";
import { getInjectable } from "@ogre-tools/injectable";
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
import { filter, sortBy } from "lodash/fp";
import { computed } from "mobx";
import { topBarItemOnRightSideInjectionToken } from "./top-bar-item-injection-token";
const topBarItemsOnRightSideInjectable = getInjectable({
id: "top-bar-items-on-right-side",
instantiate: (di) => {
const computedInjectMany = di.inject(computedInjectManyInjectable);
const items = computedInjectMany(topBarItemOnRightSideInjectionToken);
return computed(() =>
pipeline(
items.get(),
filter((item) => item.isShown.get()),
sortBy(item => item.orderNumber),
),
);
},
});
export default topBarItemsOnRightSideInjectable;

View File

@ -4,7 +4,7 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import topBarItemInjectionToken from "../top-bar-item-injection-token";
import { topBarItemOnRightSideInjectionToken } from "../top-bar-item-injection-token";
import { WindowControls } from "./window-controls";
import isWindowsInjectable from "../../../../../../common/vars/is-windows.injectable";
import isLinuxInjectable from "../../../../../../common/vars/is-linux.injectable";
@ -18,13 +18,13 @@ const windowControlsTopBarItemInjectable = getInjectable({
return ({
id: "window-controls",
orderNumber: 110,
orderNumber: 900,
isShown: computed(() => (isWindows || isLinux)),
Component: WindowControls,
});
},
injectionToken: topBarItemInjectionToken,
injectionToken: topBarItemOnRightSideInjectionToken,
});
export default windowControlsTopBarItemInjectable;

View File

@ -4,13 +4,10 @@
*/
.topBar {
display: flex;
background-color: var(--layoutBackground);
z-index: 2;
width: 100%;
grid-area: topbar;
height: var(--main-layout-header);
justify-content: space-between;
/* Use topbar as draggable region */
user-select: none;
@ -18,26 +15,20 @@
}
.topBar .items {
justify-content: space-between;
align-items: center;
display: flex;
height: 100%;
padding-left: calc(var(--padding) * 2);
padding-right: calc(var(--padding) * 2);
}
.preventedDragging {
-webkit-app-region: no-drag;
}
&:first-of-type {
padding-left: calc(var(--padding) * 2);
& > *:not(:empty) {
margin-right: calc(var(--padding) * 1.5);
}
}
&:last-of-type {
padding-right: calc(var(--padding) * 2);
& > *:not(:empty) {
margin-left: calc(var(--padding) * 1.5);
}
}
.separator {
flex-basis: 100%;
}
:global(.is-mac) .topBar {

View File

@ -4,51 +4,52 @@
*/
import styles from "./top-bar.module.scss";
import React, { useEffect, useRef } from "react";
import React, { useEffect } from "react";
import { observer } from "mobx-react";
import type { IComputedValue } from "mobx";
import { withInjectables } from "@ogre-tools/injectable-react";
import toggleMaximizeWindowInjectable from "./toggle-maximize-window/toggle-maximize-window.injectable";
import watchHistoryStateInjectable from "../../../remote-helpers/watch-history-state.injectable";
import topBarItemsInjectable from "./top-bar-items/top-bar-items.injectable";
import topBarItemsOnRightSideInjectable from "./top-bar-items/top-bar-items-on-right-side.injectable";
import type { TopBarItem } from "./top-bar-items/top-bar-item-injection-token";
import welcomeRouteInjectable from "../../../../common/front-end-routing/routes/welcome/welcome-route.injectable";
import navigateToWelcomeInjectable from "../../../../common/front-end-routing/routes/welcome/navigate-to-welcome.injectable";
import { Map } from "../../map/map";
import Gutter from "../../gutter/gutter";
import topBarItemsOnLeftSideInjectable from "./top-bar-items/top-bar-items-on-left-side.injectable";
interface Dependencies {
items: IComputedValue<TopBarItem[]>;
itemsOnLeft: IComputedValue<TopBarItem[]>;
itemsOnRight: IComputedValue<TopBarItem[]>;
toggleMaximizeWindow: () => void;
watchHistoryState: () => () => void;
}
const NonInjectedTopBar = observer(
({
items,
itemsOnLeft,
itemsOnRight,
toggleMaximizeWindow,
watchHistoryState,
}: Dependencies) => {
const elem = useRef<HTMLDivElement | null>(null);
const windowSizeToggle = (evt: React.MouseEvent) => {
if (elem.current === evt.target) {
toggleMaximizeWindow();
}
};
useEffect(() => watchHistoryState(), []);
return (
<div
className={styles.topBar}
onDoubleClick={windowSizeToggle}
ref={elem}
>
<div className={styles.topBar} onDoubleClick={toggleMaximizeWindow}>
<div className={styles.items}>
{items.get().map((item) => {
const Component = item.Component;
<Map
items={itemsOnLeft.get()}
getSeparator={() => <Gutter size="sm" />}
>
{toItemWhichWorksWithWindowDraggingAndDoubleClicking}
</Map>
return <Component key={item.id} />;
})}
<div className={styles.separator} />
<Map
items={itemsOnRight.get()}
getSeparator={() => <Gutter size="sm" />}
>
{toItemWhichWorksWithWindowDraggingAndDoubleClicking}
</Map>
</div>
</div>
);
@ -57,8 +58,22 @@ const NonInjectedTopBar = observer(
export const TopBar = withInjectables<Dependencies>(NonInjectedTopBar, {
getProps: (di) => ({
items: di.inject(topBarItemsInjectable),
itemsOnLeft: di.inject(topBarItemsOnLeftSideInjectable),
itemsOnRight: di.inject(topBarItemsOnRightSideInjectable),
toggleMaximizeWindow: di.inject(toggleMaximizeWindowInjectable),
watchHistoryState: di.inject(watchHistoryStateInjectable),
}),
});
const toItemWhichWorksWithWindowDraggingAndDoubleClicking = (
item: TopBarItem,
) => (
<div
className={styles.preventedDragging}
onDoubleClick={(event) => {
return event.stopPropagation();
}}
>
<item.Component />
</div>
);