@@ -71,6 +71,25 @@ const DEFAULT_ROOT_OVERLAY_MODEL: DroptargetOverlayModel = {
71
71
size : { type : 'pixels' , value : 20 } ,
72
72
} ;
73
73
74
+ function moveGroupWithoutDestroying ( options : {
75
+ from : DockviewGroupPanel ;
76
+ to : DockviewGroupPanel ;
77
+ } ) {
78
+ const activePanel = options . from . activePanel ;
79
+ const panels = [ ...options . from . panels ] . map ( ( panel ) => {
80
+ const removedPanel = options . from . model . removePanel ( panel ) ;
81
+ options . from . model . renderContainer . detatch ( panel ) ;
82
+ return removedPanel ;
83
+ } ) ;
84
+
85
+ panels . forEach ( ( panel ) => {
86
+ options . to . model . openPanel ( panel , {
87
+ skipSetActive : activePanel !== panel ,
88
+ skipSetGroupActive : true ,
89
+ } ) ;
90
+ } ) ;
91
+ }
92
+
74
93
function getDockviewTheme ( element : HTMLElement ) : string | undefined {
75
94
function toClassList ( element : HTMLElement ) {
76
95
const list : string [ ] = [ ] ;
@@ -358,8 +377,8 @@ export class DockviewComponent
358
377
private readonly _popoutGroups : {
359
378
window : PopoutWindow ;
360
379
popoutGroup : DockviewGroupPanel ;
361
- referenceGroup : string ;
362
- disposable : IDisposable ;
380
+ referenceGroup ? : string ;
381
+ disposable : { dispose : ( ) => DockviewGroupPanel | undefined } ;
363
382
} [ ] = [ ] ;
364
383
private readonly _rootDropTarget : Droptarget ;
365
384
@@ -621,22 +640,6 @@ export class DockviewComponent
621
640
const theme = getDockviewTheme ( this . gridview . element ) ;
622
641
const element = this . element ;
623
642
624
- function moveGroupWithoutDestroying ( options : {
625
- from : DockviewGroupPanel ;
626
- to : DockviewGroupPanel ;
627
- } ) {
628
- const activePanel = options . from . activePanel ;
629
- const panels = [ ...options . from . panels ] . map ( ( panel ) =>
630
- options . from . model . removePanel ( panel )
631
- ) ;
632
-
633
- panels . forEach ( ( panel ) => {
634
- options . to . model . openPanel ( panel , {
635
- skipSetActive : activePanel !== panel ,
636
- } ) ;
637
- } ) ;
638
- }
639
-
640
643
function getBox ( ) : Box {
641
644
if ( options ?. position ) {
642
645
return options . position ;
@@ -657,7 +660,9 @@ export class DockviewComponent
657
660
const groupId =
658
661
options ?. overridePopoutGroup ?. id ?? this . getNextGroupId ( ) ; //item.id;
659
662
660
- itemToPopout . api . setHidden ( true ) ;
663
+ if ( itemToPopout . api . location . type === 'grid' ) {
664
+ itemToPopout . api . setHidden ( true ) ;
665
+ }
661
666
662
667
const _window = new PopoutWindow (
663
668
`${ this . id } -${ groupId } ` , // unique id
@@ -704,6 +709,8 @@ export class DockviewComponent
704
709
? itemToPopout . group
705
710
: itemToPopout ;
706
711
712
+ const referenceLocation = itemToPopout . api . location . type ;
713
+
707
714
const group =
708
715
options ?. overridePopoutGroup ??
709
716
this . createGroup ( { id : groupId } ) ;
@@ -713,23 +720,29 @@ export class DockviewComponent
713
720
this . _onDidAddGroup . fire ( group ) ;
714
721
}
715
722
716
- const isMoving = this . _moving ;
717
-
718
- try {
719
- this . _moving = true ;
720
- if ( itemToPopout instanceof DockviewPanel ) {
723
+ if ( itemToPopout instanceof DockviewPanel ) {
724
+ this . movingLock ( ( ) => {
721
725
const panel =
722
726
referenceGroup . model . removePanel ( itemToPopout ) ;
723
727
group . model . openPanel ( panel ) ;
724
- } else {
728
+ } ) ;
729
+ } else {
730
+ this . movingLock ( ( ) =>
725
731
moveGroupWithoutDestroying ( {
726
732
from : referenceGroup ,
727
733
to : group ,
728
- } ) ;
729
- referenceGroup . api . setHidden ( true ) ;
734
+ } )
735
+ ) ;
736
+
737
+ switch ( referenceLocation ) {
738
+ case 'grid' :
739
+ referenceGroup . api . setHidden ( true ) ;
740
+ break ;
741
+ case 'floating' :
742
+ case 'popout' :
743
+ this . removeGroup ( referenceGroup ) ;
744
+ break ;
730
745
}
731
- } finally {
732
- this . _moving = isMoving ;
733
746
}
734
747
735
748
popoutContainer . classList . add ( 'dv-dockview' ) ;
@@ -743,6 +756,8 @@ export class DockviewComponent
743
756
getWindow : ( ) => _window . window ! ,
744
757
} ;
745
758
759
+ this . doSetGroupAndPanelActive ( group ) ;
760
+
746
761
popoutWindowDisposable . addDisposables (
747
762
group . api . onDidActiveChange ( ( event ) => {
748
763
if ( event . isActive ) {
@@ -754,11 +769,20 @@ export class DockviewComponent
754
769
} )
755
770
) ;
756
771
772
+ let returnedGroup : DockviewGroupPanel | undefined ;
773
+
757
774
const value = {
758
775
window : _window ,
759
776
popoutGroup : group ,
760
- referenceGroup : referenceGroup . id ,
761
- disposable : popoutWindowDisposable ,
777
+ referenceGroup : this . getPanel ( referenceGroup . id )
778
+ ? referenceGroup . id
779
+ : undefined ,
780
+ disposable : {
781
+ dispose : ( ) => {
782
+ popoutWindowDisposable . dispose ( ) ;
783
+ return returnedGroup ;
784
+ } ,
785
+ } ,
762
786
} ;
763
787
764
788
popoutWindowDisposable . addDisposables (
@@ -777,23 +801,22 @@ export class DockviewComponent
777
801
overlayRenderContainer ,
778
802
Disposable . from ( ( ) => {
779
803
if ( this . getPanel ( referenceGroup . id ) ) {
780
- try {
781
- this . _moving = true ;
804
+ this . movingLock ( ( ) =>
782
805
moveGroupWithoutDestroying ( {
783
806
from : group ,
784
807
to : referenceGroup ,
785
- } ) ;
786
- } finally {
787
- this . _moving = isMoving ;
788
- }
808
+ } )
809
+ ) ;
789
810
790
811
if ( referenceGroup . api . isHidden ) {
791
812
referenceGroup . api . setHidden ( false ) ;
792
813
}
793
814
794
- this . doRemoveGroup ( group , {
795
- skipPopoutAssociated : true ,
796
- } ) ;
815
+ if ( this . getPanel ( group . id ) ) {
816
+ this . doRemoveGroup ( group , {
817
+ skipPopoutAssociated : true ,
818
+ } ) ;
819
+ }
797
820
} else {
798
821
if ( this . getPanel ( group . id ) ) {
799
822
const removedGroup = this . doRemoveGroup ( group , {
@@ -803,8 +826,7 @@ export class DockviewComponent
803
826
removedGroup . model . renderContainer =
804
827
this . overlayRenderContainer ;
805
828
removedGroup . model . location = { type : 'grid' } ;
806
- this . doAddGroup ( removedGroup , [ 0 ] ) ;
807
- this . doSetGroupAndPanelActive ( removedGroup ) ;
829
+ returnedGroup = removedGroup ;
808
830
}
809
831
}
810
832
} )
@@ -845,12 +867,40 @@ export class DockviewComponent
845
867
} else {
846
868
group = item ;
847
869
870
+ const popoutReferenceGroupId = this . _popoutGroups . find (
871
+ ( _ ) => _ . popoutGroup === group
872
+ ) ?. referenceGroup ;
873
+ const popoutReferenceGroup = popoutReferenceGroupId
874
+ ? this . getPanel ( popoutReferenceGroupId )
875
+ : undefined ;
876
+
848
877
const skip =
849
878
typeof options ?. skipRemoveGroup === 'boolean' &&
850
879
options . skipRemoveGroup ;
851
880
852
881
if ( ! skip ) {
853
- this . doRemoveGroup ( item , { skipDispose : true } ) ;
882
+ if ( popoutReferenceGroup ) {
883
+ this . movingLock ( ( ) =>
884
+ moveGroupWithoutDestroying ( {
885
+ from : item ,
886
+ to : popoutReferenceGroup ,
887
+ } )
888
+ ) ;
889
+ this . doRemoveGroup ( item , {
890
+ skipPopoutReturn : true ,
891
+ skipPopoutAssociated : true ,
892
+ } ) ;
893
+ this . doRemoveGroup ( popoutReferenceGroup , {
894
+ skipDispose : true ,
895
+ } ) ;
896
+ group = popoutReferenceGroup ;
897
+ } else {
898
+ this . doRemoveGroup ( item , {
899
+ skipDispose : true ,
900
+ skipPopoutReturn : true ,
901
+ skipPopoutAssociated : ! ! popoutReferenceGroup ,
902
+ } ) ;
903
+ }
854
904
}
855
905
}
856
906
@@ -1505,7 +1555,7 @@ export class DockviewComponent
1505
1555
} ) ;
1506
1556
1507
1557
if ( ! options . skipDispose ) {
1508
- this . overlayRenderContainer . detatch ( panel ) ;
1558
+ panel . group . model . renderContainer . detatch ( panel ) ;
1509
1559
panel . dispose ( ) ;
1510
1560
}
1511
1561
@@ -1628,6 +1678,8 @@ export class DockviewComponent
1628
1678
| {
1629
1679
skipActive ?: boolean ;
1630
1680
skipDispose ?: boolean ;
1681
+ skipPopoutAssociated ?: boolean ;
1682
+ skipPopoutReturn ?: boolean ;
1631
1683
}
1632
1684
| undefined
1633
1685
) : void {
@@ -1641,6 +1693,7 @@ export class DockviewComponent
1641
1693
skipActive ?: boolean ;
1642
1694
skipDispose ?: boolean ;
1643
1695
skipPopoutAssociated ?: boolean ;
1696
+ skipPopoutReturn ?: boolean ;
1644
1697
}
1645
1698
| undefined
1646
1699
) : DockviewGroupPanel {
@@ -1694,20 +1747,26 @@ export class DockviewComponent
1694
1747
if ( selectedGroup ) {
1695
1748
if ( ! options ?. skipDispose ) {
1696
1749
if ( ! options ?. skipPopoutAssociated ) {
1697
- const refGroup = this . getPanel (
1698
- selectedGroup . referenceGroup
1699
- ) ;
1750
+ const refGroup = selectedGroup . referenceGroup
1751
+ ? this . getPanel ( selectedGroup . referenceGroup )
1752
+ : undefined ;
1700
1753
if ( refGroup ) {
1701
1754
this . removeGroup ( refGroup ) ;
1702
1755
}
1703
1756
}
1704
1757
1705
1758
selectedGroup . popoutGroup . dispose ( ) ;
1759
+
1706
1760
this . _groups . delete ( group . id ) ;
1707
1761
this . _onDidRemoveGroup . fire ( group ) ;
1708
1762
}
1709
1763
1710
- selectedGroup . disposable . dispose ( ) ;
1764
+ const removedGroup = selectedGroup . disposable . dispose ( ) ;
1765
+
1766
+ if ( ! options ?. skipPopoutReturn && removedGroup ) {
1767
+ this . doAddGroup ( removedGroup , [ 0 ] ) ;
1768
+ this . doSetGroupAndPanelActive ( removedGroup ) ;
1769
+ }
1711
1770
1712
1771
if ( ! options ?. skipActive && this . _activeGroup === group ) {
1713
1772
const groups = Array . from ( this . _groups . values ( ) ) ;
@@ -1993,17 +2052,18 @@ export class DockviewComponent
1993
2052
}
1994
2053
1995
2054
doSetGroupAndPanelActive ( group : DockviewGroupPanel | undefined ) : void {
1996
- // if (
1997
- // this.activeGroup === group &&
1998
- // this._onDidActiveGroupChange.value !== group
1999
- // ) {
2000
- // this._onDidActiveGroupChange.fire(group);
2001
- // }
2002
-
2003
2055
super . doSetGroupActive ( group ) ;
2004
2056
2005
2057
const activePanel = this . activePanel ;
2006
2058
2059
+ if (
2060
+ group &&
2061
+ this . hasMaximizedGroup ( ) &&
2062
+ ! this . isMaximizedGroup ( group )
2063
+ ) {
2064
+ this . exitMaximizedGroup ( ) ;
2065
+ }
2066
+
2007
2067
if (
2008
2068
! this . _moving &&
2009
2069
activePanel !== this . _onDidActivePanelChange . value
0 commit comments