summaryrefslogtreecommitdiff
path: root/gtk/gtkprogressbar.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2004-10-31 04:36:50 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2004-10-31 04:36:50 +0000
commit19fad93243ee3716a3133d3d7c63f9ef8a101584 (patch)
tree533e0d26b3ef380ab2c006bce1be5cba7bd9cdca /gtk/gtkprogressbar.c
parent819e36e5cbc5904378d963eb78a112eaf708832e (diff)
downloadgtk+-19fad93243ee3716a3133d3d7c63f9ef8a101584.tar.gz
Add an ellipsize property with getter and setter. (#156845, Morten
2004-10-31 Matthias Clasen <mclasen@redhat.com> * gtk/gtkprogressbar.[hc]: Add an ellipsize property with getter and setter. (#156845, Morten Welinder)
Diffstat (limited to 'gtk/gtkprogressbar.c')
-rw-r--r--gtk/gtkprogressbar.c125
1 files changed, 111 insertions, 14 deletions
diff --git a/gtk/gtkprogressbar.c b/gtk/gtkprogressbar.c
index e21df6b5f4..fd241a074b 100644
--- a/gtk/gtkprogressbar.c
+++ b/gtk/gtkprogressbar.c
@@ -54,6 +54,7 @@ enum {
PROP_PULSE_STEP,
PROP_ORIENTATION,
PROP_TEXT,
+ PROP_ELLIPSIZE,
/* Deprecated args */
PROP_ADJUSTMENT,
@@ -221,6 +222,29 @@ gtk_progress_bar_class_init (GtkProgressBarClass *class)
"%P %%",
G_PARAM_READWRITE));
+ /**
+ * GtkProgressBar:ellipsize:
+ *
+ * The preferred place to ellipsize the string, if the progressbar does
+ * not have enough room to display the entire string, specified as a
+ * #PangoEllisizeMode.
+ *
+ * Note that setting this property to a value other than
+ * %PANGO_ELLIPSIZE_NONE has the side-effect that the progressbar requests
+ * only enough space to display the ellipsis "...". Another means to set a
+ * progressbar's width is gtk_widget_set_size_request().
+ *
+ * Since: 2.6
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_ELLIPSIZE,
+ g_param_spec_enum ("ellipsize",
+ P_("Ellipsize"),
+ P_("The preferred place to ellipsize the string, if the progressbar does not have enough room to display the entire string, if at all"),
+ PANGO_TYPE_ELLIPSIZE_MODE,
+ PANGO_ELLIPSIZE_NONE,
+ G_PARAM_READWRITE));
+
}
static void
@@ -235,6 +259,7 @@ gtk_progress_bar_init (GtkProgressBar *pbar)
pbar->activity_dir = 1;
pbar->activity_step = 3;
pbar->activity_blocks = 5;
+ pbar->ellipsize = PANGO_ELLIPSIZE_NONE;
}
static void
@@ -277,6 +302,9 @@ gtk_progress_bar_set_property (GObject *object,
case PROP_TEXT:
gtk_progress_bar_set_text (pbar, g_value_get_string (value));
break;
+ case PROP_ELLIPSIZE:
+ gtk_progress_bar_set_ellipsize (pbar, g_value_get_enum (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -322,6 +350,9 @@ gtk_progress_bar_get_property (GObject *object,
case PROP_TEXT:
g_value_set_string (value, gtk_progress_bar_get_text (pbar));
break;
+ case PROP_ELLIPSIZE:
+ g_value_set_enum (value, pbar->ellipsize);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -462,6 +493,7 @@ gtk_progress_bar_size_request (GtkWidget *widget,
gchar *buf;
PangoRectangle logical_rect;
PangoLayout *layout;
+ gint width, height;
g_return_if_fail (GTK_IS_PROGRESS_BAR (widget));
g_return_if_fail (requisition != NULL);
@@ -469,6 +501,9 @@ gtk_progress_bar_size_request (GtkWidget *widget,
progress = GTK_PROGRESS (widget);
pbar = GTK_PROGRESS_BAR (widget);
+ width = 2 * widget->style->xthickness + 3 + 2 * TEXT_SPACING;
+ height = 2 * widget->style->ythickness + 3 + 2 * TEXT_SPACING;
+
if (progress->show_text && pbar->bar_style != GTK_PROGRESS_DISCRETE)
{
if (!progress->adjustment)
@@ -477,8 +512,29 @@ gtk_progress_bar_size_request (GtkWidget *widget,
buf = gtk_progress_get_text_from_value (progress, progress->adjustment->upper);
layout = gtk_widget_create_pango_layout (widget, buf);
+
pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
+ if (pbar->ellipsize)
+ {
+ PangoContext *context;
+ PangoFontMetrics *metrics;
+ gint char_width;
+
+ /* The minimum size for ellipsized text is ~ 3 chars */
+ context = pango_layout_get_context (layout);
+ metrics = pango_context_get_metrics (context, widget->style->font_desc, NULL);
+
+ char_width = pango_font_metrics_get_approximate_char_width (metrics);
+ pango_font_metrics_unref (metrics);
+
+ width += PANGO_PIXELS (char_width) * 3;
+ }
+ else
+ width += logical_rect.width;
+
+ height += logical_rect.height;
+
g_object_unref (layout);
g_free (buf);
}
@@ -488,13 +544,8 @@ gtk_progress_bar_size_request (GtkWidget *widget,
{
if (progress->show_text && pbar->bar_style != GTK_PROGRESS_DISCRETE)
{
- requisition->width = MAX (MIN_HORIZONTAL_BAR_WIDTH,
- 2 * widget->style->xthickness + 3 +
- logical_rect.width + 2 * TEXT_SPACING);
-
- requisition->height = MAX (MIN_HORIZONTAL_BAR_HEIGHT,
- 2 * widget->style->ythickness + 3 +
- logical_rect.height + 2 * TEXT_SPACING);
+ requisition->width = MAX (MIN_HORIZONTAL_BAR_WIDTH, width);
+ requisition->height = MAX (MIN_HORIZONTAL_BAR_HEIGHT, height);
}
else
{
@@ -506,13 +557,8 @@ gtk_progress_bar_size_request (GtkWidget *widget,
{
if (progress->show_text && pbar->bar_style != GTK_PROGRESS_DISCRETE)
{
- requisition->width = MAX (MIN_VERTICAL_BAR_WIDTH,
- 2 * widget->style->xthickness + 3 +
- logical_rect.width + 2 * TEXT_SPACING);
-
- requisition->height = MAX (MIN_VERTICAL_BAR_HEIGHT,
- 2 * widget->style->ythickness + 3 +
- logical_rect.height + 2 * TEXT_SPACING);
+ requisition->width = MAX (MIN_VERTICAL_BAR_WIDTH, width);
+ requisition->height = MAX (MIN_VERTICAL_BAR_HEIGHT, height);
}
else
{
@@ -737,6 +783,10 @@ gtk_progress_bar_paint_text (GtkProgressBar *pbar,
buf = gtk_progress_get_current_text (progress);
layout = gtk_widget_create_pango_layout (widget, buf);
+ pango_layout_set_ellipsize (layout, pbar->ellipsize);
+ if (pbar->ellipsize)
+ pango_layout_set_width (layout, widget->allocation.width * PANGO_SCALE);
+
pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
x = widget->style->xthickness + 1 +
@@ -1174,3 +1224,50 @@ gtk_progress_bar_set_activity_blocks (GtkProgressBar *pbar,
gtk_progress_bar_set_activity_blocks_internal (pbar, blocks);
}
+
+/**
+ * gtk_progress_bar_set_ellipsize:
+ * @pbar: a #GtkProgressBar
+ * @mode: a #PangoEllipsizeMode
+ *
+ * Sets the mode used to ellipsize (add an ellipsis: "...") the text
+ * if there is not enough space to render the entire string.
+ *
+ * Since: 2.6
+ **/
+void
+gtk_progress_bar_set_ellipsize (GtkProgressBar *pbar,
+ PangoEllipsizeMode mode)
+{
+ g_return_if_fail (GTK_IS_PROGRESS_BAR (pbar));
+ g_return_if_fail (mode >= PANGO_ELLIPSIZE_NONE &&
+ mode <= PANGO_ELLIPSIZE_END);
+
+ if ((PangoEllipsizeMode)pbar->ellipsize != mode)
+ {
+ pbar->ellipsize = mode;
+
+ g_object_notify (G_OBJECT (pbar), "ellipsize");
+ gtk_widget_queue_resize (GTK_WIDGET (pbar));
+ }
+}
+
+/**
+ * gtk_pgrogress_bar_get_ellipsize:
+ * @pbar: a #GtkProgressBar
+ *
+ * Returns the ellipsizing position of the progressbar.
+ * See gtk_progress_bar_set_ellipsize().
+ *
+ * Return value: #PangoEllipsizeMode
+ *
+ * Since: 2.6
+ **/
+PangoEllipsizeMode
+gtk_progress_bar_get_ellipsize (GtkProgressBar *pbar)
+{
+ g_return_val_if_fail (GTK_IS_PROGRESS_BAR (pbar), PANGO_ELLIPSIZE_NONE);
+
+ return pbar->ellipsize;
+}
+