* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
PROP_MAX_WIDTH_CHARS,
PROP_WRAP_WIDTH,
PROP_ALIGN,
-
+ PROP_PLACEHOLDER_TEXT,
+
/* Style args */
PROP_BACKGROUND,
PROP_FOREGROUND,
PangoWrapMode wrap_mode;
gchar *text;
+ gchar *placeholder_text;
gdouble font_scale;
PANGO_TYPE_ALIGNMENT,
PANGO_ALIGN_LEFT,
GTK_PARAM_READWRITE));
-
+
+ /**
+ * GtkCellRendererText:placeholder-text:
+ *
+ * The text that will be displayed in the #GtkCellRenderer if
+ * #GtkCellRendererText:editable is %TRUE and the cell is empty.
+ *
+ * Since 3.6
+ */
+ g_object_class_install_property (object_class,
+ PROP_PLACEHOLDER_TEXT,
+ g_param_spec_string ("placeholder-text",
+ P_("Placeholder text"),
+ P_("Text rendered when an editable cell is empty"),
+ NULL,
+ GTK_PARAM_READWRITE));
/* Style props are set or not */
P_("Whether this tag affects the alignment mode"));
/**
- * GtkCellRendererText::edited
+ * GtkCellRendererText::edited:
* @renderer: the object which received the signal
* @path: the path identifying the edited cell
* @new_text: the new text
g_type_class_add_private (object_class, sizeof (GtkCellRendererTextPrivate));
- _gtk_cell_renderer_class_set_accessible_type (cell_class, GTK_TYPE_TEXT_CELL_ACCESSIBLE);
+ gtk_cell_renderer_class_set_accessible_type (cell_class, GTK_TYPE_TEXT_CELL_ACCESSIBLE);
}
static void
pango_font_description_free (priv->font);
g_free (priv->text);
+ g_free (priv->placeholder_text);
if (priv->extra_attrs)
pango_attr_list_unref (priv->extra_attrs);
if (priv->language)
g_object_unref (priv->language);
+ g_clear_object (&priv->entry);
+
G_OBJECT_CLASS (gtk_cell_renderer_text_parent_class)->finalize (object);
}
g_value_set_int (value, priv->max_width_chars);
break;
+ case PROP_PLACEHOLDER_TEXT:
+ g_value_set_string (value, priv->placeholder_text);
+ break;
+
case PROP_BACKGROUND:
case PROP_FOREGROUND:
case PROP_MARKUP:
case PROP_ALIGN_SET:
priv->align_set = g_value_get_boolean (value);
break;
-
+
+ case PROP_PLACEHOLDER_TEXT:
+ g_free (priv->placeholder_text);
+ priv->placeholder_text = g_value_dup_string (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
return g_object_new (GTK_TYPE_CELL_RENDERER_TEXT, NULL);
}
+static inline gboolean
+show_placeholder_text (GtkCellRendererText *celltext)
+{
+ GtkCellRendererTextPrivate *priv = celltext->priv;
+
+ return priv->editable && priv->placeholder_text &&
+ (!priv->text || !priv->text[0]);
+}
+
static void
add_attr (PangoAttrList *attr_list,
PangoAttribute *attr)
PangoLayout *layout;
PangoUnderline uline;
gint xpad;
+ gboolean placeholder_layout = show_placeholder_text (celltext);
- layout = gtk_widget_create_pango_layout (widget, priv->text);
+ layout = gtk_widget_create_pango_layout (widget, placeholder_layout ?
+ priv->placeholder_text : priv->text);
gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (celltext), &xpad, NULL);
pango_layout_set_single_paragraph_mode (layout, priv->single_paragraph);
- if (cell_area)
+ if (!placeholder_layout && cell_area)
{
/* Add options that affect appearance but not size */
add_attr (attr_list,
pango_attr_strikethrough_new (priv->strikethrough));
}
+ else if (placeholder_layout)
+ {
+ PangoColor color;
+ GtkStyleContext *context;
+ GdkRGBA fg = { 0.5, 0.5, 0.5 };
+
+ context = gtk_widget_get_style_context (widget);
+ gtk_style_context_lookup_color (context, "placeholder_text_color", &fg);
+
+ color.red = CLAMP (fg.red * 65535. + 0.5, 0, 65535);
+ color.green = CLAMP (fg.green * 65535. + 0.5, 0, 65535);
+ color.blue = CLAMP (fg.blue * 65535. + 0.5, 0, 65535);
+
+ add_attr (attr_list,
+ pango_attr_foreground_new (color.red, color.green, color.blue));
+ }
add_attr (attr_list, pango_attr_font_desc_new (priv->font));
style_context = gtk_widget_get_style_context (widget);
state = gtk_widget_get_state_flags (widget);
- font_desc = pango_font_description_copy_static (gtk_style_context_get_font (style_context, state));
+ gtk_style_context_get (style_context, state, "font", &font_desc, NULL);
pango_font_description_merge_static (font_desc, priv->font, TRUE);
if (priv->scale_set)
priv = GTK_CELL_RENDERER_TEXT (data)->priv;
- priv->entry = NULL;
+ g_clear_object (&priv->entry);
if (priv->focus_out_id > 0)
{
const GdkRectangle *cell_area,
GtkCellRendererState flags)
{
- GtkRequisition requisition;
GtkCellRendererText *celltext;
GtkCellRendererTextPrivate *priv;
gfloat xalign, yalign;
gtk_cell_renderer_get_alignment (cell, &xalign, &yalign);
priv->entry = gtk_entry_new ();
+ g_object_ref_sink (G_OBJECT (priv->entry));
+
gtk_entry_set_has_frame (GTK_ENTRY (priv->entry), FALSE);
gtk_entry_set_alignment (GTK_ENTRY (priv->entry), xalign);
gtk_editable_select_region (GTK_EDITABLE (priv->entry), 0, -1);
- gtk_widget_get_preferred_size (priv->entry, &requisition, NULL);
- if (requisition.height < cell_area->height)
- {
- GtkBorder *style_border;
- GtkBorder border;
-
- gtk_widget_style_get (priv->entry,
- "inner-border", &style_border,
- NULL);
-
- if (style_border)
- {
- border = *style_border;
- g_boxed_free (GTK_TYPE_BORDER, style_border);
- }
- else
- {
- /* Since boxed style properties can't have default values ... */
- border.left = 2;
- border.right = 2;
- }
-
- border.top = (cell_area->height - requisition.height) / 2;
- border.bottom = (cell_area->height - requisition.height) / 2;
- gtk_entry_set_inner_border (GTK_ENTRY (priv->entry), &border);
- }
-
priv->in_entry_menu = FALSE;
if (priv->entry_menu_popdown_timeout)
{
{
GtkCellRendererTextPrivate *priv;
GtkCellRendererText *celltext;
- GtkStyleContext *style_context;
- const PangoFontDescription *font_desc;
PangoLayout *layout;
PangoContext *context;
PangoFontMetrics *metrics;
celltext = GTK_CELL_RENDERER_TEXT (cell);
priv = celltext->priv;
- style_context = gtk_widget_get_style_context (widget);
-
gtk_cell_renderer_get_padding (cell, &xpad, NULL);
layout = get_layout (celltext, widget, NULL, 0);
/* Fetch the average size of a charachter */
context = pango_layout_get_context (layout);
- font_desc = gtk_style_context_get_font (style_context, 0);
- metrics = pango_context_get_metrics (context, font_desc,
+ metrics = pango_context_get_metrics (context,
+ pango_context_get_font_description (context),
pango_context_get_language (context));
char_width = pango_font_metrics_get_approximate_char_width (metrics);