Minsky
ravel.tcl
Go to the documentation of this file.
1 # Ravel specific functionality
2 
3 proc ravelContextItems {} {
4  global editorMode
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
8  global sortOrder
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
16  }
17  }
18 }
19 
20 proc setupPickDimMenu {} {
21  global dimLabelPicked
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 \
30  -width 35 \
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
35  buttonBar .wiring.context.pick {
36  global dimLabelPicked
37  set pick {}
38  foreach i [.wiring.context.pick.select.lb curselection] {
39  lappend pick [lindex $dimLabelPicked $i]
40  }
41  minsky.canvas.item.setDimLabelsPicked [lindex $pick 0] [lindex $pick 1]
42  reset
43  }
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
47  } else {
48  deiconify .wiring.context.pick
49  }
50 
51  set dimLabelPicked [minsky.canvas.item.dimLabels]
52  wm transient .wiring.context.pick
53  wm geometry .wiring.context.pick +[winfo pointerx .]+[winfo pointery .]
54  ensureWindowVisible .wiring.context.pick
55  grab set .wiring.context.pick
56 }
57 
58 proc lockSpecificHandles {} {
59  global currentLockHandles
60 
61  if {![llength [info commands minsky.canvas.item.lockGroup.allLockHandles]]} {
62  minsky.canvas.lockRavelsInSelection
63  # reinitialise the canvas item commands
64  getItemAt [minsky.canvas.item.x] [minsky.canvas.item.y]
65  if {![llength [info commands minsky.canvas.item.lockGroup.allLockHandles]]} return
66  }
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
71 
72  if {![minsky.canvas.item.lockGroup.handleLockInfo.size]} {
73  minsky.canvas.item.lockGroup.setLockHandles [minsky.canvas.item.lockGroup.allLockHandles]
74  }
75 
76  set col 0
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
80  incr col
81  }
82  global lockHandleAttributes
83  set lockHandleAttributes {"slicer" "orientation" "calipers" "order"}
84  set tooltips {
85  "slicer includes whether a handle is an output handle or not"
86  "orientation includes whether a handle is collapsed or not"
87  ""
88  "order includes picked slices"
89  }
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]]]
93  incr col
94  }
95 
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]
102  }
103  foreach attr $lockHandleAttributes {
104  grid [checkbutton .wiring.context.lockHandles.grid.attr${col}_$row -variable lockHandleAttr(${attr}_$row)] -row $row -column $col
105  if [$info.$attr] {
106  .wiring.context.lockHandles.grid.attr${col}_$row select
107  } else {
108  .wiring.context.lockHandles.grid.attr${col}_$row deselect
109  }
110  incr col
111  }
112  }
113 
114  buttonBar .wiring.context.lockHandles {
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]]
118  set handleNames {}
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]
121  }
122  $info.handleNames $handleNames
123  foreach attr $lockHandleAttributes {
124  $info.$attr $lockHandleAttr(${attr}_$row)
125  }
126  }
127  minsky.canvas.item.lockGroup.validateLockHandleInfo msg
128  }
129 
130  wm transient .wiring.context.lockHandles
131  wm geometry .wiring.context.lockHandles +[winfo pointerx .]+[winfo pointery .]
132  ensureWindowVisible .wiring.context.lockHandles
133  grab set .wiring.context.lockHandles
134 }
135 
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]"
140 }
141 
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]"
145 }
146 
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]
151  }
152 }
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
157  reset
158 }
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
162 set sortOrder none
163 
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
171  reset
172  } -value "$order" -variable sortOrder
173  }
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}
176 }
177 
178 .wiring.context.axisMenu add command -label "Pick Slices" -command setupPickMenu
179 
180 
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] {}
191  }
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
201  buttonBar .wiring.context.axisMenu.dim {
202  minsky.canvas.item.setDimension [.wiring.context.axisMenu.dim.type.value get] [.wiring.context.axisMenu.dim.units.value get]
203  }
204  } else {
205  deiconify .wiring.context.axisMenu.dim
206  }
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]
210  ensureWindowVisible .wiring.context.axisMenu.dim
211  grab set .wiring.context.axisMenu.dim
212  wm transient .wiring.context.axisMenu.dim
213 }
214 
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 \
225  -width 35 \
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
232  set pick {}
233  foreach i [.wiring.context.axisMenu.pick.select.lb curselection] {
234  lappend pick [lindex $labelPicked $i]
235  }
236  minsky.canvas.item.pickSliceLabels $pickHandle $pick
237  minsky.canvas.item.broadcastStateToLockGroup
238  reset
239  }
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
245  } else {
246  deiconify .wiring.context.axisMenu.pick
247  }
248 
249  set labelPicked [minsky.canvas.item.allSliceLabels]
250  for {set i 0} {$i<[llength $labelPicked]} {incr i} {
251  set idx([lindex $labelPicked $i]) $i
252  }
253  foreach i [minsky.canvas.item.pickedSliceLabels] {
254  .wiring.context.axisMenu.pick.select.lb selection set $idx($i)
255  }
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 .]
259  ensureWindowVisible .wiring.context.axisMenu.pick
260  grab set .wiring.context.axisMenu.pick
261 }
262