📄 st-preferences-dialog.c
字号:
const char *handler_name; char *page_name; g_return_val_if_fail(ST_IS_HANDLER(handler), NULL); g_return_val_if_fail(st_handler_event_is_bound(handler, ST_HANDLER_EVENT_PREFERENCES_WIDGET_NEW), NULL); widget = st_handler_event_preferences_widget_new(handler); if (! widget) return NULL; page = st_preferences_page_new(); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(page), widget, FALSE, FALSE, 0); handler_name = st_handler_get_name(handler); page_name = HANDLER_PAGE_NAME(handler_name); st_preferences_page_set_name(page, page_name); g_free(page_name); st_preferences_page_set_icon(page, st_handler_get_pixbuf(handler)); st_preferences_page_set_label(page, st_handler_get_label(handler)); if (! strcmp(handler_name, "live365")) st_preferences_page_set_help_link_id(page, "preferences-live365"); else if (! strcmp(handler_name, "shoutcast")) st_preferences_page_set_help_link_id(page, "preferences-shoutcast"); else if (! strcmp(handler_name, "punkcast.com.py")) st_preferences_page_set_help_link_id(page, "preferences-punkcast"); return page;}/* takes @page ownership */static voidst_preferences_dialog_append_page (STPreferencesDialog *dialog, GtkTreeStore *store, GtkTreeIter *iter, GtkTreeIter *parent, STPreferencesPage *page){ GdkPixbuf *icon; GdkPixbuf *scaled; g_return_if_fail(ST_IS_PREFERENCES_DIALOG(dialog)); g_return_if_fail(GTK_IS_TREE_STORE(store)); g_return_if_fail(iter != NULL); g_return_if_fail(ST_IS_PREFERENCES_PAGE(page)); /* take the page ownership */ g_object_ref(page); gtk_object_sink(GTK_OBJECT(page)); icon = st_preferences_page_get_icon(page); scaled = icon ? sgtk_pixbuf_scale(icon, GTK_ICON_SIZE_MENU) : NULL; gtk_tree_store_append(store, iter, parent); gtk_tree_store_set(store, iter, COLUMN_PAGE, page, COLUMN_ICON, scaled, COLUMN_STOCK_ID, st_preferences_page_get_stock_id(page), COLUMN_LABEL, st_preferences_page_get_label(page), -1); if (scaled) g_object_unref(scaled); /* the store now holds a reference to the page */ g_object_unref(page);}static voidst_preferences_dialog_page_changed_h (GtkTreeSelection *selection, gpointer user_data){ STPreferencesDialog *dialog = user_data; if (dialog->priv->current_page) { /* * The list store holds a reference to the page, so it will not * be destroyed here. */ gtk_container_remove(GTK_CONTAINER(dialog->priv->hbox), GTK_WIDGET(dialog->priv->current_page)); dialog->priv->current_page = NULL; } g_free(st_settings.preferences_selected_page); st_settings.preferences_selected_page = NULL; dialog->priv->current_page = st_preferences_dialog_get_selected_page(dialog); if (dialog->priv->current_page) { gtk_box_pack_start(GTK_BOX(dialog->priv->hbox), GTK_WIDGET(dialog->priv->current_page), TRUE, TRUE, 0); gtk_widget_show(GTK_WIDGET(dialog->priv->current_page)); g_object_unref(dialog->priv->current_page); /* hbox owns it */ st_settings.preferences_selected_page = g_strdup(st_preferences_page_get_name(dialog->priv->current_page)); }}static voidst_preferences_dialog_row_expanded_collapsed_h (GtkTreeView *view, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data){ STPreferencesPage *page; gtk_tree_model_get(gtk_tree_view_get_model(view), iter, COLUMN_PAGE, &page, -1); if (! strcmp(st_preferences_page_get_name(page), "plugins")) st_settings.preferences_plugins_expanded = GPOINTER_TO_INT(user_data); g_object_unref(page);}static voidst_preferences_dialog_response_h (GtkDialog *dialog, int response, gpointer data){ STPreferencesDialog *preferences_dialog = ST_PREFERENCES_DIALOG(dialog); switch (response) { case GTK_RESPONSE_HELP: { STPreferencesPage *page; page = st_preferences_dialog_get_selected_page(preferences_dialog); if (page) { st_show_help(st_preferences_page_get_help_link_id(page)); g_object_unref(page); } else st_show_help("preferences"); break; } case GTK_RESPONSE_DELETE_EVENT: case GTK_RESPONSE_CLOSE: { GSList *l; gboolean plugins_changed = FALSE; gtk_widget_destroy(GTK_WIDGET(dialog)); SG_LIST_FOREACH(l, disabled_plugins) if (! sg_str_slist_contains(st_settings.disabled_plugins, l->data)) { plugins_changed = TRUE; break; } if (! plugins_changed) SG_LIST_FOREACH(l, st_settings.disabled_plugins) if (! sg_str_slist_contains(disabled_plugins, l->data)) { plugins_changed = TRUE; break; } if (plugins_changed) { GtkWidget *dialog; int response; dialog = sgtk_message_dialog_new(st_shell ? st_shell_get_window(st_shell) : NULL, GTK_STOCK_DIALOG_WARNING, _("Restart streamtuner?"), _("The plugins settings have changed, and streamtuner must be restarted for these changes to take effect. Would you like to restart streamtuner?")); gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_NO, GTK_RESPONSE_NO, GTK_STOCK_YES, GTK_RESPONSE_YES, NULL); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (response == GTK_RESPONSE_YES) { st_shell_set_restart(st_shell, TRUE); g_object_unref(st_shell); } } } break; }}static STPreferencesPage *st_preferences_dialog_get_selected_page (STPreferencesDialog *dialog){ GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; STPreferencesPage *page = NULL; g_return_val_if_fail(ST_IS_PREFERENCES_DIALOG(dialog), NULL); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->priv->view)); if (gtk_tree_selection_get_selected(selection, &model, &iter)) gtk_tree_model_get(model, &iter, COLUMN_PAGE, &page, -1); return page;}static voidst_preferences_dialog_select_page (STPreferencesDialog *dialog, const char *name){ GtkTreeModel *model; GtkTreeIter iter; g_return_if_fail(ST_IS_PREFERENCES_DIALOG(dialog)); model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog->priv->view)); if (name) { SelectPageInfo info; info.dialog = dialog; info.name = name; info.found = FALSE; gtk_tree_model_foreach(model, st_preferences_dialog_select_page_cb, &info); if (info.found) return; } if (gtk_tree_model_get_iter_first(model, &iter)) st_preferences_dialog_select_iter(dialog, &iter);}static gbooleanst_preferences_dialog_select_page_cb (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data){ SelectPageInfo *info = data; STPreferencesPage *page; gtk_tree_model_get(model, iter, COLUMN_PAGE, &page, -1); if (! strcmp(st_preferences_page_get_name(page), info->name)) { st_preferences_dialog_select_iter(info->dialog, iter); info->found = TRUE; } g_object_unref(page); return info->found;}static voidst_preferences_dialog_select_iter (STPreferencesDialog *dialog, GtkTreeIter *iter){ GtkTreeSelection *selection; g_return_if_fail(ST_IS_PREFERENCES_DIALOG(dialog)); g_return_if_fail(iter != NULL); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->priv->view)); gtk_tree_selection_select_iter(selection, iter);}GtkWidget *st_preferences_dialog_new (GtkWindow *parent){ STPreferencesDialog *dialog; dialog = g_object_new(ST_TYPE_PREFERENCES_DIALOG, NULL); if (parent) gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); return GTK_WIDGET(dialog);}voidst_preferences_dialog_select_handler (STPreferencesDialog *dialog, STHandler *handler){ char *page_name; g_return_if_fail(ST_IS_PREFERENCES_DIALOG(dialog)); g_return_if_fail(ST_IS_HANDLER(handler)); page_name = HANDLER_PAGE_NAME(st_handler_get_name(handler)); st_preferences_dialog_select_page(dialog, page_name); g_free(page_name);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -