1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciexport class LitSlicer extends HTMLElement { 17fb726d48Sopenharmony_ci static get observedAttributes(): string[] { 18fb726d48Sopenharmony_ci return ['direction']; //direction = 'horizontal'或者'vertical' 19fb726d48Sopenharmony_ci } 20fb726d48Sopenharmony_ci 21fb726d48Sopenharmony_ci constructor() { 22fb726d48Sopenharmony_ci super(); 23fb726d48Sopenharmony_ci const shadowRoot = this.attachShadow({ mode: 'open' }); 24fb726d48Sopenharmony_ci shadowRoot.innerHTML = ` 25fb726d48Sopenharmony_ci <style> 26fb726d48Sopenharmony_ci :host{ 27fb726d48Sopenharmony_ci display: flex; 28fb726d48Sopenharmony_ci } 29fb726d48Sopenharmony_ci 30fb726d48Sopenharmony_ci #root{ 31fb726d48Sopenharmony_ci display: flex; 32fb726d48Sopenharmony_ci width: 100%; 33fb726d48Sopenharmony_ci height: 100%; 34fb726d48Sopenharmony_ci overflow: auto; 35fb726d48Sopenharmony_ci } 36fb726d48Sopenharmony_ci </style> 37fb726d48Sopenharmony_ci <div id="root" style="${this.style}"> 38fb726d48Sopenharmony_ci <slot></slot> 39fb726d48Sopenharmony_ci </div> 40fb726d48Sopenharmony_ci `; 41fb726d48Sopenharmony_ci } 42fb726d48Sopenharmony_ci 43fb726d48Sopenharmony_ci set direction(val: unknown) { 44fb726d48Sopenharmony_ci // @ts-ignore 45fb726d48Sopenharmony_ci if (val.startsWith('h')) { 46fb726d48Sopenharmony_ci this.shadowRoot!.querySelector('div')!.style.flexDirection = 'row'; // @ts-ignore 47fb726d48Sopenharmony_ci } else if (val.startsWith('v')) { 48fb726d48Sopenharmony_ci this.shadowRoot!.querySelector('div')!.style.flexDirection = 'column'; 49fb726d48Sopenharmony_ci } 50fb726d48Sopenharmony_ci } 51fb726d48Sopenharmony_ci 52fb726d48Sopenharmony_ci connectedCallback(): void {} 53fb726d48Sopenharmony_ci 54fb726d48Sopenharmony_ci disconnectedCallback(): void {} 55fb726d48Sopenharmony_ci 56fb726d48Sopenharmony_ci attributeChangedCallback(name: unknown, oldValue: unknown, newValue: unknown): void { 57fb726d48Sopenharmony_ci // @ts-ignore 58fb726d48Sopenharmony_ci (this as unknown)[name] = newValue; 59fb726d48Sopenharmony_ci } 60fb726d48Sopenharmony_ci // @ts-ignore 61fb726d48Sopenharmony_ci set style(v: unknown) {} 62fb726d48Sopenharmony_ci} 63fb726d48Sopenharmony_ci 64fb726d48Sopenharmony_ciif (!customElements.get('lit-slicer')) { 65fb726d48Sopenharmony_ci // @ts-ignore 66fb726d48Sopenharmony_ci customElements.define('lit-slicer', LitSlicer); 67fb726d48Sopenharmony_ci} 68fb726d48Sopenharmony_ci 69fb726d48Sopenharmony_ciexport class LitSlicerTrack extends HTMLElement { 70fb726d48Sopenharmony_ci private line: HTMLElement | null | undefined; 71fb726d48Sopenharmony_ci private draging: boolean = false; 72fb726d48Sopenharmony_ci private normalWidth: number = 0; 73fb726d48Sopenharmony_ci private rightWidth: number = 0; 74fb726d48Sopenharmony_ci 75fb726d48Sopenharmony_ci static get observedAttributes(): string[] { 76fb726d48Sopenharmony_ci return ['range-left', 'range-right']; 77fb726d48Sopenharmony_ci } 78fb726d48Sopenharmony_ci 79fb726d48Sopenharmony_ci get rangeLeft(): number { 80fb726d48Sopenharmony_ci return parseInt(this.getAttribute('range-left') || '200'); 81fb726d48Sopenharmony_ci } 82fb726d48Sopenharmony_ci 83fb726d48Sopenharmony_ci set rangeLeft(val: number) { 84fb726d48Sopenharmony_ci this.setAttribute('range-left', `${val}`); 85fb726d48Sopenharmony_ci } 86fb726d48Sopenharmony_ci 87fb726d48Sopenharmony_ci get rangeRight(): number { 88fb726d48Sopenharmony_ci return parseInt(this.getAttribute('range-right') || '300'); 89fb726d48Sopenharmony_ci } 90fb726d48Sopenharmony_ci 91fb726d48Sopenharmony_ci set rangeRight(val: number) { 92fb726d48Sopenharmony_ci this.setAttribute('range-right', `${val}`); 93fb726d48Sopenharmony_ci } 94fb726d48Sopenharmony_ci 95fb726d48Sopenharmony_ci constructor() { 96fb726d48Sopenharmony_ci super(); 97fb726d48Sopenharmony_ci const shadowRoot = this.attachShadow({ mode: 'open' }); 98fb726d48Sopenharmony_ci shadowRoot.innerHTML = ` 99fb726d48Sopenharmony_ci <style> 100fb726d48Sopenharmony_ci :host{ 101fb726d48Sopenharmony_ci flex 102fb726d48Sopenharmony_ci } 103fb726d48Sopenharmony_ci .rootH{ 104fb726d48Sopenharmony_ci width:var(--lit-slicer-track--width,5px); 105fb726d48Sopenharmony_ci background-color: var(--lit-slicer-track--background-color,#d1d1d1); 106fb726d48Sopenharmony_ci height: 100%; 107fb726d48Sopenharmony_ci cursor: ew-resize; 108fb726d48Sopenharmony_ci } 109fb726d48Sopenharmony_ci .rootV{ 110fb726d48Sopenharmony_ci height:var(--lit-slicer-track--height,5px); 111fb726d48Sopenharmony_ci background-color: var(--lit-slicer-track--background-color,#d1d1d1); 112fb726d48Sopenharmony_ci width: 100%; 113fb726d48Sopenharmony_ci cursor: ns-resize; 114fb726d48Sopenharmony_ci } 115fb726d48Sopenharmony_ci </style> 116fb726d48Sopenharmony_ci <div id="root"> 117fb726d48Sopenharmony_ci </div> 118fb726d48Sopenharmony_ci `; 119fb726d48Sopenharmony_ci } 120fb726d48Sopenharmony_ci 121fb726d48Sopenharmony_ci //当 custom element首次被插入文档DOM时,被调用。 122fb726d48Sopenharmony_ci connectedCallback(): void { 123fb726d48Sopenharmony_ci this.line = this.shadowRoot?.querySelector('#root'); 124fb726d48Sopenharmony_ci let parentDirection = this.parentElement!.getAttribute('direction') || 'horizontal'; 125fb726d48Sopenharmony_ci if (parentDirection.startsWith('h')) { 126fb726d48Sopenharmony_ci this.line!.className = 'rootH'; 127fb726d48Sopenharmony_ci let previousElementSibling = this.previousElementSibling as HTMLElement; 128fb726d48Sopenharmony_ci let nextElementSibling = this.nextElementSibling as HTMLElement; 129fb726d48Sopenharmony_ci let preX: number; 130fb726d48Sopenharmony_ci let preY: number; 131fb726d48Sopenharmony_ci let preWidth: number; 132fb726d48Sopenharmony_ci let nextWidth: number; 133fb726d48Sopenharmony_ci this.line!.onmousedown = (e): void => { 134fb726d48Sopenharmony_ci this.draging = true; 135fb726d48Sopenharmony_ci preX = e.pageX; 136fb726d48Sopenharmony_ci preWidth = previousElementSibling!.clientWidth; 137fb726d48Sopenharmony_ci nextWidth = nextElementSibling!.clientWidth; 138fb726d48Sopenharmony_ci if (this.normalWidth === 0) { 139fb726d48Sopenharmony_ci this.normalWidth = previousElementSibling!.clientWidth; 140fb726d48Sopenharmony_ci this.rightWidth = nextElementSibling!.clientWidth; 141fb726d48Sopenharmony_ci } 142fb726d48Sopenharmony_ci previousElementSibling!.style.width = preWidth + 'px'; 143fb726d48Sopenharmony_ci nextElementSibling!.style.width = nextWidth + 'px'; 144fb726d48Sopenharmony_ci document.body.style.userSelect = 'none'; 145fb726d48Sopenharmony_ci document.body.style.webkitUserSelect = 'none'; 146fb726d48Sopenharmony_ci // @ts-ignore 147fb726d48Sopenharmony_ci document.body.style.msUserSelect = 'none'; 148fb726d48Sopenharmony_ci document.onmousemove = (e1): void => { 149fb726d48Sopenharmony_ci if (this.draging) { 150fb726d48Sopenharmony_ci if ( 151fb726d48Sopenharmony_ci preWidth + e1.pageX - preX >= this.normalWidth - this.rangeLeft && 152fb726d48Sopenharmony_ci preWidth + e1.pageX - preX <= this.normalWidth + this.rangeRight 153fb726d48Sopenharmony_ci ) { 154fb726d48Sopenharmony_ci previousElementSibling!.style.width = preWidth + e1.pageX - preX + 'px'; 155fb726d48Sopenharmony_ci nextElementSibling!.style.width = nextWidth + preX - e1.pageX + 'px'; 156fb726d48Sopenharmony_ci } 157fb726d48Sopenharmony_ci } 158fb726d48Sopenharmony_ci }; 159fb726d48Sopenharmony_ci document.onmouseleave = (e2): void => { 160fb726d48Sopenharmony_ci this.draging = false; 161fb726d48Sopenharmony_ci document.body.style.userSelect = 'auto'; 162fb726d48Sopenharmony_ci document.body.style.webkitUserSelect = 'auto'; 163fb726d48Sopenharmony_ci // @ts-ignore 164fb726d48Sopenharmony_ci document.body.style.msUserSelect = 'auto'; 165fb726d48Sopenharmony_ci }; 166fb726d48Sopenharmony_ci document.onmouseup = (e3): void => { 167fb726d48Sopenharmony_ci this.draging = false; 168fb726d48Sopenharmony_ci document.body.style.userSelect = 'auto'; 169fb726d48Sopenharmony_ci document.body.style.webkitUserSelect = 'auto'; 170fb726d48Sopenharmony_ci // @ts-ignore 171fb726d48Sopenharmony_ci document.body.style.msUserSelect = 'auto'; 172fb726d48Sopenharmony_ci }; 173fb726d48Sopenharmony_ci }; 174fb726d48Sopenharmony_ci } else { 175fb726d48Sopenharmony_ci this.isDirection(); 176fb726d48Sopenharmony_ci } 177fb726d48Sopenharmony_ci } 178fb726d48Sopenharmony_ci 179fb726d48Sopenharmony_ci isDirection(): void { 180fb726d48Sopenharmony_ci this.line!.className = 'rootV'; 181fb726d48Sopenharmony_ci let previousElementSibling = this.previousElementSibling as HTMLElement; 182fb726d48Sopenharmony_ci let preY: number; 183fb726d48Sopenharmony_ci let preHeight: number; 184fb726d48Sopenharmony_ci this.line!.onmousedown = (e): void => { 185fb726d48Sopenharmony_ci this.draging = true; 186fb726d48Sopenharmony_ci preY = e.pageY; 187fb726d48Sopenharmony_ci preHeight = previousElementSibling?.clientHeight; 188fb726d48Sopenharmony_ci previousElementSibling!.style!.height = preHeight + 'px'; 189fb726d48Sopenharmony_ci document.onmousemove = (e1): void => { 190fb726d48Sopenharmony_ci if (this.draging) { 191fb726d48Sopenharmony_ci previousElementSibling.style.height = preHeight + e1.pageY - preY + 'px'; 192fb726d48Sopenharmony_ci } 193fb726d48Sopenharmony_ci }; 194fb726d48Sopenharmony_ci document.onmouseleave = (e2): void => { 195fb726d48Sopenharmony_ci this.draging = false; 196fb726d48Sopenharmony_ci }; 197fb726d48Sopenharmony_ci document.onmouseup = (e3): void => { 198fb726d48Sopenharmony_ci this.draging = false; 199fb726d48Sopenharmony_ci }; 200fb726d48Sopenharmony_ci }; 201fb726d48Sopenharmony_ci } 202fb726d48Sopenharmony_ci 203fb726d48Sopenharmony_ci //当 custom element从文档DOM中删除时,被调用。 204fb726d48Sopenharmony_ci disconnectedCallback(): void { 205fb726d48Sopenharmony_ci this.line!.onmousedown = null; 206fb726d48Sopenharmony_ci } 207fb726d48Sopenharmony_ci 208fb726d48Sopenharmony_ci //当 custom element被移动到新的文档时,被调用。 209fb726d48Sopenharmony_ci adoptedCallback(): void {} 210fb726d48Sopenharmony_ci 211fb726d48Sopenharmony_ci //当 custom element增加、删除、修改自身属性时,被调用。 212fb726d48Sopenharmony_ci attributeChangedCallback(name: unknown, oldValue: unknown, newValue: unknown): void {} 213fb726d48Sopenharmony_ci} 214fb726d48Sopenharmony_ci 215fb726d48Sopenharmony_ciif (!customElements.get('lit-slicer-track')) { 216fb726d48Sopenharmony_ci customElements.define('lit-slicer-track', LitSlicerTrack); 217fb726d48Sopenharmony_ci} 218