pavi  0.0
Map Path Viewer
track_store.bas
Go to the documentation of this file.
1 
9 
10 #INCLUDE ONCE "Gir/Gtk-3.0.bi"
11 #INCLUDE ONCE "track_layer.bi"
12 #INCLUDE ONCE "track_store.bi"
13 #INCLUDE ONCE "gui.bi"
14 
15 
16 
29 FUNCTION TS_add._find CDECL( _
30  BYVAL Model AS GtkTreeModel PTR _
31  , BYVAL Path AS GtkTreePath PTR _
32  , BYVAL Iter AS GtkTreeIter PTR _
33  , BYVAL UserData AS gpointer) AS gboolean
34 WITH *CAST(TS_add PTR, UserData)
35  DIM AS gchar PTR n, p
36  gtk_tree_model_get(Model, Iter _
37  , COL____NAME, @n _
38  , COL____PATH, @p _
39  , COL__LOADER, @.Loa _
40  , -1)
41  IF .Loa THEN
42  ' check if file (path+name) is present
43  IF .Nam = *n ANDALSO .Fol = *p THEN .Got = TRUE
44  ELSE
45  ' check if folder is present -> get iter
46  IF NULL = p ANDALSO .Fol = *n THEN .Par = gtk_tree_iter_copy(Iter)
47  END IF : g_free(p) : g_free(n) : RETURN .Got
48 END WITH
49 END FUNCTION
50 
51 
52 
66 CONSTRUCTOR TS_add(BYVAL N AS CONST gchar PTR)
67 WITH *GUI
68  VAR p = INSTRREV(*N, *G_DIR_SEPARATOR_S)
69  Nam = MID(*N, p+1)
70  Fol = LEFT(*N, p)
71  VAR model = GTK_TREE_MODEL(.STO)
72  gtk_tree_model_foreach(model _
73  , @TS_add._find(), CAST(gpointer, @THIS))
74  IF Got THEN EXIT CONSTRUCTOR
75 
76  VAR tl = NEW TrackLoader(N)
77  IF tl->Az >= 0 THEN Loa = CAST(gpointer, tl) _
78  ELSE ?"**load error: ";*tl->Errr;" in file ";*N : DELETE(tl) : EXIT CONSTRUCTOR
79 
80  DIM AS GtkTreeIter new_par, iter
81  VAR sto = GTK_TREE_STORE(.STO)
82  IF NULL = Par THEN
83  gtk_tree_store_insert_with_values(sto, @new_par, NULL, -1 _
84  , COL__ENABLE, FALSE _
85  , COL__SELECT, FALSE _
86  , COL_VISIBLE, FALSE _
87  , COL____NAME, Fol _
88  , COL____PATH, NULL _
89  , COL__LOADER, NULL _
90  ,-1)
91  END IF
92 
93  VAR def = track_layer_get_default(TRACK_LAYER(.TRL))
94  IF def THEN
95  gtk_tree_store_insert_with_values(sto, @iter, IIF(Par, Par, @new_par), -1 _
96  , COL__ENABLE, TRUE _
97  , COL__SELECT, FALSE _
98  , COL_VISIBLE, TRUE _
99  , COL____PATH, Fol _
100  , COL____NAME, Nam _
101  , COL_P_WIDTH, PEEK(UBYTE, def->P) _
102  , COL_L_WIDTH, PEEK(UBYTE, def->L) _
103  , COL_P_COLOR, def->P[1] _
104  , COL_L_COLOR, def->L[1] _
105  , COL__LOADER, Loa _
106  ,-1)
107  VAR s = gtk_tree_model_get_string_from_iter(model, @iter)
108  PEEK(TrackLoader, Loa).Path = *s
109  g_free(s)
110  END IF
111  IF Par THEN gtk_tree_iter_free(Par) : EXIT CONSTRUCTOR
112  ' expand new folder row
113  VAR path = gtk_tree_model_get_path(model, @new_par)
114  gtk_tree_view_expand_row(GTK_TREE_VIEW(.TVT), path, FALSE)
115  gtk_tree_path_free(path)
116 END WITH
117 END CONSTRUCTOR
118 
119 
120 
133 FUNCTION track_store_remove CDECL( _
134  BYVAL Model AS GtkTreeModel PTR _
135  , BYVAL Path AS GtkTreePath PTR _
136  , BYVAL Iter AS GtkTreeIter PTR _
137  , BYVAL UserData AS gpointer) AS gboolean
138  DIM AS TrackLoader PTR loa
139  DIM AS gchar PTR pcs, lcs, nam, fol
140  gtk_tree_model_get(Model, Iter _
141  , COL____PATH, @fol _
142  , COL____NAME, @nam _
143  , COL_P_COLOR, @pcs _
144  , COL_L_COLOR, @lcs _
145  , COL__LOADER, @loa _
146  , -1)
147  IF pcs THEN g_free(pcs)
148  IF lcs THEN g_free(lcs)
149  IF fol THEN g_free(fol)
150  IF nam THEN g_free(nam)
151  IF loa THEN DELETE(loa)
152  RETURN FALSE
153 END FUNCTION
154 
155 
156 
164 SUB TS_finalize()
165 WITH *.GUI
166  gtk_tree_model_foreach(GTK_TREE_MODEL(.STO) _
167  , @track_store_remove(), NULL)
168  gtk_tree_store_clear(GTK_TREE_STORE(.STO))
169 END WITH
170 END SUB
171 
172 
173 
181 SUB TS_remove(BYVAL Child AS GtkTreeIter PTR)
182 WITH *.GUI
183  VAR model = GTK_TREE_MODEL(.STO)
184  DIM AS GtkTreeIter parent
185  gtk_tree_model_iter_parent(model, @parent, Child)
186  track_store_remove(model, NULL, Child, NULL)
187  gtk_tree_store_remove(GTK_TREE_STORE(.STO), Child)
188  IF FALSE = gtk_tree_model_iter_has_child(model, @parent) _
189  THEN gtk_tree_store_remove(GTK_TREE_STORE(.STO), @parent)
190 END WITH
191 END SUB
192 
193 
194 
209 FUNCTION TS_nearest._dist CDECL( _
210  BYVAL Model AS GtkTreeModel PTR _
211  , BYVAL Path AS GtkTreePath PTR _
212  , BYVAL Iter AS GtkTreeIter PTR _
213  , BYVAL UserData AS gpointer) AS gboolean
214  DIM AS TrackLoader PTR loa
215  DIM AS gboolean en
216  gtk_tree_model_get(Model, Iter _
217  , COL__ENABLE, @en _
218  , COL__LOADER, @loa _
219  , -1)
220  IF FALSE = en ORELSE NULL = loa THEN RETURN FALSE
221  WITH PEEK(TS_nearest, UserData)
222  VAR d = loa->Nearest(.Lat, .Lon) _
223  , d0 = .Res(0).Dist - d, ii = -1L
224  FOR i AS LONG = 0 TO UBOUND(.Res)
225  WITH .Res(i)
226  IF 0 = .Loa THEN .Dist = d : .Loa = loa : RETURN FALSE ' fill empty slot
227  IF .Dist <= d THEN CONTINUE FOR
228  VAR di = .Dist - d
229  IF di < d0 THEN ii = i : d0 = di
230  END WITH
231  NEXT
232  IF ii >= 0 THEN .Res(ii).Dist = d : .Res(ii).Loa = loa
233  END WITH
234  RETURN FALSE
235 END FUNCTION
236 
237 
238 
249 CONSTRUCTOR TS_nearest( _
250  BYVAL La AS float _
251  , BYVAL Lo AS float)
252  Lat = La
253  Lon = Lo
254 
255  gtk_tree_model_foreach(GTK_TREE_MODEL(GUI->STO) _
256  , @TS_nearest._dist(), CAST(gpointer, @THIS))
257 
258 END CONSTRUCTOR
259 
260 
261 
273 FUNCTION TS_bbox._bounds CDECL( _
274  BYVAL Model AS GtkTreeModel PTR _
275  , BYVAL Path AS GtkTreePath PTR _
276  , BYVAL Iter AS GtkTreeIter PTR _
277  , BYVAL UserData AS gpointer) AS gboolean
278  DIM AS TrackLoader PTR loa
279  DIM AS gboolean en
280  gtk_tree_model_get(Model, Iter _
281  , COL__ENABLE, @en _
282  , COL__LOADER, @loa _
283  , -1)
284  IF NULL = loa THEN RETURN FALSE ' folder row
285 
286  WITH PEEK(TS_bbox, UserData)
287  IF en OR .Mode THEN
288  IF .La0 > loa->Mn.Lat THEN .La0 = loa->Mn.Lat
289  IF .La1 < loa->Mx.Lat THEN .La1 = loa->Mx.Lat
290  IF .Lo0 > loa->Mn.Lon THEN .Lo0 = loa->Mn.Lon
291  IF .Lo1 < loa->Mx.Lon THEN .Lo1 = loa->Mx.Lon
292  .Cnt += 1
293  END IF
294  END WITH
295  RETURN FALSE
296 END FUNCTION
297 
298 
299 
307 CONSTRUCTOR TS_bbox(BYVAL Mo AS gboolean)
308  Mode = Mo
309 
310  gtk_tree_model_foreach(GTK_TREE_MODEL(GUI->STO) _
311  , @TS_bbox._bounds(), CAST(gpointer, @THIS))
312 
313  IF Cnt THEN _
314  track_layer_set_bbox(TRACK_LAYER(GUI->TRL), La0, La1, Lo0, Lo1)
315 
316 END CONSTRUCTOR
317 
318 
319 
331 SUB TS_select(BYVAL Path AS STRING)
332  STATIC AS STRING last
333  IF 0 = LEN(Path) THEN EXIT SUB
334 WITH *GUI
335  DIM AS GtkTreeIter iter
336  VAR store = GTK_TREE_STORE(.STO) _
337  , model = GTK_TREE_MODEL(.STO)
338  IF LEN(last) THEN
339  gtk_tree_model_get_iter_from_string(model, @iter, last)
340  gtk_tree_store_set(store, @iter, COL__SELECT, FALSE, -1)
341  END IF
342  last = Path
343  gtk_tree_model_get_iter_from_string(model, @iter, last)
344  gtk_tree_store_set(store, @iter, COL__SELECT, TRUE, -1)
345  DIM AS TrackLoader PTR loa
346  gtk_tree_model_get(model, @iter, COL__LOADER, @loa, -1)
347 
348  VAR p = gtk_tree_path_new_from_string(last)
349  gtk_tree_view_expand_to_path(GTK_TREE_VIEW(.TVT), p)
350  gtk_tree_path_free(p)
351  track_layer_set_loader(TRACK_LAYER(.TRL), loa)
352 END WITH
353 END SUB
354 
355 
356 
357 
367 SUB TS_preference(BYVAL Loa AS TrackLoader PTR)
368 WITH *GUI
369  IF NULL = Loa THEN EXIT SUB
370  DIM AS gint lw, pw
371  DIM AS gchar PTR lc, pc, nam
372  DIM AS GtkTreeIter iter
373  DIM AS GdkRGBA x
374  VAR model = GTK_TREE_MODEL(.STO)
375 
376  gtk_tree_model_get_iter_from_string(model, @iter, Loa->Path)
377  gtk_tree_model_get(model, @iter _
378  , COL____NAME, @nam _
379  , COL_P_WIDTH, @pw _
380  , COL_L_WIDTH, @lw _
381  , COL_P_COLOR, @pc _
382  , COL_L_COLOR, @lc _
383  , -1)
384 
385  IF gdk_rgba_parse(@x, pc) THEN _
386  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(.BPC), @x)
387  g_free(pc)
388  IF gdk_rgba_parse(@x, lc) THEN _
389  gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(.BLC), @x)
390  g_free(lc)
391  gtk_adjustment_set_value(GTK_ADJUSTMENT(.APW), (pw AND &b1111) SHL 1)
392  gtk_combo_box_set_active( GTK_COMBO_BOX(.CPD), (pw SHR 4) AND &b11)
393  gtk_combo_box_set_active( GTK_COMBO_BOX(.CPC), (pw SHR 6) AND &b11)
394  gtk_adjustment_set_value(GTK_ADJUSTMENT(.ALW), lw)
395  gtk_window_set_title(GTK_WINDOW(.DTP), nam)
396  g_free(nam)
397 WITH *Loa
398  gtk_label_set_text(GTK_LABEL(GUI->LTD), .Desc) '?? markup
399  gtk_label_set_text(GTK_LABEL(GUI->LTE), _
400  .Mn.Lon*Rad2Deg & " to " & .Mx.Lon*Rad2Deg & !"\n" _
401  & .Mn.Lat*Rad2Deg & " to " & .Mx.Lat*Rad2Deg & !"\n" _
402  & .Mn.Ele & " to " & .Mx.Ele & !"\n" _
403  & .Mn.Spd & " to " & .Mx.Spd & !"\n" _
404  & .Mn.Ang & " to " & .Mx.Ang _
405  )
406 END WITH
407 
408  SELECT CASE AS CONST gtk_dialog_run(GTK_DIALOG(.DTP))
409  CASE GTK_RESPONSE_OK
410  lw = CAST(gint, gtk_adjustment_get_value(GTK_ADJUSTMENT(.ALW)))
411  pw = CAST(gint, gtk_adjustment_get_value(GTK_ADJUSTMENT(.APW))) SHR 1 _
412  + CAST(gint, *gtk_combo_box_get_active_id(GTK_COMBO_BOX(.CPD))) SHL 4 _
413  + CAST(gint, *gtk_combo_box_get_active_id(GTK_COMBO_BOX(.CPC))) SHL 6
414  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(.BLC), @x)
415  lc = gdk_rgba_to_string(@x)
416  gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(.BPC), @x)
417  pc = gdk_rgba_to_string(@x)
418  gtk_tree_store_set(GTK_TREE_STORE(.STO), @iter _
419  , COL_P_WIDTH, pw _
420  , COL_L_WIDTH, lw _
421  , COL_P_COLOR, pc _
422  , COL_L_COLOR, lc _
423  , -1)
424  g_free(pc)
425  g_free(lc)
426  track_layer_redraw(TRACK_LAYER(.TRL))
427  CASE 1
428  TS_remove(@iter)
429  CASE 2 '!! for testing: center track on map
430  track_layer_set_loader(TRACK_LAYER(.TRL), Loa)
431  END SELECT
432  gtk_widget_hide(GTK_WIDGET(.DTP))
433 END WITH
434 END SUB
435 
track_store_remove
FUNCTION_CDECL_AS_gboolean track_store_remove(BYVAL_AS_GtkTreeModel_PTR Model, BYVAL_AS_GtkTreePath_PTR Path, BYVAL_AS_GtkTreeIter_PTR Iter, BYVAL_AS_gpointer UserData)
Callback for unloading all tracks.
Definition: track_store.bas:134
track_layer_set_loader
SUB_CDECL track_layer_set_loader(BYVAL_AS_TrackLayer_PTR Lay, BYVAL_AS_TrackLoader_PTR Loa)
Set active track.
Definition: track_layer.bas:875
track_store.bi
Header for tree store of tracks handling.
track_layer_get_default
FUNCTION_CDECL_AS_TrackLayerDefault_PTR track_layer_get_default(BYVAL_AS_TrackLayer_PTR Lay)
Provide the next default setting.
Definition: track_layer.bas:815
TS_remove
SUB TS_remove(BYVAL_AS_GtkTreeIter_PTR Child)
Remove a track from store.
Definition: track_store.bas:182
TS_nearest::_dist
static FUNCTION_CDECL_AS_gboolean _dist(BYVAL_AS_GtkTreeModel_PTR, BYVAL_AS_GtkTreePath_PTR, BYVAL_AS_GtkTreeIter_PTR, BYVAL_AS_gpointer)
Callback for search nearest point.
Definition: track_store.bas:210
TS_finalize
SUB TS_finalize()
Remove all tracks from store.
Definition: track_store.bas:165
TS_nearest
Class finding the nearest track point.
Definition: track_store.bi:79
TS_add
Class adding a new entry to the list of tracks.
Definition: track_store.bi:42
track_layer_set_bbox
SUB_CDECL track_layer_set_bbox(BYVAL_AS_TrackLayer_PTR Lay, BYVAL_AS_float La0, BYVAL_AS_float La1, BYVAL_AS_float Lo0, BYVAL_AS_float Lo1)
Set map segment to the given bounding box.
Definition: track_layer.bas:964
TS_bbox
Class finding the nearest track point.
Definition: track_store.bi:99
TS_select
SUB TS_select(BYVAL_AS_STRING Path)
Handle new selection.
Definition: track_store.bas:332
track_layer_redraw
SUB_CDECL track_layer_redraw(BYVAL_AS_TrackLayer_PTR Lay)
Redraw surface.
Definition: track_layer.bas:897
TS_preference
SUB TS_preference(BYVAL_AS_TrackLoader_PTR Loa)
Open the preference dialog.
Definition: track_store.bas:368
TS_add::TS_add
TS_add(BYVAL_AS_CONST_gchar_PTR)
CTOR for adding a further track.
Definition: track_store.bas:66
TS_add::_find
static FUNCTION_CDECL_AS_gboolean _find(BYVAL_AS_GtkTreeModel_PTR, BYVAL_AS_GtkTreePath_PTR, BYVAL_AS_GtkTreeIter_PTR, BYVAL_AS_gpointer)
Callback for finding folders/file entries.
Definition: track_store.bas:29
TS_nearest::TS_nearest
TS_nearest(BYVAL_AS_float, BYVAL_AS_float)
Find the point nearest to a location.
Definition: track_store.bas:250
track_layer.bi
Header for advanced tracks layer.
TS_bbox::_bounds
static FUNCTION_CDECL_AS_gboolean _bounds(BYVAL_AS_GtkTreeModel_PTR, BYVAL_AS_GtkTreePath_PTR, BYVAL_AS_GtkTreeIter_PTR, BYVAL_AS_gpointer)
Callback for computing bounds.
Definition: track_store.bas:274
TS_bbox::TS_bbox
TS_bbox(BYVAL_AS_gboolean)
Conpute the bounding box for all tracks.
Definition: track_store.bas:308
gui.bi
Header containing Glade ui file pointers.