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