From fcbee8fd23cafc3ee83de417ce29deac9f8c6f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lasse=20K=C3=BCchler?= Date: Fri, 19 Jan 2018 23:52:39 +0100 Subject: [PATCH] feat(menu): add context menu for page elements fixes #111 --- src/component/container/element_list.tsx | 5 ++ src/component/container/element_wrapper.tsx | 4 +- src/electron/context-menus.ts | 58 +++++++++++++++++++++ src/lsg/patterns/element/index.tsx | 3 ++ src/lsg/patterns/list/index.tsx | 8 +-- 5 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 src/electron/context-menus.ts diff --git a/src/component/container/element_list.tsx b/src/component/container/element_list.tsx index 6a37083d1..c660e9865 100644 --- a/src/component/container/element_list.tsx +++ b/src/component/container/element_list.tsx @@ -1,3 +1,4 @@ +import { elementMenu } from '../../electron/context-menus'; import { ElementWrapper } from './element_wrapper'; import { ListItemProps } from '../../lsg/patterns/list'; import { createMenu } from '../../electron/menu'; @@ -45,6 +46,7 @@ export class ElementList extends React.Component { title={item.value} key={key} handleClick={item.onClick} + handleContextMenu={item.onContextMenu} active={item.active} handleDragStart={item.handleDragStart} handleDragDropForChild={item.handleDragDropForChild} @@ -93,6 +95,9 @@ export class ElementList extends React.Component { label: key, value: pattern.getName(), onClick: updatePageElement, + onContextMenu: () => { + elementMenu(this.props.store, element); + }, handleDragStart: (e: React.DragEvent) => { this.props.store.setRearrangeElement(element); }, diff --git a/src/component/container/element_wrapper.tsx b/src/component/container/element_wrapper.tsx index 1c8d3a9d4..3ed2ef41b 100644 --- a/src/component/container/element_wrapper.tsx +++ b/src/component/container/element_wrapper.tsx @@ -12,6 +12,7 @@ export interface ElementWrapperProps { open?: boolean; title: string; handleClick?: React.MouseEventHandler; + handleContextMenu?: React.MouseEventHandler; handleDragStart?: React.DragEventHandler; handleDragDrop?: React.DragEventHandler; handleDragDropForChild?: React.DragEventHandler; @@ -94,7 +95,7 @@ export class ElementWrapper extends React.Component { + store.setClipboardElement(element); + element.remove(); + } + }, + { + label: 'Copy Element', + click: () => { + store.setClipboardElement(element); + } + }, + { + label: 'Delete element', + click: () => { + element.remove(); + } + }, + { + type: 'separator' + }, + { + label: 'Paste element below', + enabled: Boolean(clipboardElement), + click: () => { + const newPageElement = clipboardElement && clipboardElement.clone(); + + if (newPageElement) { + element.addSibling(newPageElement); + } + } + }, + { + label: 'Paste element inside', + enabled: Boolean(clipboardElement), + click: () => { + const newPageElement = clipboardElement && clipboardElement.clone(); + + if (newPageElement) { + element.addChild(newPageElement); + } + } + } + ]; + + const menu = Menu.buildFromTemplate(template); + menu.popup(); +} diff --git a/src/lsg/patterns/element/index.tsx b/src/lsg/patterns/element/index.tsx index 8be77e3aa..3998dcf0e 100644 --- a/src/lsg/patterns/element/index.tsx +++ b/src/lsg/patterns/element/index.tsx @@ -13,6 +13,7 @@ export interface ElementProps { draggable?: boolean; handleClick?: React.MouseEventHandler; + handleContextMenu?: React.MouseEventHandler; handleIconClick?: React.MouseEventHandler; handleDragStart?: React.DragEventHandler; handleDragEnter?: React.DragEventHandler; @@ -142,6 +143,7 @@ const Element: React.StatelessComponent = props => { highlight, draggable, handleClick, + handleContextMenu, handleIconClick, handleDragStart, handleDragEnter, @@ -176,6 +178,7 @@ const Element: React.StatelessComponent = props => { active={active} highlight={highlight} onClick={handleClick} + onContextMenu={handleContextMenu} > {children && ( ; + onContextMenu?: React.MouseEventHandler; handleDragStart?: React.DragEventHandler; handleDragDrop?: React.DragEventHandler; handleDragDropForChild?: React.DragEventHandler; @@ -45,13 +46,14 @@ const StyledUl = styled.ul` const StyledLi = styled.li` line-height: 25px; list-style: none; - ${(props: StyledListItemProps) => (props.onClick ? 'cursor: pointer;' : '')} - ${(props: StyledListItemProps) => (props.active ? 'background: #def' : '')} + ${(props: StyledListItemProps) => (props.onClick ? 'cursor: pointer;' : '')} ${( + props: StyledListItemProps + ) => (props.active ? 'background: #def' : '')}; `; const StyledLabel = styled.span` color: ${colors.black.toString()}; - padding-right 4px; + padding-right: 4px; `; const StyledValue = styled.span`