gtkfontchooser.c 12 KB
Newer Older
1
/* GTK - The GIMP Toolkit
2 3 4
 * gtkfontchooser.c - Abstract interface for font file selectors GUIs
 *
 * Copyright (C) 2006, Emmanuele Bassi
5
 * Copyright (C) 2011 Alberto Ruiz <aruiz@gnome.org>
6 7 8 9 10 11 12 13 14 15 16 17
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
Javier Jardón's avatar
Javier Jardón committed
18
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 20 21 22
 */

#include "config.h"

23
#include "gtkfontchooser.h"
24
#include "gtkfontchooserprivate.h"
25
#include "gtkintl.h"
26
#include "gtktypebuiltins.h"
27 28 29
#include "gtkprivate.h"

/**
30
 * SECTION:gtkfontchooser
31
 * @Short_description: Interface implemented by widgets displaying fonts
32
 * @Title: GtkFontChooser
33
 * @See_also: #GtkFontChooserDialog, #GtkFontChooserWidget, #GtkFontButton
34
 *
35 36 37 38
 * #GtkFontChooser is an interface that can be implemented by widgets
 * displaying the list of fonts.  In GTK+, the main objects
 * that implement this interface are #GtkFontChooserWidget,
 * #GtkFontChooserDialog and #GtkFontButton.
39 40
 *
 * Since: 3.2
41 42
 */

43
enum
44
{
45
  SIGNAL_FONT_ACTIVATED,
46
  LAST_SIGNAL
47 48
};

49
static guint chooser_signals[LAST_SIGNAL];
50

51 52
typedef GtkFontChooserIface GtkFontChooserInterface;
G_DEFINE_INTERFACE (GtkFontChooser, gtk_font_chooser, G_TYPE_OBJECT);
53 54

static void
55 56
gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
{
57 58 59 60 61
  /**
   * GtkFontChooser:font:
   *
   * The font description as a string, e.g. "Sans Italic 12".
   */
62 63
  g_object_interface_install_property
     (iface,
64 65
      g_param_spec_string ("font",
                          P_("Font"),
66 67 68 69 70 71 72 73 74 75 76 77
                           P_("Font description as a string, e.g. \"Sans Italic 12\""),
                           GTK_FONT_CHOOSER_DEFAULT_FONT_NAME,
                           GTK_PARAM_READWRITE));

  /**
   * GtkFontChooser:font-desc:
   *
   * The font description as a #PangoFontDescription.
   */
  g_object_interface_install_property
     (iface,
      g_param_spec_boxed ("font-desc",
78
                          P_("Font description"),
79 80
                          P_("Font description as a PangoFontDescription struct"),
                          PANGO_TYPE_FONT_DESCRIPTION,
81 82
                          GTK_PARAM_READWRITE));

83 84 85 86 87
  /**
   * GtkFontChooser:preview-text:
   *
   * The string with which to preview the font.
   */
88 89 90 91 92 93 94 95
  g_object_interface_install_property
     (iface,
      g_param_spec_string ("preview-text",
                          P_("Preview text"),
                          P_("The text to display in order to demonstrate the selected font"),
                          pango_language_get_sample_string (NULL),
                          GTK_PARAM_READWRITE));

96 97 98 99 100
  /**
   * GtkFontChooser:show-preview-entry:
   *
   * Whether to show an entry to change the preview text.
   */
101 102 103 104 105 106 107
  g_object_interface_install_property
     (iface,
      g_param_spec_boolean ("show-preview-entry",
                          P_("Show preview text entry"),
                          P_("Whether the preview text entry is shown or not"),
                          TRUE,
                          GTK_PARAM_READWRITE));
108

109
  /**
Matthias Clasen's avatar
Matthias Clasen committed
110
   * GtkFontChooser::font-activated:
111 112 113
   * @self: the object which received the signal
   * @fontname: the font name
   *
Matthias Clasen's avatar
Matthias Clasen committed
114
   * Emitted when a font is activated.
115 116 117
   * This usually happens when the user double clicks an item,
   * or an item is selected and the user presses one of the keys
   * Space, Shift+Space, Return or Enter.
118 119
    */
  chooser_signals[SIGNAL_FONT_ACTIVATED] =
120 121 122
    g_signal_new ("font-activated",
                  GTK_TYPE_FONT_CHOOSER,
                  G_SIGNAL_RUN_FIRST,
123
                  G_STRUCT_OFFSET (GtkFontChooserIface, font_activated),
124 125 126 127
                  NULL, NULL,
                  NULL,
                  G_TYPE_NONE,
                  1, G_TYPE_STRING);
128 129 130
}

