@@ -233,7 +233,57 @@ class TraceViewer implements m.ClassComponent<TraceViewerAttrs> {
233
233
window . removeEventListener ( 'resize' , this . onResize ) ;
234
234
if ( this . zoomContent ) this . zoomContent . shutdown ( ) ;
235
235
}
236
+ pinnedTrackResize = ( e : MouseEvent ) => {
237
+ e . stopPropagation ( ) ;
238
+ e . preventDefault ( ) ;
239
+ if ( e . currentTarget instanceof HTMLElement ) {
240
+ const timelineElement = e . currentTarget . closest ( 'div.pan-and-zoom-content' ) ;
241
+ if ( timelineElement && timelineElement instanceof HTMLDivElement ) {
242
+ let mouseY = e . clientY ;
243
+ const mouseMoveEvent = ( evMove : MouseEvent ) : void => {
244
+ evMove . preventDefault ( ) ;
245
+ const movementY = evMove . clientY - mouseY ;
246
+ globals . dispatch (
247
+ Actions . setPinnedPanelHeight (
248
+ { newHeight : globals . state . pinnedPanelHeight + movementY } ) ) ;
249
+ mouseY = evMove . clientY ;
236
250
251
+ globals . rafScheduler . scheduleFullRedraw ( ) ;
252
+ } ;
253
+ const mouseReturnEvent = ( ) : void => {
254
+ timelineElement . addEventListener ( 'mousemove' , mouseMoveEvent ) ;
255
+ timelineElement . removeEventListener ( 'mouseenter' , mouseReturnEvent ) ;
256
+ } ;
257
+ const mouseLeaveEvent = ( ) : void => {
258
+ timelineElement . removeEventListener ( 'mousemove' , mouseMoveEvent ) ;
259
+ timelineElement . addEventListener ( 'mouseenter' , mouseReturnEvent ) ;
260
+ } ;
261
+ const mouseUpEvent = ( ) : void => {
262
+ timelineElement . removeEventListener ( 'mousemove' , mouseMoveEvent ) ;
263
+ document . removeEventListener ( 'mouseup' , mouseUpEvent ) ;
264
+ timelineElement . removeEventListener ( 'mouseenter' , mouseReturnEvent ) ;
265
+ timelineElement . removeEventListener ( 'mouseleave' , mouseLeaveEvent ) ;
266
+ } ;
267
+ timelineElement . addEventListener ( 'mousemove' , mouseMoveEvent ) ;
268
+ timelineElement . addEventListener ( 'mouseleave' , mouseLeaveEvent ) ;
269
+ document . addEventListener ( 'mouseup' , mouseUpEvent ) ;
270
+ }
271
+ }
272
+ } ;
273
+ checkPinnedResize = ( e : MouseEvent ) => {
274
+ if ( e . currentTarget instanceof HTMLElement &&
275
+ e . type !== 'mouseleave'
276
+ ) {
277
+ const timelineElement : HTMLDivElement | null = e . currentTarget . closest ( 'div.pan-and-zoom-content' ) ;
278
+ timelineElement ?. addEventListener ( 'mousedown' , this . pinnedTrackResize ) ;
279
+ e . currentTarget . style . cursor = 'row-resize' ;
280
+ return ;
281
+ } else if ( e . currentTarget instanceof HTMLElement ) {
282
+ const timelineElement : HTMLDivElement | null = e . currentTarget . closest ( 'div.pan-and-zoom-content' ) ;
283
+ timelineElement ?. removeEventListener ( 'mousedown' , this . pinnedTrackResize ) ;
284
+ e . currentTarget . style . cursor = 'unset' ;
285
+ }
286
+ } ;
237
287
view ( ) {
238
288
const rootNode : AnyAttrsVnode [ ] = [ ] ;
239
289
const renderGroup = ( group : TrackGroupState , panels : AnyAttrsVnode [ ] ) => {
@@ -290,13 +340,14 @@ class TraceViewer implements m.ClassComponent<TraceViewerAttrs> {
290
340
if ( OVERVIEW_PANEL_FLAG . get ( ) ) {
291
341
overviewPanel . push ( m ( OverviewTimelinePanel , { key : 'overview' } ) ) ;
292
342
}
293
- const pinnedPanels : AnyAttrsVnode [ ] = [
343
+ const overviewPanels : AnyAttrsVnode [ ] = [
294
344
...overviewPanel ,
295
345
m ( TimeAxisPanel , { key : 'timeaxis' } ) ,
296
346
m ( TimeSelectionPanel , { key : 'timeselection' } ) ,
297
347
m ( NotesPanel , { key : 'notes' } ) ,
298
348
m ( TickmarkPanel , { key : 'searchTickmarks' } ) ,
299
349
] ;
350
+ const pinnedPanels : AnyAttrsVnode [ ] = [ ] ;
300
351
if ( globals . state . pinnedTracks . length > 0 ) {
301
352
pinnedPanels . push ( m ( TrackGroup , {
302
353
header : m ( MinimalTrackGroup , {
@@ -314,6 +365,7 @@ class TraceViewer implements m.ClassComponent<TraceViewerAttrs> {
314
365
} as TrackGroupAttrs ) ) ;
315
366
}
316
367
368
+
317
369
return m (
318
370
'.page' ,
319
371
m ( '.split-panel' ,
@@ -328,11 +380,28 @@ class TraceViewer implements m.ClassComponent<TraceViewerAttrs> {
328
380
globals . makeSelection ( Actions . deselect ( { } ) ) ;
329
381
} ,
330
382
} ,
331
- m ( '.pinned -panel-container' , m ( PanelContainer , {
383
+ m ( '.overview -panel-container' , m ( PanelContainer , {
332
384
doesScroll : false ,
333
- panels : pinnedPanels ,
385
+ panels : overviewPanels ,
334
386
kind : 'OVERVIEW' ,
335
387
} ) ) ,
388
+ m ( '.scrolling-panel-container pinned-group' , { style : {
389
+ minHeight : ! globals . state . pinnedGroupCollapsed ?globals . state . pinnedPanelHeight + 'px' : '18px' ,
390
+ height : ! globals . state . pinnedGroupCollapsed ?globals . state . pinnedPanelHeight + 'px' : '18px' ,
391
+ } } , m ( PanelContainer , {
392
+ doesScroll : true ,
393
+ panels : pinnedPanels ,
394
+ kind : 'TRACKS' ,
395
+ } ) ) ,
396
+ m ( 'hr' , {
397
+ style : {
398
+ width : '100%' ,
399
+ margin : '0' ,
400
+ cursor : 'row-resize' ,
401
+ } ,
402
+ onmousemove : this . checkPinnedResize ,
403
+ onmouseleave : this . checkPinnedResize ,
404
+ } ) ,
336
405
m ( '.scrolling-panel-container' , m ( PanelContainer , {
337
406
doesScroll : true ,
338
407
panels : rootNode ,
0 commit comments