diff --git a/modules/ui/components/Folder.jsx b/modules/ui/components/Folder.jsx index b408bbea..7fbcb922 100644 --- a/modules/ui/components/Folder.jsx +++ b/modules/ui/components/Folder.jsx @@ -26,7 +26,7 @@ export default class Folder extends React.Component{ let {title, closable, children} = this.props; return
- + {title}
{!this.isClosed() && children} diff --git a/modules/ui/components/Folder.less b/modules/ui/components/Folder.less index c99410c6..2455d72a 100644 --- a/modules/ui/components/Folder.less +++ b/modules/ui/components/Folder.less @@ -1,5 +1,17 @@ +@import "~ui/styles/theme"; + .root { + background-color: @bg-color-alt; } .title { + border-bottom: 1px solid @border-color; + background-color: @bg-color; + padding: 0.3rem 0.6rem; + line-height: 1.7; +} + +.handle { + font-size: 0.8rem; + color: @font-color-suppressed; } \ No newline at end of file diff --git a/modules/ui/components/Stack.jsx b/modules/ui/components/Stack.jsx index 9ef8655f..960abc1e 100644 --- a/modules/ui/components/Stack.jsx +++ b/modules/ui/components/Stack.jsx @@ -6,10 +6,6 @@ export default function Stack({children}) { return
{children}
} -Window.defaultProps = { - type: 'neutral', -}; - diff --git a/modules/ui/components/Stack.less b/modules/ui/components/Stack.less index 9cc100dd..adb79c34 100644 --- a/modules/ui/components/Stack.less +++ b/modules/ui/components/Stack.less @@ -2,8 +2,7 @@ @import '../styles/mixins'; .root > * { - border-bottom: 1px solid @border-color; padding: 0.3rem 0.6rem; - + line-height: 1.7; } diff --git a/modules/ui/components/Window.jsx b/modules/ui/components/Window.jsx index f4fae45f..ad798173 100644 --- a/modules/ui/components/Window.jsx +++ b/modules/ui/components/Window.jsx @@ -16,7 +16,7 @@ export default class Window extends React.Component { } render() { - let {initWidth, initLeft, initTop, children, title, minimizable, onClose, ...props} = this.props; + let {initWidth, initLeft, initTop, setFocus, children, title, minimizable, onClose, ...props} = this.props; return
{title.toUpperCase()}
@@ -41,8 +41,8 @@ export default class Window extends React.Component { } componentDidMount() { - if (this.props.onFocus) { - this.props.onFocus(this.el); + if (this.props.setFocus) { + this.props.setFocus(this.el); } else { this.el.focus(); } diff --git a/modules/ui/components/controls/Field.less b/modules/ui/components/controls/Field.less index 9fdb0d84..352f1da8 100644 --- a/modules/ui/components/controls/Field.less +++ b/modules/ui/components/controls/Field.less @@ -2,5 +2,4 @@ display: flex; justify-content: space-between; align-items: baseline; - line-height: 1.5; } \ No newline at end of file diff --git a/modules/ui/connect.jsx b/modules/ui/connect.jsx index b42355fe..a7638c09 100644 --- a/modules/ui/connect.jsx +++ b/modules/ui/connect.jsx @@ -1,8 +1,12 @@ import React from 'react'; import PropTypes from 'prop-types'; -export default function connect(WrappedComponent, tokens, {staticProps, mapProps, mapActions, mapSelfProps}) { - +export default function connect(WrappedComponent, tokens, config) { + if (!config) { + config = DEFAULT_CONFIG; + } + let {staticProps, mapProps, mapActions, mapSelfProps} = config; + mapProps = createMapper(mapProps); mapActions = mapActions || function({dispatch}) { @@ -82,6 +86,8 @@ function createMapper(mapper, comp) { return mapper; } +const DEFAULT_CONFIG = {}; + export function DEFAULT_MAPPER(state) { let props = {}; state.forEach(stateItem => Object.assign(props, stateItem)); diff --git a/web/app/cad/craft/craftPlugin.js b/web/app/cad/craft/craftPlugin.js index acf227cd..96c6307d 100644 --- a/web/app/cad/craft/craftPlugin.js +++ b/web/app/cad/craft/craftPlugin.js @@ -14,8 +14,8 @@ export function activate({bus, services}) { bus.subscribe(TOKENS.HISTORY_POINTER, (pointer) => { let history = getHistory(); if (pointer < history.length) { + resetInternal(history.slice(0, pointer)); bus.setState(TOKENS.MODIFICATIONS, {pointer}); - reset(history.slice(0, pointer)); } }); @@ -29,12 +29,22 @@ export function activate({bus, services}) { }); } - function reset(modifications) { + function resetInternal(modifications) { services.cadRegistry.reset(); for (let request of modifications) { modifyInternal(request); } - bus.dispatch(TOKENS.DID_MODIFY); + } + + function reset(modifications) { + resetInternal(modifications); + bus.updateState(TOKENS.MODIFICATIONS, + () => { + return { + history: modifications, + pointer: modifications.length - 1 + } + }); } function modifyInternal(request) { @@ -56,7 +66,6 @@ export function activate({bus, services}) { pointer: pointer++ } }); - bus.dispatch(TOKENS.DID_MODIFY); } services.craft = { @@ -67,5 +76,4 @@ export function activate({bus, services}) { export const TOKENS = { MODIFICATIONS: createToken('craft', 'modifications'), HISTORY_POINTER: createToken('craft', 'historyPointer'), - DID_MODIFY: createToken('craft', 'didModify') }; diff --git a/web/app/cad/dom/components/OperationHistory.jsx b/web/app/cad/dom/components/OperationHistory.jsx index 4a00b8df..b534ffa2 100644 --- a/web/app/cad/dom/components/OperationHistory.jsx +++ b/web/app/cad/dom/components/OperationHistory.jsx @@ -1,10 +1,44 @@ import React from 'react'; +import PropTypes from 'prop-types'; +import Stack from 'ui/components/Stack'; +import connect from 'ui/connect'; +import Fa from 'ui/components/Fa'; +import ImgIcon from 'ui/components/ImgIcon'; +import ls from './OperationHistory.less' -export default class OperationHistory extends React.Component { +import {TOKENS as CRAFT_TOKENS} from '../../craft/craftPlugin'; - render() { - return
- OperationHistory -
+function OperationHistory({history, pointer}, {services: {operation: operationService}}) { + return + + {history.map(({type, params}, index) => { + + let {appearance, paramsInfo} = getDescriptor(type, operationService.registry); + return
+ {appearance && } + {type} {paramsInfo && paramsInfo(params)} + + + + + +
; + })} + +
; +} + +const EMPTY_DESCRIPTOR = {}; +function getDescriptor(type, registry) { + let descriptor = registry[type]; + if (!descriptor) { + descriptor = EMPTY_DESCRIPTOR; } -} \ No newline at end of file + return descriptor; +} + +OperationHistory.contextTypes = { + services: PropTypes.object +}; + +export default connect(OperationHistory, CRAFT_TOKENS.MODIFICATIONS); diff --git a/web/app/cad/dom/components/OperationHistory.less b/web/app/cad/dom/components/OperationHistory.less new file mode 100644 index 00000000..fa3b409e --- /dev/null +++ b/web/app/cad/dom/components/OperationHistory.less @@ -0,0 +1,8 @@ +.item { + word-wrap: break-word; + word-break: break-all; +} + +.buttons { + +} \ No newline at end of file diff --git a/web/app/cad/dom/components/PartPanel.jsx b/web/app/cad/dom/components/PartPanel.jsx new file mode 100644 index 00000000..296a9a86 --- /dev/null +++ b/web/app/cad/dom/components/PartPanel.jsx @@ -0,0 +1,16 @@ +import React, {Fragment} from 'react'; +import ObjectExplorer from './ObjectExplorer'; +import OperationHistory from './OperationHistory'; +import Folder from 'ui/components/Folder'; +import Fa from '../../../../../modules/ui/components/Fa'; + +export default function PartPanel() { + return + Model}> + + + Modifications}> + + + ; +} \ No newline at end of file diff --git a/web/app/cad/dom/components/View3d.jsx b/web/app/cad/dom/components/View3d.jsx index 83f351a1..934c590d 100644 --- a/web/app/cad/dom/components/View3d.jsx +++ b/web/app/cad/dom/components/View3d.jsx @@ -2,12 +2,11 @@ import React from 'react'; import PlugableControlBar from './PlugableControlBar'; import ls from './View3d.less'; -import ObjectExplorer from './ObjectExplorer'; -import OperationHistory from './OperationHistory'; import Abs from 'ui/components/Abs'; -import {PlugableToolbarLeft, PlugableToolbarLeftSecondary, PlugableToolbarRight} from "./PlugableToolbar"; +import {PlugableToolbarLeft, PlugableToolbarLeftSecondary, PlugableToolbarRight} from './PlugableToolbar'; import UISystem from './UISystem'; import WizardManager from './wizard/WizardManager'; +import PartPanel from './PartPanel'; export default class View3d extends React.Component { @@ -20,8 +19,7 @@ export default class View3d extends React.Component { render() { return
- - +
diff --git a/web/app/cad/dom/components/wizard/Wizard.jsx b/web/app/cad/dom/components/wizard/Wizard.jsx index 924c941d..5bf55363 100644 --- a/web/app/cad/dom/components/wizard/Wizard.jsx +++ b/web/app/cad/dom/components/wizard/Wizard.jsx @@ -44,7 +44,7 @@ export default class Wizard extends React.Component { title={title} onClose={this.onClose} onKeyDown={this.onKeyDown} - onFocus={this.focusFirstInput}> + setFocus={this.focusFirstInput}> {metadata.map(([name, type, , params], index) => { return diff --git a/web/app/cad/sketch/sketcherPlugin.js b/web/app/cad/sketch/sketcherPlugin.js index f4b9c781..136e8c98 100644 --- a/web/app/cad/sketch/sketcherPlugin.js +++ b/web/app/cad/sketch/sketcherPlugin.js @@ -59,7 +59,7 @@ export function activate({bus, services}) { services.appTabs.show(sceneFace.id, 'Sketch ' + sceneFace.id, 'sketcher.html#' + sketchURL); } - bus.subscribe(CRAFT_TOKENS.DID_MODIFY, updateAllSketches); + bus.subscribe(CRAFT_TOKENS.MODIFICATIONS, updateAllSketches); services.sketcher = { sketchFace, updateAllSketches