basic player status UI added
[melted_gui] / 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 GLADE_HOOKUP_OBJECT (top, treeview, name);
87
88 return treeview;
89 };
90
91 static GtkWidget* pane_library_grid(GtkWidget* top, omnplay_instance_t* app)
92 {
93 static const char* columns[] = {"ID", "DUR", "TITLE", NULL};
94 GtkWidget *scrolledwindow;
95
96 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
97 gtk_widget_show (scrolledwindow);
98 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
99 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
100
101 gtk_container_add (GTK_CONTAINER (scrolledwindow),
102 create_treeview(top, "treeview_library", columns));
103
104 return scrolledwindow;
105 }
106
107 static GtkWidget* pane_library_buttons(GtkWidget* top, omnplay_instance_t* app)
108 {
109 GtkWidget* hbox;
110
111 hbox = gtk_hbox_new (FALSE, 0);
112 gtk_widget_show (hbox);
113
114 /* playlist modify buttons */
115 gtk_box_pack_start (GTK_BOX (hbox),
116 ui_create_button(top, app, BUTTON_LIBRARY_ADD),
117 FALSE, FALSE, 0);
118 gtk_box_pack_start (GTK_BOX (hbox),
119 ui_create_button(top, app, BUTTON_LIBRARY_REFRESH),
120 FALSE, FALSE, 0);
121
122 /* spacer */
123 gtk_box_pack_start (GTK_BOX (hbox),
124 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
125 TRUE, TRUE, 0);
126
127 return hbox;
128 }
129
130 static GtkWidget* pane_library(GtkWidget* top, omnplay_instance_t* app)
131 {
132 GtkWidget* vbox;
133
134 vbox = gtk_vbox_new (FALSE, 0);
135 gtk_widget_show (vbox);
136 gtk_widget_set_size_request(vbox, 300, -1);
137
138 /* add buttons box */
139 gtk_box_pack_start (GTK_BOX (vbox),
140 pane_library_buttons(top, app),
141 FALSE, FALSE, 0);
142
143 /* add buttons box */
144 gtk_box_pack_start (GTK_BOX (vbox),
145 pane_library_grid(top, app),
146 TRUE, TRUE, 0);
147
148 return vbox;
149 }
150
151 static GtkWidget* create_channel_status(GtkWidget* top, omnplay_instance_t* app, int idx)
152 {
153 GtkWidget* frame;
154
155 frame = gtk_frame_new (app->players.item[idx].name);
156 // gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
157 gtk_widget_show(frame);
158
159 return frame;
160 }
161
162 static GtkWidget* pane_operate_status(GtkWidget* top, omnplay_instance_t* app)
163 {
164 int i;
165 GtkWidget* vbox;
166
167 vbox = gtk_vbox_new (FALSE, 0);
168 gtk_widget_show (vbox);
169 gtk_widget_set_size_request(vbox, 250, -1);
170
171 for(i = 0; i < app->players.count; i++)
172 {
173 gtk_box_pack_start (GTK_BOX (vbox),
174 create_channel_status(top, app, i),
175 FALSE, FALSE, 0);
176
177 /* spacer */
178 gtk_box_pack_start (GTK_BOX (vbox),
179 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
180 FALSE, FALSE, 0);
181 }
182
183 /* spacer */
184 gtk_box_pack_start (GTK_BOX (vbox),
185 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
186 TRUE, TRUE, 0);
187
188 return vbox;
189 }
190
191 static GtkWidget* pane_operate_buttons_playlist(GtkWidget* top, omnplay_instance_t* app)
192 {
193 GtkWidget* hbox;
194
195 hbox = gtk_hbox_new (FALSE, 0);
196 gtk_widget_show (hbox);
197
198 /* playlist load/save buttons */
199 gtk_box_pack_start (GTK_BOX (hbox),
200 ui_create_button(top, app, BUTTON_PLAYLIST_LOAD),
201 FALSE, FALSE, 0);
202 gtk_box_pack_start (GTK_BOX (hbox),
203 ui_create_button(top, app, BUTTON_PLAYLIST_SAVE),
204 FALSE, FALSE, 0);
205
206 /* spacer */
207 gtk_box_pack_start (GTK_BOX (hbox),
208 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
209 FALSE, FALSE, 0);
210
211 /* playlist modify buttons */
212 gtk_box_pack_start (GTK_BOX (hbox),
213 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_ADD),
214 FALSE, FALSE, 0);
215 gtk_box_pack_start (GTK_BOX (hbox),
216 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_EDIT),
217 FALSE, FALSE, 0);
218 gtk_box_pack_start (GTK_BOX (hbox),
219 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_DEL),
220 FALSE, FALSE, 0);
221
222 /* spacer */
223 gtk_box_pack_start (GTK_BOX (hbox),
224 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
225 FALSE, FALSE, 0);
226
227 /* playlist block buttons */
228 gtk_box_pack_start (GTK_BOX (hbox),
229 ui_create_button(top, app, BUTTON_PLAYLIST_BLOCK_SINGLE),
230 FALSE, FALSE, 0);
231 gtk_box_pack_start (GTK_BOX (hbox),
232 ui_create_button(top, app, BUTTON_PLAYLIST_BLOCK_LOOP),
233 FALSE, FALSE, 0);
234
235 /* spacer */
236 gtk_box_pack_start (GTK_BOX (hbox),
237 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
238 FALSE, FALSE, 0);
239
240 /* playlist move items buttons */
241 gtk_box_pack_start (GTK_BOX (hbox),
242 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_UP),
243 FALSE, FALSE, 0);
244 gtk_box_pack_start (GTK_BOX (hbox),
245 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_DOWN),
246 FALSE, FALSE, 0);
247
248 return hbox;
249 }
250
251 static GtkWidget* pane_operate_grid(GtkWidget* top, omnplay_instance_t* app)
252 {
253 static const char* columns[] = {"REM", "B", "CH", "ID", "IN", "DUR", "TITLE", NULL};
254 GtkWidget *scrolledwindow;
255
256 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
257 gtk_widget_show (scrolledwindow);
258 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
259 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
260
261 gtk_container_add (GTK_CONTAINER (scrolledwindow),
262 create_treeview(top, "treeview_playlist", columns));
263
264 return scrolledwindow;
265 }
266
267 static GtkWidget* pane_operate_buttons_operate(GtkWidget* top, omnplay_instance_t* app)
268 {
269 GtkWidget* hbox;
270
271 hbox = gtk_hbox_new (FALSE, 0);
272 gtk_widget_show (hbox);
273
274 /* spacer */
275 gtk_box_pack_start (GTK_BOX (hbox),
276 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
277 TRUE, TRUE, 0);
278
279 /* playlist modify buttons */
280 gtk_box_pack_start (GTK_BOX (hbox),
281 ui_create_button(top, app, BUTTON_PLAYER_CUE),
282 FALSE, FALSE, 0);
283 gtk_box_pack_start (GTK_BOX (hbox),
284 ui_create_button(top, app, BUTTON_PLAYER_PLAY),
285 FALSE, FALSE, 0);
286 gtk_box_pack_start (GTK_BOX (hbox),
287 ui_create_button(top, app, BUTTON_PLAYER_PAUSE),
288 FALSE, FALSE, 0);
289 gtk_box_pack_start (GTK_BOX (hbox),
290 ui_create_button(top, app, BUTTON_PLAYER_STOP),
291 FALSE, FALSE, 0);
292
293 /* spacer */
294 gtk_box_pack_start (GTK_BOX (hbox),
295 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
296 TRUE, TRUE, 0);
297
298 return hbox;
299 }
300
301 static GtkWidget* pane_operate_operate(GtkWidget* top, omnplay_instance_t* app)
302 {
303 GtkWidget* vbox;
304
305 vbox = gtk_vbox_new (FALSE, 0);
306 gtk_widget_show (vbox);
307
308 /* add buttons box #1 */
309 gtk_box_pack_start (GTK_BOX (vbox),
310 pane_operate_buttons_playlist(top, app),
311 FALSE, FALSE, 0);
312
313 /* add buttons box */
314 gtk_box_pack_start (GTK_BOX (vbox),
315 pane_operate_grid(top, app),
316 TRUE, TRUE, 0);
317
318 /* add buttons box #1 */
319 gtk_box_pack_start (GTK_BOX (vbox),
320 pane_operate_buttons_operate(top, app),
321 FALSE, FALSE, 0);
322
323 return vbox;
324
325 }
326
327 static GtkWidget* pane_operate(GtkWidget* top, omnplay_instance_t* app)
328 {
329 GtkWidget* hbox;
330
331 hbox = gtk_hbox_new (FALSE, 0);
332 gtk_widget_show (hbox);
333
334 /* add buttons box */
335 gtk_box_pack_start (GTK_BOX (hbox),
336 pane_operate_status(top, app),
337 FALSE, FALSE, 0);
338
339 /* add buttons box */
340 gtk_box_pack_start (GTK_BOX (hbox),
341 pane_operate_operate(top, app),
342 TRUE, TRUE, 0);
343
344 return hbox;
345
346 };
347
348 static GtkWidget* pane_top(GtkWidget* top, omnplay_instance_t* app)
349 {
350 GtkWidget* pane;
351
352 pane = gtk_hpaned_new ();
353 gtk_widget_show (pane);
354
355 gtk_paned_set_position (GTK_PANED (pane), 800);
356
357 gtk_paned_pack1 (GTK_PANED (pane),
358 pane_operate(top, app),
359 TRUE, FALSE);
360
361 gtk_paned_pack2 (GTK_PANED (pane),
362 pane_library(top, app),
363 FALSE, FALSE);
364
365 return pane;
366 }
367
368 GtkWidget* ui_omnplay (omnplay_instance_t* app)
369 {
370 GtkWidget *wnd;
371
372 wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
373 GLADE_HOOKUP_OBJECT_NO_REF (wnd, wnd, "omnplay_window");
374
375 gtk_window_set_title (GTK_WINDOW (wnd), _("Omneon Player"));
376 gtk_window_set_default_size (GTK_WINDOW (wnd), 1024, 768);
377
378 gtk_container_add (GTK_CONTAINER (wnd),
379 pane_top(wnd, app));
380
381 return wnd;
382 }