1/*
2 * This file Copyright (C) Mnemosyne LLC
3 *
4 * This file is licensed by the GPL version 2. Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id: hig.c 13388 2012-07-14 19:26:55Z jordan $
11 */
12
13#include <gtk/gtk.h>
14#include "hig.h"
15
16GtkWidget*
17hig_workarea_create( void )
18{
19    GtkWidget * grid = gtk_grid_new( );
20
21    gtk_container_set_border_width( GTK_CONTAINER( grid ), GUI_PAD_BIG );
22    gtk_grid_set_row_spacing( GTK_GRID( grid ), GUI_PAD );
23    gtk_grid_set_column_spacing( GTK_GRID( grid ), GUI_PAD_BIG );
24
25    return grid;
26}
27
28void
29hig_workarea_add_section_divider( GtkWidget * t, guint * row )
30{
31    GtkWidget * w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
32
33    gtk_widget_set_size_request( w, 0u, 6u );
34    gtk_grid_attach( GTK_GRID( t ), w, 0, *row, 2, 1 );
35    ++ * row;
36}
37
38void
39hig_workarea_add_section_title_widget( GtkWidget * t, guint * row, GtkWidget * w )
40{
41    gtk_widget_set_hexpand( w, TRUE );
42    gtk_grid_attach( GTK_GRID( t ), w, 0, *row, 2, 1 );
43    ++ * row;
44}
45
46void
47hig_workarea_add_section_title( GtkWidget *  t, guint * row, const char * section_title )
48{
49    char buf[512];
50    GtkWidget * l;
51
52    g_snprintf( buf, sizeof( buf ), "<b>%s</b>", section_title );
53    l = gtk_label_new( buf );
54    gtk_misc_set_alignment( GTK_MISC( l ), 0.0f, 0.5f );
55    gtk_label_set_use_markup( GTK_LABEL( l ), TRUE );
56    hig_workarea_add_section_title_widget( t, row, l );
57}
58
59void
60hig_workarea_add_wide_control( GtkWidget * t, guint * row, GtkWidget * w )
61{
62    gtk_widget_set_hexpand( w, TRUE );
63    gtk_widget_set_margin_left( w, 18 );
64    gtk_grid_attach( GTK_GRID( t ), w, 0, *row, 2, 1 );
65    ++ * row;
66}
67void
68hig_workarea_add_wide_tall_control( GtkWidget * t, guint * row, GtkWidget * w )
69{
70    gtk_widget_set_hexpand( w, TRUE );
71    hig_workarea_add_wide_control( t, row, w );
72}
73
74GtkWidget *
75hig_workarea_add_wide_checkbutton( GtkWidget  * t,
76                                   guint      * row,
77                                   const char * mnemonic_string,
78                                   gboolean     is_active )
79{
80    GtkWidget * w = gtk_check_button_new_with_mnemonic( mnemonic_string );
81
82    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), is_active );
83    hig_workarea_add_wide_control( t, row, w );
84    return w;
85}
86
87void
88hig_workarea_add_label_w( GtkWidget * t, guint row, GtkWidget * w )
89{
90    gtk_widget_set_margin_left( w, 18 );
91    if( GTK_IS_MISC( w ) )
92        gtk_misc_set_alignment( GTK_MISC( w ), 0.0f, 0.5f );
93    if( GTK_IS_LABEL( w ) )
94        gtk_label_set_use_markup( GTK_LABEL( w ), TRUE );
95    gtk_grid_attach( GTK_GRID( t ), w, 0, row, 1, 1 );
96}
97
98static void
99hig_workarea_add_tall_control( GtkWidget * t, guint row, GtkWidget * control )
100{
101    if( GTK_IS_MISC( control ) )
102        gtk_misc_set_alignment( GTK_MISC( control ), 0.0f, 0.5f );
103
104    g_object_set( control, "expand", TRUE, NULL );
105    gtk_grid_attach( GTK_GRID( t ), control, 1, row, 1, 1 );
106}
107
108static void
109hig_workarea_add_control( GtkWidget * t, guint row, GtkWidget * control )
110{
111    if( GTK_IS_MISC( control ) )
112        gtk_misc_set_alignment( GTK_MISC( control ), 0.0f, 0.5f );
113
114    gtk_widget_set_hexpand( control, TRUE );
115    gtk_grid_attach( GTK_GRID( t ), control, 1, row, 1, 1 );
116}
117
118void
119hig_workarea_add_row_w( GtkWidget * t,
120                        guint     * row,
121                        GtkWidget * label,
122                        GtkWidget * control,
123                        GtkWidget * mnemonic )
124{
125    hig_workarea_add_label_w( t, *row, label );
126    hig_workarea_add_control( t, *row, control );
127    if( GTK_IS_LABEL( label ) )
128        gtk_label_set_mnemonic_widget( GTK_LABEL( label ),
129                                       mnemonic ? mnemonic : control );
130    ++ * row;
131}
132
133GtkWidget*
134hig_workarea_add_row( GtkWidget  * t,
135                      guint      * row,
136                      const char * mnemonic_string,
137                      GtkWidget  * control,
138                      GtkWidget  * mnemonic )
139{
140    GtkWidget * l = gtk_label_new_with_mnemonic( mnemonic_string );
141
142    hig_workarea_add_row_w( t, row, l, control, mnemonic );
143    return l;
144}
145
146GtkWidget*
147hig_workarea_add_tall_row( GtkWidget  * table,
148                           guint      * row,
149                           const char * mnemonic_string,
150                           GtkWidget  * control,
151                           GtkWidget  * mnemonic )
152{
153    GtkWidget * l = gtk_label_new_with_mnemonic( mnemonic_string );
154    GtkWidget * h = gtk_box_new( GTK_ORIENTATION_HORIZONTAL, 0 );
155    GtkWidget * v = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0 );
156    gtk_box_pack_start( GTK_BOX( h ), l, FALSE, FALSE, 0 );
157    gtk_box_pack_start( GTK_BOX( v ), h, FALSE, FALSE, GUI_PAD_SMALL );
158
159    hig_workarea_add_label_w( table, *row, v );
160    hig_workarea_add_tall_control( table, *row, control );
161
162    if( GTK_IS_LABEL( l ) )
163        gtk_label_set_mnemonic_widget( GTK_LABEL( l ),
164                                       mnemonic ? mnemonic : control );
165
166    ++ * row;
167    return l;
168}
169