1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
|
## -*- tcl -*-
# # ## ### ##### ######## ############# ######################
## (c) 2022 Andreas Kupries
# @@ Meta Begin
# Package map::track::display 0.1
# Meta author {Andreas Kupries}
# Meta location https://core.tcl.tk/tklib
# Meta platform tcl
# Meta summary Widget to display a single track definition
# Meta description Widget to display the information of a single track definition
# Meta subject {track display, tabular}
# Meta subject {tabular, track display}
# Meta require {Tcl 8.6-}
# Meta require {Tk 8.6-}
# Meta require debug
# Meta require debug::caller
# Meta require {map::slippy 0.8}
# Meta require scrollutil
# Meta require snit
# Meta require tablelist
# @@ Meta End
## TODO / focus - active vertex / row map ...
package provide map::track::display 0.1
# # ## ### ##### ######## ############# ######################
## API
#
## <class> OBJ
#
## <obj> set TRACK -> VOID Show this track, or nothing, if empty
#
## -on-selection Report changes to the vertext selection
#
# # ## ### ##### ######## ############# ######################
## Requirements
package require Tcl 8.6-
package require Tk 8.6-
# ;# Tcllib
package require debug ;# - Narrative Tracing
package require debug::caller ;#
package require map::slippy 0.8 ;# - Map utilities
package require snit ;# - OO system
# ;# Tklib
package require scrollutil ;# - Scroll framework
package require tablelist ;# - Tabular display
# # ## ### ##### ######## ############# ######################
## Ensemble setup.
namespace eval map { namespace export track ; namespace ensemble create }
namespace eval map::track { namespace export display ; namespace ensemble create }
debug level tklib/map/track/display
debug prefix tklib/map/track/display {<[pid]> [debug caller] | }
# # ## ### ##### ######## ############# ######################
snit::widget ::map::track::display {
# . . .. ... ..... ........ ............. .....................
# User configuration
option -on-selection -default {}
# . . .. ... ..... ........ ............. .....................
## State
variable myspec {} ;# Table data derived from the track specification
variable myparts ;# Track statistics: Number of parts
variable mylength ;# Track statistics: Length/Perimeter
variable mydiameter ;# Track statistics: Diameter
variable myclat ;# Track statistics: Center Latitude
variable myclon ;# Track statistics: Center Longitude
# . . .. ... ..... ........ ............. .....................
## Lifecycle
constructor {args} {
debug.tklib/map/track/display {}
$self configurelist $args
label $win.lcenter -text Center
label $win.clat -textvariable [myvar myclat]
label $win.clon -textvariable [myvar myclon]
label $win.lparts -text Parts
label $win.parts -textvariable [myvar myparts]
label $win.llength -text Length
label $win.length -textvariable [myvar mylength]
label $win.ldiameter -text Diameter
label $win.diameter -textvariable [myvar mydiameter]
scrollutil::scrollarea $win.sa
tablelist::tablelist $win.sa.table -width 60 \
-columntitles {\# Latitude Longitude Distance Total}
$win.sa setwidget $win.sa.table
pack $win.sa -in $win -side bottom -fill both -expand 1
pack $win.lcenter -in $win -side left
pack $win.clat -in $win -side left
pack $win.clon -in $win -side left
pack $win.lparts -in $win -side left
pack $win.parts -in $win -side left
pack $win.llength -in $win -side left
pack $win.length -in $win -side left
pack $win.ldiameter -in $win -side left
pack $win.diameter -in $win -side left
$win.sa.table configure -listvariable [myvar myspec]
bind $win.sa.table <<TablelistSelect>> [mymethod SelectionChanged]
return
}
destructor {
debug.tklib/map/track/display {}
return
}
# . . .. ... ..... ........ ............. .....................
## API
method focus {index} {
debug.tklib/map/track/display {}
$win.sa.table selection clear 0 end
$win.sa.table selection set $index
$win.sa.table see $index
return
}
method set {geos} {
debug.tklib/map/track/display {}
if {![llength $geos]} {
set myspec {}
set mydiameter n/a
set mylength n/a
set myparts n/a
set myclat n/a
set myclon n/a
return
}
set parts [expr { max(0, [llength $geos] - 1) }]
set diameter [map slippy geo diameter-list $geos]
set center [map slippy geo center-list $geos]
lassign [map slippy geo limit $center] clat clon
# Assemble table data
set last {}
set total 0
set rows [lmap g $geos {
set dd {}
set dt {}
if {$last ne {}} {
set d [map slippy geo distance $last $g]
set total [expr {$total + $d}]
# Format for display
set dd [map slipp pretty-distance $d]
set dt [map slipp pretty-distance $total]
}
lassign [map slippy geo limit $g] lat lon
set last $g
set data {}
lappend data [incr rowid]
lappend data $lat
lappend data $lon
lappend data $dd
lappend data $dt
set data
}]
# ... and commit
set myparts $parts
set mylength $dt
set mydiameter [map slippy pretty-distance $diameter]
set myspec $rows
set myclat $clat
set myclon $clon
return
}
# . . .. ... ..... ........ ............. .....................
# Internal
method SelectionChanged {} {
debug.tklib/map/track/display {}
after idle [mymethod ReportSelectionChange]
return
}
method ReportSelectionChange {} {
debug.tklib/map/track/display {}
if {![llength $options(-on-selection)]} return
set row [$win.sa.table curselection]
if {$row eq {}} return
uplevel #0 [list {*}$options(-on-selection) $row]
return
}
# . . .. ... ..... ........ ............. .....................
}
# # ## ### ##### ######## ############# ######################
return
|