3 proc ravelContextItems {} {
5 set editorMode [minsky.canvas.item.editorMode]
6 .wiring.context add checkbutton -label "EditorMode" -command minsky.canvas.item.toggleEditorMode -variable editorMode
7 .wiring.context add command -label "Export as CSV" -command exportItemAsCSV
9 set sortOrder [minsky.canvas.item.sortOrder]
10 .wiring.context add cascade -label "Set Next Aggregation" -menu .wiring.context.nextAggregationMenu
11 .wiring.context add cascade -label "Axis properties" -menu .wiring.context.axisMenu
12 if [
llength [
info commands minsky.canvas.item.lockGroup]] {
13 .wiring.context add command -label "Lock specific handles" -command lockSpecificHandles
14 .wiring.context add command -label "Unlock" -command {
15 minsky.canvas.item.leaveLockGroup; canvas.requestRedraw
20 proc setupPickDimMenu {} {
22 if {![
winfo exists .wiring.context.pick]} {
23 toplevel .wiring.context.pick
24 wm title .wiring.context.pick "Pick any two dimensions"
25 frame .wiring.context.pick.select
26 scrollbar .wiring.context.pick.select.vscroll -orient vertical -command {
27 .wiring.context.pick.select.lb yview}
28 listbox .wiring.context.pick.select.lb -listvariable dimLabelPicked \
29 -selectmode extended -selectforeground blue \
31 -yscrollcommand {.wiring.context.pick.select.vscroll set}
32 pack .wiring.context.pick.select.lb -fill both -expand y -side left
33 pack .wiring.context.pick.select.vscroll -fill y -expand y -side left
34 pack .wiring.context.pick.select
38 foreach i [.wiring.context.pick.select.lb curselection] {
39 lappend pick [lindex $dimLabelPicked $i]
41 minsky.canvas.item.setDimLabelsPicked [lindex $pick 0] [lindex $pick 1]
44 button .wiring.context.pick.buttonBar.clear -text "Clear" -command {
45 .wiring.context.pick.select.lb selection clear 0 end}
46 pack .wiring.context.pick.buttonBar.clear -side left
51 set dimLabelPicked [minsky.canvas.item.dimLabels]
52 wm transient .wiring.context.pick
53 wm geometry .wiring.context.pick +[
winfo pointerx .]+[
winfo pointery .]
55 grab set .wiring.context.pick
58 proc lockSpecificHandles {} {
59 global currentLockHandles
61 if {![
llength [
info commands minsky.canvas.item.lockGroup.allLockHandles]]} {
62 minsky.canvas.lockRavelsInSelection
64 getItemAt [minsky.canvas.item.x] [minsky.canvas.item.y]
65 if {![
llength [
info commands minsky.canvas.item.lockGroup.allLockHandles]]}
return 67 if {[
winfo exists .wiring.context.lockHandles]} {
destroy .wiring.context.lockHandles}
68 toplevel .wiring.context.lockHandles
69 frame .wiring.context.lockHandles.grid
70 pack .wiring.context.lockHandles.grid
72 if {![minsky.canvas.item.lockGroup.handleLockInfo.size]} {
73 minsky.canvas.item.lockGroup.setLockHandles [minsky.canvas.item.lockGroup.allLockHandles]
77 set ravelNames [minsky.canvas.item.lockGroup.ravelNames]
78 foreach r $ravelNames {
79 grid [
label .wiring.context.lockHandles.grid.name$col -text $r] -row 0 -column $col
82 global lockHandleAttributes
83 set lockHandleAttributes {"slicer" "orientation" "calipers" "order"}
85 "slicer includes whether a handle is an output handle or not"
86 "orientation includes whether a handle is collapsed or not"
88 "order includes picked slices"
90 foreach attribute {"Slicer" "Orientation" "Calipers" "SortOrder"} {
91 grid [
label .wiring.context.lockHandles.grid.name$col -text $attribute] -row 0 -column $col
92 tooltip .wiring.context.lockHandles.grid.name$col [
lindex $tooltips [
expr $col-[
llength $ravelNames]]]
96 for {
set row 1} {$row<=[minsky.canvas.item.lockGroup.handleLockInfo.size]} {
incr row} {
97 set info [minsky.canvas.item.lockGroup.handleLockInfo.@elem [
expr $row-1]]
98 set handles [$info.handleNames]
99 for {
set col 0} {$col<[
llength $ravelNames]} {
incr col} {
100 grid [ttk::combobox .wiring.context.lockHandles.grid.handle${col}_$row -state readony -values [
concat "\xA0" [minsky.canvas.item.lockGroup.handleNames $col]]] -row $row -column $col
101 .wiring.context.lockHandles.grid.handle${col}_$row set [
lindex $handles $col]
103 foreach attr $lockHandleAttributes {
104 grid [
checkbutton .wiring.context.lockHandles.grid.attr${col}_$row -variable lockHandleAttr(${attr}_$row)] -row $row -column $col
106 .wiring.context.lockHandles.grid.attr${col}_$row select
108 .wiring.context.lockHandles.grid.attr${col}_$row deselect
115 global lockHandleAttributes lockHandleAttr
116 for {set row 1} {$row<=[minsky.canvas.item.lockGroup.handleLockInfo.size]} {incr row} {
117 set info [minsky.canvas.item.lockGroup.handleLockInfo.@elem [expr $row-1]]
119 for {set col 0} {$col<[llength [minsky.canvas.item.lockGroup.ravelNames]]} {incr col} {
120 lappend handleNames [.wiring.context.lockHandles.grid.handle${col}_$row get]
122 $info.handleNames $handleNames
123 foreach attr $lockHandleAttributes {
124 $info.$attr $lockHandleAttr(${attr}_$row)
127 minsky.canvas.item.lockGroup.validateLockHandleInfo msg
130 wm transient .wiring.context.lockHandles
131 wm geometry .wiring.context.lockHandles +[
winfo pointerx .]+[
winfo pointery .]
133 grab set .wiring.context.lockHandles
136 set aggTypes {{"Σ" "sum"} {"Π" "prod"} {"av" "av"} {"σ" "stddev"} {"min" "min"} {"max" "max"}}
137 menu .wiring.context.nextAggregationMenu
138 foreach m $aggTypes {
139 .wiring.context.nextAggregationMenu add command -label [
lindex $m 0] -command "minsky.canvas.item.nextReduction [
lindex $m 1]"
142 menu .wiring.context.axisAggregationMenu
143 foreach m $aggTypes {
144 .wiring.context.axisAggregationMenu add command -label [
lindex $m 0] -command "minsky.canvas.item.handleSetReduction \[minsky.canvas.item.selectedHandle\] [
lindex $m 1]"
147 menu .wiring.context.axisMenu
148 .wiring.context.axisMenu add command -label "Description" -command {
149 textEntryPopup .wiring.context.axisMenu.desc [minsky.canvas.item.description] {
150 minsky.canvas.item.setDescription [.wiring.context.axisMenu.desc.entry get]
153 .wiring.context.axisMenu add command -label "Dimension" -command setDimension
154 .wiring.context.axisMenu add command -label "Toggle Calipers" -command {
155 minsky.canvas.item.toggleDisplayFilterCaliper
156 minsky.canvas.item.broadcastStateToLockGroup
159 .wiring.context.axisMenu add cascade -label "Set Aggregation" -menu .wiring.context.axisAggregationMenu
160 menu .wiring.context.axisMenu.sort -postcommand populateSortOptions
161 .wiring.context.axisMenu add cascade -label "Sort" -menu .wiring.context.axisMenu.sort
164 proc populateSortOptions {} {
165 set orders {none forward reverse}
166 .wiring.context.axisMenu.sort delete 0 end
167 foreach order $orders {
168 .wiring.context.axisMenu.sort add radiobutton -label $order -command {
169 minsky.canvas.item.setSortOrder $sortOrder
170 minsky.canvas.item.broadcastStateToLockGroup
172 } -value "$order" -variable sortOrder
174 .wiring.context.axisMenu.sort add command -label "forward by value" -command {minsky.canvas.item.sortByValue "forward"; reset}
175 .wiring.context.axisMenu.sort add command -label "reverse by value" -command {minsky.canvas.item.sortByValue "reverse"; reset}
178 .wiring.context.axisMenu add command -label "Pick Slices" -command setupPickMenu
181 proc setDimension {} {
182 if {![
winfo exists .wiring.context.axisMenu.dim]} {
183 toplevel .wiring.context.axisMenu.dim
184 wm title .wiring.context.axisMenu.dim "Dimension axis"
185 frame .wiring.context.axisMenu.dim.type
186 label .wiring.context.axisMenu.dim.type.label -text "type"
187 ttk::combobox .wiring.context.axisMenu.dim.type.value -values {string value time} -state readonly -textvariable axisType
188 bind .wiring.context.axisMenu.dim.type.value <<ComboboxSelected>> {
189 minsky.value.csvDialog.spec.horizontalDimension.type [.wiring.context.axisMenu.dim.type.value get]
190 dimFormatPopdown .wiring.context.axisMenu.dim.units.value [.wiring.context.axisMenu.dim.type.value get] {}
192 pack .wiring.context.axisMenu.dim.type.label .wiring.context.axisMenu.dim.type.value -side left
193 frame .wiring.context.axisMenu.dim.units
194 label .wiring.context.axisMenu.dim.units.label -text "units/format"
195 tooltip .wiring.context.axisMenu.dim.units.label \
196 "Value type: enter a unit string, eg m/s; time type: enter a strftime format string, eg %Y-%m-%d %H:%M:%S, or %Y-Q%Q"
197 ttk::combobox .wiring.context.axisMenu.dim.units.value
198 dimFormatPopdown .wiring.context.axisMenu.dim.units.value [minsky.canvas.item.dimensionType] {}
199 pack .wiring.context.axisMenu.dim.units.label .wiring.context.axisMenu.dim.units.value -side left
200 pack .wiring.context.axisMenu.dim.type .wiring.context.axisMenu.dim.units
202 minsky.canvas.item.setDimension [.wiring.context.axisMenu.dim.type.value get] [.wiring.context.axisMenu.dim.units.value get]
207 .wiring.context.axisMenu.dim.type.value set [minsky.canvas.item.dimensionType]
208 .wiring.context.axisMenu.dim.units.value delete 0 end
209 .wiring.context.axisMenu.dim.units.value insert 0 [minsky.canvas.item.dimensionUnitsFormat]
211 grab set .wiring.context.axisMenu.dim
212 wm transient .wiring.context.axisMenu.dim
215 proc setupPickMenu {} {
216 global labelPicked pickHandle
217 if {![
winfo exists .wiring.context.axisMenu.pick]} {
218 toplevel .wiring.context.axisMenu.pick
219 wm title .wiring.context.axisMenu.pick "Pick slices"
220 frame .wiring.context.axisMenu.pick.select
221 scrollbar .wiring.context.axisMenu.pick.select.vscroll -orient vertical -command {
222 .wiring.context.axisMenu.pick.select.lb yview}
223 listbox .wiring.context.axisMenu.pick.select.lb -listvariable labelPicked \
224 -selectmode extended -selectforeground blue \
226 -yscrollcommand {.wiring.context.axisMenu.pick.select.vscroll set}
227 pack .wiring.context.axisMenu.pick.select.lb -fill both -expand y -side left
228 pack .wiring.context.axisMenu.pick.select.vscroll -fill y -expand y -side left
229 pack .wiring.context.axisMenu.pick.select
230 buttonBar .wiring.context.axisMenu.pick {
231 global labelPicked pickHandle
233 foreach i [.wiring.context.axisMenu.pick.select.lb curselection] {
234 lappend pick [lindex $labelPicked $i]
236 minsky.canvas.item.pickSliceLabels $pickHandle $pick
237 minsky.canvas.item.broadcastStateToLockGroup
240 button .wiring.context.axisMenu.pick.buttonBar.all -text "All" -command {
241 .wiring.context.axisMenu.pick.select.lb selection set 0 end}
242 button .wiring.context.axisMenu.pick.buttonBar.clear -text "Clear" -command {
243 .wiring.context.axisMenu.pick.select.lb selection clear 0 end}
244 pack .wiring.context.axisMenu.pick.buttonBar.all .wiring.context.axisMenu.pick.buttonBar.clear -side left
249 set labelPicked [minsky.canvas.item.allSliceLabels]
250 for {
set i 0} {$i<[
llength $labelPicked]} {
incr i} {
251 set idx([
lindex $labelPicked $i]) $i
253 foreach i [minsky.canvas.item.pickedSliceLabels] {
254 .wiring.context.axisMenu.pick.select.lb selection set $idx($i)
256 set pickHandle [minsky.canvas.item.selectedHandle]
257 wm transient .wiring.context.axisMenu.pick
258 wm geometry .wiring.context.axisMenu.pick +[
winfo pointerx .]+[
winfo pointery .]
260 grab set .wiring.context.axisMenu.pick