@@ -878,6 +878,11 @@ export function ResultSet() {
878878 const isDataChangedRef = useRef ( false ) ;
879879 const prevRowsRef = React . useRef ( null ) ;
880880 const prevColumnsRef = React . useRef ( null ) ;
881+ const gvClearedForColumnsRef = useRef ( null ) ;
882+ const lastGvSelectionRef = useRef ( {
883+ type : 'all' , // 'all' | 'rows' | 'columns'
884+ selectedColumns : new Set ( ) ,
885+ } ) ;
881886
882887 useEffect ( ( ) => {
883888 isDataChangedRef . current = Boolean ( _ . size ( dataChangeStore . updated ) || _ . size ( dataChangeStore . added ) || _ . size ( dataChangeStore . deleted ) ) ;
@@ -1463,13 +1468,19 @@ export function ResultSet() {
14631468 return ( ) => eventBus . deregisterListener ( QUERY_TOOL_EVENTS . TRIGGER_ADD_ROWS , triggerAddRows ) ;
14641469 } , [ columns , selectedRows . size ] ) ;
14651470
1466- const getFilteredRowsForGeometryViewer = React . useCallback ( ( ) => {
1471+ const getFilteredRowsForGeometryViewer = React . useCallback ( ( useLastGvSelection = false ) => {
14671472 let selRowsData = rows ;
14681473 if ( selectedRows . size != 0 ) {
14691474 selRowsData = rows . filter ( ( r ) => selectedRows . has ( rowKeyGetter ( r ) ) ) ;
14701475 } else if ( selectedColumns . size > 0 ) {
14711476 let selectedCols = _ . filter ( columns , ( _c , i ) => selectedColumns . has ( i + 1 ) ) ;
14721477 selRowsData = _ . map ( rows , ( r ) => _ . pick ( r , _ . map ( selectedCols , ( c ) => c . key ) ) ) ;
1478+ } else if ( useLastGvSelection && lastGvSelectionRef . current . type === 'columns'
1479+ && lastGvSelectionRef . current . selectedColumns . size > 0 ) {
1480+ let selectedCols = _ . filter ( columns , ( _c , i ) => lastGvSelectionRef . current . selectedColumns . has ( i + 1 ) ) ;
1481+ if ( selectedCols . length > 0 ) {
1482+ selRowsData = _ . map ( rows , ( r ) => _ . pick ( r , _ . map ( selectedCols , ( c ) => c . key ) ) ) ;
1483+ }
14731484 } else if ( selectedRange . current ) {
14741485 let [ , , startRowIdx , endRowIdx ] = getRangeIndexes ( ) ;
14751486 selRowsData = rows . slice ( startRowIdx , endRowIdx + 1 ) ;
@@ -1491,12 +1502,20 @@ export function ResultSet() {
14911502 // Handle manual Geometry Viewer opening
14921503 useEffect ( ( ) => {
14931504 const renderGeometries = ( column ) => {
1505+ gvClearedForColumnsRef . current = null ;
1506+ if ( selectedRows . size > 0 ) {
1507+ lastGvSelectionRef . current = { type : 'rows' , selectedColumns : new Set ( ) } ;
1508+ } else if ( selectedColumns . size > 0 ) {
1509+ lastGvSelectionRef . current = { type : 'columns' , selectedColumns : new Set ( selectedColumns ) } ;
1510+ } else {
1511+ lastGvSelectionRef . current = { type : 'all' , selectedColumns : new Set ( ) } ;
1512+ }
14941513 const selRowsData = getFilteredRowsForGeometryViewer ( ) ;
14951514 openGeometryViewerTab ( column , selRowsData ) ;
14961515 } ;
14971516 eventBus . registerListener ( QUERY_TOOL_EVENTS . TRIGGER_RENDER_GEOMETRIES , renderGeometries ) ;
14981517 return ( ) => eventBus . deregisterListener ( QUERY_TOOL_EVENTS . TRIGGER_RENDER_GEOMETRIES , renderGeometries ) ;
1499- } , [ getFilteredRowsForGeometryViewer , openGeometryViewerTab , eventBus ] ) ;
1518+ } , [ getFilteredRowsForGeometryViewer , openGeometryViewerTab , eventBus , selectedRows , selectedColumns ] ) ;
15001519
15011520 // Auto-update Geometry Viewer when rows/columns change
15021521 useEffect ( ( ) => {
@@ -1506,8 +1525,19 @@ export function ResultSet() {
15061525
15071526 if ( ( rowsChanged || columnsChanged ) && layoutDocker . isTabOpen ( PANELS . GEOMETRY ) ) {
15081527
1509- if ( currentGeometryColumn ) {
1510- const selRowsData = getFilteredRowsForGeometryViewer ( ) ;
1528+ const prevColumnNames = prevColumnsRef . current ?. map ( c => c . key ) . sort ( ) . join ( ',' ) ?? '' ;
1529+ const currColumnNames = columns . map ( c => c . key ) . sort ( ) . join ( ',' ) ;
1530+ const columnsChanged = prevColumnNames !== currColumnNames ;
1531+
1532+ if ( columnsChanged && currentGeometryColumn ) {
1533+ gvClearedForColumnsRef . current = currColumnNames ;
1534+ lastGvSelectionRef . current = { type : 'all' , selectedColumns : new Set ( ) } ;
1535+ openGeometryViewerTab ( null , [ ] ) ;
1536+ } else if ( gvClearedForColumnsRef . current === currColumnNames ) {
1537+ openGeometryViewerTab ( null , [ ] ) ;
1538+ } else if ( currentGeometryColumn && rowsChanged ) {
1539+ const useColSelection = lastGvSelectionRef . current . type === 'columns' ;
1540+ const selRowsData = getFilteredRowsForGeometryViewer ( useColSelection ) ;
15111541 openGeometryViewerTab ( currentGeometryColumn , selRowsData ) ;
15121542 } else {
15131543 // No geometry column
@@ -1517,7 +1547,7 @@ export function ResultSet() {
15171547
15181548 prevRowsRef . current = rows ;
15191549 prevColumnsRef . current = columns ;
1520- } , [ rows , columns , getFilteredRowsForGeometryViewer , openGeometryViewerTab , layoutDocker ] ) ;
1550+ } , [ rows , columns , getFilteredRowsForGeometryViewer , layoutDocker ] ) ;
15211551
15221552 const triggerResetScroll = ( ) => {
15231553 // Reset the scroll position to previously saved location.
0 commit comments