static void add_header(prop_courier_t *pc, GtkWidget *parent, prop_t *root) { GtkWidget *hbox, *w; prop_sub_t *s; hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(parent), hbox, FALSE, TRUE, 0); /* Artist name */ w = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(w), 0, 0); gtk_label_set_ellipsize(GTK_LABEL(w), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(hbox), w, TRUE, TRUE, 0); s = prop_subscribe(0, PROP_TAG_NAME("self", "model", "artist_name"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label_xl, w, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, root, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), s); }
gu_tab_t * gu_tab_create(gu_window_t *gw, int select, prop_t *nav) { gu_tab_t *gt = calloc(1, sizeof(gu_tab_t)); prop_sub_t *s; int idx; gt->gt_gw = gw; LIST_INSERT_HEAD(&gw->gw_tabs, gt, gt_link); gw->gw_current_tab = gt; gw->gw_ntabs++; gt->gt_nav = nav ?: nav_spawn(); if(prop_set_parent(gt->gt_nav, prop_get_global())) abort(); gt->gt_vbox = gtk_vbox_new(FALSE, 1); gtk_widget_show(gt->gt_vbox); gt->gt_notebook = gtk_notebook_new(); gtk_widget_show(gt->gt_notebook); gtk_notebook_set_show_border(GTK_NOTEBOOK(gt->gt_notebook), 0); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gt->gt_notebook), 0); gu_toolbar_add(gt, gt->gt_vbox); gtk_container_add(GTK_CONTAINER(gt->gt_vbox), gt->gt_notebook); build_tab_header(gt); s = prop_subscribe(0, PROP_TAG_NAME("nav", "pages"), PROP_TAG_CALLBACK, gu_nav_pages, gt, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, gt->gt_nav, "nav", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(gt->gt_notebook), s); // Add to tab's notebook idx = gtk_notebook_append_page(GTK_NOTEBOOK(gw->gw_notebook), gt->gt_vbox, gt->gt_label); gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(gw->gw_notebook), gt->gt_vbox, 1); if(select) gtk_notebook_set_current_page(GTK_NOTEBOOK(gw->gw_notebook), idx); if(gw->gw_ntabs > 1) gtk_notebook_set_show_tabs(GTK_NOTEBOOK(gw->gw_notebook), 1); return gt; }
static void gu_openerror_create(gu_nav_page_t *gnp) { prop_sub_t *s; GtkWidget *l; gnp->gnp_pageroot = gtk_vbox_new(FALSE, 3); gtk_container_add(GTK_CONTAINER(gnp->gnp_pagebin), gnp->gnp_pageroot); l = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(l), "<span size=\"x-large\">Unable to open page</span>"); gtk_box_pack_start(GTK_BOX(gnp->gnp_pageroot), l, FALSE, FALSE, 0); gtk_label_set_ellipsize(GTK_LABEL(l), PANGO_ELLIPSIZE_END); l = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(gnp->gnp_pageroot), l, FALSE, FALSE, 0); gtk_label_set_ellipsize(GTK_LABEL(l), PANGO_ELLIPSIZE_END); s = prop_subscribe(PROP_SUB_DIRECT_UPDATE, PROP_TAG_NAME("self", "url"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, l, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, gnp->gnp_prop, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(l), s); l = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(gnp->gnp_pageroot), l, FALSE, FALSE, 0); gtk_label_set_ellipsize(GTK_LABEL(l), PANGO_ELLIPSIZE_END); s = prop_subscribe(PROP_SUB_DIRECT_UPDATE, PROP_TAG_NAME("self", "model", "error"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, l, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, gnp->gnp_prop, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(l), s); gtk_widget_show_all(gnp->gnp_pageroot); }
static void build_tab_header(gu_tab_t *gt) { prop_courier_t *pc = gt->gt_gw->gw_gu->gu_pc; GtkWidget *l, *img; prop_sub_t *s; // Tab header gt->gt_label = gtk_hbox_new(FALSE, 0); gtk_widget_set_size_request(gt->gt_label, 150, -1); img = gtk_image_new(); gtk_box_pack_start(GTK_BOX(gt->gt_label), img, FALSE, TRUE, 0); s = prop_subscribe(PROP_SUB_DIRECT_UPDATE, PROP_TAG_NAME("nav", "currentpage", "model", "type"), PROP_TAG_CALLBACK_STRING, gu_set_icon_by_type, img, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, gt->gt_nav, "nav", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(img), s); l = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(gt->gt_label), l, TRUE, TRUE, 0); gtk_label_set_ellipsize(GTK_LABEL(l), PANGO_ELLIPSIZE_END); gtk_misc_set_alignment(GTK_MISC(l), 0, 0.5); gtk_misc_set_padding(GTK_MISC(l), 5, 0); s = prop_subscribe(PROP_SUB_DIRECT_UPDATE, PROP_TAG_NAME("nav", "currentpage", "model", "metadata", "title"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, l, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, gt->gt_nav, "nav", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(l), s); gtk_widget_show_all(gt->gt_label); }
static void popup_create_auth(gtk_ui_t *gu, prop_t *p) { GtkWidget *vbox, *hbox; GtkWidget *win; GtkWidget *l, *e, *w; prop_sub_t *s; popup_t *pop = calloc(1, sizeof(popup_t)); pop->p = prop_ref_inc(p); LIST_INSERT_HEAD(&gu->popups, pop, link); /* The window */ pop->win = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win), "Authentication request"); gtk_window_set_default_size(GTK_WINDOW(win), 400, 180); gtk_window_set_resizable(GTK_WINDOW(win), FALSE); gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER_ON_PARENT); // gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(gu->gu_window)); /* Vbox */ vbox = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(vbox), 1); gtk_container_add(GTK_CONTAINER(win), vbox); /* ID label */ l = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(vbox), l, FALSE, TRUE, 0); s = prop_subscribe(0, PROP_TAG_NAME("self", "id"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, l, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(l), s); /* Reason label */ l = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(vbox), l, FALSE, TRUE, 0); s = prop_subscribe(0, PROP_TAG_NAME("self", "reason"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, l, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(l), s); /* Username */ hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); l = gtk_label_new("Username:"******"activate", G_CALLBACK(auth_ok), pop); /* Password */ hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); l = gtk_label_new("Password:"******"activate", G_CALLBACK(auth_ok), pop); /* Separator */ w = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), w, FALSE, TRUE, 0); /* Action buttons */ hbox = gtk_hbutton_box_new(); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); w = gtk_button_new_from_stock(GTK_STOCK_OK); gtk_container_add(GTK_CONTAINER(hbox), w); g_signal_connect(G_OBJECT(w), "clicked", G_CALLBACK(auth_ok), pop); w = gtk_button_new_from_stock(GTK_STOCK_CANCEL); gtk_container_add(GTK_CONTAINER(hbox), w); g_signal_connect(G_OBJECT(w), "clicked", G_CALLBACK(auth_cancel), pop); gtk_widget_show_all(win); }
static void collection_albums(void *opaque, prop_event_t event, ...) { albumbrowse_t *ab = opaque; prop_t *p; GtkWidget *w; GtkWidget *hbox; prop_sub_t *s; va_list ap; va_start(ap, event); switch(event) { case PROP_ADD_CHILD: p = va_arg(ap, prop_t *); /* Separator */ if(ab->albums > 0) { w = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(ab->vbox), w, FALSE, FALSE, 5); gtk_widget_show(w); } ab->albums++; /* Album name */ w = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(w), 0, 0); gtk_misc_set_padding(GTK_MISC(w), 5, 0); gtk_label_set_ellipsize(GTK_LABEL(w), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(ab->vbox), w, TRUE, TRUE, 0); gtk_widget_show(w); s = prop_subscribe(0, PROP_TAG_NAME("self", "metadata", "album_name"), PROP_TAG_CALLBACK_STRING, set_title, w, PROP_TAG_COURIER, ab->gt->gt_gw->gw_gu->gu_pc, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), s); /* hbox */ hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(ab->vbox), hbox, TRUE, TRUE, 0); /* Album art */ w = gtk_image_new(); gtk_misc_set_alignment(GTK_MISC(w), 0.5, 0.0); gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, TRUE, 5); s = prop_subscribe(0, PROP_TAG_NAME("self", "metadata", "album_art"), PROP_TAG_CALLBACK_STRING, album_set_art, w, PROP_TAG_COURIER, ab->gt->gt_gw->gw_gu->gu_pc, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), s); gtk_widget_show(w); /* Tracklist */ w = gu_directory_list_create(ab->gt, p, GU_DIR_COL_ARTIST | GU_DIR_COL_DURATION | GU_DIR_COL_TRACKINDEX); gtk_box_pack_start(GTK_BOX(hbox), w, TRUE, TRUE, 0); gtk_widget_show_all(hbox); break; case PROP_SET_DIR: case PROP_SET_VOID: break; default: fprintf(stderr, "artist_albums(): Can not handle event %d, aborting()\n", event); abort(); } }
static void source_add(gtk_ui_t *gu, settinglist_t *sl, prop_t *p, setting_t *s, setting_t *before, int position) { prop_sub_t *sub; GtkWidget *w, *vbox; prop_courier_t *pc = gu->gu_pc; s->s_settinglist = sl; s->s_hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(sl->sl_box), s->s_hbox, FALSE, TRUE, 5); gtk_box_reorder_child(GTK_BOX(sl->sl_box), s->s_hbox, position * 2); s->s_separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(sl->sl_box), s->s_separator, FALSE, TRUE, 0); gtk_box_reorder_child(GTK_BOX(sl->sl_box), s->s_separator, position * 2 + 1); gtk_widget_show(s->s_separator); gtk_widget_set_size_request(s->s_hbox, -1, 64); /* Icon */ w = gtk_image_new(); gtk_box_pack_start(GTK_BOX(s->s_hbox), w, FALSE, TRUE, 5); sub = prop_subscribe(0, PROP_TAG_NAME("self", "model", "metadata", "icon"), PROP_TAG_CALLBACK_STRING, set_icon, w, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); gtk_image_set_from_stock(GTK_IMAGE(w), GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment(GTK_MISC(w), 0.5, 0.5); gtk_misc_set_padding(GTK_MISC(w), 8, 0); /* vbox */ vbox = gtk_vbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(s->s_hbox), vbox, TRUE, TRUE, 0); /* Title */ w = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(w), 0, 0); gtk_label_set_ellipsize(GTK_LABEL(w), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(vbox), w, FALSE, TRUE, 0); sub = prop_subscribe(0, PROP_TAG_NAME("self", "model", "metadata", "title"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label_xl, w, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); /* Short description */ w = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(w), 0, 0); gtk_label_set_ellipsize(GTK_LABEL(w), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(vbox), w, FALSE, TRUE, 0); sub = prop_subscribe(0, PROP_TAG_NAME("self", "model", "metadata", "shortdesc"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, w, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); /* Spacer */ w = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), w, TRUE, FALSE, 0); /* Link */ #if 0 hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, FALSE, 0); w = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 0); g_signal_connect(GTK_OBJECT(w), "clicked", G_CALLBACK(source_clicked), s); g_object_set(G_OBJECT(w), "label", "Open", NULL); sub = prop_subscribe(0, PROP_TAG_NAME("self", "url"), PROP_TAG_CALLBACK_STRING, source_set_url, s, PROP_TAG_COURIER, pc, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); #endif /* Finalize */ gtk_widget_show_all(s->s_hbox); }
static void source_add(gtk_ui_t *gu, home_t *h, prop_t *p, source_t *s, source_t *before, int position) { prop_sub_t *sub; GtkWidget *w, *vbox, *hbox; s->s_home = h; s->s_hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(h->h_sourcebox), s->s_hbox, FALSE, TRUE, 5); gtk_box_reorder_child(GTK_BOX(h->h_sourcebox), s->s_hbox, position * 2); s->s_separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(h->h_sourcebox), s->s_separator, FALSE, TRUE, 0); gtk_box_reorder_child(GTK_BOX(h->h_sourcebox), s->s_separator, position * 2 + 1); gtk_widget_show(s->s_separator); /* Icon */ w = gtk_image_new(); gtk_box_pack_start(GTK_BOX(s->s_hbox), w, FALSE, TRUE, 5); sub = prop_subscribe(0, PROP_TAG_NAME("self", "icon"), PROP_TAG_CALLBACK_STRING, home_set_icon, w, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); gtk_image_set_from_stock(GTK_IMAGE(w), GTK_STOCK_DIRECTORY, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment(GTK_MISC(w), 0.5, 0.5); gtk_misc_set_padding(GTK_MISC(w), 12, 0); /* vbox */ vbox = gtk_vbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(s->s_hbox), vbox, TRUE, TRUE, 0); /* Title */ w = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(w), 0, 0); gtk_label_set_ellipsize(GTK_LABEL(w), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(vbox), w, FALSE, TRUE, 0); sub = prop_subscribe(0, PROP_TAG_NAME("self", "title"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label_xl, w, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); /* Status */ w = gtk_label_new(""); gtk_misc_set_alignment(GTK_MISC(w), 0, 0); gtk_label_set_ellipsize(GTK_LABEL(w), PANGO_ELLIPSIZE_END); gtk_box_pack_start(GTK_BOX(vbox), w, FALSE, TRUE, 0); sub = prop_subscribe(0, PROP_TAG_NAME("self", "status"), PROP_TAG_CALLBACK_STRING, gu_subscription_set_label, w, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); /* Spacer */ w = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), w, TRUE, FALSE, 0); /* Link */ hbox = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, FALSE, 0); w = gtk_button_new(); gtk_box_pack_start(GTK_BOX(hbox), w, FALSE, FALSE, 0); g_signal_connect(GTK_OBJECT(w), "clicked", G_CALLBACK(source_clicked), s); g_object_set(G_OBJECT(w), "label", "Open", NULL); sub = prop_subscribe(0, PROP_TAG_NAME("self", "url"), PROP_TAG_CALLBACK_STRING, source_set_url, s, PROP_TAG_COURIER, glibcourier, PROP_TAG_NAMED_ROOT, p, "self", NULL); gu_unsubscribe_on_destroy(GTK_OBJECT(w), sub); /* Finalize */ gtk_widget_show_all(s->s_hbox); }