pavi  0.0
Map Path Viewer
track_layer.bas
Go to the documentation of this file.
1 
8 
9 #INCLUDE ONCE "cairo/cairo.bi"
10 #INCLUDE ONCE "Gir/OsmGpsMap-1.0.bi"
11 #INCLUDE ONCE "Gir/_GLibMacros-2.0.bi"
12 #INCLUDE ONCE "Gir/_GObjectMacros-2.0.bi"
13 #INCLUDE ONCE "track_layer.bi"
14 #INCLUDE ONCE "track_store.bi"
15 #INCLUDE ONCE "gui.bi"
16 #INCLUDE ONCE "debug.bi"
17 #INCLUDE ONCE "string.bi"
18 
19 TYPE as single float '!! FIXME
20 
21 
22 DECLARE SUB track_layer_interface_init CDECL (BYVAL AS OsmGpsMapLayerIface PTR)
23 
24 
25 STATIC SHARED AS TrackLayerDefault DEFAULT_ENTRIES(...) = { _
26  TYPE(@!"\&b00100111" "rgba(0xA4,0x00,0x00,1)", @!"\1" "#EF2929") _
27 , TYPE(@!"\&b01000111" "rgba(0xCE,0x5C,0x00,1)", @!"\1" "#FCAF3E") _
28 , TYPE(@!"\&b10010111" "rgba(0xC4,0xA0,0x00,1)", @!"\1" "#FCE94F") _
29 , TYPE(@!"\&h34" "rgba(0x4E,0x9A,0x06,1)", @!"\4" "#8AE234") _
30 , TYPE(@!"\&h35" "rgba(0x20,0x4A,0x87,1)", @!"\5" "#729FCF") _
31 , TYPE(@!"\&h35" "rgba(0x5C,0x35,0x66,1)", @!"\4" "#AD7FA8") _
32 , TYPE(@!"\&h35" "rgba(0x8F,0x59,0x02,1)", @!"\5" "#E9B96E") _
33 , TYPE(@!"\&h34" "rgba(0x2E,0x34,0x36,1)", @!"\4" "#888A85") _
34 , TYPE(@!"\&h34" "rgba(0xBA,0xBD,0xB6,1)", @!"\4" "#EEEEEC") _
35 , TYPE(NULL, NULL)}
36 
37 
38 
39 ENUM
40  PROP_0
41  PROP_TL_W
42  PROP_TL_H
43  PROP__MAP
44  PROP_PREF
45  PROP_LOAD
46  PROP_FSIZ
47  PROP_FTYP
48 END ENUM
49 
50 
51 
59  AS OsmGpsMap PTR _
60  Map ' the corresponding map (prop "map")
61  AS TrackLoader PTR _
62  Loader ' the active track (prop "loader")
63  AS TrackLayerDefault PTR _
64  Default
65  AS cairo_t PTR _
66  Cr
67  AS cairo_surface_t PTR _
68  Surface _
69  , InfoSurface
70  AS gchar PTR _
71  FTyp
72  AS gint _
73  Nxt _
74  , TIx _
75  , TIy _
76  , TIw _
77  , TIh _
78  , TLz _
79  , TLx _
80  , TLy _
81  , TLw _
82  , TLh _
83  , FSiz
84  AS gboolean _
85  LayReSurf
86 END TYPE
87 
88 ' ?? G_ADD_PRIVATE doesn't work (memory conflict) -> classic style
89 'G_DEFINE_TYPE_WITH_CODE(TrackLayer, track_layer, G_TYPE_OBJECT _
90  ', G_ADD_PRIVATE(TrackLayer) _
91  ': G_IMPLEMENT_INTERFACE(OSM_TYPE_GPS_MAP_LAYER, track_layer_interface_init))
92 G_DEFINE_TYPE_WITH_CODE(TrackLayer, track_layer, G_TYPE_OBJECT _
93  , G_IMPLEMENT_INTERFACE(OSM_TYPE_GPS_MAP_LAYER, track_layer_interface_init))
94 
95 
96 DECLARE SUB render_info CDECL(BYVAL Lay AS TrackLayer PTR, BYVAL Map AS OsmGpsMap PTR)
97 DECLARE SUB track_layer_render CDECL(BYVAL AS OsmGpsMapLayer PTR, BYVAL AS OsmGpsMap PTR)
98 DECLARE SUB track_layer_draw CDECL(BYVAL AS OsmGpsMapLayer PTR, BYVAL AS OsmGpsMap PTR, BYVAL AS cairo_t PTR)
99 DECLARE FUNCTION track_layer_busy CDECL(BYVAL AS OsmGpsMapLayer PTR) AS gboolean
100 DECLARE FUNCTION track_layer_button_press CDECL(BYVAL AS OsmGpsMapLayer PTR, BYVAL AS OsmGpsMap PTR, BYVAL AS GdkEventButton PTR) AS gboolean
101 
102 
103 
111 SUB track_layer_interface_init CDECL(BYVAL Iface AS OsmGpsMapLayerIface PTR)
112  Iface->render = @track_layer_render()
113  Iface->draw = @track_layer_draw()
114  Iface->busy = @track_layer_busy()
115  Iface->button_press = @track_layer_button_press()
116 END SUB
117 
118 
119 
130 SUB track_layer_get_property CDECL( _
131  BYVAL Obj AS Gobject PTR _
132  , BYVAL Property_id AS guint _
133  , BYVAL Value AS GValue PTR _
134  , BYVAL Pspec AS GParamSpec PTR)
135 WITH *TRACK_LAYER(Obj)->Priv
136  SELECT CASE AS CONST Property_id
137  CASE PROP_TL_W : g_value_set_int(Value, .TLw)
138  CASE PROP_TL_H : g_value_set_int(Value, .TLh)
139  CASE PROP__MAP : g_value_set_pointer(Value, .Map)
140  CASE PROP_PREF : g_value_set_pointer(Value, .Default)
141  CASE PROP_LOAD : g_value_set_pointer(Value, .Loader)
142  CASE PROP_FSIZ : g_value_set_int(Value, .FSiz)
143  CASE PROP_FTYP : g_value_set_string(Value, .FTyp)
144  CASE ELSE
145  G_OBJECT_WARN_INVALID_PROPERTY_ID(Obj, Property_id, Pspec)
146  END SELECT
147 END WITH
148 END SUB
149 
150 
151 
162 SUB track_layer_set_property CDECL( _
163  BYVAL Obj AS Gobject PTR _
164  , BYVAL Property_id AS guint _
165  , BYVAL Value AS CONST GValue PTR _
166  , BYVAL Pspec AS GParamSpec PTR)
167 WITH *TRACK_LAYER(Obj)->Priv
168  SELECT CASE AS CONST Property_id
169  CASE PROP_TL_W : .TLw = g_value_get_int(Value)
170  CASE PROP_TL_H : .TLh = g_value_get_int(Value)
171  CASE PROP__MAP : .Map = g_value_get_pointer(Value)
172  CASE PROP_PREF : .Default = g_value_get_pointer(Value)
173  .Nxt = -1
174  IF NULL = .Default THEN .Default = @DEFAULT_ENTRIES(0)
175  CASE PROP_LOAD : .Default = g_value_get_pointer(Value)
176  CASE PROP_FSIZ : .FSiz = g_value_get_int(Value)
177  CASE PROP_FTYP : g_free(.FTyp) : .FTyp = g_value_dup_string(Value)
178  IF 0 = .FTyp ORELSE 0 = .FTyp[0] THEN .FTyp = g_strdup(@"Sans")
179  CASE ELSE
180  G_OBJECT_WARN_INVALID_PROPERTY_ID(Obj, Property_id, Pspec)
181  END SELECT
182 END WITH
183 END SUB
184 
185 
186 
198 FUNCTION track_layer_constructor CDECL( _
199  BYVAL Typ AS GType _
200  , BYVAL N_prop AS guint _
201  , BYVAL Prop AS GObjectConstructParam PTR) AS Gobject PTR
202  ' chain up to the parent constructor */
203  VAR obj = G_OBJECT_CLASS(track_layer_parent_class)->constructor(Typ, N_prop, Prop)
204 
205  WITH *TRACK_LAYER(obj)->Priv
206  .Loader = NULL
207 
208  .Default = @DEFAULT_ENTRIES(0)
209  .Nxt = -1
210 
211  .Surface = NULL
212  .LayReSurf = TRUE
213 
214  .TIw = PAR->InfoFontSize * 10
215  .TIh = PAR->InfoFontSize * 7
216  .InfoSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, .TIw, .TIh)
217  END WITH
218  RETURN obj
219 END FUNCTION
220 
221 
222 
231 SUB track_layer_finalize CDECL(BYVAL Obj AS Gobject PTR)
232 WITH *TRACK_LAYER(Obj)->Priv
233  IF .Surface THEN cairo_surface_destroy(.Surface)
234  cairo_surface_destroy(.InfoSurface)
235 END WITH
236  G_OBJECT_CLASS(track_layer_parent_class)->finalize(Obj)
237 END SUB
238 
239 
240 
248 SUB track_layer_class_init CDECL(BYVAL klass AS TrackLayerClass PTR)
249  g_type_class_add_private(klass, SIZEOF(TrackLayerPrivate))
250  VAR object_class = G_OBJECT_CLASS(klass)
251 
252  object_class->get_property = @track_layer_get_property()
253  object_class->set_property = @track_layer_set_property()
254  object_class->constructor = @track_layer_constructor()
255  object_class->finalize = @track_layer_finalize()
256 
257 
258  g_object_class_install_property( _
259  object_class _
260  , PROP_TL_W _
261  , g_param_spec_int("width" _
262  , "width" _
263  , "map width" _
264  , G_MININT _
265  , G_MAXINT _
266  , 450 _
267  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT_ONLY))
268 
269 
270  g_object_class_install_property( _
271  object_class _
272  , PROP_TL_H _
273  , g_param_spec_int("height" _
274  , "height" _
275  , "map height" _
276  , G_MININT _
277  , G_MAXINT _
278  , 300 _
279  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT_ONLY))
280 
281 
282  g_object_class_install_property( _
283  object_class _
284  , PROP__MAP _
285  , g_param_spec_pointer("map" _
286  , "map" _
287  , "the corresponding map widget" _
288  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT))
289 
290 
291  g_object_class_install_property( _
292  object_class _
293  , PROP_PREF _
294  , g_param_spec_pointer("defaults" _
295  , "defaults" _
296  , "array of default parameters" _
297  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT))
298 
299 
300  g_object_class_install_property( _
301  object_class _
302  , PROP_LOAD _
303  , g_param_spec_pointer("loader" _
304  , "loader" _
305  , "the active track loader" _
306  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT))
307 
308 
309  g_object_class_install_property( _
310  object_class _
311  , PROP_FSIZ _
312  , g_param_spec_int("font-size" _
313  , "FontSize" _
314  , "font size for info pad" _
315  , 6 _
316  , 24 _
317  , 12 _
318  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT))
319 
320 
321  g_object_class_install_property( _
322  object_class _
323  , PROP_FTYP _
324  , g_param_spec_string("font-type" _
325  , "InfoPadFontType" _
326  , "font family for info pad" _
327  , @"Sans" _
328  , G_PARAM_READWRITE OR G_PARAM_CONSTRUCT))
329 END SUB
330 
331 
332 
340 SUB track_layer_init CDECL(BYVAL Self AS TrackLayer PTR)
341  Self->Priv = _
342  G_TYPE_INSTANCE_GET_PRIVATE(Self, TRACK_TYPE_LAYER, TrackLayerPrivate)
343 END SUB
344 
345 
346 
357 SUB track_layer_draw cdecl( _
358  BYVAL Lay AS OsmGpsMapLayer PTR _
359  , BYVAL Map AS OsmGpsMap PTR _
360  , BYVAL Cr AS cairo_t PTR)
361 
362  g_return_if_fail(TRACK_IS_LAYER(Lay))
363 
364 WITH *TRACK_LAYER(Lay)->Priv
365  IF .Surface THEN
366  cairo_set_source_surface(Cr, .Surface, 0, 0)
367  cairo_paint(Cr)
368  END IF
369 
370  IF PAR->LayOn ANDALSO .InfoSurface THEN
371  cairo_set_source_surface(Cr, .InfoSurface, .TIx, .TIy)
372  cairo_paint(Cr)
373  END IF
374 END WITH
375 END SUB
376 
377 
378 
388 FUNCTION track_layer_busy CDECL(BYVAL Lay AS OsmGpsMapLayer PTR) AS gboolean
389  RETURN FALSE
390 END FUNCTION
391 
392 
393 
413 FUNCTION track_layer_button_press CDECL( _
414  BYVAL Lay AS OsmGpsMapLayer PTR _
415  , BYVAL Map AS OsmGpsMap PTR _
416  , BYVAL Event AS GdkEventButton PTR) AS gboolean
417  g_return_val_if_fail(TRACK_IS_LAYER(Lay), FALSE)
418 
419  VAR state = Event->state XOR GDK_MOD2_MASK
420  IF NOT((GDK_CONTROL_MASK + GDK_SHIFT_MASK + GDK_LOCK_MASK) AND state) THEN RETURN FALSE
421 
422  DIM AS float lat, lon
423  VAR osm = OSM_GPS_MAP(GUI->MAP) _
424  , pt = osm_gps_map_get_event_location(osm, Event)
425  osm_gps_map_point_get_radians(pt, @lat, @lon)
426  osm_gps_map_point_free(pt)
427  VAR sc = osm_gps_map_get_scale(osm) _
428  , d = osm_gps_map_get_scale(osm) * PAR->NearDist / ERA
429 
430  IF GDK_CONTROL_MASK AND Event->state THEN ' search all tracks
431  WITH TYPE<TS_nearest>(lat, lon)
432  VAR ii = -1L, ni = 0L
433  FOR i AS LONG = 0 TO UBOUND(.Res)
434  IF NULL = .Res(i).Loa THEN EXIT FOR
435  IF .Res(i).Dist < d THEN ni += 1 : ii = i : d = .Res(i).Dist
436  NEXT
437  IF 0 = ni THEN RETURN TRUE
438  'if ni > 1 then '?? handle multiple tracks
439  WITH *.Res(ii).Loa
440  lat = .V[.Tmp].Lat
441  lon = .V[.Tmp].Lon
442  .Cur = .Tmp
443  END WITH
444  TS_select(.Res(ii).Loa->Path)
445  END WITH
446  ELSE ' search only active track
447  WITH *TRACK_LAYER(Lay)->Priv
448  IF 0 = .Loader THEN RETURN FALSE
449  IF d < .Loader->Nearest(lon, lat) THEN RETURN FALSE
450  WITH *.Loader
451  lat = .V[.Tmp].Lat
452  lon = .V[.Tmp].Lon
453  .Cur = .Tmp
454  END WITH
455  END WITH
456  osm_gps_map_set_center(OSM_GPS_MAP(GUI->MAP), Rad2Deg*lat, Rad2Deg*lon)
457  END IF
458  RETURN TRUE
459 END FUNCTION
460 
461 
462 
474 FUNCTION on_MAP_configure_event CDECL( _
475  BYVAL Wid AS GtkWidget PTR _
476 , BYVAL Event AS GdkEventConfigure PTR _
477 , BYVAL UDat AS GPOINTER) AS gboolean
478 WITH Peek(TrackLayerPrivate, UDat)
479  IF .TLw <> Event->width THEN .TLw = Event->width : .LayReSurf = TRUE
480  IF .TLh <> Event->height THEN .TLh = Event->height : .LayReSurf = TRUE
481 END WITH : RETURN FALSE
482 END FUNCTION
483 
484 
485 
497 FUNCTION track_layer_new(BYVAL Map AS GObject PTR) AS TrackLayer PTR
498  g_return_val_if_fail(OSM_IS_GPS_MAP(Map), NULL)
499  VAR osm = GTK_WIDGET(Map) _
500  , w = gtk_widget_get_allocated_width(osm) _
501  , h = gtk_widget_get_allocated_height(osm)
502  VAR r = g_object_new(TRACK_TYPE_LAYER _
503  , "map", Map _
504  , "width", w _
505  , "height", h _
506  , NULL)
507  osm_gps_map_layer_add(OSM_GPS_MAP(Map), OSM_GPS_MAP_LAYER(r))
508  g_signal_connect(Map, "configure_event" _
509  , G_CALLBACK(@on_MAP_configure_event()), TRACK_LAYER(r)->Priv)
510  RETURN r
511 END FUNCTION
512 
513 
514 
527 SUB render_rtext(BYVAL Cr AS cairo_t PTR, BYREF Y AS LONG, BYREF W AS LONG, BYREF S AS STRING)
528  IF 0 = LEN(S) THEN EXIT SUB
529 
530  DIM AS cairo_text_extents_t extents
531  cairo_text_extents(Cr, S, @extents)
532  g_assert(extents.width <> 0.0)
533 
534  VAR xt = W - extents.width - 2 _
535  , yt = Y - extents.y_bearing
536  cairo_set_source_rgb(Cr, 1.0, 1.0, 1.0)
537  cairo_set_line_width(Cr, PAR->InfoFontSize/6)
538  cairo_move_to(Cr, xt, yt)
539  cairo_text_path(Cr, S)
540  cairo_stroke(Cr)
541 
542  cairo_set_source_rgb(Cr, 0.0, 0.0, 0.0)
543  cairo_move_to(Cr, xt, yt)
544  cairo_show_text(Cr, S)
545  '/* skip + 1/5 line */
546  y -= PAR->InfoFontSize*6\5
547 END SUB
548 
549 
550 
560 FUNCTION lat2str(BYVAL V AS float) AS STRING
561  VAR x = ABS(V) _
562  , g = INT(x) _
563  , m = FRAC(x) * 60
564  RETURN g & FORMAT(m, "\°00.0000\'") & *IIF(V >= 0, @"N", @"S")
565 END FUNCTION
566 
567 
568 
578 FUNCTION lon2str(BYVAL V AS float) AS STRING
579  VAR x = ABS(V) _
580  , g = INT(x) _
581  , m = FRAC(x) * 60
582  RETURN g & FORMAT(m, "\°00.0000\'") & *IIF(V >= 0, @"E", @"W")
583 END FUNCTION
584 
585 
586 
599 SUB render_info( _
600  BYVAL Lay AS TrackLayer PTR _
601  , BYVAL Map AS OsmGpsMap PTR)
602 WITH *Lay->Priv
603  IF 0 = .InfoSurface THEN EXIT SUB
604 
605  '/* first fill with transparency */
606  VAR cr = cairo_create(.InfoSurface)
607  cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE)
608  '~ cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.5)
609  cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0)
610  cairo_paint(cr)
611  cairo_set_operator(cr, CAIRO_OPERATOR_OVER)
612 
613  cairo_select_font_face(cr _
614  , .FTyp _
615  , CAIRO_FONT_SLANT_NORMAL _
616  , CAIRO_FONT_WEIGHT_BOLD)
617  cairo_set_font_size(cr, .FSiz)
618 
619  DIM AS LONG y = .TIh - PAR->InfoFontSize, w = .TIw
620  IF .Loader ANDALSO .Loader->Cur >= 0 THEN
621 WITH .Loader->V[.Loader->Cur]
622  render_rtext(cr, y, w, FORMAT(.Tim, "yymmdd-hh:mm:ss"))
623  render_rtext(cr, y, w, lon2str(.Lon*Rad2Deg))
624  render_rtext(cr, y, w, lat2str(.Lat*Rad2Deg))
625  render_rtext(cr, y, w, FORMAT(.Ele, "##### \m") & FORMAT(.Ang, " ###\°"))
626  render_rtext(cr, y, w, FORMAT(.Spd, "##### ""km/h"""))
627 END WITH
628  render_rtext(cr, y, w, FORMAT(.Loader->Cur, "###### \(") & FORMAT(.Loader->Az, "###### \)"))
629  ELSE
630  DIM AS gfloat lat, lon
631  g_object_get(Map, "latitude", @lat, "longitude", @lon, NULL)
632  render_rtext(cr, y, w, lon2str(lon))
633  render_rtext(cr, y, w, lat2str(lat))
634  END IF
635 END WITH
636 END SUB
637 
638 
639 
640 
655 FUNCTION render_track CDECL( _
656  BYVAL Model AS GtkTreeModel PTR _
657  , BYVAL Path AS GtkTreePath PTR _
658  , BYVAL Iter AS GtkTreeIter PTR _
659  , BYVAL TLPriv AS gpointer) AS gboolean
660  DIM AS gboolean en
661  gtk_tree_model_get(Model, Iter _
662  , COL__ENABLE, @en _
663  , -1)
664  IF FALSE = en THEN RETURN FALSE
665 
666  DIM AS gint lw, pw
667  DIM AS gchar PTR lcs, pcs
668  DIM AS TrackLoader PTR loa
669  gtk_tree_model_get(Model, Iter _
670  , COL_P_WIDTH, @pw _
671  , COL_L_WIDTH, @lw _
672  , COL_P_COLOR, @pcs _
673  , COL_L_COLOR, @lcs _
674  , COL__LOADER, @loa _
675  , -1)
676  DIM AS GdkRGBA lc, pc
677  gdk_rgba_parse(@pc, pcs) : g_free(pcs)
678  gdk_rgba_parse(@lc, lcs) : g_free(lcs)
679  IF NULL = loa THEN RETURN false
680 
681 WITH PEEK(TrackLayerPrivate, TLPriv)
682  IF loa->Pixel(.TLx, .TLy, .TLz) THEN RETURN false
683  ' lines
684  IF lw THEN
685  cairo_set_line_width(.Cr, lw)
686  cairo_set_source_rgba(.Cr, lc.red, lc.green, lc.blue, lc.alpha)
687  cairo_set_line_cap(.Cr, CAIRO_LINE_CAP_ROUND)
688  cairo_set_line_join(.Cr, CAIRO_LINE_JOIN_ROUND)
689  cairo_move_to(.Cr, loa->V[0].Xpix, loa->V[0].Ypix)
690  FOR i AS INTEGER = 1 TO loa->Az
691  cairo_line_to(.Cr, loa->V[i].Xpix, loa->V[i].Ypix)
692  NEXT
693  cairo_stroke(.Cr)
694  END IF
695  ' points
696  IF pw AND &b1111 THEN
697  cairo_set_source_rgba(.Cr, pc.red, pc.green, pc.blue, pc.alpha)
698  SELECT CASE AS CONST pw
699  CASE &b0001 TO &b1111 ' fast simple
700  FOR i AS INTEGER = 0 TO loa->Az
701  cairo_new_sub_path(.Cr)
702  cairo_arc(.Cr, loa->V[i].Xpix, loa->V[i].Ypix, pw, 0.0, PIx2)
703  NEXT : cairo_fill(.Cr)
704  CASE ELSE ' complex
705  DIM AS INTEGER p4, p6
706  DIM AS float up_4, up_6, low4, low6
707  IF pw AND &b00110000 THEN
708  SELECT CASE AS CONST (pw SHR 4) AND &b11
709  CASE 1 : p4 = OFFSETOF(TrP, Ele) : low4 = loa->Mn.Ele : up_4 = loa->Mx.Ele
710  CASE 2 : p4 = OFFSETOF(TrP, Spd) : low4 = loa->Mn.Spd : up_4 = loa->Mx.Spd
711  CASE 3 : p4 = OFFSETOF(TrP, Ang) : low4 = loa->Mn.Ang : up_4 = loa->Mx.Ang
712  END SELECT
713  END IF
714  IF pw AND &b11000000 THEN
715  SELECT CASE AS CONST (pw SHR 6) AND &b11
716  CASE 1 : p6 = OFFSETOF(TrP, Ele) : low6 = loa->Mn.Ele : up_6 = loa->Mx.Ele
717  CASE 2 : p6 = OFFSETOF(TrP, Spd) : low6 = loa->Mn.Spd : up_6 = loa->Mx.Spd
718  CASE 3 : p6 = OFFSETOF(TrP, Ang) : low6 = loa->Mn.Ang : up_6 = loa->Mx.Ang
719  END SELECT
720  END IF
721 
722  IF p4 ANDALSO p6 THEN ' variable diameter and alpha
723  VAR fac4 = IIF(up_4 <> low4, ((pw AND &b1111) - 1) / (up_4 - low4), 1.) _
724  , fac6 = IIF(up_6 <> low6, .9 / (up_6 - low6), 1.)
725  FOR i AS INTEGER = 0 TO loa->Az
726  VAR a = .1 + (PEEK(float, CAST(ANY PTR, @loa->V[i]) + p6) - low6) * fac6 _
727  , r = 1. + (PEEK(float, CAST(ANY PTR, @loa->V[i]) + p4) - low4) * fac4
728  cairo_set_source_rgba(.Cr, pc.red, pc.green, pc.blue, a)
729  cairo_arc(.Cr, loa->V[i].Xpix, loa->V[i].Ypix, r, 0.0, PIx2)
730  cairo_fill(.Cr)
731  NEXT
732  ELSEIF p4 THEN ' variable diameter
733  VAR fac = IIF(up_4 <> low4, ((pw AND &b1111) - 1) / (up_4 - low4), 1.)
734  FOR i AS INTEGER = 0 TO loa->Az
735  VAR r = 1. + (PEEK(float, CAST(ANY PTR, @loa->V[i]) + p4) - low4) * fac
736  cairo_new_sub_path(.Cr)
737  cairo_arc(.Cr, loa->V[i].Xpix, loa->V[i].Ypix, r, 0.0, PIx2)
738  NEXT : cairo_fill(.Cr)
739  ELSE ' variable alpha
740  VAR r = pw AND &b1111 _
741  , fac = IIF(up_6 <> low6, .9 / (up_6 - low6), 1.)
742  FOR i AS INTEGER = 0 TO loa->Az
743  VAR a = .1 + (PEEK(float, CAST(ANY PTR, @loa->V[i]) + p6) - low6) * fac
744  cairo_set_source_rgba(.Cr, pc.red, pc.green, pc.blue, a)
745  cairo_arc(.Cr, loa->V[i].Xpix, loa->V[i].Ypix, r, 0.0, PIx2)
746  cairo_fill(.Cr)
747  NEXT
748  END IF
749  END SELECT
750  END IF
751 END WITH
752 END FUNCTION
753 
754 
755 
766 SUB track_layer_render CDECL( _
767  BYVAL Lay AS OsmGpsMapLayer PTR _
768  , BYVAL Map AS OsmGpsMap PTR)
769 
770  g_return_if_fail(TRACK_IS_LAYER(Lay))
771 
772 WITH *TRACK_LAYER(Lay)->Priv
773  IF .LayReSurf THEN
774  IF .Surface THEN cairo_surface_destroy(.Surface)
775  .TIx = .TLw - .TIw - 5
776  .TIy = .TLh - .TIh - 5
778  .Surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, .TLw, .TLh)
779  .LayResurf = FALSE
780  END IF
781  .Cr = cairo_create(.Surface)
782 
783  g_object_get(GUI->MAP _
784  , "map-x", @.TLx _
785  , "map-y", @.TLy _
786  , "zoom" , @.TLz _
787  , NULL)
788 
789  '/* first fill with transparency */
790  cairo_set_operator(.Cr, CAIRO_OPERATOR_SOURCE)
791  cairo_set_source_rgba(.Cr, 1.0, 0.0, 0.0, 0.0)
792  cairo_paint(.Cr)
793  cairo_set_operator(.Cr, CAIRO_OPERATOR_OVER)
794 
795  gtk_tree_model_foreach(GTK_TREE_MODEL(GUI->STO) _
796  , @render_track(), CAST(gpointer, TRACK_LAYER(Lay)->Priv))
797 
798  IF PAR->LayOn THEN render_info(TRACK_LAYER(Lay), Map)
799  cairo_destroy(.Cr)
800 END WITH
801 END SUB
802 
803 
804 
815 FUNCTION track_layer_get_default CDECL( _
816  BYVAL Lay AS TrackLayer PTR) AS TrackLayerDefault PTR
817 
818  g_return_val_if_fail(TRACK_IS_LAYER(Lay), NULL)
819 
820  WITH *Lay->Priv
821  .Nxt += 1 : IF NULL = .Default[.Nxt].P THEN .Nxt = 0
822  RETURN @.Default[.Nxt]
823  END WITH
824 END FUNCTION
825 
826 
827 
836 FUNCTION track_layer_get_loader CDECL( _
837  BYVAL Lay AS TrackLayer PTR) AS TrackLoader PTR
838 
839  g_return_val_if_fail(TRACK_IS_LAYER(Lay), NULL)
840 
841  RETURN Lay->Priv->Loader
842 END FUNCTION
843 
844 
845 
853 SUB track_layer_center_track CDECL( _
854  BYVAL Lay AS TrackLayer PTR)
855 
856  g_return_if_fail(TRACK_IS_LAYER(Lay))
857 
858  IF 0 = Lay->Priv->Loader THEN EXIT SUB
859 WITH *Lay->Priv->Loader
860  .MapCenter(Lay->Priv->TLw, Lay->Priv->TLh)
861  osm_gps_map_set_center_and_zoom(OSM_GPS_MAP(GUI->MAP), .UsLa, .UsLo, .UsZo)
862 END WITH
863 END SUB
864 
865 
866 
875 SUB track_layer_set_loader CDECL( _
876  BYVAL Lay AS TrackLayer PTR _
877 , BYVAL Loa AS TrackLoader PTR)
878 
879  g_return_if_fail(TRACK_IS_LAYER(Lay))
880 
881  Lay->Priv->Loader = Loa : IF 0 = Loa THEN EXIT SUB
882 WITH *Loa
883  IF .UsZo < 0 THEN .MapCenter(Lay->Priv->TLw, Lay->Priv->TLh)
884  osm_gps_map_set_center_and_zoom(OSM_GPS_MAP(GUI->MAP), .UsLa, .UsLo, .UsZo)
885 END WITH
886 END SUB
887 
888 
889 
897 SUB track_layer_redraw CDECL(BYVAL Lay AS TrackLayer PTR)
898 
899  g_return_if_fail(TRACK_IS_LAYER(Lay))
900 
901  track_layer_render(OSM_GPS_MAP_LAYER(Lay), Lay->Priv->Map)
902 END SUB
903 
904 
905 
915 FUNCTION track_layer_get_point CDECL(BYVAL Lay AS TrackLayer PTR) AS gint
916 
917  g_return_val_if_fail(TRACK_IS_LAYER(Lay), -1)
918  IF NULL = Lay->Priv->Loader THEN RETURN -1
919  RETURN Lay->Priv->Loader->Cur
920 
921 END FUNCTION
922 
923 
924 
935 SUB track_layer_set_point CDECL(BYVAL Lay AS TrackLayer PTR, BYVAL N AS gint)
936 
937  g_return_if_fail(TRACK_IS_LAYER(Lay))
938  IF NULL = Lay->Priv->Loader THEN EXIT SUB
939 
940 WITH *Lay->Priv->Loader
941  .Cur = IIF(N > .Az, .Az, IIF(N < 0, 0, N))
942  .UsLa = Rad2Deg * .V[.Cur].Lat
943  .UsLo = Rad2Deg * .V[.Cur].Lon
944  .UsZo = .CoZo
945  osm_gps_map_set_center_and_zoom(OSM_GPS_MAP(GUI->MAP), .UsLa, .UsLo, .UsZo)
946 END WITH
947 END SUB
948 
949 
950 
964 SUB track_layer_set_bbox CDECL(BYVAL Lay AS TrackLayer PTR _
965  , BYVAL La0 AS float, BYVAL La1 AS float _
966  , BYVAL Lo0 AS float, BYVAL Lo1 AS float)
967 
968  g_return_if_fail(TRACK_IS_LAYER(Lay))
969 
970 WITH *Lay->Priv
971  osm_gps_map_set_center_and_zoom(OSM_GPS_MAP(GUI->MAP) _
972  , Rad2Deg * (La0 + La1) * .5 _
973  , Rad2Deg * (Lo0 + Lo1) * .5 _
974  , latlon2zoom(.TLw, .TLh, La0, La1, Lo0, Lo1))
975 END WITH
976 END SUB
977 
978 
979 
988 SUB track_layer_point_move CDECL(BYVAL Lay AS TrackLayer PTR, BYVAL S AS gchar PTR)
989 
990  g_return_if_fail(TRACK_IS_LAYER(Lay))
991  IF NULL = Lay->Priv->Loader THEN EXIT SUB
992 
993 WITH *Lay->Priv->Loader
994  SELECT CASE AS CONST S[0]
995  CASE ASC("+") : .Cur += 1 : IF .Cur > .Az THEN .Cur = .Az
996  CASE ASC("-") : .Cur -= 1 : IF .Cur < 0 THEN .Cur = 0
997  CASE ASC("f") : .Cur += .Az SHR 5 : IF .Cur > .Az THEN .Cur = .Az
998  CASE ASC("b") : .Cur -= .Az SHR 5 : IF .Cur < 0 THEN .Cur = 0
999  CASE ASC("F") : .Cur += .Az SHR 3 : IF .Cur > .Az THEN .Cur = .Az
1000  CASE ASC("B") : .Cur -= .Az SHR 3 : IF .Cur < 0 THEN .Cur = 0
1001  CASE ASC("H") : .Cur = 0
1002  CASE ASC("E") : .Cur = .Az
1003  CASE ASC("M") : .Cur = .Az SHR 1
1004  CASE ASC("1") : .Cur = CINT(.1 * .Az)
1005  CASE ASC("2") : .Cur = CINT(.2 * .Az)
1006  CASE ASC("3") : .Cur = CINT(.3 * .Az)
1007  CASE ASC("4") : .Cur = CINT(.4 * .Az)
1008  CASE ASC("5") : .Cur = CINT(.5 * .Az)
1009  CASE ASC("6") : .Cur = CINT(.6 * .Az)
1010  CASE ASC("7") : .Cur = CINT(.7 * .Az)
1011  CASE ASC("8") : .Cur = CINT(.8 * .Az)
1012  CASE ASC("9") : .Cur = CINT(.9 * .Az)
1013  CASE ASC("}") : .Cur = .SkipOut( 2, PAR->SkipFact * osm_gps_map_get_scale(Lay->Priv->Map))
1014  CASE ASC(">") : .Cur = .SkipOut( 1, PAR->SkipFact * osm_gps_map_get_scale(Lay->Priv->Map))
1015  CASE ASC("<") : .Cur = .SkipOut(-1, PAR->SkipFact * osm_gps_map_get_scale(Lay->Priv->Map))
1016  CASE ASC("{") : .Cur = .SkipOut(-2, PAR->SkipFact * osm_gps_map_get_scale(Lay->Priv->Map))
1017  CASE ELSE : EXIT SUB
1018  END SELECT
1019  .UsLa = Rad2Deg * .V[.Cur].Lat
1020  .UsLo = Rad2Deg * .V[.Cur].Lon
1021  .UsZo = .CoZo
1022  osm_gps_map_set_center_and_zoom(OSM_GPS_MAP(GUI->MAP), .UsLa, .UsLo, .UsZo)
1023 END WITH
1024 END SUB
1025 
PROP_0
@ PROP_0
Definition: track_layer.bas:40
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
PROP_FSIZ
@ PROP_FSIZ
Definition: track_layer.bas:46
float
single float
Definition: track_layer.bas:19
track_layer_point_move
SUB_CDECL track_layer_point_move(BYVAL_AS_TrackLayer_PTR Lay, BYVAL_AS_gchar_PTR S)
Move current point.
Definition: track_layer.bas:988
track_layer_busy
FUNCTION_CDECL_AS_gboolean track_layer_busy(BYVAL_AS_OsmGpsMapLayer_PTR)
Callback for busy layer.
Definition: track_layer.bas:388
PROP_FTYP
@ PROP_FTYP
Definition: track_layer.bas:47
latlon2zoom
FUNCTION_CDECL_AS_LONG latlon2zoom(BYVAL_AS_LONG W, BYVAL_AS_LONG H, BYVAL_AS_float La0, BYVAL_AS_float La1, BYVAL_AS_float Lo0, BYVAL_AS_float Lo1)
Evaluate the matching zoom level for BBox.
Definition: track_loader.bas:116
DEFAULT_ENTRIES
static TrackLayerDefault DEFAULT_ENTRIES[...]
Array of default setting for loaded tracks.
Definition: track_layer.bas:25
track_store.bi
Header for tree store of tracks handling.
track_layer_get_point
FUNCTION_CDECL_AS_gint track_layer_get_point(BYVAL_AS_TrackLayer_PTR Lay)
Get current point in active track.
Definition: track_layer.bas:915
lat2str
FUNCTION_AS_STRING lat2str(BYVAL_AS_float V)
Format a latitude as string.
Definition: track_layer.bas:560
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
_TrackLayerPrivate::InfoSurface
cairo_surface_t_PTR InfoSurface
surface for info pad
Definition: track_layer.bas:69
_TrackLayerPrivate::Default
TrackLayerDefault_PTR Default
default values width/color (prop "defaults")
Definition: track_layer.bas:64
track_layer_render
SUB_CDECL track_layer_render(BYVAL_AS_OsmGpsMapLayer_PTR, BYVAL_AS_OsmGpsMap_PTR)
Render all enabled tracks.
Definition: track_layer.bas:766
_TrackLayerPrivate::Nxt
gint Nxt
next index (defaults)
Definition: track_layer.bas:73
track_layer_set_point
SUB_CDECL track_layer_set_point(BYVAL_AS_TrackLayer_PTR Lay, BYVAL_AS_gint N)
Set current point in active track.
Definition: track_layer.bas:935
TRACK_LAYER
#define TRACK_LAYER(obj)
Definition: track_layer.bi:14
TrackLayerDefault
Definition: track_layer.bi:20
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
track_layer_constructor
FUNCTION_CDECL_AS_Gobject_PTR track_layer_constructor(BYVAL_AS_GType Typ, BYVAL_AS_guint N_prop, BYVAL_AS_GObjectConstructParam_PTR Prop)
GObjectClass CTOR.
Definition: track_layer.bas:198
track_layer_init
SUB_CDECL track_layer_init(BYVAL_AS_TrackLayer_PTR Self)
GObject init procedure.
Definition: track_layer.bas:340
_TrackLayerPrivate::TIx
gint TIx
info surface x position
Definition: track_layer.bas:74
_TrackLayerPrivate::TIy
gint TIy
info surface y position
Definition: track_layer.bas:75
_TrackLayerPrivate::Surface
cairo_surface_t_PTR Surface
layer surface (track background)
Definition: track_layer.bas:68
PROP_TL_H
@ PROP_TL_H
Definition: track_layer.bas:42
track_layer_center_track
SUB_CDECL track_layer_center_track(BYVAL_AS_TrackLayer_PTR Lay)
Show complete track.
Definition: track_layer.bas:853
_TrackLayerPrivate::TIh
gint TIh
info surface height
Definition: track_layer.bas:77
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
track_layer_get_property
SUB_CDECL track_layer_get_property(BYVAL_AS_Gobject_PTR Obj, BYVAL_AS_guint Property_id, BYVAL_AS_GValue_PTR Value, BYVAL_AS_GParamSpec_PTR Pspec)
Handling property fetching.
Definition: track_layer.bas:130
_TrackLayerPrivate
Private data.
Definition: track_layer.bas:58
_TrackLayerPrivate::Cr
cairo_t_PTR Cr
layer
Definition: track_layer.bas:66
track_layer_interface_init
SUB_CDECL track_layer_interface_init(BYVAL_AS_OsmGpsMapLayerIface_PTR)
Initialise the interface functions.
Definition: track_layer.bas:111
_TrackLayerPrivate::LayReSurf
gboolean LayReSurf
flag for layer surface redo
Definition: track_layer.bas:85
lon2str
FUNCTION_AS_STRING lon2str(BYVAL_AS_float V)
Format a longitude as string.
Definition: track_layer.bas:578
PROP_PREF
@ PROP_PREF
Definition: track_layer.bas:44
track_layer_new
FUNCTION_AS_TrackLayer_PTR track_layer_new(BYVAL_AS_GObject_PTR Map)
Creates a new instance of TrackLayer.
Definition: track_layer.bas:497
_TrackLayerPrivate::TLw
gint TLw
map width (prop "width")
Definition: track_layer.bas:81
track_layer_draw
SUB_CDECL track_layer_draw(BYVAL_AS_OsmGpsMapLayer_PTR, BYVAL_AS_OsmGpsMap_PTR, BYVAL_AS_cairo_t_PTR)
Callback for drawing the layer surfaces.
Definition: track_layer.bas:357
debug.bi
_TrackLayerPrivate::TLx
gint TLx
map X
Definition: track_layer.bas:79
track_layer_get_loader
FUNCTION_CDECL_AS_TrackLoader_PTR track_layer_get_loader(BYVAL_AS_TrackLayer_PTR Lay)
Provide pointer to the active track.
Definition: track_layer.bas:836
_TrackLayerPrivate::FSiz
gint FSiz
font size (prop "font-size")
Definition: track_layer.bas:83
_TrackLayerPrivate::TLy
gint TLy
map Y
Definition: track_layer.bas:80
_TrackLayerPrivate::TLz
gint TLz
map zoom
Definition: track_layer.bas:78
render_track
FUNCTION_CDECL_AS_gboolean render_track(BYVAL_AS_GtkTreeModel_PTR Model, BYVAL_AS_GtkTreePath_PTR Path, BYVAL_AS_GtkTreeIter_PTR Iter, BYVAL_AS_gpointer TLPriv)
Render an enabled track.
Definition: track_layer.bas:655
render_info
SUB_CDECL render_info(BYVAL_AS_TrackLayer_PTR Lay, BYVAL_AS_OsmGpsMap_PTR Map)
Render the info pad.
Definition: track_layer.bas:599
PROP_TL_W
@ PROP_TL_W
Definition: track_layer.bas:41
_TrackLayerPrivate::TIw
gint TIw
info surface width
Definition: track_layer.bas:76
track_layer.bi
Header for advanced tracks layer.
_TrackLayerPrivate::Map
OsmGpsMap_PTR Map
Definition: track_layer.bas:60
track_layer_class_init
SUB_CDECL track_layer_class_init(BYVAL_AS_TrackLayerClass_PTR klass)
GObjectClass initialization.
Definition: track_layer.bas:248
track_layer_set_property
SUB_CDECL track_layer_set_property(BYVAL_AS_Gobject_PTR Obj, BYVAL_AS_guint Property_id, BYVAL_AS_CONST_GValue_PTR Value, BYVAL_AS_GParamSpec_PTR Pspec)
Handling property setting.
Definition: track_layer.bas:162
render_rtext
SUB render_rtext(BYVAL_AS_cairo_t_PTR Cr, BYREF_AS_LONG Y, BYREF_AS_LONG W, BYREF_AS_STRING S)
Render right alligned text, bottom up.
Definition: track_layer.bas:527
on_MAP_configure_event
FUNCTION_CDECL_AS_gboolean on_MAP_configure_event(BYVAL_AS_GtkWidget_PTR Wid, BYVAL_AS_GdkEventConfigure_PTR Event, BYVAL_AS_GPOINTER UDat)
Callback fetching map size.
Definition: track_layer.bas:474
PROP__MAP
@ PROP__MAP
Definition: track_layer.bas:43
PROP_LOAD
@ PROP_LOAD
Definition: track_layer.bas:45
_TrackLayerPrivate::TLh
gint TLh
map height (prop "height")
Definition: track_layer.bas:82
_TrackLayerPrivate::Loader
TrackLoader_PTR Loader
Definition: track_layer.bas:62
track_layer_finalize
SUB_CDECL track_layer_finalize(BYVAL_AS_Gobject_PTR Obj)
GObjectClass finalisation.
Definition: track_layer.bas:231
gui.bi
Header containing Glade ui file pointers.
_TrackLayerPrivate::FTyp
gchar_PTR FTyp
font family (prop "font-type")
Definition: track_layer.bas:71
track_layer_button_press
FUNCTION_CDECL_AS_gboolean track_layer_button_press(BYVAL_AS_OsmGpsMapLayer_PTR, BYVAL_AS_OsmGpsMap_PTR, BYVAL_AS_GdkEventButton_PTR)
Callback for button event.
Definition: track_layer.bas:413