Mercurial > audlegacy-plugins
diff src/rootvis/config_frontend_widgets.c @ 900:d985f0dcdeb0 trunk
[svn] - add a starting point for xmms-rootvis port. giacomo will need to
finish this up, as my XLib skills are not enough at this time.
author | nenolod |
---|---|
date | Mon, 26 Mar 2007 01:19:26 -0700 |
parents | |
children | 30e515b6e651 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/rootvis/config_frontend_widgets.c Mon Mar 26 01:19:26 2007 -0700 @@ -0,0 +1,486 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include <gtk/gtk.h> +#include <config_frontend.h> + +extern void print_status(char msg[]); + +void frontend_set_signal(GtkWidget *widget, char* signal, void* func, int data) +{ + gtk_signal_connect(GTK_OBJECT(widget), signal, GTK_SIGNAL_FUNC(func), GINT_TO_POINTER(data)); +} + +GtkWidget *frontend_create_window(int type, const char *name) +{ + GtkWidget *window; + + print_status("creating window"); + print_status(name); + window = gtk_window_new(type); + gtk_signal_connect(GTK_OBJECT(window), + "delete-event", + GTK_SIGNAL_FUNC(signal_window_close), + NULL); + + print_status("setting title"); + gtk_window_set_title(window, name); + print_status("done"); + gtk_widget_show(window); + return window; +} + +GtkWidget *frontend_create_box(int box_type, GtkWidget *container, char *label, + int attach) +{ + GtkWidget *box; + + print_status("creating box"); + print_status(label); + + + + switch (box_type) { + case VBOX: + box = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(box), 5); + break; + + case HBOX: + box = gtk_hbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(box), 5); + break; + case HBBOX: + box = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(box), + GTK_BUTTONBOX_END); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(box), 5); + break; + case HBBOX2: + box = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(box), + GTK_BUTTONBOX_EDGE); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(box), 4); + break; + case FRAME: + box = gtk_frame_new(label); + gtk_container_set_border_width(GTK_CONTAINER(box), 5); + break; + default: + print_status("error"); + print_status("trying to create vbox"); + box = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(box), 5); + } + + print_status("attaching"); + switch (attach) { + case ATTACH_TO_NOTEBOOK: + gtk_notebook_append_page(GTK_NOTEBOOK(container), + box, gtk_label_new(label)); + break; + + case ATTACH_TO_CONTAINER: + gtk_container_add(GTK_CONTAINER(container), box); + break; + case ATTACH_TO_BOX: + gtk_box_pack_start(GTK_BOX(container), box, TRUE, TRUE, 0); + break; + default: + print_status("error"); + print_status("trying to attach to container"); + gtk_container_add(GTK_CONTAINER(container), box); + } + gtk_widget_show(box); + print_status("done"); + return box; +} + +GtkWidget *frontend_create_notebook(GtkWidget *box) +{ + GtkWidget *notebook; + + print_status("creating notebook"); + notebook = gtk_notebook_new(); + gtk_box_pack_start(GTK_BOX(box), notebook, TRUE, TRUE, 0); + gtk_widget_show(notebook); + return notebook; +} + +GtkWidget *frontend_create_button(GtkWidget *container, char *label) +{ + GtkWidget *button; + + print_status("adding button"); + print_status(label); + + button = gtk_button_new_with_label(label); + gtk_widget_show(button); + + GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(container), button, TRUE, TRUE, 0); + + return button; +} + +GtkWidget *frontend_create_check(GtkWidget *container, char *label) +{ + GtkWidget *check; + + print_status("creating check"); + print_status(label); + + check = gtk_check_button_new_with_label(label); + gtk_widget_show(check); + + gtk_container_add(GTK_CONTAINER(container), check); + + print_status("done"); + return check; +} + +GtkWidget *frontend_create_label(GtkWidget *container, char *text) +{ + GtkWidget *label; + + print_status("creating label"); + print_status(text); + + label = gtk_label_new(text); + gtk_label_set_justify(label, GTK_JUSTIFY_CENTER); + gtk_label_set_line_wrap(label, TRUE); + gtk_widget_show(label); + + gtk_container_add(GTK_CONTAINER(container), label); + + print_status("done"); + return label; +} + +/* +GtkWidget *rootvis_create_frame_and_attach(char *name, GtkWidget *box) +{ + GtkWidget *frame; + + frame = gtk_frame_new(name); + gtk_container_set_border_width(GTK_CONTAINER(frame), 5); + gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 0); + gtk_widget_show(frame); + return frame; +} +*/ + +GtkWidget *frontend_create_entry(int type, GtkWidget *container, + char *entry_changed, + char *label, ...) +{ + va_list ap; + char *list_element; + char *signal; + + GtkWidget *entry; + GList *list = NULL; + + print_status("creating entry"); + print_status(label); + + va_start(ap, label); + switch (type) { + case COMBO: + entry = gtk_combo_new(); + while ((list_element = va_arg(ap, char *))) { + print_status("adding element to list"); + print_status(list_element); + list = g_list_append(list, list_element); + } + print_status("attaching string list to combo"); + gtk_combo_set_popdown_strings(GTK_COMBO(entry), list); + break; + case ENTRY: + entry = gtk_entry_new(); + gtk_entry_set_max_length(GTK_ENTRY(entry), 6); + while ((signal = va_arg(ap, char *))) { + print_status("adding signal to entry"); + print_status(signal); + gtk_signal_connect(GTK_OBJECT(entry), + /* signal */ + signal, + /* function */ + GTK_SIGNAL_FUNC(va_arg(ap, + void *)), + /* data */ + va_arg(ap, char *)); + } + break; + default: + return NULL; + } + va_end(ap); + + print_status("attaching entry to container"); + gtk_container_add(GTK_CONTAINER(container), entry); + gtk_widget_show(entry); + + print_status("done"); + + return entry; +} + +void frontend_create_colorpicker(struct config_value *cvar) +{ + struct rootvis_colorsel* colorsel = cvar->valc.frontend; + GtkWidget *vbox; + GtkWidget *options_frame, *options_vbox; + + static GtkWidget *bbox, *ok, *cancel; + + print_status("pressing button ... "); + gtk_button_set_relief(GTK_BUTTON(colorsel->button), GTK_RELIEF_HALF); + + + print_status("casting window ..."); + + colorsel->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(colorsel->window), colorsel->complete_name); + + gtk_container_set_border_width(GTK_CONTAINER(colorsel->window), 10); + gtk_window_set_policy(GTK_WINDOW(colorsel->window), FALSE, FALSE, FALSE); + gtk_window_set_position(GTK_WINDOW(colorsel->window), + GTK_WIN_POS_MOUSE); + gtk_signal_connect(GTK_OBJECT(colorsel->window), "destroy", + GTK_SIGNAL_FUNC(gtk_widget_destroyed), + &(colorsel->window)); + + vbox = gtk_vbox_new(FALSE, 5); + + printf("setting name ..."); + options_frame = gtk_frame_new(colorsel->complete_name); + printf("done. \n"); + gtk_container_set_border_width(GTK_CONTAINER(options_frame), 5); + + options_vbox = gtk_vbox_new(FALSE, 5); + gtk_container_set_border_width(GTK_CONTAINER(options_vbox), 5); + + colorsel->color_picker = gtk_color_selection_new(); + gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(colorsel->color_picker), TRUE); + gtk_color_selection_set_color(GTK_COLOR_SELECTION(colorsel->color_picker), colorsel->color); + gtk_signal_connect(GTK_OBJECT(colorsel->color_picker), "color_changed", GTK_SIGNAL_FUNC(signal_colorselector_update), cvar); + + gtk_box_pack_start(GTK_BOX(options_vbox), colorsel->color_picker, + FALSE, FALSE, 0); + gtk_widget_show(colorsel->color_picker); + printf("raising the curtain \n"); + + gtk_container_add(GTK_CONTAINER(options_frame), options_vbox); + gtk_widget_show(options_vbox); + + gtk_box_pack_start(GTK_BOX(vbox), options_frame, TRUE, TRUE, 0); + gtk_widget_show(options_frame); + + bbox = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); + gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5); + gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0); + + ok = gtk_button_new_with_label("Ok"); + gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(signal_colorselector_ok), cvar); + GTK_WIDGET_SET_FLAGS(ok, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(bbox), ok, TRUE, TRUE, 0); + gtk_widget_show(ok); + + + cancel = gtk_button_new_with_label("Cancel"); + gtk_signal_connect(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(signal_colorselector_cancel), cvar); + GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT); + gtk_box_pack_start(GTK_BOX(bbox), cancel, TRUE, TRUE, 0); + gtk_widget_show(cancel); + gtk_widget_show(bbox); + + gtk_container_add(GTK_CONTAINER(colorsel->window), vbox); + gtk_widget_show(vbox); + gtk_widget_grab_default(ok); +} + +void frontend_create_color_button(struct config_value* cvar, GtkWidget *container, char *name, + char *channel_name) +{ + struct rootvis_colorsel *color_struct; + + print_status("Allocating memory for color struct"); + color_struct = malloc(sizeof(struct rootvis_colorsel)); + cvar->valc.frontend = color_struct; + + frontend_set_color(cvar); + color_struct->window = NULL; + color_struct->name = name; //complete_name; + + print_status("reallocating name"); + color_struct->complete_name = + malloc((sizeof(name) + sizeof(channel_name) + 10)*sizeof(char)); + print_status("done"); + sprintf(color_struct->complete_name, "%s - %s", channel_name, name); + print_status("done"); + + + char* labeltext = (char*)malloc(strlen(name) + 2); + sprintf(labeltext, "%s:", name); + color_struct->label = gtk_label_new(labeltext); + gtk_container_add(GTK_CONTAINER(container), GTK_WIDGET(color_struct->label)); + + color_struct->button = gtk_button_new(); + print_status("adding container ... "); + gtk_container_add(GTK_CONTAINER(container), GTK_WIDGET(color_struct->button)); + print_status("done.\nraising ... "); + + print_status("done.\nmaking preview ... "); + + color_struct->preview = gtk_preview_new(GTK_PREVIEW_COLOR); + print_status("done.\nsetting size ... "); + gtk_preview_size(GTK_PREVIEW(color_struct->preview), 30, 28); + print_status("done.\nraising ... "); + print_status("done.\n"); + gtk_container_add(GTK_CONTAINER(color_struct->button), color_struct->preview); + + gtk_widget_set_usize(color_struct->button, 32, 26); + + gtk_signal_connect(GTK_OBJECT(color_struct->button), "clicked", + GTK_SIGNAL_FUNC(signal_toggle_colorselector), cvar); + + frontend_update_color(cvar, 0); + gtk_widget_show(GTK_WIDGET(color_struct->label)); + gtk_widget_show(GTK_WIDGET(color_struct->button)); + gtk_widget_show(color_struct->preview); +} + +GtkWidget *frontend_create_channel(int channel) +{ + GtkWidget *window; + char name[12]; + + print_status("creating gtk window ... "); + + sprintf(name, "Channel %d", channel+1); + print_status(name); + + print_status("debug 2"); + + window = frontend_create_window(GTK_WINDOW_TOPLEVEL, &name); + + print_status("done."); + + { + GtkWidget *vbox_0, *notebook_1, *button_box_1, + *vbox_2[4], *frame_3[4], *vbox_3[1], *hbox_4[5], + *check_debug, *check_stereo, + *close_button, *revert_button; + + vbox_0 = frontend_create_box(VBOX, window, "rootvis_config_vbox", ATTACH_TO_CONTAINER); + { + + notebook_1 = frontend_create_notebook(vbox_0); + { + /* vbox_2[0] = frontend_create_box(VBOX, notebook_1, "General", ATTACH_TO_NOTEBOOK); + { + } + vbox_2[1] = frontend_create_box(VBOX, notebook_1, "Geometry", ATTACH_TO_NOTEBOOK); + { + } + vbox_2[2] = frontend_create_box(VBOX, notebook_1, "Look & Feel", ATTACH_TO_NOTEBOOK); + { + }*/ + vbox_2[3] = frontend_create_box(VBOX, notebook_1, "Colors", ATTACH_TO_NOTEBOOK); + { + frame_3[0] = frontend_create_box(FRAME, vbox_2[3], "Gradient", ATTACH_TO_BOX); + hbox_4[0] = frontend_create_box(HBOX, frame_3[0], "Bar", ATTACH_TO_CONTAINER); + { + frontend_create_color_button(&Cchannel[channel].def[11], hbox_4[0], "Begin", name); + frontend_create_color_button(&Cchannel[channel].def[12], hbox_4[0], "2/5", name); + frontend_create_color_button(&Cchannel[channel].def[13], hbox_4[0], "4/5", name); + frontend_create_color_button(&Cchannel[channel].def[14], hbox_4[0], "End", name); + } + frame_3[1] = frontend_create_box(FRAME, vbox_2[3], "Bevel, Peaks & Shadow", ATTACH_TO_BOX); + hbox_4[1] = frontend_create_box(HBOX, frame_3[1], "etc", ATTACH_TO_CONTAINER); + { + frontend_create_color_button(&Cchannel[channel].def[15], hbox_4[1], "Bevel", name); + frontend_create_color_button(&Cchannel[channel].def[20], hbox_4[1], "Peaks", name); + frontend_create_color_button(&Cchannel[channel].def[16], hbox_4[1], "Shadow", name); + } + } + } + + + button_box_1 = frontend_create_box(HBBOX2, vbox_0, "Button Box", ATTACH_TO_BOX); + { + revert_button = frontend_create_button(button_box_1, "Revert"); + frontend_set_signal(revert_button, "clicked", signal_revert, channel); + close_button = frontend_create_button(button_box_1, "Close"); + frontend_set_signal(close_button, "clicked", signal_hide, channel); + } + } + } + config_set_widgets(channel); + return window; +} + +GtkWidget *frontend_create_main(void) +{ + GtkWidget *window, *channel_button[2], + *button_box[2], *channels_frame, *main_frame, *vbox, + *main_vbox, *channels_hbox, *channel_vbox[2], + *save_button, *revert_button, *close_button; + + window = frontend_create_window(GTK_WINDOW_TOPLEVEL, "Main"); + { + vbox = frontend_create_box(VBOX, window, "vbox", ATTACH_TO_CONTAINER); + { + main_frame = frontend_create_box(FRAME, vbox, "Global Settings", ATTACH_TO_BOX); + { + main_vbox = frontend_create_box(VBOX, main_frame, "main_hbox", + ATTACH_TO_CONTAINER); + + widgets.stereo_check = frontend_create_check(main_vbox, "stereo support"); + frontend_set_signal(widgets.stereo_check, "toggled", signal_stereo_toggled, 0); + widgets.debug_check = frontend_create_check(main_vbox, "debug messages (stdout)"); + frontend_set_signal(widgets.debug_check, "toggled", signal_check_toggled, 0); + + } + channels_frame = frontend_create_box(FRAME, vbox, "Channel-specific", + ATTACH_TO_BOX); + { + button_box[0] = frontend_create_box(HBOX, channels_frame, "Main Button Box", + ATTACH_TO_CONTAINER); + { + channel_vbox[0] = frontend_create_box(VBOX, button_box[0], "channel_vbox_0", + ATTACH_TO_CONTAINER); + { + channel_button[0] = frontend_create_button(channel_vbox[0], "First Channel"); + frontend_set_signal(channel_button[0], "clicked", signal_show, 0); + widgets.stereo_status[0] = frontend_create_label(channel_vbox[0], "renders both channels"); + } + channel_vbox[1] = frontend_create_box(VBOX, button_box[0], "channel_vbox_0", + ATTACH_TO_CONTAINER); + { + + channel_button[1] = frontend_create_button(channel_vbox[1], "Second Channel"); + frontend_set_signal(channel_button[1], "clicked", signal_show, 1); + widgets.stereo_status[1] = frontend_create_label(channel_vbox[1], "unused / inactive"); + } + } + } + button_box[1] = frontend_create_box(HBBOX, vbox, "Button Box", ATTACH_TO_BOX); + { + + revert_button = frontend_create_button(button_box[1], "Revert All"); + frontend_set_signal(revert_button, "clicked", signal_revert, 2); + save_button = frontend_create_button(button_box[1], "Save Settings"); + frontend_set_signal(save_button, "clicked", signal_save, 2); + close_button = frontend_create_button(button_box[1], "Close Windows"); + frontend_set_signal(close_button, "clicked", signal_hide, 2); + + } + } + } + config_set_widgets(2); + return window; +}