basic drawing widget, nothing drawn for now
[lttv.git] / ltt / branches / poly / lttv / modules / guiControlFlow / Drawing.c
CommitLineData
fa2c4dbe 1
f0d936c0 2#include "Drawing.h"
76a67e8a 3#include <gtk/gtk.h>
4#include <gdk/gdk.h>
f0d936c0 5
6/*****************************************************************************
7 * Drawing functions *
8 *****************************************************************************/
9
10typedef enum
11{
12 RED,
13 GREEN,
14 BLUE,
15 WHITE,
16 BLACK
17
18} ControlFlowColors;
19
20/* Vector of unallocated colors */
21static GdkColor CF_Colors [] =
22{
23 { 0, 0xffff, 0x0000, 0x0000 }, // RED
24 { 0, 0x0000, 0xffff, 0x0000 }, // GREEN
25 { 0, 0x0000, 0x0000, 0xffff }, // BLUE
26 { 0, 0xffff, 0xffff, 0xffff }, // WHITE
27 { 0, 0x0000, 0x0000, 0x0000 } // BLACK
28};
29
30
76a67e8a 31struct _Drawing_t {
32 GtkWidget *Drawing_Area_V;
33 GdkPixmap *Pixmap;
f0d936c0 34
76a67e8a 35 gint height, width, depth;
f0d936c0 36
76a67e8a 37};
f0d936c0 38
39
76a67e8a 40Drawing_t *Drawing_construct(void)
f0d936c0 41{
42
76a67e8a 43 Drawing_t *Drawing = g_new(Drawing_t, 1);
f0d936c0 44
45 Drawing->Drawing_Area_V = gtk_drawing_area_new ();
46
47 g_object_set_data_full(
48 G_OBJECT(Drawing->Drawing_Area_V),
76a67e8a 49 "Link_Drawing_Data",
f0d936c0 50 Drawing,
fa2c4dbe 51 (GDestroyNotify)Drawing_destroy);
f0d936c0 52
76a67e8a 53 gtk_widget_modify_bg( Drawing->Drawing_Area_V,
f0d936c0 54 GTK_STATE_NORMAL,
55 &CF_Colors[BLACK]);
56
76a67e8a 57 gdk_window_get_geometry(Drawing->Drawing_Area_V->window,
58 NULL, NULL,
59 &(Drawing->width),
60 &(Drawing->height),
61 &(Drawing->depth));
62
63 Drawing->Pixmap = gdk_pixmap_new(
64 Drawing->Drawing_Area_V->window,
65 Drawing->width,
66 Drawing->height,
67 Drawing->depth);
68
f0d936c0 69 return Drawing;
70}
71
72void Drawing_destroy(Drawing_t *Drawing)
73{
74
76a67e8a 75 // Do not unref here, Drawing_t destroyed by it's widget.
76 //g_object_unref( G_OBJECT(Drawing->Drawing_Area_V));
f0d936c0 77
78 g_free(Drawing);
79}
80
76a67e8a 81GtkWidget *Drawing_getWidget(Drawing_t *Drawing)
82{
83 return Drawing->Drawing_Area_V;
84}
85
f0d936c0 86/* get_time_from_pixels
87 *
88 * Get the time interval from window time and pixels, and pixels requested. This
89 * function uses TimeMul, which should only be used if the float value is lower
90 * that 4, and here it's always lower than 1, so it's ok.
91 */
fa2c4dbe 92void convert_pixels_to_time(
93 Drawing_t *Drawing,
94 guint x,
95 LttTime *window_time_begin,
96 LttTime *window_time_end,
76a67e8a 97 LttTime *time)
f0d936c0 98{
fa2c4dbe 99 LttTime window_time_interval;
f0d936c0 100
76a67e8a 101 TimeSub(window_time_interval, *window_time_end, *window_time_begin);
f0d936c0 102
103
fa2c4dbe 104 TimeMul(*time, window_time_interval,
105 (x/(float)Drawing->width));
76a67e8a 106 TimeAdd(*time, *window_time_begin, *time);
f0d936c0 107
fa2c4dbe 108}
109
110
111
112void convert_time_to_pixels(
113 LttTime window_time_begin,
114 LttTime window_time_end,
115 LttTime time,
116 Drawing_t *Drawing,
76a67e8a 117 guint *x)
fa2c4dbe 118{
119 LttTime window_time_interval;
76a67e8a 120 float interval_float, time_float;
fa2c4dbe 121
122 TimeSub(window_time_interval, window_time_end, window_time_begin);
123
76a67e8a 124 TimeSub(time, time, window_time_begin);
fa2c4dbe 125
76a67e8a 126 interval_float = (window_time_interval.tv_sec * NANSECOND_CONST)
127 + window_time_interval.tv_nsec;
128 time_float = (time.tv_sec * NANSECOND_CONST)
129 + time.tv_nsec;
130
131 *x = (guint)(time_float/interval_float * Drawing->width);
f0d936c0 132
133}
134
fa2c4dbe 135
136
76a67e8a 137void Drawing_Resize(Drawing_t *Drawing, guint h, guint w)
f0d936c0 138{
f0d936c0 139 Drawing->height = h ;
76a67e8a 140 Drawing->width = w ;
f0d936c0 141
76a67e8a 142 gtk_widget_set_size_request ( Drawing->Drawing_Area_V,
143 Drawing->width,
f0d936c0 144 Drawing->height);
145
146
147}
This page took 0.029374 seconds and 4 git commands to generate.