Mercurial > audlegacy-plugins
comparison src/streambrowser/gui/streambrowser_win.c @ 2848:fbb32674bfd2
click on a stream updates; more comments; more proper stream icons
| author | Calin Crisan ccrisan@gmail.com |
|---|---|
| date | Mon, 28 Jul 2008 23:43:31 +0300 |
| parents | e883536cefe0 |
| children | 587b3657990d |
comparison
equal
deleted
inserted
replaced
| 2845:d0cbf303869b | 2848:fbb32674bfd2 |
|---|---|
| 17 GtkWidget* tree_view; | 17 GtkWidget* tree_view; |
| 18 | 18 |
| 19 } streamdir_gui_t; | 19 } streamdir_gui_t; |
| 20 | 20 |
| 21 | 21 |
| 22 void (* update_function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo); | 22 void (* update_function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo, gboolean add_to_playlist); |
| 23 | 23 |
| 24 static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text); | 24 static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text); |
| 25 static GtkWidget* gtk_streamdir_tree_view_new(); | 25 static GtkWidget* gtk_streamdir_tree_view_new(); |
| 26 static GtkWidget* gtk_streamdir_table_new(GtkWidget *tree_view); | 26 static GtkWidget* gtk_streamdir_table_new(GtkWidget *tree_view); |
| 27 | 27 |
| 31 static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); | 31 static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); |
| 32 static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); | 32 static gboolean on_tree_view_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); |
| 33 static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data); | 33 static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data); |
| 34 | 34 |
| 35 static streamdir_gui_t* find_streamdir_gui_by_name(gchar *name); | 35 static streamdir_gui_t* find_streamdir_gui_by_name(gchar *name); |
| 36 static streamdir_gui_t* find_streamdir_gui_by_tree_view(GtkTreeView *tree_view); | 36 //static streamdir_gui_t* find_streamdir_gui_by_tree_view(GtkTreeView *tree_view); todo: remove this |
| 37 static streamdir_gui_t* find_streamdir_gui_by_table(GtkTable *table); | 37 static streamdir_gui_t* find_streamdir_gui_by_table(GtkTable *table); |
| 38 static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir); | 38 static streamdir_gui_t* find_streamdir_gui_by_streamdir(streamdir_t *streamdir); |
| 39 static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data); | 39 static gboolean tree_view_search_equal_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer data); |
| 40 | 40 |
| 41 static GtkWidget* notebook; | 41 static GtkWidget* notebook; |
| 43 static GtkWidget* add_button; | 43 static GtkWidget* add_button; |
| 44 static GtkWidget* streambrowser_window; | 44 static GtkWidget* streambrowser_window; |
| 45 static GList* streamdir_gui_list; | 45 static GList* streamdir_gui_list; |
| 46 static GtkCellRenderer* cell_renderer_pixbuf; | 46 static GtkCellRenderer* cell_renderer_pixbuf; |
| 47 static GtkCellRenderer* cell_renderer_text; | 47 static GtkCellRenderer* cell_renderer_text; |
| 48 | |
| 49 static gboolean tree_view_button_pressed = FALSE; | |
| 50 | |
| 48 | 51 |
| 49 | 52 |
| 50 void streambrowser_win_init() | 53 void streambrowser_win_init() |
| 51 { | 54 { |
| 52 /* notebook */ | 55 /* notebook */ |
| 184 streaminfo_t *streaminfo; | 187 streaminfo_t *streaminfo; |
| 185 for (i = 0; i < count; i++) { | 188 for (i = 0; i < count; i++) { |
| 186 streaminfo = streaminfo_get_by_index(category, i); | 189 streaminfo = streaminfo_get_by_index(category, i); |
| 187 | 190 |
| 188 gtk_tree_store_append(store, &new_iter, &iter); | 191 gtk_tree_store_append(store, &new_iter, &iter); |
| 189 gtk_tree_store_set(store, &new_iter, 0, "gtk-directory", 1, streaminfo->name, 2, streaminfo->current_track, -1); | 192 gtk_tree_store_set(store, &new_iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, -1); |
| 190 } | 193 } |
| 191 | 194 |
| 192 gtk_tree_path_free(path); | 195 gtk_tree_path_free(path); |
| 193 } | 196 } |
| 194 | 197 |
| 195 void streambrowser_win_set_update_function(void (*function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo)) | 198 void streambrowser_win_set_streaminfo(streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo) |
| 199 { | |
| 200 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_name(streamdir->name); | |
| 201 if (streamdir_gui == NULL) { | |
| 202 failure("gui: streambrowser_win_set_category() called with non-existent streamdir\n"); | |
| 203 return; | |
| 204 } | |
| 205 | |
| 206 GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); | |
| 207 GtkTreeStore *store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view))); | |
| 208 GtkTreePath *path; | |
| 209 GtkTreeIter iter, new_iter; | |
| 210 | |
| 211 /* find the corresponding streaminfo tree iter */ | |
| 212 path = gtk_tree_path_new_from_indices(category_get_index(streamdir, category), streaminfo_get_index(category, streaminfo), -1); | |
| 213 if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) | |
| 214 return; | |
| 215 | |
| 216 /* update the streaminfo*/ | |
| 217 gtk_tree_store_set(store, &new_iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, -1); | |
| 218 | |
| 219 gtk_tree_path_free(path); | |
| 220 } | |
| 221 | |
| 222 void streambrowser_win_set_update_function(void (*function) (streamdir_t *streamdir, category_t *category, streaminfo_t *streaminfo, gboolean add_to_playlist)) | |
| 196 { | 223 { |
| 197 update_function = function; | 224 update_function = function; |
| 198 } | 225 } |
| 199 | 226 |
| 200 void streambrowser_win_set_category_state(streamdir_t *streamdir, category_t *category, gboolean fetching) | 227 void streambrowser_win_set_category_state(streamdir_t *streamdir, category_t *category, gboolean fetching) |
| 238 sprintf(temp, "<span style='italic' weight='heavy'>%s</span>", streaminfo->name); | 265 sprintf(temp, "<span style='italic' weight='heavy'>%s</span>", streaminfo->name); |
| 239 | 266 |
| 240 gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, streaminfo->current_track, -1); | 267 gtk_tree_store_set(store, &iter, 0, "gtk-refresh", 1, temp, 2, streaminfo->current_track, -1); |
| 241 } | 268 } |
| 242 else { | 269 else { |
| 243 gtk_tree_store_set(store, &iter, 0, "gtk-directory", 1, streaminfo->name, 2, streaminfo->current_track, -1); | 270 gtk_tree_store_set(store, &iter, 0, "gtk-media-play", 1, streaminfo->name, 2, streaminfo->current_track, -1); |
| 244 } | 271 } |
| 245 } | 272 } |
| 246 | 273 |
| 247 static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text) | 274 static GtkWidget* gtk_label_new_with_icon(gchar *icon_filename, gchar *label_text) |
| 248 { | 275 { |
| 328 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); | 355 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); |
| 329 | 356 |
| 330 return TRUE; | 357 return TRUE; |
| 331 } | 358 } |
| 332 | 359 |
| 360 | |
| 333 static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data) | 361 static gboolean on_tree_view_cursor_changed(GtkTreeView *tree_view, gpointer data) |
| 334 { | 362 { |
| 363 /* only do the refresh if this cursor change occured due to a mouse click */ | |
| 364 if (!tree_view_button_pressed) | |
| 365 return FALSE; | |
| 366 | |
| 367 tree_view_button_pressed = FALSE; | |
| 368 | |
| 335 GtkTreePath *path; | 369 GtkTreePath *path; |
| 336 GtkTreeIter iter; | 370 GtkTreeViewColumn *focus_column; |
| 337 GtkTreeModel *model; | 371 |
| 338 | 372 /* get the currently selected tree view */ |
| 339 /* obtain the current category */ | 373 GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); |
| 340 gtk_tree_view_get_cursor(tree_view, &path, NULL); | 374 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); |
| 341 | 375 if (streamdir_gui == NULL) |
| 342 if (path == NULL) | 376 return FALSE; |
| 343 return TRUE; | 377 |
| 344 | 378 /* get the currently selected path in the tree */ |
| 379 gtk_tree_view_get_cursor(tree_view, &path, &focus_column); | |
| 380 | |
| 381 if (path == NULL || gtk_tree_path_get_depth(path) == 0) | |
| 382 return FALSE; | |
| 383 | |
| 345 gint *indices = gtk_tree_path_get_indices(path); | 384 gint *indices = gtk_tree_path_get_indices(path); |
| 346 if (gtk_tree_path_get_depth(path) != 1) { | 385 int category_index = indices[0]; |
| 386 streamdir_t *streamdir = streamdir_gui->streamdir; | |
| 387 category_t *category = category_get_by_index(streamdir_gui->streamdir, category_index); | |
| 388 | |
| 389 /* if the selected item is a category */ | |
| 390 if (gtk_tree_path_get_depth(path) == 1) { | |
| 391 if (!gtk_tree_view_row_expanded(tree_view, path)) { | |
| 392 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); | |
| 393 update_function(streamdir, category, NULL, FALSE); | |
| 394 } | |
| 395 | |
| 347 gtk_tree_path_free(path); | 396 gtk_tree_path_free(path); |
| 348 return TRUE; | 397 } |
| 349 } | 398 /* if the selected item is a streaminfo */ |
| 350 | 399 else { |
| 351 model = gtk_tree_view_get_model(tree_view); | 400 int streaminfo_index = indices[1]; |
| 352 gtk_tree_model_get_iter(model, &iter, path); | 401 |
| 353 | |
| 354 /* don't fetch a category that has been already fetched */ | |
| 355 if (gtk_tree_model_iter_has_child(model, &iter)) { | |
| 356 gtk_tree_path_free(path); | 402 gtk_tree_path_free(path); |
| 357 return TRUE; | 403 |
| 358 } | 404 /* get the currently selected stream (info) */ |
| 359 | 405 streaminfo_t *streaminfo = streaminfo_get_by_index(category, streaminfo_index); |
| 360 int category_index = indices[0]; | 406 |
| 361 | 407 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); |
| 362 gtk_tree_path_free(path); | 408 update_function(streamdir, category, streaminfo, FALSE); |
| 363 | 409 } |
| 364 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_tree_view(tree_view); | 410 |
| 365 if (streamdir_gui == NULL) | 411 return FALSE; |
| 366 return TRUE; | |
| 367 | |
| 368 /* issue an update on the current category */ | |
| 369 update_function(streamdir_gui->streamdir, category_get_by_index(streamdir_gui->streamdir, category_index), NULL); | |
| 370 | |
| 371 return TRUE; | |
| 372 } | 412 } |
| 373 | 413 |
| 374 static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data) | 414 static gboolean on_tree_view_button_pressed(GtkWidget *widget, GdkEventButton *event, gpointer data) |
| 375 { | 415 { |
| 376 /* double click adds the currently selected stream to the playlist */ | 416 /* double click adds the currently selected stream to the playlist */ |
| 377 if (event->type == GDK_2BUTTON_PRESS) { | 417 if (event->type == GDK_2BUTTON_PRESS) { |
| 418 tree_view_button_pressed = FALSE; | |
| 378 on_add_button_clicked(NULL, NULL); | 419 on_add_button_clicked(NULL, NULL); |
| 379 } | 420 } |
| 421 /* single click triggers a refresh of the selected item */ | |
| 422 else { | |
| 423 tree_view_button_pressed = TRUE; | |
| 424 } | |
| 425 | |
| 380 | 426 |
| 381 return FALSE; | 427 return FALSE; |
| 382 } | 428 } |
| 383 | 429 |
| 384 static gboolean on_add_button_clicked(GtkButton *button, gpointer data) | 430 static gboolean on_add_button_clicked(GtkButton *button, gpointer data) |
| 385 { | 431 { |
| 386 GtkTreePath *path; | 432 GtkTreePath *path; |
| 387 GtkTreeViewColumn *focus_column; | 433 GtkTreeViewColumn *focus_column; |
| 388 | 434 |
| 435 /* get the currently selected tree view */ | |
| 389 GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); | 436 GtkWidget *table = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); |
| 390 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); | 437 streamdir_gui_t *streamdir_gui = find_streamdir_gui_by_table(GTK_TABLE(table)); |
| 391 if (streamdir_gui == NULL) | 438 if (streamdir_gui == NULL) |
| 392 return TRUE; | 439 return TRUE; |
| 393 | 440 |
| 394 GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); | 441 GtkTreeView *tree_view = GTK_TREE_VIEW(streamdir_gui->tree_view); |
| 395 | 442 |
| 443 /* get the currently selected path in the tree */ | |
| 396 gtk_tree_view_get_cursor(tree_view, &path, &focus_column); | 444 gtk_tree_view_get_cursor(tree_view, &path, &focus_column); |
| 397 | 445 |
| 398 if (path == NULL) | 446 if (path == NULL) |
| 399 return TRUE; | 447 return TRUE; |
| 400 | 448 |
| 412 int category_index = indices[0]; | 460 int category_index = indices[0]; |
| 413 int streaminfo_index = indices[1]; | 461 int streaminfo_index = indices[1]; |
| 414 | 462 |
| 415 gtk_tree_path_free(path); | 463 gtk_tree_path_free(path); |
| 416 | 464 |
| 465 /* get the currently selected stream (info) */ | |
| 417 streamdir_t *streamdir = streamdir_gui->streamdir; | 466 streamdir_t *streamdir = streamdir_gui->streamdir; |
| 418 category_t *category = category_get_by_index(streamdir_gui->streamdir, category_index); | 467 category_t *category = category_get_by_index(streamdir_gui->streamdir, category_index); |
| 419 streaminfo_t *streaminfo = streaminfo_get_by_index(category, streaminfo_index); | 468 streaminfo_t *streaminfo = streaminfo_get_by_index(category, streaminfo_index); |
| 420 | 469 |
| 421 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); | 470 gtk_entry_set_text(GTK_ENTRY(search_entry), ""); |
| 422 update_function(streamdir, category, streaminfo); | 471 update_function(streamdir, category, streaminfo, TRUE); |
| 423 | 472 |
| 424 return TRUE; | 473 return TRUE; |
| 425 } | 474 } |
| 426 | 475 |
| 427 static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) | 476 static gboolean on_search_entry_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) |
| 468 } | 517 } |
| 469 | 518 |
| 470 return NULL; | 519 return NULL; |
| 471 } | 520 } |
| 472 | 521 |
| 522 /* todo: remove this | |
| 473 static streamdir_gui_t *find_streamdir_gui_by_tree_view(GtkTreeView *tree_view) | 523 static streamdir_gui_t *find_streamdir_gui_by_tree_view(GtkTreeView *tree_view) |
| 474 { | 524 { |
| 475 GList *iterator; | 525 GList *iterator; |
| 476 streamdir_gui_t *streamdir_gui; | 526 streamdir_gui_t *streamdir_gui; |
| 477 | 527 |
| 482 return streamdir_gui; | 532 return streamdir_gui; |
| 483 } | 533 } |
| 484 | 534 |
| 485 return NULL; | 535 return NULL; |
| 486 } | 536 } |
| 537 */ | |
| 487 | 538 |
| 488 static streamdir_gui_t *find_streamdir_gui_by_table(GtkTable *table) | 539 static streamdir_gui_t *find_streamdir_gui_by_table(GtkTable *table) |
| 489 { | 540 { |
| 490 GList *iterator; | 541 GList *iterator; |
| 491 streamdir_gui_t *streamdir_gui; | 542 streamdir_gui_t *streamdir_gui; |
