Alpha release.
[speedometer] / ui.c
1 /****
2         Speedometer, shows your current speed using GPS
3         Copyright (C) 2008 Wellu Mäkinen <wellu@wellu.org>
4
5         This program is free software: you can redistribute it and/or modify
6         it under the terms of the GNU General Public License as published by
7         the Free Software Foundation, either version 3 of the License, or
8         (at your option) any later version.
9
10         This program is distributed in the hope that it will be useful,
11         but WITHOUT ANY WARRANTY; without even the implied warranty of
12         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13         GNU General Public License for more details.
14
15         You should have received a copy of the GNU General Public License
16         along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  ****/
18
19 #include <gtk/gtk.h>
20
21 #include "ui.h"
22 #include "callbacks.h"
23
24 #define IMAGE_PATH "/usr/share/speedometer/%d.png"
25
26 static void set_widget_bg_black(GtkWidget* widget) {
27         GdkColor black;
28         black.red = 0x0000;
29         black.blue = 0x0000;
30         black.green = 0x0000;
31         gtk_widget_modify_bg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &black);
32 }
33
34 void load_images(AppData *appdata) {
35         g_print("Loading images\n");
36         int i = 0;
37         while(i < 10) {
38                 char* path = malloc(30);
39                 g_sprintf(path, IMAGE_PATH, i);
40                 appdata->image_array[i] = (GtkImage*) gtk_image_new_from_file(path);
41                 g_print(path);
42                 g_print("\n");
43                 free(path);
44                 i++;
45         }
46 }
47
48 void reset_speed(AppData* appdata) {
49
50         GdkPixbuf* zero = gtk_image_get_pixbuf(appdata->image_array[0]);
51
52         appdata->speed_array[0] = (GtkImage*) gtk_image_new_from_pixbuf(zero);
53         appdata->speed_array[1] = (GtkImage*) gtk_image_new_from_pixbuf(zero);
54         appdata->speed_array[2] = (GtkImage*) gtk_image_new_from_pixbuf(zero);
55 }
56
57 void set_nth_digit(AppData* appdata, guint n, guint value) {
58         //assert(nth >= 0 && nth < 3);
59
60         GtkImage* image = appdata->speed_array[n];
61         GdkPixbuf* buf = gtk_image_get_pixbuf(appdata->image_array[value]);
62         gtk_image_set_from_pixbuf(image, buf);
63         gtk_widget_queue_draw(GTK_WIDGET(appdata->speed_array[n]));
64 }
65
66 guint randomize(AppData* appdata) {
67
68         gint32 n = g_random_int_range(0, 3);
69         GtkImage* image = appdata->speed_array[n];
70
71         gint32 m = g_random_int_range(0, 10);
72         GdkPixbuf* buf = gtk_image_get_pixbuf(appdata->image_array[m]);
73
74         g_print("Setting number %d to %d.. ", n+1, m);
75
76         gtk_image_set_from_pixbuf(image, buf);
77         gtk_widget_queue_draw(GTK_WIDGET(appdata->speed_array[n]));
78
79         return TRUE;
80 }
81
82 void create_ui(AppData* appdata) {
83
84         GtkWidget *hbox;
85         GtkWidget *vbox;
86
87         vbox = gtk_vbox_new(FALSE, 0);
88         hbox = gtk_hbox_new(TRUE, 0);
89
90         GtkWidget* top_e = gtk_event_box_new();
91         GtkWidget* bottom_e = gtk_event_box_new();
92
93         g_signal_connect(G_OBJECT(top_e),
94                         "button_press_event",
95                         G_CALLBACK(top_event_box_button_press),
96                         appdata);
97
98         g_signal_connect(G_OBJECT(bottom_e),
99                         "button_press_event",
100                         G_CALLBACK(bottom_event_box_button_press),
101                         appdata);
102
103         g_signal_connect(G_OBJECT(appdata->window),
104                         "delete_event",
105                         G_CALLBACK(gtk_main_quit),
106                         NULL);
107
108     g_signal_connect(G_OBJECT(appdata->window),
109                 "key_press_event",
110                 G_CALLBACK(key_press_cb),
111                 appdata->window);
112
113         // add three digits to the hbox
114         gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(appdata->speed_array[0]), FALSE, FALSE, 0);
115         gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(appdata->speed_array[1]), FALSE, FALSE, 0);
116         gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(appdata->speed_array[2]), FALSE, FALSE, 0);
117
118         gtk_box_pack_start_defaults(GTK_BOX(vbox), top_e); // add event box on top
119         gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox); // numbers to the middle
120         gtk_box_pack_start_defaults(GTK_BOX(vbox), bottom_e); // add event box on bottom
121
122         gtk_container_add(GTK_CONTAINER(appdata->window), GTK_WIDGET(vbox));
123
124
125         // set backgrounds black
126         set_widget_bg_black(GTK_WIDGET(appdata->window));
127         set_widget_bg_black(bottom_e);
128         set_widget_bg_black(top_e);
129
130 }
131