silex-website-builder-goodevent
Version:
Free and easy website builder for everyone.
140 lines (129 loc) • 5.28 kB
text/typescript
import {Controller} from '../types';
import {Model} from '../types';
/**
* Silex, live web creation
* http://projects.silexlabs.org/?/silex/
*
* Copyright (c) 2012 Silex Labs
* http://www.silexlabs.org/
*
* Silex is available under the GPL license
* http://www.silexlabs.org/silex/silex-licensing/
*/
/**
* @fileoverview
* the Silex context menu
*
*/
import {ControllerBase} from '../controller/controller-base';
import {InvalidationManager} from '../utils/invalidation-manager';
/**
* @param element container to render the UI
* @param model model class which holds
* the model instances - views use it for read
* operation only
* @param controller structure which holds
* the controller instances
*/
export class ContextMenu {
/**
* hold the element in the context menu which has the current page name
*/
currentPageElement: HTMLElement;
/**
* invalidation mechanism
*/
invalidationManager: InvalidationManager;
constructor(public element: HTMLElement, public model: Model, public controller: Controller) {
this.currentPageElement = element.querySelector('.current-page');
this.currentPageElement.onclick = (e) =>
this.controller.viewMenuController.showPages();
this.invalidationManager = new InvalidationManager(500);
}
/**
* create the context menu
* called by the app constructor
*/
buildUi() {
this.element.querySelector('.delete').addEventListener('click', () => {
this.controller.editMenuController.removeSelectedElements();
});
this.element.querySelector('.edit').addEventListener('click', () => {
this.controller.editMenuController.editElement();
});
this.element.querySelector('.copy').addEventListener('click', () => {
this.controller.editMenuController.copySelection();
});
this.element.querySelector('.paste').addEventListener('click', () => {
this.controller.editMenuController.pasteClipBoard();
});
this.element.querySelector('.duplicate').addEventListener('click', () => {
this.controller.editMenuController.duplicate();
});
this.element.querySelector('.top').addEventListener('click', () => {
this.controller.editMenuController.moveToTop();
});
this.element.querySelector('.up').addEventListener('click', () => {
this.controller.editMenuController.moveUp();
});
this.element.querySelector('.down').addEventListener('click', () => {
this.controller.editMenuController.moveDown();
});
this.element.querySelector('.bottom').addEventListener('click', () => {
this.controller.editMenuController.moveToBottom();
});
this.element.querySelector('.sticky-elements').addEventListener('click', (e) => {
this.controller.stageController.toggleSticky();
});
}
/**
* the selection has changed
* called by silex.model.Body
* @param opt_selectedElements the selected elements
* @param opt_pageNames the names of the pages
* @param opt_currentPageName the name of the current page
*/
redraw(opt_selectedElements?: HTMLElement[], opt_pageNames?: string[], opt_currentPageName?: string) {
this.invalidationManager.callWhenReady(() => {
// update page name
if (opt_currentPageName) {
this.currentPageElement.innerHTML = this.model.page.getDisplayName(opt_currentPageName);
}
// get the selection if not provided
if (!opt_selectedElements) {
opt_selectedElements = this.model.body.getSelection();
}
// update menu items according to selection
if (opt_selectedElements.length === 1 &&
opt_selectedElements[0].tagName.toLowerCase() === 'body') {
this.element.querySelector('.delete').classList.add('off');
this.element.querySelector('.edit').classList.add('off');
this.element.querySelector('.copy').classList.add('off');
this.element.querySelector('.top').classList.add('off');
this.element.querySelector('.up').classList.add('off');
this.element.querySelector('.down').classList.add('off');
this.element.querySelector('.bottom').classList.add('off');
this.element.querySelector('.duplicate').classList.add('off');
} else {
this.element.querySelector('.delete').classList.remove('off');
this.element.querySelector('.edit').classList.remove('off');
this.element.querySelector('.copy').classList.remove('off');
this.element.querySelector('.top').classList.remove('off');
this.element.querySelector('.up').classList.remove('off');
this.element.querySelector('.down').classList.remove('off');
this.element.querySelector('.bottom').classList.remove('off');
this.element.querySelector('.duplicate').classList.remove('off');
}
if (this.controller.contextMenuController.hasElementsToPaste()) {
this.element.querySelector('.paste').classList.remove('off');
} else {
this.element.querySelector('.paste').classList.add('off');
}
if (this.controller.stageController.getEnableSticky()) {
this.element.querySelector('.sticky-elements').classList.remove('off');
} else {
this.element.querySelector('.sticky-elements').classList.add('off');
}
});
}
}