silex-website-builder-goodevent
Version:
Free and easy website builder for everyone.
226 lines (194 loc) • 7.4 kB
text/typescript
/**
* 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 Property pane, displayed in the property tool box.
* Controls the background params
*
*/
import { SelectableState } from 'drag-drop-stage-component/src/ts/Types';
import { Controller, Model } from '../../types';
import { ColorPicker } from '../ColorPicker';
import { PaneBase } from './pane-base';
/**
* on of Silex Editors class
* const user edit style of components
* @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 BgPane extends PaneBase {
colorPicker: ColorPicker;
// bg image buttons
bgSelectBgImage: HTMLElement;
bgClearBgImage: HTMLElement;
// bg image properties
attachmentComboBox: HTMLSelectElement;
vPositionComboBox: HTMLSelectElement;
hPositionComboBox: HTMLSelectElement;
repeatComboBox: HTMLSelectElement;
sizeComboBox: HTMLSelectElement;
constructor(element: HTMLElement, model: Model, controller: Controller) {
super(element, model, controller);
// init the component
this.buildUi();
}
/**
* build the UI
*/
buildUi() {
// BG color
this.buildBgColor();
// init bg image
this.buildBgImage();
// bg image properties
this.buildBgImageProperties();
}
/**
* build the UI
*/
buildBgColor() {
this.colorPicker = new ColorPicker(this.element.querySelector('.color-edit-container'), () => this.onColorChanged());
}
/**
* build the UI
*/
buildBgImage() {
this.bgSelectBgImage = this.element.querySelector('.bg-image-button');
this.bgClearBgImage = this.element.querySelector('.clear-bg-image-button');
// event user wants to update the bg image
this.bgSelectBgImage.addEventListener('click', () => this.onSelectImageButton(), false);
// event user wants to remove the bg image
this.bgClearBgImage.addEventListener('click', () => this.onClearImageButton(), false);
}
/**
* build the UI
*/
buildBgImageProperties() {
this.attachmentComboBox = this.initComboBox('.bg-attachment-combo-box', (event: Event) => {
this.styleChanged('background-attachment', (event.target as HTMLInputElement).value);
});
this.vPositionComboBox = this.initComboBox('.bg-position-v-combo-box', (event: Event) => {
const hPosition = this.hPositionComboBox.value;
const vPosition = this.vPositionComboBox.value;
this.styleChanged('background-position', vPosition + ' ' + hPosition);
});
this.hPositionComboBox = this.initComboBox('.bg-position-h-combo-box', (event: Event) => {
const hPosition = this.hPositionComboBox.value;
const vPosition = this.vPositionComboBox.value;
this.styleChanged('background-position', vPosition + ' ' + hPosition);
});
this.repeatComboBox = this.initComboBox('.bg-repeat-combo-box', (event: Event) => {
this.styleChanged('background-repeat', (event.target as HTMLInputElement).value);
});
this.sizeComboBox = this.initComboBox('.bg-size-combo-box', (event: Event) => {
this.styleChanged('background-size', (event.target as HTMLInputElement).value);
});
}
/**
* redraw the properties
* @param states the elements currently selected
* @param pageNames the names of the pages which appear in the current HTML file
* @param currentPageName the name of the current page
*/
redraw(states: SelectableState[], pageNames: string[], currentPageName: string) {
super.redraw(states, pageNames, currentPageName);
// BG color
if (states.length > 0) {
this.colorPicker.setDisabled(false);
const color = this.getCommonProperty(states, (state) => this.model.element.getStyle(state.el, 'background-color') || '');
// indeterminate state
this.colorPicker.setIndeterminate(color == null);
// display color
if (color != null ) {
this.colorPicker.setColor(color);
}
} else {
this.colorPicker.setDisabled(true);
}
// BG image
const enableBgComponents = (enable) => {
if (enable) {
this.bgClearBgImage.classList.remove('disabled');
} else {
this.bgClearBgImage.classList.add('disabled');
}
this.attachmentComboBox.disabled = !enable;
this.vPositionComboBox.disabled = !enable;
this.hPositionComboBox.disabled = !enable;
this.repeatComboBox.disabled = !enable;
this.sizeComboBox.disabled = !enable;
};
const bgImage = this.getCommonProperty(states, (state) => this.model.element.getStyle(state.el, 'background-image'));
if (bgImage != null && bgImage !== 'none' && bgImage !== '') {
enableBgComponents(true);
} else {
enableBgComponents(false);
}
// bg image attachment
const bgImageAttachment = this.getCommonProperty(states, (state) => this.model.element.getStyle(state.el, 'background-attachment'));
if (bgImageAttachment) {
this.attachmentComboBox.value = bgImageAttachment;
} else {
this.attachmentComboBox.selectedIndex = 0;
}
// bg image position
const bgImagePosition: string = this.getCommonProperty(states, (state) => this.model.element.getStyle(state.el, 'background-position'));
if (bgImagePosition && bgImagePosition !== '') {
const hPosition = bgImagePosition.includes('left') ? 'left' : bgImagePosition.includes('right') ? 'right' : bgImagePosition.includes('center') ? 'center' : '';
const vPosition = bgImagePosition.includes('top') ? 'top' : bgImagePosition.includes('bottom') ? 'bottom' : bgImagePosition.includes('center') ? 'center' : '';
// update the drop down lists to display the bg image position
this.vPositionComboBox.value = vPosition;
this.hPositionComboBox.value = hPosition;
} else {
this.vPositionComboBox.selectedIndex = 0;
this.hPositionComboBox.selectedIndex = 0;
}
// bg image repeat
const bgImageRepeat = this.getCommonProperty(states, (state) => this.model.element.getStyle(state.el, 'background-repeat'));
if (bgImageRepeat) {
this.repeatComboBox.value = bgImageRepeat;
} else {
this.repeatComboBox.selectedIndex = 0;
}
// bg image size
const bgImageSize = this.getCommonProperty(states, (state) => this.model.element.getStyle(state.el, 'background-size'));
if (bgImageSize) {
this.sizeComboBox.value = bgImageSize;
} else {
this.sizeComboBox.selectedIndex = 0;
}
}
/**
* User has selected a color
*/
onColorChanged() {
// notify the toolbox
this.styleChanged('background-color', this.colorPicker.getColor());
}
/**
* User has clicked the select image button
*/
onSelectImageButton() {
this.controller.propertyToolController.browseBgImage();
}
/**
* User has clicked the clear image button
*/
onClearImageButton() {
this.styleChanged('background-image', '');
// UI needs to be updated (which is prevented in this.styleChanged by the
// flag iAmSettingTheValue
this.redraw(this.states, this.pageNames, this.currentPageName);
}
}