/**
131
 * gtk_font_chooser_get_font_family:
132
 * @fontchooser: a #GtkFontChooser
133 134
 *
 * Gets the #PangoFontFamily representing the selected font family.
135
 * Font families are a collection of font faces.
136
 *
137 138
 * If the selected font is not installed, returns %NULL.
 *
139
 * Return value: (transfer none): A #PangoFontFamily representing the
140
 *     selected font family, or %NULL. The returned object is owned by @fontchooser
141
 *     and must not be modified or freed.
142
 *
143
 * Since: 3.2
144 145
 */
PangoFontFamily *
146
gtk_font_chooser_get_font_family (GtkFontChooser *fontchooser)
147
{
148
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
149

150
  return GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_family (fontchooser);
151 152 153
}

/**
154
 * gtk_font_chooser_get_font_face:
155
 * @fontchooser: a #GtkFontChooser
156 157 158 159
 *
 * Gets the #PangoFontFace representing the selected font group
 * details (i.e. family, slant, weight, width, etc).
 *
160 161
 * If the selected font is not installed, returns %NULL.
 *
162
 * Return value: (transfer none): A #PangoFontFace representing the
163
 *     selected font group details, or %NULL. The returned object is owned by
164
 *     @fontchooser and must not be modified or freed.
165
 *
166
 * Since: 3.2
167 168
 */
PangoFontFace *
169
gtk_font_chooser_get_font_face (GtkFontChooser *fontchooser)
170
{
171
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
172

173
  return GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_face (fontchooser);
174 175 176
}

/**
177
 * gtk_font_chooser_get_font_size:
178
 * @fontchooser: a #GtkFontChooser
179 180 181 182 183 184
 *
 * The selected font size.
 *
 * Return value: A n integer representing the selected font size,
 *     or -1 if no font size is selected.
 *
185
 * Since: 3.2
Matthias Clasen's avatar
Matthias Clasen committed
186
 */
187
gint
188
gtk_font_chooser_get_font_size (GtkFontChooser *fontchooser)
189
{
190
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), -1);
191

192
  return GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_size (fontchooser);
193 194 195
}

/**
196
 * gtk_font_chooser_get_font:
197
 * @fontchooser: a #GtkFontChooser
198
 *
199 200 201
 * Gets the currently-selected font name.
 *
 * Note that this can be a different string than what you set with
202
 * gtk_font_chooser_set_font(), as the font chooser widget may
203
 * normalize font names and thus return a string with a different
204 205
 * structure. For example, “Helvetica Italic Bold 12” could be
 * normalized to “Helvetica Bold Italic 12”.
206 207 208 209 210 211 212
 *
 * Use pango_font_description_equal() if you want to compare two
 * font descriptions.
 *
 * Return value: (transfer full) (allow-none): A string with the name
 *     of the current font, or %NULL if  no font is selected. You must
 *     free this string with g_free().
213 214
 *
 * Since: 3.2
215 216
 */
gchar *
217
gtk_font_chooser_get_font (GtkFontChooser *fontchooser)
218
{
219 220
  gchar *fontname;

221
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
222

223 224 225 226
  g_object_get (fontchooser, "font", &fontname, NULL);


  return fontname;
227 228 229
}

/**
230
 * gtk_font_chooser_set_font:
231
 * @fontchooser: a #GtkFontChooser
232
 * @fontname: a font name like “Helvetica 12” or “Times Bold 18”
233
 *
234 235
 * Sets the currently-selected font.
 *
236
 * Since: 3.2
237
 */
238
void
239 240
gtk_font_chooser_set_font (GtkFontChooser *fontchooser,
                           const gchar    *fontname)
241
{
242 243
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
  g_return_if_fail (fontname != NULL);
244

245
  g_object_set (fontchooser, "font", fontname, NULL);
246 247
}

248 249 250 251 252 253 254 255 256
/**
 * gtk_font_chooser_get_font_desc:
 * @fontchooser: a #GtkFontChooser
 *
 * Gets the currently-selected font.
 *
 * Note that this can be a different string than what you set with
 * gtk_font_chooser_set_font(), as the font chooser widget may
 * normalize font names and thus return a string with a different
257 258
 * structure. For example, “Helvetica Italic Bold 12” could be
 * normalized to “Helvetica Bold Italic 12”.
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
 *
 * Use pango_font_description_equal() if you want to compare two
 * font descriptions.
 *
 * Return value: (transfer full) (allow-none): A #PangoFontDescription for the
 *     current font, or %NULL if  no font is selected.
 *
 * Since: 3.2
 */
