201 lines
4.7 KiB
JavaScript
201 lines
4.7 KiB
JavaScript
import { AddDiv, ShowDomElement, IsDomElementVisible, SetDomElementWidth, SetDomElementHeight } from '../engine/viewer/domutils.js';
|
|
import { AddSvgIconButtonElement, SetSvgIconImageElement } from './utils.js';
|
|
|
|
export class Panel
|
|
{
|
|
constructor (parentDiv)
|
|
{
|
|
this.parentDiv = parentDiv;
|
|
this.panelDiv = AddDiv (parentDiv);
|
|
ShowDomElement (this.panelDiv, false);
|
|
this.visible = false;
|
|
}
|
|
|
|
GetName ()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
GetIcon ()
|
|
{
|
|
return null;
|
|
}
|
|
|
|
IsVisible ()
|
|
{
|
|
return this.visible;
|
|
}
|
|
|
|
Show (show)
|
|
{
|
|
if (this.visible === show) {
|
|
return;
|
|
}
|
|
|
|
this.visible = show;
|
|
ShowDomElement (this.panelDiv, this.visible);
|
|
}
|
|
|
|
Resize ()
|
|
{
|
|
|
|
}
|
|
|
|
Clear ()
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
export class PanelSet
|
|
{
|
|
constructor (parentDiv)
|
|
{
|
|
this.parentDiv = parentDiv;
|
|
this.menuDiv = AddDiv (parentDiv, 'ov_panel_set_menu');
|
|
this.contentDiv = AddDiv (parentDiv, 'ov_panel_set_content ov_thin_scrollbar');
|
|
this.panels = [];
|
|
this.panelButtons = [];
|
|
this.panelsVisible = true;
|
|
this.panelsPrevWidth = null;
|
|
this.callbacks = null;
|
|
}
|
|
|
|
Init (callbacks)
|
|
{
|
|
this.callbacks = callbacks;
|
|
}
|
|
|
|
GetContentDiv ()
|
|
{
|
|
return this.contentDiv;
|
|
}
|
|
|
|
AddPanel (panel)
|
|
{
|
|
this.panels.push (panel);
|
|
let button = AddSvgIconButtonElement (this.menuDiv, panel.GetIcon (), 'ov_panel_set_menu_button', panel.GetName ());
|
|
this.panelButtons.push (button);
|
|
button.addEventListener ('click', () => {
|
|
if (panel === this.GetVisiblePanel ()) {
|
|
this.ShowPanels (false);
|
|
} else {
|
|
this.ShowPanels (true);
|
|
this.ShowPanel (panel);
|
|
}
|
|
});
|
|
}
|
|
|
|
IsPanelsVisible ()
|
|
{
|
|
return this.panelsVisible;
|
|
}
|
|
|
|
ShowPanels (show)
|
|
{
|
|
if (!this.IsParentVisible ()) {
|
|
return;
|
|
}
|
|
|
|
if (this.panelsVisible === show) {
|
|
return;
|
|
}
|
|
|
|
this.panelsVisible = show;
|
|
if (this.panelsVisible) {
|
|
ShowDomElement (this.contentDiv, true);
|
|
SetDomElementWidth (this.parentDiv, this.menuDiv.offsetWidth + this.panelsPrevWidth);
|
|
} else {
|
|
for (let panelButton of this.panelButtons) {
|
|
panelButton.classList.remove ('selected');
|
|
panelButton.setAttribute ('aria-pressed', 'false');
|
|
}
|
|
for (let panel of this.panels) {
|
|
panel.Show (false);
|
|
}
|
|
this.panelsPrevWidth = this.contentDiv.offsetWidth;
|
|
SetDomElementWidth (this.parentDiv, this.menuDiv.offsetWidth);
|
|
ShowDomElement (this.contentDiv, false);
|
|
}
|
|
|
|
this.callbacks.onShowHidePanels (this.panelsVisible);
|
|
this.callbacks.onResizeRequested ();
|
|
}
|
|
|
|
ShowPanel (panel)
|
|
{
|
|
if (panel === this.GetVisiblePanel ()) {
|
|
return;
|
|
}
|
|
|
|
let panelButton = this.GetPanelButton (panel);
|
|
for (let otherPanelButton of this.panelButtons) {
|
|
if (otherPanelButton !== panelButton) {
|
|
otherPanelButton.classList.remove ('selected');
|
|
otherPanelButton.setAttribute ('aria-pressed', 'false');
|
|
}
|
|
}
|
|
panelButton.classList.add ('selected');
|
|
panelButton.setAttribute ('aria-pressed', 'true');
|
|
|
|
for (let otherPanel of this.panels) {
|
|
if (otherPanel !== panel) {
|
|
otherPanel.Show (false);
|
|
}
|
|
}
|
|
panel.Show (true);
|
|
panel.Resize ();
|
|
}
|
|
|
|
GetVisiblePanel ()
|
|
{
|
|
if (!this.panelsVisible) {
|
|
return null;
|
|
}
|
|
for (let panel of this.panels) {
|
|
if (panel.IsVisible ()) {
|
|
return panel;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
SetPanelIcon (panel, icon)
|
|
{
|
|
let panelButton = this.GetPanelButton (panel);
|
|
SetSvgIconImageElement (panelButton, icon);
|
|
}
|
|
|
|
GetPanelButton (panel)
|
|
{
|
|
const panelIndex = this.panels.indexOf (panel);
|
|
return this.panelButtons[panelIndex];
|
|
}
|
|
|
|
Resize ()
|
|
{
|
|
let height = this.parentDiv.offsetHeight;
|
|
SetDomElementHeight (this.menuDiv, height);
|
|
SetDomElementHeight (this.contentDiv, height);
|
|
if (this.panelsVisible) {
|
|
for (let panel of this.panels) {
|
|
if (panel.IsVisible ()) {
|
|
panel.Resize ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
IsParentVisible ()
|
|
{
|
|
return IsDomElementVisible (this.parentDiv);
|
|
}
|
|
|
|
Clear ()
|
|
{
|
|
for (let panel of this.panels) {
|
|
panel.Clear ();
|
|
}
|
|
}
|
|
}
|