/*
* Copyright (C) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export class LitSlicer extends HTMLElement {
static get observedAttributes() {
return ['direction']; //direction = 'horizontal'或者'vertical'
}
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
`;
}
set direction(val: any) {
if (val.startsWith('h')) {
this.shadowRoot!.querySelector('div')!.style.flexDirection = 'row';
} else if (val.startsWith('v')) {
this.shadowRoot!.querySelector('div')!.style.flexDirection = 'column';
}
}
connectedCallback() {}
disconnectedCallback() {}
attributeChangedCallback(name: any, oldValue: any, newValue: any) {
(this as any)[name] = newValue;
}
set style(v: any) {}
}
if (!customElements.get('lit-slicer')) {
customElements.define('lit-slicer', LitSlicer);
}
export class LitSlicerTrack extends HTMLElement {
private line: HTMLElement | null | undefined;
private draging: boolean = false;
private normalWidth: number = 0;
static get observedAttributes() {
return ['range-left', 'range-right'];
}
get rangeLeft() {
return parseInt(this.getAttribute('range-left') || '200');
}
set rangeLeft(val: number) {
this.setAttribute('range-left', `${val}`);
}
get rangeRight() {
return parseInt(this.getAttribute('range-right') || '300');
}
set rangeRight(val: number) {
this.setAttribute('range-right', `${val}`);
}
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
`;
}
//当 custom element首次被插入文档DOM时,被调用。
connectedCallback() {
this.line = this.shadowRoot?.querySelector('#root');
let parentDirection = this.parentElement!.getAttribute('direction') || 'horizontal';
if (parentDirection.startsWith('h')) {
this.line!.className = 'rootH';
let previousElementSibling = this.previousElementSibling as HTMLElement;
let preX: number, preY: number, preWidth: number;
this.line!.onmousedown = (e) => {
this.draging = true;
preX = e.pageX;
preWidth = previousElementSibling!.clientWidth;
if (this.normalWidth == 0) this.normalWidth = previousElementSibling!.clientWidth;
previousElementSibling!.style.width = preWidth + 'px';
document.body.style.userSelect = 'none';
document.body.style.webkitUserSelect = 'none';
// @ts-ignore
document.body.style.msUserSelect = 'none';
document.onmousemove = (e1) => {
if (this.draging) {
if (
preWidth + e1.pageX - preX >= this.normalWidth - this.rangeLeft &&
preWidth + e1.pageX - preX <= this.normalWidth + this.rangeRight
) {
previousElementSibling!.style.width = preWidth + e1.pageX - preX + 'px';
}
}
};
document.onmouseleave = (e2) => {
this.draging = false;
document.body.style.userSelect = 'auto';
document.body.style.webkitUserSelect = 'auto';
// @ts-ignore
document.body.style.msUserSelect = 'auto';
};
document.onmouseup = (e3) => {
this.draging = false;
document.body.style.userSelect = 'auto';
document.body.style.webkitUserSelect = 'auto';
// @ts-ignore
document.body.style.msUserSelect = 'auto';
};
};
} else {
this.isDirection();
}
}
isDirection(){
this.line!.className = 'rootV';
let previousElementSibling = this.previousElementSibling as HTMLElement;
let preY: number, preHeight: number;
this.line!.onmousedown = (e) => {
this.draging = true;
preY = e.pageY;
preHeight = previousElementSibling?.clientHeight;
previousElementSibling!.style!.height = preHeight + 'px';
document.onmousemove = (e1) => {
if (this.draging) {
previousElementSibling.style.height = preHeight + e1.pageY - preY + 'px';
}
};
document.onmouseleave = (e2) => {
this.draging = false;
};
document.onmouseup = (e3) => {
this.draging = false;
};
};
}
//当 custom element从文档DOM中删除时,被调用。
disconnectedCallback() {
this.line!.onmousedown = null;
}
//当 custom element被移动到新的文档时,被调用。
adoptedCallback() {}
//当 custom element增加、删除、修改自身属性时,被调用。
attributeChangedCallback(name: any, oldValue: any, newValue: any) {}
}
if (!customElements.get('lit-slicer-track')) {
customElements.define('lit-slicer-track', LitSlicerTrack);
}