PangoFontDescription *
gtk_font_chooser_get_font_desc (GtkFontChooser *fontchooser)
{
  PangoFontDescription *font_desc;

  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);

  g_object_get (fontchooser, "font-desc", &font_desc, NULL);

  return font_desc;
}

/**
 * gtk_font_chooser_set_font_desc:
 * @fontchooser: a #GtkFontChooser
 * @font_desc: a #PangoFontDescription
 *
 * Sets the currently-selected font from @font_desc.
 *
 * Since: 3.2
 */
void
gtk_font_chooser_set_font_desc (GtkFontChooser             *fontchooser,
                                const PangoFontDescription *font_desc)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
  g_return_if_fail (font_desc != NULL);

  g_object_set (fontchooser, "font-desc", font_desc, NULL);
}

299
/**
300 301
 * gtk_font_chooser_get_preview_text:
 * @fontchooser: a #GtkFontChooser
302 303
 *
 * Gets the text displayed in the preview area.
304
 *
305 306
 * Return value: (transfer full): the text displayed in the
 *     preview area
307 308
 *
 * Since: 3.2
309
 */
310
gchar *
311
gtk_font_chooser_get_preview_text (GtkFontChooser *fontchooser)
312
{
313 314
  char *text;

315
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
316

317
  g_object_get (fontchooser, "preview-text", &text, NULL);
318

319 320
  return text;
}
321 322

/**
323 324
 * gtk_font_chooser_set_preview_text:
 * @fontchooser: a #GtkFontChooser
325
 * @text: (transfer none): the text to display in the preview area
326 327 328
 *
 * Sets the text displayed in the preview area.
 * The @text is used to show how the selected font looks.
329 330
 *
 * Since: 3.2
331 332
 */
void
333 334
gtk_font_chooser_set_preview_text (GtkFontChooser *fontchooser,
                                   const gchar    *text)
335
{
336
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
337 338
  g_return_if_fail (text != NULL);

339
  g_object_set (fontchooser, "preview-text", text, NULL);
340 341
}

342
/**
343 344
 * gtk_font_chooser_get_show_preview_entry:
 * @fontchooser: a #GtkFontChooser
345
 *
346 347 348 349 350
 * Returns whether the preview entry is shown or not.
 *
 * Return value: %TRUE if the preview entry is shown
 *     or %FALSE if it is hidden.
 *
351 352 353
 * Since: 3.2
 */
gboolean
354
gtk_font_chooser_get_show_preview_entry (GtkFontChooser *fontchooser)
355
{
356 357
  gboolean show;

358
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), FALSE);
359

360 361 362
  g_object_get (fontchooser, "show-preview-entry", &show, NULL);

  return show;
363 364 365
}

/**
366 367
 * gtk_font_chooser_set_show_preview_entry:
 * @fontchooser: a #GtkFontChooser
368 369 370
 * @show_preview_entry: whether to show the editable preview entry or not
 *
 * Shows or hides the editable preview entry.
371
 *
372 373 374
 * Since: 3.2
 */
void
375
gtk_font_chooser_set_show_preview_entry (GtkFontChooser *fontchooser,
376
                                         gboolean        show_preview_entry)
377
{
378
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
379

380 381
  show_preview_entry = show_preview_entry != FALSE;
  g_object_set (fontchooser, "show-preview-entry", show_preview_entry, NULL);
382
}
383 384 385 386 387

/**
 * gtk_font_chooser_set_filter_func:
 * @fontchooser: a #GtkFontChooser
 * @filter: (allow-none): a #GtkFontFilterFunc, or %NULL
388
 * @user_data: data to pass to @filter
389 390 391 392 393 394 395 396 397 398
 * @destroy: function to call to free @data when it is no longer needed
 *
 * Adds a filter function that decides which fonts to display
 * in the font chooser.
 *
 * Since: 3.2
 */
void
gtk_font_chooser_set_filter_func (GtkFontChooser   *fontchooser,
                                  GtkFontFilterFunc filter,
399
                                  gpointer          user_data,
400 401 402 403
                                  GDestroyNotify    destroy)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));

404 405 406 407 408
  GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->set_filter_func (fontchooser,
                                                             filter,
                                                             user_data,
                                                             destroy);
}
409

410 411 412 413 414
void
_gtk_font_chooser_font_activated (GtkFontChooser *chooser,
                                  const gchar    *fontname)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (chooser));
415

416
  g_signal_emit (chooser, chooser_signals[SIGNAL_FONT_ACTIVATED], 0, fontname);
417
}