buttons click processing added
[omnplay] / src / ui.c
1 /*
2 * ui.c -- GTK+ 2 omnplay
3 * Copyright (C) 2011 Maksym Veremeyenko <verem@m1stereo.tv>
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 2 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, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif
23
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <unistd.h>
27 #include <string.h>
28 #include <stdio.h>
29
30 #include <gdk/gdkkeysyms.h>
31 #include <gtk/gtk.h>
32
33 #include "ui.h"
34 #include "ui_utils.h"
35 #include "ui_buttons.h"
36 #include "support.h"
37
38 static GtkWidget* create_label(GtkWidget* top, char* text, char* reg, GtkJustification jtype)
39 {
40 GtkWidget* label;
41
42 label = gtk_label_new ("");
43 gtk_widget_show (label);
44
45 gtk_label_set_justify (GTK_LABEL (label), jtype);
46
47 if(reg)
48 GLADE_HOOKUP_OBJECT (top, label, reg);
49
50 if(text)
51 gtk_label_set_text(GTK_LABEL (label), text);
52
53 return label;
54 };
55
56 static GtkWidget* create_treeview(GtkWidget* top, char* name, const char* columns[])
57 {
58 int i;
59
60 GtkWidget *treeview;
61 GtkCellRenderer *renderer;
62 GtkTreeViewColumn *column;
63 GtkListStore *list_store;
64
65 treeview = gtk_tree_view_new ();
66 gtk_widget_show (treeview);
67
68 list_store = gtk_list_store_new(7,
69 G_TYPE_STRING,
70 G_TYPE_STRING,
71 G_TYPE_STRING,
72 G_TYPE_STRING,
73 G_TYPE_STRING,
74 G_TYPE_STRING,
75 G_TYPE_STRING);
76 gtk_tree_view_set_model( GTK_TREE_VIEW( treeview ), GTK_TREE_MODEL( list_store ) );
77
78 for(i = 0; columns[i]; i++)
79 {
80 renderer = gtk_cell_renderer_toggle_new();
81 column = gtk_tree_view_column_new_with_attributes(
82 columns[i], renderer, "text", i, NULL);
83 gtk_tree_view_append_column(GTK_TREE_VIEW( treeview ), column);
84 };
85
86 g_object_unref(list_store);
87
88 GLADE_HOOKUP_OBJECT (top, treeview, name);
89
90 return treeview;
91 };
92
93 static GtkWidget* pane_library_grid(GtkWidget* top, omnplay_instance_t* app)
94 {
95 static const char* columns[] = {"ID", "DUR", "TITLE", NULL};
96 GtkWidget *scrolledwindow;
97
98 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
99 gtk_widget_show (scrolledwindow);
100 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
101 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
102
103 gtk_container_add (GTK_CONTAINER (scrolledwindow),
104 app->library_grid = create_treeview(top, "treeview_library", columns));
105
106 return scrolledwindow;
107 }
108
109 static GtkWidget* pane_library_buttons(GtkWidget* top, omnplay_instance_t* app)
110 {
111 GtkWidget* hbox;
112
113 hbox = gtk_hbox_new (FALSE, 0);
114 gtk_widget_show (hbox);
115
116 /* playlist modify buttons */
117 gtk_box_pack_start (GTK_BOX (hbox),
118 ui_create_button(top, app, BUTTON_LIBRARY_ADD),
119 FALSE, FALSE, 0);
120 gtk_box_pack_start (GTK_BOX (hbox),
121 ui_create_button(top, app, BUTTON_LIBRARY_REFRESH),
122 FALSE, FALSE, 0);
123
124 /* spacer */
125 gtk_box_pack_start (GTK_BOX (hbox),
126 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
127 TRUE, TRUE, 0);
128
129 return hbox;
130 }
131
132 static GtkWidget* pane_library(GtkWidget* top, omnplay_instance_t* app)
133 {
134 GtkWidget* vbox;
135
136 vbox = gtk_vbox_new (FALSE, 0);
137 gtk_widget_show (vbox);
138 gtk_widget_set_size_request(vbox, 300, -1);
139
140 /* add buttons box */
141 gtk_box_pack_start (GTK_BOX (vbox),
142 pane_library_buttons(top, app),
143 FALSE, FALSE, 0);
144
145 /* add buttons box */
146 gtk_box_pack_start (GTK_BOX (vbox),
147 pane_library_grid(top, app),
148 TRUE, TRUE, 0);
149
150 return vbox;
151 }
152
153 static GtkWidget* create_channel_status(GtkWidget* top, omnplay_instance_t* app, int idx)
154 {
155 GtkWidget* vbox;
156 GtkWidget* hbox;
157 GtkWidget* frame;
158 omnplay_player_t* player;
159
160 player = &app->players.item[idx];
161
162 frame = gtk_frame_new(player->name);
163 gtk_widget_show(frame);
164
165 vbox = gtk_vbox_new(FALSE, 0);
166 gtk_container_add(GTK_CONTAINER(frame), vbox);
167 gtk_widget_show(vbox);
168
169 /* status label */
170 gtk_box_pack_start(GTK_BOX (vbox),
171 player->label_status = create_label(top, "OFFLINE", NULL, GTK_JUSTIFY_LEFT),
172 FALSE, FALSE, 0);
173
174 /* spacel label */
175 gtk_box_pack_start(GTK_BOX (vbox),
176 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
177 FALSE, FALSE, 0);
178
179 /* clip label */
180 gtk_box_pack_start (GTK_BOX (vbox),
181 player->label_clip = create_label(top, "U0002323", NULL, GTK_JUSTIFY_LEFT),
182 FALSE, FALSE, 0);
183
184 /* block state/current timecode */
185 gtk_box_pack_start(GTK_BOX (vbox),
186 hbox = gtk_hbox_new(TRUE, 0),
187 FALSE, FALSE, 0);
188 gtk_widget_show(hbox);
189
190 {
191 /* clip state */
192 gtk_box_pack_start(GTK_BOX (hbox),
193 player->label_state = create_label(top, "PLAYING", NULL, GTK_JUSTIFY_LEFT),
194 TRUE, TRUE, 0);
195
196 /* current timecode */
197 gtk_box_pack_start(GTK_BOX (hbox),
198 player->label_tc_cur = create_label(top, "00:00:00:00", NULL, GTK_JUSTIFY_LEFT),
199 TRUE, TRUE, 0);
200 };
201
202 /* block remain label/remain timecode */
203 gtk_box_pack_start(GTK_BOX (vbox),
204 hbox = gtk_hbox_new(TRUE, 0),
205 FALSE, FALSE, 0);
206 gtk_widget_show (hbox);
207
208 {
209 /* label */
210 gtk_box_pack_start(GTK_BOX (hbox),
211 create_label(top, "remain:", NULL, GTK_JUSTIFY_LEFT),
212 TRUE, TRUE, 0);
213
214 /* remaining timecode */
215 gtk_box_pack_start(GTK_BOX (hbox),
216 player->label_tc_rem = create_label(top, "00:00:00:00", NULL, GTK_JUSTIFY_LEFT),
217 TRUE, TRUE, 0);
218 };
219
220 return frame;
221 }
222
223 static GtkWidget* pane_operate_status(GtkWidget* top, omnplay_instance_t* app)
224 {
225 int i;
226 GtkWidget* vbox;
227
228 vbox = gtk_vbox_new (FALSE, 0);
229 gtk_widget_show (vbox);
230 gtk_widget_set_size_request(vbox, 250, -1);
231
232 for(i = 0; i < app->players.count; i++)
233 {
234 gtk_box_pack_start (GTK_BOX (vbox),
235 create_channel_status(top, app, i),
236 FALSE, FALSE, 0);
237
238 /* spacer */
239 gtk_box_pack_start (GTK_BOX (vbox),
240 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
241 FALSE, FALSE, 0);
242 }
243
244 /* spacer */
245 gtk_box_pack_start (GTK_BOX (vbox),
246 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
247 TRUE, TRUE, 0);
248
249 return vbox;
250 }
251
252 static GtkWidget* pane_operate_buttons_playlist(GtkWidget* top, omnplay_instance_t* app)
253 {
254 GtkWidget* hbox;
255
256 hbox = gtk_hbox_new (FALSE, 0);
257 gtk_widget_show (hbox);
258
259 /* playlist load/save buttons */
260 gtk_box_pack_start (GTK_BOX (hbox),
261 ui_create_button(top, app, BUTTON_PLAYLIST_LOAD),
262 FALSE, FALSE, 0);
263 gtk_box_pack_start (GTK_BOX (hbox),
264 ui_create_button(top, app, BUTTON_PLAYLIST_SAVE),
265 FALSE, FALSE, 0);
266
267 /* spacer */
268 gtk_box_pack_start (GTK_BOX (hbox),
269 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
270 FALSE, FALSE, 0);
271
272 /* playlist modify buttons */
273 gtk_box_pack_start (GTK_BOX (hbox),
274 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_ADD),
275 FALSE, FALSE, 0);
276 gtk_box_pack_start (GTK_BOX (hbox),
277 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_EDIT),
278 FALSE, FALSE, 0);
279 gtk_box_pack_start (GTK_BOX (hbox),
280 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_DEL),
281 FALSE, FALSE, 0);
282
283 /* spacer */
284 gtk_box_pack_start (GTK_BOX (hbox),
285 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
286 FALSE, FALSE, 0);
287
288 /* playlist block buttons */
289 gtk_box_pack_start (GTK_BOX (hbox),
290 ui_create_button(top, app, BUTTON_PLAYLIST_BLOCK_SINGLE),
291 FALSE, FALSE, 0);
292 gtk_box_pack_start (GTK_BOX (hbox),
293 ui_create_button(top, app, BUTTON_PLAYLIST_BLOCK_LOOP),
294 FALSE, FALSE, 0);
295
296 /* spacer */
297 gtk_box_pack_start (GTK_BOX (hbox),
298 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
299 FALSE, FALSE, 0);
300
301 /* playlist move items buttons */
302 gtk_box_pack_start (GTK_BOX (hbox),
303 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_UP),
304 FALSE, FALSE, 0);
305 gtk_box_pack_start (GTK_BOX (hbox),
306 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_DOWN),
307 FALSE, FALSE, 0);
308
309 return hbox;
310 }
311
312 static GtkWidget* pane_operate_grid(GtkWidget* top, omnplay_instance_t* app)
313 {
314 static const char* columns[] = {"REM", "B", "CH", "ID", "IN", "DUR", "TITLE", NULL};
315 GtkWidget *scrolledwindow;
316
317 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
318 gtk_widget_show (scrolledwindow);
319 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
320 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
321
322 gtk_container_add (GTK_CONTAINER (scrolledwindow),
323 app->playlist_grid = create_treeview(top, "treeview_playlist", columns));
324
325 return scrolledwindow;
326 }
327
328 static GtkWidget* pane_operate_buttons_operate(GtkWidget* top, omnplay_instance_t* app)
329 {
330 GtkWidget* hbox;
331
332 hbox = gtk_hbox_new (FALSE, 0);
333 gtk_widget_show (hbox);
334
335 /* spacer */
336 gtk_box_pack_start (GTK_BOX (hbox),
337 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
338 TRUE, TRUE, 0);
339
340 /* playlist modify buttons */
341 gtk_box_pack_start (GTK_BOX (hbox),
342 ui_create_button(top, app, BUTTON_PLAYER_CUE),
343 FALSE, FALSE, 0);
344 gtk_box_pack_start (GTK_BOX (hbox),
345 ui_create_button(top, app, BUTTON_PLAYER_PLAY),
346 FALSE, FALSE, 0);
347 gtk_box_pack_start (GTK_BOX (hbox),
348 ui_create_button(top, app, BUTTON_PLAYER_PAUSE),
349 FALSE, FALSE, 0);
350 gtk_box_pack_start (GTK_BOX (hbox),
351 ui_create_button(top, app, BUTTON_PLAYER_STOP),
352 FALSE, FALSE, 0);
353
354 /* spacer */
355 gtk_box_pack_start (GTK_BOX (hbox),
356 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
357 TRUE, TRUE, 0);
358
359 return hbox;
360 }
361
362 static GtkWidget* pane_operate_operate(GtkWidget* top, omnplay_instance_t* app)
363 {
364 GtkWidget* vbox;
365
366 vbox = gtk_vbox_new (FALSE, 0);
367 gtk_widget_show (vbox);
368
369 /* add buttons box #1 */
370 gtk_box_pack_start (GTK_BOX (vbox),
371 pane_operate_buttons_playlist(top, app),
372 FALSE, FALSE, 0);
373
374 /* add buttons box */
375 gtk_box_pack_start (GTK_BOX (vbox),
376 pane_operate_grid(top, app),
377 TRUE, TRUE, 0);
378
379 /* add buttons box #1 */
380 gtk_box_pack_start (GTK_BOX (vbox),
381 pane_operate_buttons_operate(top, app),
382 FALSE, FALSE, 0);
383
384 return vbox;
385
386 }
387
388 static GtkWidget* pane_operate(GtkWidget* top, omnplay_instance_t* app)
389 {
390 GtkWidget* hbox;
391
392 hbox = gtk_hbox_new (FALSE, 0);
393 gtk_widget_show (hbox);
394
395 /* add buttons box */
396 gtk_box_pack_start (GTK_BOX (hbox),
397 pane_operate_status(top, app),
398 FALSE, FALSE, 0);
399
400 /* add buttons box */
401 gtk_box_pack_start (GTK_BOX (hbox),
402 pane_operate_operate(top, app),
403 TRUE, TRUE, 0);
404
405 return hbox;
406
407 };
408
409 static GtkWidget* pane_top(GtkWidget* top, omnplay_instance_t* app)
410 {
411 GtkWidget* pane;
412
413 pane = gtk_hpaned_new ();
414 gtk_widget_show (pane);
415
416 gtk_paned_set_position (GTK_PANED (pane), 800);
417
418 gtk_paned_pack1 (GTK_PANED (pane),
419 pane_operate(top, app),
420 TRUE, FALSE);
421
422 gtk_paned_pack2 (GTK_PANED (pane),
423 pane_library(top, app),
424 FALSE, FALSE);
425
426 return pane;
427 }
428
429 GtkWidget* ui_omnplay (omnplay_instance_t* app)
430 {
431 GtkWidget *wnd;
432
433 wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
434 GLADE_HOOKUP_OBJECT_NO_REF (wnd, wnd, "omnplay_window");
435
436 gtk_window_set_title (GTK_WINDOW (wnd), _("Omneon Player"));
437 gtk_window_set_default_size (GTK_WINDOW (wnd), 1024, 768);
438
439 gtk_container_add (GTK_CONTAINER (wnd),
440 pane_top(wnd, app));
441
442 return wnd;
443 }