Revision: 41462 http://brlcad.svn.sourceforge.net/brlcad/?rev=41462&view=rev Author: bob1961 Date: 2010-11-24 20:37:44 +0000 (Wed, 24 Nov 2010)
Log Message: ----------- Added the ability to select one or more members of a combination such that setting the edit parameters for one member will set them for all selected members. Modified Paths: -------------- brlcad/trunk/src/tclscripts/archer/CombEditFrame.tcl Modified: brlcad/trunk/src/tclscripts/archer/CombEditFrame.tcl =================================================================== --- brlcad/trunk/src/tclscripts/archer/CombEditFrame.tcl 2010-11-24 18:08:12 UTC (rev 41461) +++ brlcad/trunk/src/tclscripts/archer/CombEditFrame.tcl 2010-11-24 20:37:44 UTC (rev 41462) @@ -65,15 +65,16 @@ variable mMemberDataRotArb "" variable mMemberDataTra "" variable mMemberDataSca "" - variable mMemberHeadings {Op Name Az El Tw Tx Ty Tz Sa Sx Sy Sz Kx Ky Kz} - variable mMemberHeadingsRotAet {Op Name Az El Tw Kx Ky Kz} - variable mMemberHeadingsRotXyz {Op Name Rx Ry Rz Kx Ky Kz} - variable mMemberHeadingsRotArb {Op Name Kx Ky Kz Dx Dy Dz Ang} - variable mMemberHeadingsTra {Op Name Tx Ty Tz} - variable mMemberHeadingsSca {Op Name Sa Sx Sy Sz Kx Ky Kz} + variable mMemberHeadings {"" Op Name Az El Tw Tx Ty Tz Sa Sx Sy Sz Kx Ky Kz} + variable mMemberHeadingsRotAet {"" Op Name Az El Tw Kx Ky Kz} + variable mMemberHeadingsRotXyz {"" Op Name Rx Ry Rz Kx Ky Kz} + variable mMemberHeadingsRotArb {"" Op Name Kx Ky Kz Dx Dy Dz Ang} + variable mMemberHeadingsTra {"" Op Name Tx Ty Tz} + variable mMemberHeadingsSca {"" Op Name Sa Sx Sy Sz Kx Ky Kz} variable mMemberDataOrder {RotAet RotXyz RotArb Tra Sca} variable mLastTabIndex -1 - variable mTableData {RotAet 8 "Rot (AET)" RotXyz 8 "Rot (XYZ)" RotArb 9 "Rot (Arbitrary)" Tra 5 Translation Sca 9 Scale} + variable mTableData {RotAet 9 "Rot (AET)" RotXyz 9 "Rot (XYZ)" RotArb 10 "Rot (Arbitrary)" Tra 6 Translation Sca 10 Scale} + variable mToggleSelectMode 0 method buildGeneralGUI {} method buildShaderGUI {} @@ -92,13 +93,17 @@ method handleTablePopup {_win _x _y _X _Y} method populateMembersMenu {_type _index _X _Y} method addMemberCreationMenuEntries {_type _row} - method setOperator {_op _tname _index} + method setTableCol {_tname _col _val} + method setTableVal {_tname _index _val} method selectName {args} + method invertSelect {_tname} + method toggleSelect {_tname _win _x _y} method appendRow {_tname} method insertRow {_type _row} method deleteRow {_type _row} method setKeypoint {args} method setKeypointVC {_tname _row _col} + method syncColumn {_tname _row _col _val} method validateTableEntry {_row _col _newval _tname} # Override what's in GeometryEditFrame @@ -525,6 +530,8 @@ grid $itk_component(combTreeT) \ -row 0 \ -sticky nsew + grid columnconfigure $parent 0 -weight 1 + grid rowconfigure $parent 0 -weight 1 # bind $itk_component(combTreeT) <Leave> [::itcl::code $this updateGeometryIfMod] # bind $itk_component(combTreeT) <Return> [::itcl::code $this updateGeometryIfMod] @@ -564,6 +571,7 @@ -width 0 \ -rows 100000 \ -cols $cols \ + -titlecols 1 \ -titlerows 1 \ -colstretchmode all \ -variable [::itcl::scope mMemberData$tname] \ @@ -571,6 +579,11 @@ -validatecommand [::itcl::code $this validateTableEntry %r %c %S $tname] } {} + # Set width of columns 0, 1 and 2 + $itk_component(combMembers$tname) width 0 3 + $itk_component(combMembers$tname) width 1 4 + $itk_component(combMembers$tname) width 2 20 + # Create scrollbars itk_component add tableHScroll$tname { ::ttk::scrollbar $itk_component(combMembers$tname\F).tableHScroll \ @@ -596,8 +609,15 @@ $itk_component(combMembersTabs) add $itk_component(combMembers$tname\F) -text $text + bind $itk_component(combMembers$tname) <Button-1> [::itcl::code $this toggleSelect $tname %W %x %y] bind $itk_component(combMembers$tname) <Button-3> [::itcl::code $this handleTablePopup %W %x %y %X %Y] bind $itk_component(combMembers$tname) <B3-Motion> {break} + + $itk_component(combMembers$tname) tag col select_col 0 + $itk_component(combMembers$tname) tag configure select_col \ + -relief raised + $itk_component(combMembers$tname) tag configure title \ + -relief raised } grid columnconfigure $itk_component(combMembersTabs) 0 -weight 1 @@ -667,7 +687,7 @@ unset mMemberData$_tname set col 0 foreach heading [subst $[subst mMemberHeadings$_tname]] { - set mMemberData$_tname\(0,$col) $heading + set mMemberData$_tname\(0,$col\) $heading incr col } } @@ -687,9 +707,24 @@ set tname [lindex $mMemberDataOrder $dtype] set mdata [packMemberDataIntoString $tname] + # Save table row selection state + set row 1 + set rsslist {} + while {[info exists mMemberData$tname\($row,0\)]} { + lappend rsslist [subst $[subst mMemberData$tname\($row,0\)]] + incr row + } + incr dtype 2 catch {eval $itk_option(-mged) combmem -r $dtype $itk_option(-geometryObject) [regsub -all {\n} $mdata " "]} GeometryEditFrame::updateGeometry + + # Restore table row selection state + set row 1 + foreach item $rsslist { + set mMemberData$tname\($row,0\) $item + incr row + } } ::itcl::body CombEditFrame::getCurrentMemberDataType {} { @@ -714,9 +749,15 @@ ::itcl::body CombEditFrame::initMemberDataTable {_tname _mdata} { set i 1 foreach row [split $_mdata "\n"] { - set j 0 + if {$row == ""} { + incr i + continue + } + + set mMemberData$_tname\($i,0\) "" + set j 1 foreach col $row { - set mMemberData$_tname\($i,$j) $col + set mMemberData$_tname\($i,$j\) $col incr j } @@ -732,8 +773,11 @@ } set ipair [regsub {,} $index " "] + set col [lindex $ipair 1] + if {$col == 0} { + continue + } set new_row [lindex $ipair 0] - set col [lindex $ipair 1] if {$row != $new_row} { set row $new_row @@ -741,7 +785,7 @@ # Skip headings if {$row} { - lappend curr_mdata($row) [subst $[subst mMemberData$_tname\($index)]] + lappend curr_mdata($row) [subst $[subst mMemberData$_tname\($index\)]] } } @@ -792,34 +836,57 @@ -label "Append Row" \ -command [::itcl::code $this appendRow $_type] } else { + if {$col == 0} { + if {[subst $[subst mMemberData$tname\($_index\)]] == "*"} { + $itk_component(combMembersMenu) add command \ + -label "Deselect" \ + -command [::itcl::code $this setTableVal $tname $_index ""] + } else { + $itk_component(combMembersMenu) add command \ + -label "Select" \ + -command [::itcl::code $this setTableVal $tname $_index *] + } + + $itk_component(combMembersMenu) add separator + $itk_component(combMembersMenu) add command \ + -label "Deselect All" \ + -command [::itcl::code $this setTableCol $tname $col ""] + $itk_component(combMembersMenu) add command \ + -label "Select All" \ + -command [::itcl::code $this setTableCol $tname $col *] + $itk_component(combMembersMenu) add command \ + -label "Invert All" \ + -command [::itcl::code $this invertSelect $tname] + $itk_component(combMembersMenu) add separator + } elseif {$col == 1} { $itk_component(combMembersMenu) add cascade \ -label "Select Op" \ -menu $itk_component(combMembersOpMenu) $itk_component(combMembersOpMenu) add command \ -label "Union" \ - -command [::itcl::code $this setOperator u $tname $_index] + -command [::itcl::code $this setTableVal $tname $_index u] $itk_component(combMembersOpMenu) add command \ -label "Intersection" \ - -command [::itcl::code $this setOperator + $tname $_index] + -command [::itcl::code $this setTableVal $tname $_index +] $itk_component(combMembersOpMenu) add command \ -label "Subtraction" \ - -command [::itcl::code $this setOperator - $tname $_index] - } elseif {$col == 1} { + -command [::itcl::code $this setTableVal $tname $_index -] + } elseif {$col == 2} { # $itk_component(combMembersMenu) add command \ -label "Select Name" \ -command [::itcl::code $this selectName $_type] - } elseif {($_type == 0 && 5 <= $col && $col <= 7) || - ($_type == 1 && 5 <= $col && $col <= 7)} { + } elseif {($_type == 0 && 6 <= $col && $col <= 8) || + ($_type == 1 && 6 <= $col && $col <= 8)} { $itk_component(combMembersMenu) add command \ -label "Set Keypoint (View Center)" \ -command [::itcl::code $this setKeypointVC $tname $row 5] - } elseif {$_type == 2 && 2 <= $col && $col <= 4} { + } elseif {$_type == 2 && 3 <= $col && $col <= 5} { $itk_component(combMembersMenu) add command \ -label "Set Keypoint (View Center)" \ -command [::itcl::code $this setKeypointVC $tname $row 2] - } elseif {$_type == 4 && 6 <= $col && $col <= 8} { + } elseif {$_type == 4 && 7 <= $col && $col <= 9} { $itk_component(combMembersMenu) add command \ -label "Set Keypoint (View Center)" \ -command [::itcl::code $this setKeypointVC $tname $row 6] @@ -843,14 +910,69 @@ -command [::itcl::code $this deleteRow $_type $_row] } -::itcl::body CombEditFrame::setOperator {_op _tname _index} { - set mMemberData$_tname\($_index) $_op +::itcl::body CombEditFrame::setTableCol {_tname _col _val} { + set row 1 + while {[info exists mMemberData$_tname\($row,$_col\)]} { + set mMemberData$_tname\($row,$_col\) $_val + incr row + } + + if {$_col == 0} { + if {$_val == "*"} { + set mToggleSelectMode 1 + } else { + set mToggleSelectMode 0 + } + } } +::itcl::body CombEditFrame::setTableVal {_tname _index _val} { + set mMemberData$_tname\($_index\) $_val +} + ::itcl::body CombEditFrame::selectName {args} { puts "CombEditFrame::selectName: implement me" } +::itcl::body CombEditFrame::invertSelect {_tname} { + set row 1 + while {[info exists mMemberData$_tname\($row,0\)]} { + if {[subst $[subst mMemberData$_tname\($row,0\)]] == "*"} { + set mMemberData$_tname\($row,0\) "" + } else { + set mMemberData$_tname\($row,0\) "*" + } + incr row + } +} + +::itcl::body CombEditFrame::toggleSelect {_tname _win _x _y} { + set index [$_win index @$_x,$_y] + set ilist [split $index ,] + set col [lindex $ilist 1] + + if {$col != 0} { + return + } + + set row [lindex $ilist 0] + if {$row != 0} { + if {[subst $[subst mMemberData$_tname\($index\)]] == "*"} { + setTableVal $_tname $index "" + } else { + setTableVal $_tname $index "*" + } + } else { + if {$mToggleSelectMode} { + set mToggleSelectMode 0 + setTableCol $_tname 0 "" + } else { + set mToggleSelectMode 1 + setTableCol $_tname 0 "*" + } + } +} + ::itcl::body CombEditFrame::appendRow {_type} { set tname [lindex $mMemberDataOrder $_type] set anames [lsort -dictionary [array names mMemberData$tname]] @@ -871,11 +993,12 @@ set row [lindex $dlist 0] incr lastRow - set mMemberData$tname\($lastRow,0) u - set mMemberData$tname\($lastRow,1) edit_me - set j 2 + set mMemberData$tname\($lastRow,0\) "" + set mMemberData$tname\($lastRow,1\) u + set mMemberData$tname\($lastRow,2\) edit_me + set j 3 foreach col [lrange $row 2 end] { - set mMemberData$tname\($lastRow,$j) $col + set mMemberData$tname\($lastRow,$j\) $col incr j } } @@ -891,6 +1014,19 @@ set rowData [lindex $tmplist 0] set rowData [lreplace $rowData 0 1 u edit_me] + # Save table row selection state + set row 1 + set rsslist {} + while {[info exists mMemberData$tname\($row,0\)]} { + # Append extra state for the new row + if {$row == $_row} { + lappend rsslist "" + } + + lappend rsslist [subst $[subst mMemberData$tname\($row,0\)]] + incr row + } + incr _row -1 set mlist [split $mdata "\n"] set mlist [linsert $mlist $_row $rowData] @@ -901,12 +1037,31 @@ clearMemberDataTable $tname initMemberDataTable $tname $mdata + + # Restore table row selection state + set row 1 + foreach item $rsslist { + set mMemberData$tname\($row,0\) $item + incr row + } } ::itcl::body CombEditFrame::deleteRow {_type _row} { set tname [lindex $mMemberDataOrder $_type] set mdata [packMemberDataIntoString $tname] + # Save table row selection state + set row 1 + set rsslist {} + while {[info exists mMemberData$tname\($row,0\)]} { + # Effectively skip/delete state for the deleted row + if {$row != $_row} { + lappend rsslist [subst $[subst mMemberData$tname\($row,0\)]] + } + + incr row + } + incr _row -1 set mlist [split $mdata "\n"] set mlist [lreplace $mlist $_row $_row] @@ -917,6 +1072,13 @@ clearMemberDataTable $tname initMemberDataTable $tname $mdata + + # Restore table row selection state + set row 1 + foreach item $rsslist { + set mMemberData$tname\($row,0\) $item + incr row + } } ::itcl::body CombEditFrame::setKeypoint {args} { @@ -932,13 +1094,38 @@ set j $_col foreach n $center { - set mMemberData$_tname\($_row,$j) $n + set mMemberData$_tname\($_row,$j\) $n incr j } } +::itcl::body CombEditFrame::syncColumn {_tname _row _col _val} { + set anames [lsort -dictionary [array names mMemberData$_tname]] + foreach aindex [lsearch -all -regexp $anames "\[0-9\]+,$_col"] { + set index [lindex $anames $aindex] + set ilist [split $index ,] + set row [lindex $ilist 0] + if {$row == 0 || $row == $_row} { + # Ignore if in header + continue + } + + if {![info exists mMemberData$_tname\($row,0\)]} { + continue + } + + if {[subst $[subst mMemberData$_tname\($row,0\)]] == "*"} { + set mMemberData$_tname\($row,$_col\) $_val + } + } + +# puts "CombEditFrame::syncColumn: set column $_col values to $_val" +# puts "CombEditFrame::syncColumn: anames - $anames" +# puts "CombEditFrame::syncColumn: colnames - $colnames" +} + ::itcl::body CombEditFrame::validateTableEntry {_row _col _newval _tname} { - if {$_col == 0 || ![info exists mMemberData$_tname\($_row,0)]} { + if {$_col == 0 || $_col == 1 || ![info exists mMemberData$_tname\($_row,0\)]} { return 0 } @@ -951,6 +1138,7 @@ } if {[string is double $_newval]} { + syncColumn $_tname $_row $_col $_newval return 1 } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ BRL-CAD Source Commits mailing list brlcad-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/brlcad-commits