diff options
author | Keith Packard <keithp@keithp.com> | 2008-03-21 20:49:23 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2008-03-21 20:49:23 -0700 |
commit | 4b7476c90c56b2c1fa133e5eeef78ec5ef2146bf (patch) | |
tree | a488769f5639dfbce63616e904d6b90524faa6c6 /nichrome/nichrome-label.5c | |
parent | 7418ec7f067c4015fb632f9ee988b35120eaee8e (diff) |
Name the toolkit 'nichrome' (thanks again, Bart).
This patch also includes some random geometry adjustments, and the use of
'lozenges' for buttons, toggles and scrollbars.
Diffstat (limited to 'nichrome/nichrome-label.5c')
-rw-r--r-- | nichrome/nichrome-label.5c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/nichrome/nichrome-label.5c b/nichrome/nichrome-label.5c new file mode 100644 index 0000000..5239d17 --- /dev/null +++ b/nichrome/nichrome-label.5c @@ -0,0 +1,123 @@ +/* + * Copyright © 2008 Keith Packard + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + * The Original Code is the cairo graphics library. + * + * The Initial Developer of the Original Code is Keith Packard + * + * Contributor(s): + * Keith Packard <keithp@keithp.com> + */ + +autoload Nichrome; + +extend namespace Nichrome { + public namespace Label { + + public typedef void (&widget_t widget) callback_t; + + public typedef widget_t + struct { + string label; + string font; + rgba_color_t color; + } label_t; + + typedef struct { + real x, y; + real pad; + real width, height; + real preferred_width, preferred_height; + } metrics_t; + + metrics_t get_metrics (cr, &label_t widget) { + set_font (cr, widget.font); + text_extents_t text = text_extents (cr, widget.label); + text_extents_t m = text_extents (cr, "M"); + text_extents_t x = text_extents (cr, "x"); + font_extents_t font = font_extents(cr); + metrics_t metrics; + + real pad = m.height / 2; + metrics.pad = pad; + metrics.preferred_width = pad + text.width + pad; + metrics.preferred_height = pad + m.height + pad; + metrics.width = max (widget.geometry.width, metrics.preferred_width); + metrics.height = max (widget.geometry.height, metrics.preferred_height); + real text_height = (x.height + m.height) / 2; + real text_bearing = (x.y_bearing + m.y_bearing) / 2; + metrics.y = floor ((metrics.height - text_height) / 2 + - text_bearing + 0.5); + metrics.x = floor ((metrics.width - text.width) / 2 + - text.x_bearing + 0.5); + return metrics; + } + + public void natural (cairo_t cr, &label_t widget) { + metrics_t metrics = get_metrics (cr, &widget); + + rectangle (cr, 0, 0, metrics.preferred_width, metrics.preferred_height); + } + + public void outline (cairo_t cr, &label_t widget) { + metrics_t metrics = get_metrics (cr, &widget); + + rectangle (cr, 0, 0, 0, 0); + } + + public void draw (cairo_t cr, &label_t widget) { + metrics_t metrics = get_metrics (cr, &widget); + move_to (cr, metrics.x, metrics.y); + set_source_rgba (cr, widget.color.red, widget.color.green, + widget.color.blue, widget.color.alpha); + show_text (cr, widget.label); + } + + public void relabel (&label_t widget, string label) { + widget.label = label; + Widget::resize (&widget); + } + + public void init (&label_t widget, &nichrome_t nichrome, string label) { + Widget::init (&nichrome, &widget); + widget.label = label; + widget.font = Widget::default_font; + widget.draw = draw; + widget.outline = outline; + widget.natural = natural; + widget.color = (rgba_color_t) { + red = 0, green = 0, blue = 0, alpha = 1 + }; + } + + public *widget_t new (&nichrome_t nichrome, + string label) { + label_t widget; + + init (&widget, &nichrome, label); + return &widget; + } + } +} |