Commit 27a0ca6513dec8b4463103d9ad05da518dcd36b7

Authored by Perry Werneck
1 parent 18eb35eb
Exists in master and in 1 other branch develop

Implementing font chooser widget.

Showing 1 changed file with 93 additions and 9 deletions   Show diff stats
src/dialogs/font/chooser.c
... ... @@ -38,6 +38,7 @@
38 38 #include <v3270/dialogs.h>
39 39 #include <v3270/settings.h>
40 40 #include <lib3270/log.h>
  41 + #include <terminal.h>
41 42  
42 43 /*--[ Widget definition ]----------------------------------------------------------------------------*/
43 44  
... ... @@ -55,6 +56,10 @@
55 56 GtkWidget * font_list;
56 57 GtkWidget * preview;
57 58  
  59 + struct {
  60 + cairo_font_face_t * face;
  61 + } font;
  62 +
58 63 } V3270FontChooserWidget;
59 64  
60 65 typedef struct _V3270HostSelectWidgetClass
... ... @@ -97,10 +102,24 @@ static void load(GtkWidget *widget, GtkWidget *terminal)
97 102  
98 103 }
99 104  
  105 +static void dispose(GObject *object)
  106 +{
  107 + V3270FontChooserWidget * widget = GTK_V3270_FONT_CHOOSER(object);
  108 +
  109 + if(widget->font.face) {
  110 + cairo_font_face_destroy(widget->font.face);
  111 + widget->font.face = NULL;
  112 + }
  113 +
  114 + G_OBJECT_CLASS(V3270FontChooserWidget_parent_class)->dispose(object);
  115 +}
  116 +
100 117 static void V3270FontChooserWidget_class_init(V3270FontChooserWidgetClass *klass)
101 118 {
102 119 V3270SettingsClass * widget = GTK_V3270_SETTINGS_CLASS(klass);
103 120  
  121 + G_OBJECT_CLASS(klass)->dispose = dispose;
  122 +
104 123 widget->apply = apply;
105 124 widget->load = load;
106 125  
... ... @@ -122,11 +141,71 @@ static void V3270FontChooserWidget_class_init(V3270FontChooserWidgetClass *klass
122 141 // Update terminal widget
123 142 GtkWidget * terminal = v3270_settings_get_terminal_widget(GTK_WIDGET(widget));
124 143 if(terminal)
  144 + {
125 145 v3270_set_font_family(terminal,g_value_get_string(&value));
  146 + gtk_widget_queue_draw(widget->preview);
  147 + }
  148 +
  149 + // Update font
  150 +
  151 + widget->font.face = cairo_toy_font_face_create(g_value_get_string(&value), CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
126 152  
127 153 g_value_unset(&value);
128 154 }
129 155  
  156 + static gboolean draw_preview(GtkWidget *widget, cairo_t *cr, V3270FontChooserWidget *chooser) {
  157 +
  158 + GtkWidget * t = v3270_settings_get_terminal_widget(GTK_WIDGET(chooser));
  159 +
  160 + if(!t)
  161 + return TRUE;
  162 +
  163 + v3270 * terminal = GTK_V3270(t);
  164 + guint width = gtk_widget_get_allocated_width (widget);
  165 + guint height = gtk_widget_get_allocated_height (widget);
  166 +
  167 + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_BACKGROUND);
  168 + cairo_rectangle(cr, 0, 0, width, height);
  169 + cairo_fill(cr);
  170 + cairo_stroke(cr);
  171 +
  172 + if(chooser->font.face) {
  173 +
  174 + debug("%s",__FUNCTION__);
  175 +
  176 + cairo_set_font_face(cr,chooser->font.face);
  177 + cairo_set_font_size(cr,15);
  178 +
  179 + cairo_font_extents_t extents;
  180 + cairo_font_extents(cr,&extents);
  181 +
  182 + double spacing = extents.height + extents.descent;
  183 + double row = spacing;
  184 +
  185 + static const enum V3270_COLOR colors[] = {
  186 + V3270_COLOR_FIELD,
  187 + V3270_COLOR_FIELD_INTENSIFIED,
  188 + V3270_COLOR_FIELD_PROTECTED_INTENSIFIED
  189 + };
  190 +
  191 + size_t ix;
  192 +
  193 + for(ix = 0; ix < G_N_ELEMENTS(colors); ix++) {
  194 +
  195 + cairo_move_to(cr,0,row);
  196 + gdk_cairo_set_source_rgba(cr,terminal->color+colors[ix]);
  197 + cairo_show_text(cr,pango_language_get_sample_string(NULL));
  198 +
  199 + row += spacing;
  200 + }
  201 +
  202 + }
  203 +
  204 + cairo_stroke(cr);
  205 +
  206 + return FALSE;
  207 +}
  208 +
130 209 static void V3270FontChooserWidget_init(V3270FontChooserWidget *widget)
131 210 {
132 211 gtk_widget_set_size_request(GTK_WIDGET(widget),-1,136);
... ... @@ -161,19 +240,24 @@ static void V3270FontChooserWidget_init(V3270FontChooserWidget *widget)
161 240 gtk_grid_attach(GTK_GRID(widget),box,0,0,1,5);
162 241 }
163 242  
164   - // Add preview widgets
  243 + // Add preview widget
165 244 {
166   - widget->preview = gtk_entry_new();
167   - gtk_entry_set_text(GTK_ENTRY(widget->preview),pango_language_get_sample_string(NULL));
  245 + GtkWidget * frame = gtk_frame_new (NULL);
  246 + gtk_frame_set_shadow_type(GTK_FRAME (frame), GTK_SHADOW_IN);
  247 + gtk_widget_set_vexpand(frame,TRUE);
  248 + gtk_widget_set_hexpand(frame,TRUE);
168 249  
169   - gtk_widget_set_can_default(widget->preview,FALSE);
170   - gtk_widget_set_can_focus(widget->preview,FALSE);
171   - gtk_editable_set_editable(GTK_EDITABLE(widget->preview),FALSE);
172   -
173   - gtk_widget_set_vexpand(widget->preview,FALSE);
  250 + widget->preview = gtk_drawing_area_new();
  251 + gtk_widget_set_vexpand(widget->preview,TRUE);
174 252 gtk_widget_set_hexpand(widget->preview,TRUE);
175 253  
176   - gtk_grid_attach(GTK_GRID(widget),widget->preview,1,0,5,1);
  254 + gtk_widget_set_size_request(widget->preview,400,-1);
  255 +
  256 + g_signal_connect(widget->preview, "draw", G_CALLBACK(draw_preview), widget);
  257 +
  258 + gtk_container_add(GTK_CONTAINER (frame), widget->preview);
  259 +
  260 + gtk_grid_attach(GTK_GRID(widget),frame,1,0,5,3);
177 261 }
178 262  
179 263 }
... ...