ModelHandle/source/website/treeview.js
2022-01-10 18:10:51 +01:00

240 lines
6.1 KiB
JavaScript

import { IsDefined } from '../engine/core/core.js';
import { AddDiv, CreateDiv, ShowDomElement, ClearDomElement, InsertDomElementBefore, InsertDomElementAfter } from '../engine/viewer/domutils.js';
import { CreateSvgIconElement, SetSvgIconImageElement } from './utils.js';
export function ScrollToView (element)
{
element.scrollIntoView ({
behavior : 'smooth',
block : 'nearest'
});
}
export class TreeViewButton
{
constructor (imagePath)
{
this.imagePath = imagePath;
this.mainElement = CreateSvgIconElement (this.imagePath, 'ov_tree_item_button');
this.mainElement.setAttribute ('src', this.imagePath);
}
SetImage (imagePath)
{
this.imagePath = imagePath;
SetSvgIconImageElement (this.mainElement, this.imagePath);
}
OnClick (clickHandler)
{
this.mainElement.addEventListener ('click', (ev) => {
ev.stopPropagation ();
clickHandler (ev);
});
}
GetDomElement ()
{
return this.mainElement;
}
}
export class TreeViewItem
{
constructor (name, icon)
{
this.name = name;
this.parent = null;
this.mainElement = CreateDiv ('ov_tree_item');
this.mainElement.setAttribute ('title', this.name);
this.nameElement = AddDiv (this.mainElement, 'ov_tree_item_name', this.name);
if (IsDefined (icon)) {
let iconElement = CreateSvgIconElement (icon, 'ov_tree_item_icon');
InsertDomElementBefore (iconElement, this.nameElement);
}
}
OnClick (onClick)
{
this.mainElement.classList.add ('clickable');
this.mainElement.style.cursor = 'pointer';
this.mainElement.addEventListener ('click', onClick);
}
SetParent (parent)
{
this.parent = parent;
}
AddDomElements (parentDiv)
{
parentDiv.appendChild (this.mainElement);
}
}
export class TreeViewSingleItem extends TreeViewItem
{
constructor (name, icon)
{
super (name, icon);
this.selected = false;
}
SetSelected (selected)
{
this.selected = selected;
if (this.selected) {
this.mainElement.classList.add ('selected');
let parent = this.parent;
if (parent === null) {
ScrollToView (this.mainElement);
} else {
while (parent !== null) {
parent.ShowChildren (true);
ScrollToView (this.mainElement);
parent = parent.parent;
}
}
} else {
this.mainElement.classList.remove ('selected');
}
}
}
export class TreeViewButtonItem extends TreeViewSingleItem
{
constructor (name, icon)
{
super (name, icon);
this.buttonsDiv = CreateDiv ('ov_tree_item_button_container');
InsertDomElementBefore (this.buttonsDiv, this.nameElement);
}
AppendButton (button)
{
this.buttonsDiv.appendChild (button.GetDomElement ());
}
}
export class TreeViewGroupItem extends TreeViewItem
{
constructor (name, icon)
{
super (name, icon);
this.children = [];
this.isVisible = true;
this.isChildrenVisible = false;
this.childrenDiv = null;
this.openButtonIcon = 'arrow_down';
this.closeButtonIcon = 'arrow_right';
this.openCloseButton = CreateSvgIconElement (this.openButtonIcon, 'ov_tree_item_icon');
InsertDomElementBefore (this.openCloseButton, this.nameElement);
}
AddChild (child)
{
this.CreateChildrenDiv ();
this.children.push (child);
child.SetParent (this);
child.AddDomElements (this.childrenDiv);
}
ExpandAll (expand)
{
for (let child of this.children) {
if (child instanceof TreeViewGroupItem) {
child.ShowChildren (expand);
child.ExpandAll (expand);
}
}
}
Show (show)
{
this.isVisible = show;
if (this.childrenDiv === null) {
return;
}
if (this.isVisible) {
ShowDomElement (this.mainElement, true);
this.childrenDiv.classList.add ('ov_tree_view_children');
} else {
ShowDomElement (this.mainElement, false);
this.childrenDiv.classList.remove ('ov_tree_view_children');
}
}
ShowChildren (show)
{
this.isChildrenVisible = show;
if (this.childrenDiv === null) {
return;
}
if (show) {
SetSvgIconImageElement (this.openCloseButton, this.openButtonIcon);
ShowDomElement (this.childrenDiv, true);
} else {
SetSvgIconImageElement (this.openCloseButton, this.closeButtonIcon);
ShowDomElement (this.childrenDiv, false);
}
}
CreateChildrenDiv ()
{
if (this.childrenDiv === null) {
this.childrenDiv = CreateDiv ('ov_tree_view_children');
InsertDomElementAfter (this.childrenDiv, this.mainElement);
this.Show (this.isVisible);
this.ShowChildren (this.isChildrenVisible);
this.OnClick ((ev) => {
this.isChildrenVisible = !this.isChildrenVisible;
this.ShowChildren (this.isChildrenVisible);
});
}
return this.childrenDiv;
}
}
export class TreeViewGroupButtonItem extends TreeViewGroupItem
{
constructor (name, icon)
{
super (name, icon);
this.buttonsDiv = CreateDiv ('ov_tree_item_button_container');
InsertDomElementBefore (this.buttonsDiv, this.nameElement);
}
AppendButton (button)
{
this.buttonsDiv.appendChild (button.GetDomElement ());
}
}
export class TreeView
{
constructor (parentDiv)
{
this.mainDiv = AddDiv (parentDiv, 'ov_tree_view');
this.children = [];
}
AddClass (className)
{
this.mainDiv.classList.add (className);
}
AddChild (child)
{
child.AddDomElements (this.mainDiv);
this.children.push (child);
}
Clear ()
{
ClearDomElement (this.mainDiv);
this.children = [];
}
}