Skip to content

Commit 65685bd

Browse files
committed
feat(splitter): implement splitter events
1 parent 9184867 commit 65685bd

File tree

3 files changed

+84
-16
lines changed

3 files changed

+84
-16
lines changed

src/components/splitter/splitter-bar.ts

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,14 @@ export default class IgcSplitterBarComponent extends EventEmitterMixin<
139139
});
140140

141141
addKeybindings(this)
142-
.set(arrowUp, this.resizePanes)
143-
.set(arrowDown, this.resizePanes)
144-
.set(arrowLeft, this.resizePanes)
145-
.set(arrowRight, this.resizePanes)
146-
.set([ctrlKey, arrowUp], () => this._handleExpanderClick(true))
147-
.set([ctrlKey, arrowDown], () => this._handleExpanderClick(false))
148-
.set([ctrlKey, arrowLeft], () => this._handleExpanderClick(true))
149-
.set([ctrlKey, arrowRight], () => this._handleExpanderClick(false));
142+
.set(arrowUp, this._handleResizePanes)
143+
.set(arrowDown, this._handleResizePanes)
144+
.set(arrowLeft, this._handleResizePanes)
145+
.set(arrowRight, this._handleResizePanes)
146+
.set([ctrlKey, arrowUp], this._handleExpandPanes)
147+
.set([ctrlKey, arrowDown], this._handleExpandPanes)
148+
.set([ctrlKey, arrowLeft], this._handleExpandPanes)
149+
.set([ctrlKey, arrowRight], this._handleExpandPanes);
150150
//addThemingController(this, all);
151151
}
152152

@@ -157,7 +157,7 @@ export default class IgcSplitterBarComponent extends EventEmitterMixin<
157157
});
158158
}
159159

