📄 gui.c
字号:
debug("Disabling 'add' controls"); gtk_widget_set_sensitive(glade_xml_get_widget(addxml, "scrolledwindow_add"), FALSE); gtk_widget_set_sensitive(glade_xml_get_widget(addxml, "button_add_update"), FALSE); gtk_widget_set_sensitive(glade_xml_get_widget(addxml, "button_add_add"), FALSE); debug("Removing 'Add' treeview model"); gtk_tree_view_set_model(GTK_TREE_VIEW(glade_xml_get_widget(addxml, "treeview_add")), NULL);}void gui_updating_enable_add_controls() { debug("Enabling 'add' controls"); gtk_widget_set_sensitive(glade_xml_get_widget(addxml, "scrolledwindow_add"), TRUE); gtk_widget_set_sensitive(glade_xml_get_widget(addxml, "button_add_update"), TRUE); gtk_widget_set_sensitive(glade_xml_get_widget(addxml, "button_add_add"), TRUE); debug("Setting 'Add' treeview model"); gtk_tree_view_set_model(GTK_TREE_VIEW(glade_xml_get_widget(addxml, "treeview_add")), GTK_TREE_MODEL(glurp->gui_addtree));}void gui_add_fill_dir(GtkTreeIter *iter, gboolean silent) { GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(addxml, "treeview_add")); GtkTreeModel *tm = gtk_tree_view_get_model(tv); GtkTreeIter child; gint nd; gchar *filepath; gtk_tree_model_get(tm, iter, ADD_NUM_DIRS, &nd, ADD_FILENAME, &filepath, -1); if( gtk_tree_model_iter_n_children(tm, iter) == 1 && nd == -1 ) { if( !gtk_tree_model_iter_children(tm, &child, iter) ) { debug("Couldn't get stub child"); return; } debug("Filling dir '%s'", filepath); gtk_tree_store_set(GTK_TREE_STORE(tm), iter, ADD_NUM_DIRS, 0, -1); glurp_add_add_dir(filepath, gtk_tree_model_get_path(tm, iter)); gtk_tree_store_remove(GTK_TREE_STORE(tm), &child); if( silent ) gtk_tree_view_collapse_row(tv, gtk_tree_model_get_path(tm, iter)); debug("Filling complete"); }}gboolean gui_get_iter_by_id(GtkTreeIter *iter, gint id) { GtkTreeModel *tm = GTK_TREE_MODEL(glurp->gui_playlist); gint cid; if( !gtk_tree_model_get_iter_first(tm, iter) ) { debug("Couldn't get first iter"); return FALSE; } do { gtk_tree_model_get(tm, iter, PL_ID, &cid, -1); if( cid == id ) return TRUE; } while( gtk_tree_model_iter_next(tm, iter) ); return FALSE;}gboolean gui_get_iter_by_pos(GtkTreeIter *iter, gint pos) { GtkTreeModel *tm = GTK_TREE_MODEL(glurp->gui_playlist); gint cpos = 0; if( !gtk_tree_model_get_iter_first(tm, iter) ) { debug("Couldn't get first iter"); return FALSE; } while( cpos < pos ) { if( !gtk_tree_model_iter_next(tm, iter) ) return FALSE;; cpos++; } return TRUE;}void gui_update_song(gint id) { GlurpSong *s = NULL; GtkListStore *ls = glurp->gui_playlist; GtkTreeModel *tm = GTK_TREE_MODEL(ls); GtkTreeIter iter; gint spos, i; /* get GlurpSong */ if( !(s = get_song_by_id(id)) ) { debug("Couldn't get song"); return; } /* get song position in internal playlist */ spos = get_song_pos(s); if( !gui_get_iter_by_pos(&iter, spos) ) { debug("Couldn't get requested iter, adding song"); add_song_to_gui_playlist(s, spos + 1); return; } /* get GtkTreeIter */ for(i = 0, gtk_tree_model_get_iter_first(tm, &iter); i < spos; i++, gtk_tree_model_iter_next(tm, &iter) ) {} debug("Modifying playlist row..."); gtk_list_store_set(ls, &iter, PL_FILENAME, s->file, PL_ARTIST, s->artist, PL_TITLE, s->title, PL_ALBUM, s->album, PL_TRACK, s->track, PL_NAME, s->name, PL_POS, s->pos + 1, PL_ID, s->id, -1);}void gui_trim_playlist_end(gint last) { GtkTreeModel *tm = GTK_TREE_MODEL(glurp->gui_playlist); GtkTreeIter iter, riter; GtkTreePath *lpath; gint i; if( last == -1 ) { debug("Clearing GUI playlist"); gtk_list_store_clear(glurp->gui_playlist); return; } /* get the path to last row we want to keep */ for(i = 0, gtk_tree_model_get_iter_first(tm, &iter); i <= last - 1 && &iter; i++, gtk_tree_model_iter_next(tm, &iter) ) {} lpath = gtk_tree_model_get_path(tm, &iter); while( gtk_tree_model_get_iter(tm, &riter, lpath) && gtk_tree_model_iter_next(tm, &riter) ) gtk_list_store_remove(glurp->gui_playlist, &riter);}void create_stream_liststore() { GtkListStore *ls; GtkWidget *tv; if(glurp->gui_stream_list) { debug("Stream liststore exists, returning"); return; } debug("Creating stream liststore..."); ls = gtk_list_store_new(1, G_TYPE_STRING); tv = glade_xml_get_widget(streamxml, "comboboxentry_stream_url"); gtk_entry_set_activates_default(GTK_ENTRY(GTK_BIN(glade_xml_get_widget(streamxml, "comboboxentry_stream_url"))->child), TRUE); gtk_widget_grab_focus(GTK_WIDGET(GTK_BIN(glade_xml_get_widget(streamxml, "comboboxentry_stream_url"))->child)); gtk_combo_box_set_model(GTK_COMBO_BOX(tv), GTK_TREE_MODEL(ls)); gtk_combo_box_entry_set_text_column(GTK_COMBO_BOX_ENTRY(tv), 0); glurp->gui_stream_list = ls; debug("Stream combobox model created");}void populate_stream_liststore() { GlurpStream *s = NULL; GtkTreeIter iter; gtk_list_store_clear(glurp->gui_stream_list); for( s = glurp->stream_history; s; s = s->next ) { debug("Adding row '%s'", s->url); gtk_list_store_append(glurp->gui_stream_list, &iter); gtk_list_store_set(glurp->gui_stream_list, &iter, 0, g_strdup(s->url), -1); } statusbar_print("Stream combobox model populated");}void stream_window_destroyed() { if(!streamxml && !glurp->gui_stream_list) return; debug("playlists window destroyed, cleaning up"); streamxml = NULL; if( G_IS_OBJECT(glurp->gui_stream_list) ) g_object_unref(G_OBJECT(glurp->gui_stream_list)); glurp->gui_stream_list = NULL;}gchar *get_selected_stream() { gchar *text = NULL; GtkWidget *cb = NULL; if( !streamxml || !glurp->gui_stream_list ) { debug("No combobox"); return NULL; } cb = glade_xml_get_widget(streamxml, "comboboxentry_stream_url"); text = (gchar *)gtk_entry_get_text(GTK_ENTRY(GTK_BIN(cb)->child)); return text;}void gui_refresh_playlist_columns() { GtkTreeViewColumn *col = NULL; GtkCellRenderer *rend; GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(guixml, "treeview_playlist")); debug("Starting to update playlist columns"); while( (col = gtk_tree_view_get_column(GTK_TREE_VIEW(tv), 0)) ) { gtk_tree_view_remove_column(tv, col); } rend = gtk_cell_renderer_text_new(); if( glurp->config->playlist_columns[PL_POS] ) { col = gtk_tree_view_column_new_with_attributes("#", rend, "text", PL_POS, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } if( glurp->config->playlist_columns[PL_ID] ) { col = gtk_tree_view_column_new_with_attributes("Id", rend, "text", PL_ID, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } if( glurp->config->playlist_columns[PL_TITLE] ) { col = gtk_tree_view_column_new_with_attributes("Title", rend, "text", PL_TITLE, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } if( glurp->config->playlist_columns[PL_NAME] ) { col = gtk_tree_view_column_new_with_attributes("Name", rend, "text", PL_TITLE, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } if( glurp->config->playlist_columns[PL_ARTIST] ) { col = gtk_tree_view_column_new_with_attributes("Artist", rend, "text", PL_ARTIST, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } if( glurp->config->playlist_columns[PL_ALBUM] ) { col = gtk_tree_view_column_new_with_attributes("Album", rend, "text", PL_ALBUM, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } if( glurp->config->playlist_columns[PL_FILENAME] ) { col = gtk_tree_view_column_new_with_attributes("Filename", rend, "text", PL_FILENAME, "weight", PL_BOLD, "weight-set", PL_BOLD_SET, NULL); gtk_tree_view_column_set_resizable(col, TRUE); gtk_tree_view_append_column(tv, col); } debug("Playlist columns updated");}GtkMenu *populate_outputs_menu() { GtkWidget *menu = gtk_menu_new(); GtkWidget *hbox, *label, *icon; GtkMenuItem *item = NULL; mpd_OutputEntity *output; gint i; mpd_sendOutputsCommand(glurp->conn); while( (output = mpd_getNextOutput(glurp->conn)) ) { debug("%d: %s", output->id, output->name); hbox = GTK_WIDGET(gtk_hbox_new(FALSE, 0)); gtk_widget_show(hbox); /* "enabled" icon */ if( output->enabled ) { icon = gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_MENU); i = output->id + 1; } else { icon = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); i = -(output->id + 1); } gtk_widget_show(icon); gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); /* label */ label = GTK_WIDGET(gtk_label_new(g_strdup_printf("%d: %s", output->id, output->name))); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); item = GTK_MENU_ITEM(gtk_menu_item_new()); gtk_container_add(GTK_CONTAINER(item), hbox); gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(item)); gtk_widget_show(GTK_WIDGET(item)); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(on_menu_output_activate), (gpointer)i); g_free(output); } mpd_finishCommand(glurp->conn); if( check_mpd_error() ) { glurp_disconnect(); return NULL; } g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(on_menu_outputs_deactivate), NULL); return GTK_MENU(menu);}void gui_add_append(gchar *path, GtkTreePath *gpath, gboolean song) { GtkTreeModel *tm = GTK_TREE_MODEL(glurp->gui_addtree); GtkTreeIter iparent, iter, newchild; gint nd; debug("Adding '%s'", path); /* get stored number of dirs in parent dir */ if( gpath ) { gtk_tree_model_get_iter(tm, &iparent, gpath); gtk_tree_model_get(tm, &iparent, ADD_NUM_DIRS, &nd, -1); } if( song ) { gtk_tree_store_append(glurp->gui_addtree, &iter, (gpath ? &iparent : NULL)); gtk_tree_store_set(glurp->gui_addtree, &iter, 3, gdk_pixbuf_new_from_file(DATADIR "pixmaps/media-audiofile.png", NULL), -1); } else { gtk_tree_store_insert(glurp->gui_addtree, &iter, (gpath ? &iparent : NULL), (gpath ? nd : glurp->num_add_dirs)); if( gpath ) gtk_tree_store_set(glurp->gui_addtree, &iparent, 2, nd+1, -1); else glurp->num_add_dirs++; gtk_tree_store_set(glurp->gui_addtree, &iter, 3, gtk_widget_render_icon(glade_xml_get_widget(guixml, "glurp_window_main"), GTK_STOCK_OPEN, GTK_ICON_SIZE_SMALL_TOOLBAR, "icon"), -1); gtk_tree_store_set(glurp->gui_addtree, &iter, ADD_NUM_DIRS, -1, -1); gtk_tree_store_insert(glurp->gui_addtree, &newchild, &iter, (gpath ? nd : glurp->num_add_dirs)); } gtk_tree_store_set(glurp->gui_addtree, &iter, ADD_NAME, glurp_filename(path), ADD_FILENAME, path, -1); if( gpath ) gtk_tree_view_expand_row(GTK_TREE_VIEW(glade_xml_get_widget(addxml, "treeview_add")), gpath, FALSE);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -