Implementing tabbed controls

This commit is contained in:
Pierre Pronchery 2012-03-08 08:02:27 +00:00
parent 4b41aac022
commit 76e05c98af
3 changed files with 57 additions and 26 deletions

View File

@ -41,8 +41,9 @@
/* usage */ /* usage */
static int _usage(void) static int _usage(void)
{ {
fputs(_("Usage: mixer [-H|-V][-d device]\n" fputs(_("Usage: mixer [-H|-T|-V][-d device]\n"
" -H Show the classes next to each other\n" " -H Show the classes next to each other\n"
" -V Show the classes in separate tabs\n"
" -V Show the classes on top of each other\n" " -V Show the classes on top of each other\n"
" -d The mixer device to use\n"), stderr); " -d The mixer device to use\n"), stderr);
return 1; return 1;
@ -54,20 +55,23 @@ int main(int argc, char * argv[])
{ {
int o; int o;
char const * device = NULL; char const * device = NULL;
MixerOrientation mo = MO_HORIZONTAL; MixerLayout ml = ML_TABBED;
Mixer * mixer; Mixer * mixer;
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR); bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE); textdomain(PACKAGE);
while((o = getopt(argc, argv, "HVd:")) != -1) while((o = getopt(argc, argv, "HTVd:")) != -1)
switch(o) switch(o)
{ {
case 'H': case 'H':
mo = MO_HORIZONTAL; ml = ML_HORIZONTAL;
break;
case 'T':
ml = ML_TABBED;
break; break;
case 'V': case 'V':
mo = MO_VERTICAL; ml = ML_VERTICAL;
break; break;
case 'd': case 'd':
device = optarg; device = optarg;
@ -78,7 +82,7 @@ int main(int argc, char * argv[])
if(optind != argc) if(optind != argc)
return _usage(); return _usage();
gtk_init(&argc, &argv); gtk_init(&argc, &argv);
if((mixer = mixer_new(device, mo)) == NULL) if((mixer = mixer_new(device, ml)) == NULL)
return 2; return 2;
gtk_main(); gtk_main();
mixer_delete(mixer); mixer_delete(mixer);

View File

@ -87,6 +87,7 @@ struct _Mixer
{ {
/* widgets */ /* widgets */
GtkWidget * window; GtkWidget * window;
GtkWidget * notebook;
GtkWidget * properties; GtkWidget * properties;
GtkWidget * about; GtkWidget * about;
@ -202,16 +203,16 @@ static GtkWidget * _new_set(Mixer * mixer, int dev, struct audio_mixer_set * s);
#endif #endif
static GtkWidget * _new_value(Mixer * mixer, int index); static GtkWidget * _new_value(Mixer * mixer, int index);
Mixer * mixer_new(char const * device, MixerOrientation orientation) Mixer * mixer_new(char const * device, MixerLayout layout)
{ {
Mixer * mixer; Mixer * mixer;
GtkAccelGroup * accel; GtkAccelGroup * accel;
GtkSizeGroup * group; GtkSizeGroup * group;
GtkWidget * scrolled; GtkWidget * scrolled = NULL;
GtkWidget * vbox; GtkWidget * vbox;
GtkWidget * label; GtkWidget * label;
GtkWidget * widget; GtkWidget * widget;
GtkWidget * hvbox; GtkWidget * hvbox = NULL;
GtkWidget * hbox; GtkWidget * hbox;
GtkWidget * control; GtkWidget * control;
int i; int i;
@ -258,12 +259,6 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
gtk_window_set_title(GTK_WINDOW(mixer->window), PACKAGE); gtk_window_set_title(GTK_WINDOW(mixer->window), PACKAGE);
g_signal_connect_swapped(G_OBJECT(mixer->window), "delete-event", g_signal_connect_swapped(G_OBJECT(mixer->window), "delete-event",
G_CALLBACK(on_closex), mixer); G_CALLBACK(on_closex), mixer);
scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
GTK_POLICY_AUTOMATIC, orientation == MO_VERTICAL
? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled),
GTK_SHADOW_NONE);
vbox = gtk_vbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0);
#ifndef EMBEDDED #ifndef EMBEDDED
/* menubar */ /* menubar */
@ -273,11 +268,25 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
desktop_accel_create(_mixer_accel, mixer, accel); desktop_accel_create(_mixer_accel, mixer, accel);
#endif #endif
/* classes */ /* classes */
if(orientation == MO_VERTICAL) mixer->notebook = NULL;
hvbox = gtk_vbox_new(TRUE, 4); if(layout == ML_TABBED)
mixer->notebook = gtk_notebook_new();
else else
hvbox = gtk_hbox_new(FALSE, 4); {
gtk_container_set_border_width(GTK_CONTAINER(hvbox), 4); scrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
GTK_POLICY_AUTOMATIC, (layout == ML_VERTICAL)
? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER);
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(
scrolled), GTK_SHADOW_NONE);
if(layout == ML_VERTICAL)
hvbox = gtk_vbox_new(TRUE, 4);
else
hvbox = gtk_hbox_new(FALSE, 4);
gtk_container_set_border_width(GTK_CONTAINER(hvbox), 4);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(
scrolled), hvbox);
}
for(i = 0;; i++) for(i = 0;; i++)
{ {
#ifdef AUDIO_MIXER_DEVINFO #ifdef AUDIO_MIXER_DEVINFO
@ -304,8 +313,6 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
break; break;
#endif #endif
} }
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled),
hvbox);
/* controls */ /* controls */
for(i = 0;; i++) for(i = 0;; i++)
{ {
@ -347,8 +354,16 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
{ {
mixer->mc[u].hbox = gtk_hbox_new(FALSE, 4); mixer->mc[u].hbox = gtk_hbox_new(FALSE, 4);
hbox = mixer->mc[u].hbox; hbox = mixer->mc[u].hbox;
gtk_box_pack_start(GTK_BOX(hvbox), hbox, FALSE, TRUE, if(mixer->notebook != NULL)
0); {
/* FIXME nicer tab labels */
gtk_notebook_append_page(GTK_NOTEBOOK(
mixer->notebook), hbox,
NULL);
}
else if(hvbox != NULL)
gtk_box_pack_start(GTK_BOX(hvbox), hbox, FALSE,
TRUE, 0);
} }
gtk_size_group_add_widget(group, widget); gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
@ -387,7 +402,11 @@ Mixer * mixer_new(char const * device, MixerOrientation orientation)
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
#endif #endif
} }
gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); if(mixer->notebook != NULL)
gtk_box_pack_start(GTK_BOX(vbox), mixer->notebook, TRUE, TRUE,
0);
else
gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(mixer->window), vbox); gtk_container_add(GTK_CONTAINER(mixer->window), vbox);
gtk_widget_show_all(vbox); gtk_widget_show_all(vbox);
#ifdef AUDIO_MIXER_DEVINFO #ifdef AUDIO_MIXER_DEVINFO
@ -874,6 +893,9 @@ void mixer_show_class(Mixer * mixer, char const * name)
#ifdef AUDIO_MIXER_DEVINFO #ifdef AUDIO_MIXER_DEVINFO
size_t u; size_t u;
if(mixer->notebook != NULL)
/* FIXME really implement */
name = NULL;
for(u = 0; u < mixer->mc_cnt; u++) for(u = 0; u < mixer->mc_cnt; u++)
if(mixer->mc[u].hbox == NULL) if(mixer->mc[u].hbox == NULL)
continue; continue;

View File

@ -23,13 +23,18 @@
/* Mixer */ /* Mixer */
/* types */ /* types */
typedef enum _MixerOrientation { MO_HORIZONTAL, MO_VERTICAL } MixerOrientation; typedef enum _MixerLayout
{
ML_HORIZONTAL,
ML_TABBED,
ML_VERTICAL
} MixerLayout;
typedef struct _Mixer Mixer; typedef struct _Mixer Mixer;
/* functions */ /* functions */
Mixer * mixer_new(char const * device, MixerOrientation orientation); Mixer * mixer_new(char const * device, MixerLayout layout);
void mixer_delete(Mixer * mixer); void mixer_delete(Mixer * mixer);
/* accessors */ /* accessors */