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
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits