basic UI 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 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* pane_operate_status(GtkWidget* top, omnplay_instance_t* app)
152 {
153 GtkWidget* frame;
154
155 frame = gtk_frame_new ("STATUS");
156 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
157 gtk_widget_show(frame);
158
159 gtk_container_add(GTK_CONTAINER(frame),
160 create_label(top, "status here", NULL, GTK_JUSTIFY_CENTER));
161
162 return frame;
163 }
164
165 static GtkWidget* pane_operate_buttons_playlist(GtkWidget* top, omnplay_instance_t* app)
166 {
167 GtkWidget* hbox;
168
169 hbox = gtk_hbox_new (FALSE, 0);
170 gtk_widget_show (hbox);
171
172 /* playlist load/save buttons */
173 gtk_box_pack_start (GTK_BOX (hbox),
174 ui_create_button(top, app, BUTTON_PLAYLIST_LOAD),
175 FALSE, FALSE, 0);
176 gtk_box_pack_start (GTK_BOX (hbox),
177 ui_create_button(top, app, BUTTON_PLAYLIST_SAVE),
178 FALSE, FALSE, 0);
179
180 /* spacer */
181 gtk_box_pack_start (GTK_BOX (hbox),
182 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
183 FALSE, FALSE, 0);
184
185 /* playlist modify buttons */
186 gtk_box_pack_start (GTK_BOX (hbox),
187 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_ADD),
188 FALSE, FALSE, 0);
189 gtk_box_pack_start (GTK_BOX (hbox),
190 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_EDIT),
191 FALSE, FALSE, 0);
192 gtk_box_pack_start (GTK_BOX (hbox),
193 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_DEL),
194 FALSE, FALSE, 0);
195
196 /* spacer */
197 gtk_box_pack_start (GTK_BOX (hbox),
198 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
199 FALSE, FALSE, 0);
200
201 /* playlist block buttons */
202 gtk_box_pack_start (GTK_BOX (hbox),
203 ui_create_button(top, app, BUTTON_PLAYLIST_BLOCK_SINGLE),
204 FALSE, FALSE, 0);
205 gtk_box_pack_start (GTK_BOX (hbox),
206 ui_create_button(top, app, BUTTON_PLAYLIST_BLOCK_LOOP),
207 FALSE, FALSE, 0);
208
209 /* spacer */
210 gtk_box_pack_start (GTK_BOX (hbox),
211 create_label(top, " ", NULL, GTK_JUSTIFY_CENTER),
212 FALSE, FALSE, 0);
213
214 /* playlist move items buttons */
215 gtk_box_pack_start (GTK_BOX (hbox),
216 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_UP),
217 FALSE, FALSE, 0);
218 gtk_box_pack_start (GTK_BOX (hbox),
219 ui_create_button(top, app, BUTTON_PLAYLIST_ITEM_DOWN),
220 FALSE, FALSE, 0);
221
222 return hbox;
223 }
224
225 static GtkWidget* pane_operate_grid(GtkWidget* top, omnplay_instance_t* app)
226 {
227 static const char* columns[] = {"REM", "B", "CH", "ID", "IN", "DUR", "TITLE", NULL};
228 GtkWidget *scrolledwindow;
229
230 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
231 gtk_widget_show (scrolledwindow);
232 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow),
233 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
234
235 gtk_container_add (GTK_CONTAINER (scrolledwindow),
236 create_treeview(top, "treeview_playlist", columns));
237
238 return scrolledwindow;
239 }
240
241 static GtkWidget* pane_operate_buttons_operate(GtkWidget* top, omnplay_instance_t* app)
242 {
243 GtkWidget* hbox;
244
245 hbox = gtk_hbox_new (FALSE, 0);
246 gtk_widget_show (hbox);
247
248 /* spacer */
249 gtk_box_pack_start (GTK_BOX (hbox),
250 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
251 TRUE, TRUE, 0);
252
253 /* playlist modify buttons */
254 gtk_box_pack_start (GTK_BOX (hbox),
255 ui_create_button(top, app, BUTTON_PLAYER_CUE),
256 FALSE, FALSE, 0);
257 gtk_box_pack_start (GTK_BOX (hbox),
258 ui_create_button(top, app, BUTTON_PLAYER_PLAY),
259 FALSE, FALSE, 0);
260 gtk_box_pack_start (GTK_BOX (hbox),
261 ui_create_button(top, app, BUTTON_PLAYER_PAUSE),
262 FALSE, FALSE, 0);
263 gtk_box_pack_start (GTK_BOX (hbox),
264 ui_create_button(top, app, BUTTON_PLAYER_STOP),
265 FALSE, FALSE, 0);
266
267 /* spacer */
268 gtk_box_pack_start (GTK_BOX (hbox),
269 create_label(top, NULL, NULL, GTK_JUSTIFY_CENTER),
270 TRUE, TRUE, 0);
271
272 return hbox;
273 }
274
275 static GtkWidget* pane_operate_operate(GtkWidget* top, omnplay_instance_t* app)
276 {
277 GtkWidget* vbox;
278
279 vbox = gtk_vbox_new (FALSE, 0);
280 gtk_widget_show (vbox);
281
282 /* add buttons box #1 */
283 gtk_box_pack_start (GTK_BOX (vbox),
284 pane_operate_buttons_playlist(top, app),
285 FALSE, FALSE, 0);
286
287 /* add buttons box */
288 gtk_box_pack_start (GTK_BOX (vbox),
289 pane_operate_grid(top, app),
290 TRUE, TRUE, 0);
291
292 /* add buttons box #1 */
293 gtk_box_pack_start (GTK_BOX (vbox),
294 pane_operate_buttons_operate(top, app),
295 FALSE, FALSE, 0);
296
297 return vbox;
298
299 }
300
301 static GtkWidget* pane_operate(GtkWidget* top, omnplay_instance_t* app)
302 {
303 GtkWidget* hbox;
304
305 hbox = gtk_hbox_new (FALSE, 0);
306 gtk_widget_show (hbox);
307
308 /* add buttons box */
309 gtk_box_pack_start (GTK_BOX (hbox),
310 pane_operate_status(top, app),
311 FALSE, FALSE, 0);
312
313 /* add buttons box */
314 gtk_box_pack_start (GTK_BOX (hbox),
315 pane_operate_operate(top, app),
316 TRUE, TRUE, 0);
317
318 return hbox;
319
320 };
321
322 static GtkWidget* pane_top(GtkWidget* top, omnplay_instance_t* app)
323 {
324 GtkWidget* pane;
325
326 pane = gtk_hpaned_new ();
327 gtk_widget_show (pane);
328
329 gtk_paned_set_position (GTK_PANED (pane), 800);
330
331 gtk_paned_pack1 (GTK_PANED (pane),
332 pane_operate(top, app),
333 TRUE, FALSE);
334
335 gtk_paned_pack2 (GTK_PANED (pane),
336 pane_library(top, app),
337 FALSE, FALSE);
338
339 return pane;
340 }
341
342 GtkWidget* ui_omnplay (omnplay_instance_t* app)
343 {
344 GtkWidget *wnd;
345
346 wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
347 GLADE_HOOKUP_OBJECT_NO_REF (wnd, wnd, "omnplay_window");
348
349 gtk_window_set_title (GTK_WINDOW (wnd), _("Omneon Player"));
350 gtk_window_set_default_size (GTK_WINDOW (wnd), 1024, 768);
351
352 gtk_container_add (GTK_CONTAINER (wnd),
353 pane_top(wnd, app));
354
355 return wnd;
356 }