From f85eebfb3fed7b9bc5ab1ebfc6e2eeeb7d635b20 Mon Sep 17 00:00:00 2001 From: kovacsv Date: Sat, 10 Jul 2021 18:48:59 +0200 Subject: [PATCH] Init sidebar panels from the website code. --- source/core/core.js | 9 ++++ website/o3dv/navigator.js | 14 ++---- website/o3dv/sidebar.js | 39 ++++++++--------- website/o3dv/toolbar.js | 14 +++--- website/o3dv/website.js | 91 +++++++++++++++++++++++---------------- 5 files changed, 91 insertions(+), 76 deletions(-) diff --git a/source/core/core.js b/source/core/core.js index 17f93e9..742ee50 100644 --- a/source/core/core.js +++ b/source/core/core.js @@ -10,3 +10,12 @@ OV.ValueOrDefault = function (val, def) } return val; }; + +OV.EnumerateKeyValuePairs = function (arr, proc) +{ + for (let key in arr) { + if (arr.hasOwnProperty (key)) { + proc (key, arr[key]); + } + } +}; diff --git a/website/o3dv/navigator.js b/website/o3dv/navigator.js index f5c8712..ffc91a7 100644 --- a/website/o3dv/navigator.js +++ b/website/o3dv/navigator.js @@ -108,10 +108,9 @@ OV.NavigatorInfoPanel = class OV.Navigator = class { - constructor (parentDiv, propertiesPanel) + constructor (parentDiv) { this.parentDiv = parentDiv; - this.propertiesPanel = propertiesPanel; this.callbacks = null; this.titleDiv = $('
').addClass ('ov_navigator_tree_title').appendTo (parentDiv); this.treeDiv = $('
').addClass ('ov_navigator_tree_panel').addClass ('ov_thin_scrollbar').appendTo (parentDiv); @@ -316,8 +315,7 @@ OV.Navigator = class obj.SetSelection (new OV.Selection (OV.SelectionType.Material, materialIndex)); } }); - let model = this.callbacks.getModel (); - this.propertiesPanel.AddElementProperties (model); + this.callbacks.onModelSelected (); } else { if (this.selection.type === OV.SelectionType.Material) { let usedByMeshes = this.callbacks.getMeshesForMaterial (this.selection.index); @@ -329,9 +327,7 @@ OV.Navigator = class obj.SetSelection (new OV.Selection (OV.SelectionType.Mesh, meshIndex)); } }); - let model = this.callbacks.getModel (); - let material = model.GetMaterial (this.selection.index); - this.propertiesPanel.AddMaterialProperties (material); + this.callbacks.onMaterialSelected (this.selection.index); } else if (this.selection.type === OV.SelectionType.Mesh) { let usedMaterials = this.callbacks.getMaterialsForMesh (this.selection.index); this.infoPanel.FillWithModelInfo (usedMaterials, { @@ -339,9 +335,7 @@ OV.Navigator = class obj.SetSelection (new OV.Selection (OV.SelectionType.Material, materialIndex)); } }); - let model = this.callbacks.getModel (); - let mesh = model.GetMesh (this.selection.index); - this.propertiesPanel.AddElementProperties (mesh); + this.callbacks.onMeshSelected (this.selection.index); } } this.Resize (); diff --git a/website/o3dv/sidebar.js b/website/o3dv/sidebar.js index 1c48f65..d647215 100644 --- a/website/o3dv/sidebar.js +++ b/website/o3dv/sidebar.js @@ -1,9 +1,3 @@ -OV.SidebarPanelId = -{ - Details : 0, - Settings : 1 -}; - OV.Sidebar = class { constructor (parentDiv) @@ -12,10 +6,13 @@ OV.Sidebar = class this.visible = true; this.titleDiv = null; this.contentDiv = null; - this.panels = [ - new OV.DetailsSidebarPanel (this.parentDiv), - new OV.SettingsSidebarPanel (this.parentDiv) - ]; + this.panels = []; + } + + AddPanel (panel) + { + this.panels.push (panel); + return this.panels.length - 1; } GetPanel (id) @@ -25,8 +22,8 @@ OV.Sidebar = class Init (callbacks) { - for (let i = 0; i < this.panels.length; i++) { - this.panels[i].Init (callbacks); + for (let id = 0; id < this.panels.length; id++) { + this.panels[id].Init (callbacks); } } @@ -35,9 +32,9 @@ OV.Sidebar = class if (panelId !== null) { this.visible = true; this.parentDiv.show (); - for (let i = 0; i < this.panels.length; i++) { - const panel = this.panels[i]; - if (i === panelId) { + for (let id = 0; id < this.panels.length; id++) { + let panel = this.panels[id]; + if (id === panelId) { panel.Show (true); } else { panel.Show (false); @@ -59,9 +56,9 @@ OV.Sidebar = class if (!this.visible) { return null; } - for (let i = 0; i < this.panels.length; i++) { - if (this.panels[i].IsVisible ()) { - return i; + for (let id = 0; id < this.panels.length; id++) { + if (this.panels[id].IsVisible ()) { + return id; } } return null; @@ -69,8 +66,8 @@ OV.Sidebar = class Resize () { - for (let i = 0; i < this.panels.length; i++) { - this.panels[i].Resize (); - } + for (let id = 0; id < this.panels.length; id++) { + this.panels[id].Resize (); + } } }; diff --git a/website/o3dv/toolbar.js b/website/o3dv/toolbar.js index 17d5abf..d6e3a07 100644 --- a/website/o3dv/toolbar.js +++ b/website/o3dv/toolbar.js @@ -20,7 +20,6 @@ OV.ToolbarButton = class } this.buttonDiv.attr ('alt', this.imageTitle); OV.InstallTooltip (this.buttonDiv, this.imageTitle); - this.Update (); } AddClass (className) @@ -28,13 +27,14 @@ OV.ToolbarButton = class this.buttonDiv.addClass (className); } - Update () + SetSelected (selected) { + this.selected = selected; if (!this.selected) { this.buttonDiv.removeClass ('selected'); } else { this.buttonDiv.addClass ('selected'); - } + } } }; @@ -61,17 +61,15 @@ OV.Toolbar = class for (let i = 0; i < buttons.length; i++) { let currentButton = buttons[i]; if (i === buttonIndex) { - currentButton.selected = true; + currentButton.SetSelected (true); } else { - currentButton.selected = false; + currentButton.SetSelected (false); } - currentButton.Update (); } onClick (buttonIndex); }); if (selectedIndex === buttonIndex) { - button.selected = true; - button.Update (); + button.SetSelected (true); } buttons.push (button); } diff --git a/website/o3dv/website.js b/website/o3dv/website.js index c11357a..023c536 100644 --- a/website/o3dv/website.js +++ b/website/o3dv/website.js @@ -8,7 +8,7 @@ OV.Website = class this.cookieHandler = new OV.CookieHandler (); this.toolbar = new OV.Toolbar (this.parameters.toolbarDiv); this.sidebar = new OV.Sidebar (this.parameters.sidebarDiv); - this.navigator = new OV.Navigator (this.parameters.navigatorDiv, this.sidebar.GetPanel (OV.SidebarPanelId.Details)); + this.navigator = new OV.Navigator (this.parameters.navigatorDiv); this.viewerSettings = new OV.ViewerSettings (); this.importSettings = new OV.ImportSettings (); this.modelLoader = new OV.ThreeModelLoader (); @@ -16,6 +16,7 @@ OV.Website = class color : 0x8ec9f0, side : THREE.DoubleSide }); + this.detailsPanel = null; this.model = null; this.dialog = null; } @@ -81,21 +82,6 @@ OV.Website = class } } - ShowSidebar (panelId) - { - this.sidebar.Show (panelId); - this.cookieHandler.SetBoolVal ('ov_show_sidebar', this.sidebar.IsVisible ()); - } - - ToggleSidebar (panelId) - { - if (this.sidebar.GetVisiblePanelId () !== panelId) { - this.ShowSidebar (panelId); - } else { - this.ShowSidebar (null); - } - } - ClearModel () { if (this.dialog !== null) { @@ -256,13 +242,6 @@ OV.Website = class return button; } - function AddRightButton (toolbar, imageName, imageTitle, onlyFullWidth, onClick) - { - let button = AddButton (toolbar, imageName, imageTitle, onlyFullWidth, onClick); - button.AddClass ('right'); - return button; - } - function AddRadioButton (toolbar, imageNames, imageTitles, selectedIndex, onlyFullWidth, onClick) { let imageData = []; @@ -337,16 +316,6 @@ OV.Website = class AddButton (this.toolbar, 'share', 'Share model', true, function () { obj.dialog = OV.ShowSharingDialog (importer, obj.viewerSettings, obj.importSettings, obj.viewer.GetCamera ()); }); - AddRightButton (this.toolbar, 'details', 'Details panel', true, function () { - obj.ToggleSidebar (OV.SidebarPanelId.Details); - obj.Resize (); - }); - if (OV.FeatureSet.SettingsAvailable) { - AddRightButton (this.toolbar, 'settings', 'Settings panel', true, function () { - obj.ToggleSidebar (OV.SidebarPanelId.Settings); - obj.Resize (); - }); - } this.parameters.fileInput.on ('change', function (ev) { if (ev.target.files.length > 0) { @@ -398,15 +367,57 @@ OV.Website = class InitSidebar () { + function AddSidebarButton (toolbar, imageName, imageTitle, onClick) + { + let image = 'assets/images/toolbar/' + imageName + '.svg'; + let button = toolbar.AddImageButton (image, imageTitle, onClick); + button.AddClass ('only_full_width'); + button.AddClass ('right'); + return button; + } + + function ShowSidebar (sidebar, cookieHandler, panelId) + { + sidebar.Show (panelId); + cookieHandler.SetBoolVal ('ov_show_sidebar', sidebar.IsVisible ()); + } + + function ToggleSidebar (sidebar, cookieHandler, panelId) + { + if (sidebar.GetVisiblePanelId () !== panelId) { + ShowSidebar (sidebar, cookieHandler, panelId); + } else { + ShowSidebar (sidebar, cookieHandler, null); + } + } + + const detailsPanelId = this.sidebar.AddPanel (new OV.DetailsSidebarPanel (this.parameters.sidebarDiv)); + const settingsPanelId = this.sidebar.AddPanel (new OV.SettingsSidebarPanel (this.parameters.sidebarDiv)); + + this.detailsPanel = this.sidebar.GetPanel (detailsPanelId); + let obj = this; + AddSidebarButton (this.toolbar, 'details', 'Details panel', function () { + ToggleSidebar (obj.sidebar, obj.cookieHandler, detailsPanelId); + obj.Resize (); + }); + + if (OV.FeatureSet.SettingsAvailable) { + AddSidebarButton (this.toolbar, 'settings', 'Settings panel', function () { + ToggleSidebar (obj.sidebar, obj.cookieHandler, settingsPanelId); + obj.Resize (); + }); + } + this.sidebar.Init ({ onClose : function () { - obj.ShowSidebar (null); + ShowSidebar (obj.sidebar, obj.cookieHandler, null); obj.Resize (); } }); + let show = this.cookieHandler.GetBoolVal ('ov_show_sidebar', true); - this.ShowSidebar (show ? OV.SidebarPanelId.Details : null); + ShowSidebar (this.sidebar, this.cookieHandler, show ? detailsPanelId : null); } InitNavigator () @@ -493,8 +504,14 @@ OV.Website = class getMaterialsForModel : function () { return GetMaterialsForModel (obj.model); }, - getModel : function () { - return obj.model; + onModelSelected : function () { + obj.detailsPanel.AddElementProperties (obj.model); + }, + onMeshSelected : function (meshIndex) { + obj.detailsPanel.AddElementProperties (obj.model.GetMesh (meshIndex)); + }, + onMaterialSelected : function (materialIndex) { + obj.detailsPanel.AddMaterialProperties (obj.model.GetMaterial (materialIndex)); } }); }