160-
private resizePanes(event: KeyboardEvent) {
160+
private _handleResizePanes(event: KeyboardEvent) {
161161
if (this._resizeDisallowed) {
162162
return false;
163163
}
@@ -185,6 +185,29 @@ export default class IgcSplitterBarComponent extends EventEmitterMixin<
185185
return true;
186186
}
187187

188+
private _handleExpandPanes(event: KeyboardEvent) {
189+
if (this._splitter?.nonCollapsible) {
190+
return;
191+
}
192+
const { prevButtonHidden, nextButtonHidden } =
193+
this._getExpanderHiddenState();
194+
195+
if (
196+
((event.key === arrowUp && this._orientation === 'vertical') ||
197+
(event.key === arrowLeft && this._orientation === 'horizontal')) &&
198+
!prevButtonHidden
199+
) {
200+
this._handleExpanderClick(true);
201+
}
202+
if (
203+
((event.key === arrowDown && this._orientation === 'vertical') ||
204+
(event.key === arrowRight && this._orientation === 'horizontal')) &&
205+
!nextButtonHidden
206+
) {
207+
this._handleExpanderClick(false);
208+
}
209+
}
210+
188211
private _createSiblingPaneMutationController(pane: IgcSplitterPaneComponent) {
189212
createMutationController(pane, {
190213
callback: () => {
@@ -215,6 +238,7 @@ export default class IgcSplitterBarComponent extends EventEmitterMixin<
215238

216239
const prevSibling = this._siblingPanes[0]!;
217240
const nextSibling = this._siblingPanes[1]!;
241+
218242
let target: IgcSplitterPaneComponent;
219243
if (start) {
220244
// if prev is clicked when next pane is hidden, show next pane, else hide prev pane.
@@ -224,15 +248,23 @@ export default class IgcSplitterBarComponent extends EventEmitterMixin<
224248
target = prevSibling.collapsed ? prevSibling : nextSibling;
225249
}
226250
target.toggle();
251+
target.emitEvent('igcToggle', { detail: target });
252+
}
253+
254+
private _getExpanderHiddenState() {
255+
const [prev, next] = this._siblingPanes;
256+
return {
257+
prevButtonHidden: !!(prev?.collapsed && !next?.collapsed),
258+
nextButtonHidden: !!(next?.collapsed && !prev?.collapsed),
259+
};
227260
}
228261

229262
private _renderBarControls() {
230263
if (this._splitter?.nonCollapsible) {
231264
return nothing;
232265
}
233-
const siblings = this._siblingPanes;
234-
const prevButtonHidden = siblings[0]?.collapsed && !siblings[1]?.collapsed;
235-
const nextButtonHidden = siblings[1]?.collapsed && !siblings[0]?.collapsed;
266+
const { prevButtonHidden, nextButtonHidden } =
267+
this._getExpanderHiddenState();
236268
return html`
237269
<div
238270
part="expander-start"

src/components/splitter/splitter-pane.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,22 @@ import { property, query } from 'lit/decorators.js';
44
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
55
import { splitterContext } from '../common/context.js';
66
import { registerComponent } from '../common/definitions/register.js';
7+
import type { Constructor } from '../common/mixins/constructor.js';
8+
import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
79
import type { SplitterOrientation } from '../types.js';
810
import type IgcSplitterComponent from './splitter.js';
911
import IgcSplitterBarComponent from './splitter-bar.js';
1012
import { styles } from './themes/splitter-pane.css.js';
1113

12-
export default class IgcSplitterPaneComponent extends LitElement {
14+
export interface IgcSplitterPaneComponentEventMap {
15+
igcToggle: CustomEvent<IgcSplitterPaneComponent>;
16+
}
17+
export default class IgcSplitterPaneComponent extends EventEmitterMixin<
18+
IgcSplitterPaneComponentEventMap,
19+
Constructor<LitElement>
20+
>(LitElement) {
1321
public static readonly tagName = 'igc-splitter-pane';
14-
public static override styles = [styles];
22+
public static styles = [styles];
1523

1624
/* blazorSuppress */
1725
public static register() {
@@ -200,13 +208,21 @@ export default class IgcSplitterPaneComponent extends LitElement {
200208

201209
this._prevPaneInitialSize = this._rectSize;
202210
this._nextPaneInitialSize = this._nextPane._rectSize;
211+
212+
this._splitter!.emitEvent('igcResizeStart', {
213+
detail: { pane: this, sibling: this._nextPane },
214+
});
203215
}
204216

205217
private _handleMoving(event: CustomEvent<number>) {
206218
const [paneSize, siblingSize] = this._calcNewSizes(event.detail);
207219

208220
this._prevPane.size = `${paneSize}px`;
209221
this._nextPane.size = `${siblingSize}px`;
222+
223+
this._splitter!.emitEvent('igcResizing', {
224+
detail: { pane: this, sibling: this._nextPane },
225+
});
210226
}
211227

212228
private _handleMovingEnd(event: CustomEvent<number>) {
@@ -238,6 +254,10 @@ export default class IgcSplitterPaneComponent extends LitElement {
238254
totalSize
239255
);
240256
});
257+
258+
this._splitter!.emitEvent('igcResizeEnd', {
259+
detail: { pane: this, sibling: this._nextPane },
260+
});
241261
}
242262

243263
private _adjustPaneSize(

src/components/splitter/splitter.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,23 @@ import { splitterContext } from '../common/context.js';
55
import { addInternalsController } from '../common/controllers/internals.js';
66
import { watch } from '../common/decorators/watch.js';
77
import { registerComponent } from '../common/definitions/register.js';
8+
import type { Constructor } from '../common/mixins/constructor.js';
9+
import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
810
import type { SplitterOrientation } from '../types.js';
911
import IgcSplitterPaneComponent from './splitter-pane.js';
1012
import { styles } from './themes/splitter.base.css.js';
1113

14+
export interface IgcSplitterBarResizeEventArgs {
15+
pane: IgcSplitterPaneComponent;
16+
sibling: IgcSplitterPaneComponent;
17+
}
18+
19+
export interface IgcSplitterComponentEventMap {
20+
igcResizeStart: CustomEvent<IgcSplitterBarResizeEventArgs>;
21+
igcResizing: CustomEvent<IgcSplitterBarResizeEventArgs>;
22+
igcResizeEnd: CustomEvent<IgcSplitterBarResizeEventArgs>;
23+
}
24+
1225
/**
1326
* The Splitter component provides a framework for a simple layout, splitting the view horizontally or vertically
1427
* into multiple smaller resizable and collapsible areas.
@@ -19,9 +32,12 @@ import { styles } from './themes/splitter.base.css.js';
1932
*
2033
* @csspart ... - ... .
2134
*/
22-
export default class IgcSplitterComponent extends LitElement {
35+
export default class IgcSplitterComponent extends EventEmitterMixin<
36+
IgcSplitterComponentEventMap,
37+
Constructor<LitElement>
38+
>(LitElement) {
2339
public static readonly tagName = 'igc-splitter';
24-
public static override styles = [styles];
40+
public static styles = [styles];
2541

2642
/* blazorSuppress */
2743
public static register() {

0 commit comments

Comments
 (0)