Commit 27a0ca6513dec8b4463103d9ad05da518dcd36b7
1 parent
18eb35eb
Exists in
master
and in
1 other branch
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 | } | ... | ... |