Skip to content

Commit

Permalink
Merge pull request #12 from Exabyte-io/feature/SOF-4598
Browse files Browse the repository at this point in the history
Feature/sof 4598
  • Loading branch information
timurbazhirov committed Aug 9, 2022
2 parents 8598da2 + ce2be57 commit 4dd1949
Show file tree
Hide file tree
Showing 29 changed files with 788 additions and 38 deletions.
3 changes: 2 additions & 1 deletion editor/js/Config.js
Expand Up @@ -24,7 +24,8 @@ function Config() {
'settings/shortcuts/rotate': 'e',
'settings/shortcuts/scale': 'r',
'settings/shortcuts/undo': 'z',
'settings/shortcuts/focus': 'f'
'settings/shortcuts/focus': 'f',
'settings/shortcuts/multiple-selection': 'm'
};

if ( window.localStorage[ name ] === undefined ) {
Expand Down
10 changes: 10 additions & 0 deletions editor/js/Editor.js
Expand Up @@ -19,6 +19,15 @@ function Editor( providedDefaultCamera ) {
var signal = new Signal();

this.signals = {
// multipleSelection

toggleMultipleSelection: new Signal(),
enableMultipleSelection: new Signal(),
disableMultipleSelection: new Signal(),
showMultipleSelectionControls: new Signal(),
hideMultipleSelectionControls: new Signal(),
cancelMultipleSelection: new Signal(),
submitMultipleSelection: new Signal(),

// script

Expand All @@ -37,6 +46,7 @@ function Editor( providedDefaultCamera ) {
// notifications

editorCleared: new Signal(),
editorClosed: new Signal(),

savingStarted: new Signal(),
savingFinished: new Signal(),
Expand Down
3 changes: 2 additions & 1 deletion editor/js/Menubar.Edit.js
Expand Up @@ -120,12 +120,13 @@ function MenubarEdit( editor ) {
option.onClick( function () {

let object = editor.selected;
const originalParent = editor.selected.parent;

if ( object === null || object.parent === null ) return; // avoid cloning the camera or scene

object = object.clone();

editor.execute( new AddObjectCommand( editor, object ) );
editor.execute( new AddObjectCommand( editor, object, originalParent ) );

} );
options.add( option );
Expand Down
14 changes: 14 additions & 0 deletions editor/js/Menubar.File.js
Expand Up @@ -8,6 +8,7 @@ function MenubarFile( editor ) {

const config = editor.config;
const strings = editor.strings;
const signals = editor.signals;

const container = new UIPanel();
container.setClass( 'menu' );
Expand Down Expand Up @@ -481,6 +482,19 @@ function MenubarFile( editor ) {
} );
options.add( option );

// Exit
option = new UIRow();
option.setClass( 'option' );
option.setTextContent( strings.getKey( 'menubar/file/exit' ) );
option.onClick( function () {

signals.editorClosed.dispatch();

} );

options.add( option );


//

const link = document.createElement( 'a' );
Expand Down
87 changes: 87 additions & 0 deletions editor/js/MultipleSelectionControls.js
@@ -0,0 +1,87 @@
import { UIButton, UIPanel } from './libs/ui.js';
import { getToolbarBtnHintText } from './libs/getToolbarBtnHintText.js';

const toggleMultipleSelectionImg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDIxMC40MTYgMjEwLjQxNiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjEwLjQxNiAyMTAuNDE2OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8Zz4NCgk8Zz4NCgkJPHBhdGggZD0iTTIwNi41MTksMTU1Ljg2M2gtMTkuNDgzVjU0LjU1MmgxOS40ODFjMi4xNTIsMCwzLjg5Ny0xLjc0NSwzLjg5Ny0zLjg5N1YzLjg5N2MwLTIuMTUyLTEuNzQ1LTMuODk3LTMuODk3LTMuODk3aC00Ni43NTkNCgkJCWMtMi4xNTIsMC0zLjg5NywxLjc0NS0zLjg5NywzLjg5N1YyMy4zOEg1NC41NTJWMy44OTdDNTQuNTUyLDEuNzQ1LDUyLjgwNywwLDUwLjY1NSwwSDMuODk3QzEuNzQ1LDAsMCwxLjc0NSwwLDMuODk3djQ2Ljc1OQ0KCQkJYzAsMi4xNTIsMS43NDUsMy44OTcsMy44OTcsMy44OTdIMjMuMzh2MTAxLjMxSDMuODk3Yy0yLjE1MiwwLTMuODk3LDEuNzQ1LTMuODk3LDMuODk3djQ2Ljc1OWMwLDIuMTUyLDEuNzQ1LDMuODk3LDMuODk3LDMuODk3DQoJCQloNDYuNzU5YzIuMTUyLDAsMy44OTctMS43NDUsMy44OTctMy44OTd2LTE5LjQ4M2gxMDEuMzF2MTkuNDgzYzAsMi4xNTIsMS43NDUsMy44OTcsMy44OTcsMy44OTdoNDYuNzU5DQoJCQljMi4xNTIsMCwzLjg5Ny0xLjc0NSwzLjg5Ny0zLjg5N1YxNTkuNzZDMjEwLjQxNiwxNTcuNjA4LDIwOC42NzEsMTU1Ljg2MywyMDYuNTE5LDE1NS44NjN6IE0yMDIuNjIxLDcuNzkzdjM4Ljk2NmgtMTUuNTg2aC03Ljc5Mw0KCQkJaC0xNS41ODZWMzEuMTcydi03Ljc5M1Y3Ljc5M0gyMDIuNjIxeiBNMjMuMzc5LDQ2Ljc1OEg3Ljc5M1Y3Ljc5M2gzOC45NjZ2MTUuNTg2djcuNzkzdjE1LjU4NkgzMS4xNzJIMjMuMzc5eiBNNy43OTMsMjAyLjYyMQ0KCQkJdi0zOC45NjZoMTUuNTg2aDcuNzkzaDE1LjU4NnYxNS41ODZ2Ny43OTN2MTUuNTg3SDcuNzkzeiBNMTU5Ljc1OCwxNTUuODYyYy0yLjE1MiwwLTMuODk3LDEuNzQ1LTMuODk3LDMuODk3djE5LjQ4M0g1NC41NTINCgkJCXYtMTkuNDgzYzAtMi4xNTItMS43NDUtMy44OTctMy44OTctMy44OTdIMzEuMTcyVjU0LjU1MmgxOS40ODNjMi4xNTIsMCwzLjg5Ny0xLjc0NSwzLjg5Ny0zLjg5N1YzMS4xNzJoMTAxLjMxdjE5LjQ4Mw0KCQkJYzAsMi4xNTIsMS43NDUsMy44OTcsMy44OTcsMy44OTdoMTkuNDgzdjEwMS4zMWgtMC4wMDFIMTU5Ljc1OHogTTIwMi42MjEsMjAyLjYyMWgtMzguOTY2di0xNS41ODZ2LTcuNzkzdi0xNS41ODZoMTUuNTg2aDcuNzkzDQoJCQloMTUuNTg3VjIwMi42MjF6Ii8+DQoJPC9nPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=';
const submitMultipleSelectionImg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE4LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDIzNi45ODggMjM2Ljk4OCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjM2Ljk4OCAyMzYuOTg4OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+DQo8cG9seWdvbiBwb2ludHM9IjE5OC4wOTgsMjQuMzI2IDg3LjU0MywxMzQuODgxIDM4Ljg5MSw4Ni4yMjkgMCwxMjUuMTIxIDg3LjU0MywyMTIuNjYyIDIzNi45ODgsNjMuMjE3ICIvPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=';
const cancelMultipleSelectionImg = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDQ5MiA0OTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDQ5MiA0OTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxnPg0KCQk8cGF0aCBkPSJNMzAwLjE4OCwyNDZMNDg0LjE0LDYyLjA0YzUuMDYtNS4wNjQsNy44NTItMTEuODIsNy44Ni0xOS4wMjRjMC03LjIwOC0yLjc5Mi0xMy45NzItNy44Ni0xOS4wMjhMNDY4LjAyLDcuODcyDQoJCQljLTUuMDY4LTUuMDc2LTExLjgyNC03Ljg1Ni0xOS4wMzYtNy44NTZjLTcuMiwwLTEzLjk1NiwyLjc4LTE5LjAyNCw3Ljg1NkwyNDYuMDA4LDE5MS44Mkw2Mi4wNDgsNy44NzINCgkJCWMtNS4wNi01LjA3Ni0xMS44Mi03Ljg1Ni0xOS4wMjgtNy44NTZjLTcuMiwwLTEzLjk2LDIuNzgtMTkuMDIsNy44NTZMNy44NzIsMjMuOTg4Yy0xMC40OTYsMTAuNDk2LTEwLjQ5NiwyNy41NjgsMCwzOC4wNTINCgkJCUwxOTEuODI4LDI0Nkw3Ljg3Miw0MjkuOTUyYy01LjA2NCw1LjA3Mi03Ljg1MiwxMS44MjgtNy44NTIsMTkuMDMyYzAsNy4yMDQsMi43ODgsMTMuOTYsNy44NTIsMTkuMDI4bDE2LjEyNCwxNi4xMTYNCgkJCWM1LjA2LDUuMDcyLDExLjgyNCw3Ljg1NiwxOS4wMiw3Ljg1NmM3LjIwOCwwLDEzLjk2OC0yLjc4NCwxOS4wMjgtNy44NTZsMTgzLjk2LTE4My45NTJsMTgzLjk1MiwxODMuOTUyDQoJCQljNS4wNjgsNS4wNzIsMTEuODI0LDcuODU2LDE5LjAyNCw3Ljg1NmgwLjAwOGM3LjIwNCwwLDEzLjk2LTIuNzg0LDE5LjAyOC03Ljg1NmwxNi4xMi0xNi4xMTYNCgkJCWM1LjA2LTUuMDY0LDcuODUyLTExLjgyNCw3Ljg1Mi0xOS4wMjhjMC03LjIwNC0yLjc5Mi0xMy45Ni03Ljg1Mi0xOS4wMjhMMzAwLjE4OCwyNDZ6Ii8+DQoJPC9nPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=';

function MultipleSelectionControls( editor ) {

const signals = editor.signals;
const strings = editor.strings;
const config = editor.config;

const container = new UIPanel();
container.setId( 'multiple-selection-buttons' );

// Toggle Button
const toggleIcon = document.createElement( 'img' );
toggleIcon.title = getToolbarBtnHintText( strings.getKey( 'toolbar/toggle-multiple-selection' ), config.getKey( 'settings/shortcuts/multiple-selection' ) );
toggleIcon.src = toggleMultipleSelectionImg;

const toggleBtn = new UIButton();
toggleBtn.setClass( 'ms-button ms-button__toggle' );
toggleBtn.dom.appendChild( toggleIcon );
toggleBtn.onClick( function () {

signals.toggleMultipleSelection.dispatch();

} );

// Cancel Button
const cancelIcon = document.createElement( 'img' );
cancelIcon.title = getToolbarBtnHintText( strings.getKey( 'toolbar/cancel-multiple-selection' ) );
cancelIcon.src = cancelMultipleSelectionImg;

const cancelBtn = new UIButton();
cancelBtn.setClass( 'ms-button ms-button__cancel' );
cancelBtn.dom.appendChild( cancelIcon );
cancelBtn.dom.style.display = 'none';
cancelBtn.onClick( function () {

signals.cancelMultipleSelection.dispatch();

} );

// Submit Button
const submitIcon = document.createElement( 'img' );
submitIcon.title = getToolbarBtnHintText( strings.getKey( 'toolbar/submit-multiple-selection' ) );
submitIcon.src = submitMultipleSelectionImg;

const submitBtn = new UIButton();
submitBtn.setClass( 'ms-button ms-button__submit' );
submitBtn.dom.appendChild( submitIcon );
submitBtn.dom.style.display = 'none';
submitBtn.onClick( function () {

signals.submitMultipleSelection.dispatch();

} );

container.add( toggleBtn );
container.add( cancelBtn );
container.add( submitBtn );

signals.showMultipleSelectionControls.add( function () {

submitBtn.dom.style.display = 'block';
cancelBtn.dom.style.display = 'block';

} );

signals.hideMultipleSelectionControls.add( function () {

submitBtn.dom.style.display = 'none';
cancelBtn.dom.style.display = 'none';

} );

container.toggleBtn = toggleBtn;
container.cancelBtn = cancelBtn;
container.submitBtn = submitBtn;

return container;

}

export { MultipleSelectionControls };
29 changes: 23 additions & 6 deletions editor/js/Sidebar.Scene.js
Expand Up @@ -2,6 +2,7 @@ import * as THREE from 'three';

import { UIPanel, UIBreak, UIRow, UIColor, UISelect, UIText, UINumber } from './libs/ui.js';
import { UIOutliner, UITexture } from './libs/ui.three.js';
import { AddObjectCommand, RemoveObjectCommand } from './commands/Commands.js';

function SidebarScene( editor ) {

Expand Down Expand Up @@ -349,7 +350,7 @@ function SidebarScene( editor ) {

}

// Hide utility scene objects and labels from materials editor
// Hide utility scene objects and labels from materials editor
if (
! [
'OrthographicCamera',
Expand Down Expand Up @@ -378,7 +379,15 @@ function SidebarScene( editor ) {

outliner.setOptions( options );

outliner.setContextMenuOptions( [ 'Copy', 'Cut', 'Paste', 'Clone', 'Delete' ] );
if ( editor.selected && editor.selected.type === 'MultipleSelectionGroup' ) {

outliner.setContextMenuOptions( [ 'Cancel', 'Submit' ] );

} else {

outliner.setContextMenuOptions( [ 'Copy', 'Cut', 'Paste', 'Clone', 'Delete' ] );

}

outliner.onContextMenuChange( function ( value ) {

Expand All @@ -391,15 +400,15 @@ function SidebarScene( editor ) {
} else if ( value === 'Cut' ) {

copiedObject = editor.selected;
editor.execute( new RemoveObjectCommand( editor.selected ) );
editor.execute( new RemoveObjectCommand( editor, editor.selected ) );

} else if ( value === 'Delete' ) {

editor.execute( new RemoveObjectCommand( editor.selected ) );
editor.execute( new RemoveObjectCommand( editor, editor.selected ) );

} else if ( value === 'Clone' ) {

editor.execute( new AddObjectCommand( editor.selected.clone() ) );
editor.execute( new AddObjectCommand( editor, editor.selected.clone(), editor.selected.parent ) );

} else if ( value === 'Paste' && copiedObject !== undefined ) {

Expand All @@ -409,7 +418,15 @@ function SidebarScene( editor ) {

}

editor.execute( new AddObjectCommand( copiedObject, editor.selected ) );
editor.execute( new AddObjectCommand( editor, copiedObject, editor.selected ) );

} else if ( value === 'Submit' ) {

signals.submitMultipleSelection.dispatch();

} else if ( value === 'Cancel' ) {

signals.cancelMultipleSelection.dispatch();

}

Expand Down
8 changes: 7 additions & 1 deletion editor/js/Sidebar.Settings.Shortcuts.js
Expand Up @@ -23,7 +23,7 @@ function SidebarSettingsShortcuts( editor ) {
headerRow.add( new UIText( strings.getKey( 'sidebar/settings/shortcuts' ).toUpperCase() ) );
container.add( headerRow );

const shortcuts = [ 'translate', 'rotate', 'scale', 'undo', 'focus' ];
const shortcuts = [ 'translate', 'rotate', 'scale', 'multiple-selection', 'undo', 'focus' ];

function createShortcutInput( name ) {

Expand Down Expand Up @@ -134,6 +134,12 @@ function SidebarSettingsShortcuts( editor ) {

break;

case config.getKey( 'settings/shortcuts/multiple-selection' ) :

signals.toggleMultipleSelection.dispatch();

break;

case config.getKey( 'settings/shortcuts/undo' ):

if ( IS_MAC ? event.metaKey : event.ctrlKey ) {
Expand Down
12 changes: 12 additions & 0 deletions editor/js/Strings.js
Expand Up @@ -23,6 +23,7 @@ function Strings( config ) {
'menubar/file/export/stl_binary': 'Export STL (Binary)',
'menubar/file/export/usdz': 'Export USDZ',
'menubar/file/publish': 'Publish',
'menubar/file/exit': 'Exit',

'menubar/edit': 'Edit',
'menubar/edit/undo': 'Undo (Ctrl+Z)',
Expand Down Expand Up @@ -331,6 +332,9 @@ function Strings( config ) {
'toolbar/rotate': 'Rotate',
'toolbar/scale': 'Scale',
'toolbar/local': 'Local',
'toolbar/toggle-multiple-selection': 'Toggle Multiple Selection',
'toolbar/submit-multiple-selection': 'Submit Multiple Selection',
'toolbar/cancel-multiple-selection': 'Cancel Multiple Selection',

'viewport/info/objects': 'Objects',
'viewport/info/vertices': 'Vertices',
Expand Down Expand Up @@ -358,6 +362,7 @@ function Strings( config ) {
'menubar/file/export/stl_binary': 'Exporter STL (Binaire)',
'menubar/file/export/usdz': 'Exporter USDZ',
'menubar/file/publish': 'Publier',
'menubar/file/exit': 'Quitter',

'menubar/edit': 'Edition',
'menubar/edit/undo': 'Annuler (Ctrl+Z)',
Expand Down Expand Up @@ -666,6 +671,9 @@ function Strings( config ) {
'toolbar/rotate': 'Rotation',
'toolbar/scale': 'Échelle',
'toolbar/local': 'Local',
'toolbar/toggle-multiple-selection': 'Basculer la sélection multiple',
'toolbar/submit-multiple-selection': 'Soumettre une sélection multiple',
'toolbar/cancel-multiple-selection': 'Annuler la sélection multiple',

'viewport/info/objects': 'Objets',
'viewport/info/vertices': 'Sommets',
Expand Down Expand Up @@ -693,6 +701,7 @@ function Strings( config ) {
'menubar/file/export/stl_binary': '导出STL(二进制)',
'menubar/file/export/usdz': '导出USDZ',
'menubar/file/publish': '发布',
'menubar/file/exit': '退出',

'menubar/edit': '编辑',
'menubar/edit/undo': '撤销 (Ctrl+Z)',
Expand Down Expand Up @@ -1001,6 +1010,9 @@ function Strings( config ) {
'toolbar/rotate': '旋转',
'toolbar/scale': '缩放',
'toolbar/local': '本地',
'toolbar/toggle-multiple-selection': '切换多项选择',
'toolbar/submit-multiple-selection': '提交多项选择',
'toolbar/cancel-multiple-selection': '取消多项选择',

'viewport/info/objects': '物体',
'viewport/info/vertices': '顶点',
Expand Down

0 comments on commit 4dd1949

Please sign in to comment.