UNPKG

sunshine-layx

Version:

A magical window.

139 lines (110 loc) 5.61 kB
import UIWindowComponent from "../basic/models/UIWindowComponent"; import UIControl from "../basic/interfaces/UIControl"; import App from "../core/App"; import UIWindow from "./UIWindow"; import UIContextMenuBar from "./UIContextMenuBar"; import UIActionButton from "./UIActionButton"; import * as ElementHelper from "../utils/ElementHelper"; import * as Types from "../../types"; import * as CastHelper from "../utils/CastHelper"; import * as Enums from "../basic/enums"; import * as EventHelper from "../utils/EventHelper"; export default class UIActionBar extends UIWindowComponent implements UIControl { public static actionButtonZoomWidth: number = 300; public readonly elementId: string = `${this.window.elementId}-${Enums.ComponentType.ACTION_BAR}`; public enable: boolean = true; public items: Array<Types.ActionButtonOption> | false = [ UIActionButton.refresh, UIActionButton.min, UIActionButton.max, UIActionButton.destroy ]; private _element: HTMLElement | null = null; get element() { return document.getElementById(`${this.elementId}`); } constructor(app: App, window: UIWindow, options: Types.ActionBarOption) { super(app, window); this.enable = CastHelper.booleanCast(options.enable, this.enable); this.items = CastHelper.actionButtonsCast(options.actionButtons, this.items); } present(): DocumentFragment { const fragment = ElementHelper.createFragment(); if (this.enable === true) { const actionBarElement = ElementHelper.createElement("div"); actionBarElement.setAttribute("data-window-id", this.window.id); actionBarElement.id = this.elementId; ElementHelper.addClasses(actionBarElement, this.app.prefix, Enums.ComponentType.ACTION_BAR, "flexbox", "flex-row" ); actionBarElement.addEventListener("mousedown", (ev: MouseEvent) => { ev.preventDefault(); ev.stopPropagation(); }); actionBarElement.addEventListener("contextmenu", (ev: MouseEvent) => { ev.preventDefault(); ev.stopPropagation(); ev.returnValue = false; return false; }, true); this.createActionButtons(actionBarElement); fragment.appendChild(actionBarElement); } return fragment; } zoomActionButtons(windowWidth: number): void { if (this.items === false) return; let isMerge = windowWidth <= UIActionBar.actionButtonZoomWidth ? true : false; const actionButtons = this.getComponent<Array<UIActionButton>>(Enums.ComponentType.ACTION_BUTTONS); if (!actionButtons) return; let [lastActionButton, ...frontActionButtons] = [...actionButtons].reverse(); let moreContextMenuButtons = Array<Types.ContextMenuButtonOption>(); frontActionButtons = frontActionButtons.reverse(); for (const item of frontActionButtons) { isMerge ? ElementHelper.addClasses(item.element, this.app.prefix, "action-button-hidden" ) : ElementHelper.removeClasses(item.element, this.app.prefix, "action-button-hidden" ); moreContextMenuButtons.push(<Types.ContextMenuButtonOption>item); } const moreActionButton = new UIActionButton(this.app, this.window, UIActionButton.more); if (isMerge) { if (!moreActionButton.element) { const moreContextMenuBar = new UIContextMenuBar(this.app, this.window, `more-action`, moreContextMenuButtons); const moreContextMenuBarElement = moreContextMenuBar.present(); document.body.appendChild(moreContextMenuBarElement); moreActionButton.handler = function (ev: MouseEvent, window: UIWindow) { moreContextMenuBar.updateOffset(ev, this.window.zIndex + 1); } const moreActionButtonElement = moreActionButton.present(); moreActionButtonElement.firstElementChild && lastActionButton.element!.insertAdjacentElement('beforebegin', moreActionButtonElement.firstElementChild); this.window.setComponent(Enums.ComponentType.MORE_ACTION_CONTEXT_MENU_BAR, moreContextMenuBar); } } else { if (moreActionButton.element) { this.window.removeMoreActionContextMenu(); moreActionButton.element && moreActionButton.element.parentElement!.removeChild(moreActionButton.element); this.window.removeComponent(Enums.ComponentType.MORE_ACTION_CONTEXT_MENU_BAR); } } } private createActionButtons(parentActionBarElemnt: HTMLElement) { if (this.items === false) return; const actionButtons = Array<UIActionButton>(); for (const item of this.items) { const actionButton = new UIActionButton(this.app, this.window, item); const actionButtonElement = actionButton.present(); parentActionBarElemnt.appendChild(actionButtonElement); actionButtons.push(actionButton); } this.setComponent(Enums.ComponentType.ACTION_BUTTONS, actionButtons); } }