-
Notifications
You must be signed in to change notification settings - Fork 123
Expand file tree
/
Copy pathmultipane.js
More file actions
113 lines (91 loc) · 3.08 KB
/
multipane.js
File metadata and controls
113 lines (91 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const LAYOUT_HORIZONTAL = 'horizontal';
const LAYOUT_VERTICAL = 'vertical';
export default {
name: 'multipane',
props: {
layout: {
type: String,
default: LAYOUT_VERTICAL,
},
},
data() {
return {
isResizing: false,
};
},
computed: {
classnames() {
return [
'multipane',
'layout-' + this.layout.slice(0, 1),
this.isResizing ? 'is-resizing' : '',
];
},
cursor() {
return this.isResizing
? this.layout == LAYOUT_VERTICAL ? 'col-resize' : 'row-resize'
: '';
},
userSelect() {
return this.isResizing ? 'none' : '';
},
},
methods: {
onMouseDown({ target: resizer, pageX: initialPageX, pageY: initialPageY }) {
if (resizer.className && typeof resizer.className === 'string' && resizer.className.match('multipane-resizer')) {
let self = this;
let { $el: container, layout } = self;
let pane = resizer.previousElementSibling;
let {
offsetWidth: initialPaneWidth,
offsetHeight: initialPaneHeight,
} = pane;
let usePercentage = !!(pane.style.width + '').match('%');
const { addEventListener, removeEventListener } = window;
const resize = (initialSize, offset = 0) => {
if (layout == LAYOUT_VERTICAL) {
let containerWidth = container.clientWidth;
let paneWidth = initialSize + offset;
return (pane.style.width = usePercentage
? paneWidth / containerWidth * 100 + '%'
: paneWidth + 'px');
}
if (layout == LAYOUT_HORIZONTAL) {
let containerHeight = container.clientHeight;
let paneHeight = initialSize + offset;
return (pane.style.height = usePercentage
? paneHeight / containerHeight * 100 + '%'
: paneHeight + 'px');
}
};
// This adds is-resizing class to container
self.isResizing = true;
// Resize once to get current computed size
let size = resize();
// Trigger paneResizeStart event
self.$emit('paneResizeStart', pane, resizer, size);
const onMouseMove = function({ pageX, pageY }) {
size =
layout == LAYOUT_VERTICAL
? resize(initialPaneWidth, pageX - initialPageX)
: resize(initialPaneHeight, pageY - initialPageY);
self.$emit('paneResize', pane, resizer, size);
};
const onMouseUp = function() {
// Run resize one more time to set computed width/height.
size =
layout == LAYOUT_VERTICAL
? resize(pane.clientWidth)
: resize(pane.clientHeight);
// This removes is-resizing class to container
self.isResizing = false;
removeEventListener('mousemove', onMouseMove);
removeEventListener('mouseup', onMouseUp);
self.$emit('paneResizeStop', pane, resizer, size);
};
addEventListener('mousemove', onMouseMove);
addEventListener('mouseup', onMouseUp);
}
},
},
};