diff options
author | David Robillard <d@drobilla.net> | 2015-03-15 01:35:46 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2015-03-15 01:35:46 +0000 |
commit | 6391901e7dca631b14364dca7e5e0e664e473a6f (patch) | |
tree | ebc97600bb4efafc8d0f679b2755d1c1c636af89 /src | |
parent | d31536d69b6972c2834c390689fa05f8b118c0e9 (diff) | |
download | ganv-6391901e7dca631b14364dca7e5e0e664e473a6f.tar.gz ganv-6391901e7dca631b14364dca7e5e0e664e473a6f.tar.bz2 ganv-6391901e7dca631b14364dca7e5e0e664e473a6f.zip |
Add support for beveled box corners.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5631 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r-- | src/box.c | 29 | ||||
-rw-r--r-- | src/ganv-private.h | 1 | ||||
-rw-r--r-- | src/port.c | 18 |
3 files changed, 37 insertions, 11 deletions
@@ -41,7 +41,8 @@ enum { PROP_RADIUS_TR, PROP_RADIUS_BR, PROP_RADIUS_BL, - PROP_STACKED + PROP_STACKED, + PROP_BEVELED }; static void @@ -58,6 +59,7 @@ ganv_box_init(GanvBox* box) box->impl->radius_tr = 0.0; box->impl->radius_br = 0.0; box->impl->radius_bl = 0.0; + box->impl->beveled = FALSE; } static void @@ -94,6 +96,7 @@ ganv_box_set_property(GObject* object, SET_CASE(RADIUS_BR, double, impl->radius_br); SET_CASE(RADIUS_BL, double, impl->radius_bl); SET_CASE(STACKED, boolean, coords->stacked); + SET_CASE(BEVELED, boolean, impl->beveled); default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -123,6 +126,7 @@ ganv_box_get_property(GObject* object, GET_CASE(RADIUS_BR, double, impl->radius_br); GET_CASE(RADIUS_BL, double, impl->radius_bl); GET_CASE(STACKED, boolean, impl->coords.stacked); + GET_CASE(BEVELED, boolean, impl->beveled); default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -212,6 +216,19 @@ ganv_box_path(GanvBox* box, && impl->radius_br == 0.0 && impl->radius_bl == 0.0) { // Simple rectangle cairo_rectangle(cr, x1, y1, x2 - x1, y2 - y1); + } else if (impl->beveled) { + // Beveled rectangle + cairo_new_sub_path(cr); + cairo_move_to(cr, x1 + impl->radius_tl, y1); + cairo_line_to(cr, x2 - impl->radius_tr, y1); + cairo_line_to(cr, x2, y1 + impl->radius_tr); + cairo_line_to(cr, x2, y2 - impl->radius_br); + cairo_line_to(cr, x2 - impl->radius_br, y2); + cairo_line_to(cr, x1 + impl->radius_bl, y2); + cairo_line_to(cr, x1, y2 - impl->radius_bl); + cairo_line_to(cr, x1, y2 - impl->radius_bl); + cairo_line_to(cr, x1, y1 + impl->radius_tl); + cairo_close_path(cr); } else { // Rounded rectangle cairo_new_sub_path(cr); @@ -449,7 +466,15 @@ ganv_box_class_init(GanvBoxClass* klass) gobject_class, PROP_STACKED, g_param_spec_boolean( "stacked", _("Stacked"), - _("Whether to show the box with a stacked appearance."), + _("Show box with a stacked appearance."), + FALSE, + G_PARAM_READWRITE)); + + g_object_class_install_property( + gobject_class, PROP_BEVELED, g_param_spec_boolean( + "beveled", + _("Beveled"), + _("Show radiused corners with a sharp bevel."), FALSE, G_PARAM_READWRITE)); diff --git a/src/ganv-private.h b/src/ganv-private.h index 29b2e61..93f286c 100644 --- a/src/ganv-private.h +++ b/src/ganv-private.h @@ -45,6 +45,7 @@ struct _GanvBoxImpl { double radius_tr; double radius_br; double radius_bl; + gboolean beveled; }; /* Circle */ @@ -25,7 +25,7 @@ #include "./ganv-private.h" #include "./gettext.h" -static const double PORT_LABEL_HPAD = 2.0; +static const double PORT_LABEL_HPAD = 4.0; static const double PORT_LABEL_VPAD = 1.0; static void @@ -475,16 +475,16 @@ ganv_port_set_direction(GanvPort* port, gboolean is_input = port->impl->is_input; switch (direction) { case GANV_DIRECTION_RIGHT: - box->impl->radius_tl = (is_input ? 0.0 : 4.0); - box->impl->radius_tr = (is_input ? 4.0 : 0.0); - box->impl->radius_br = (is_input ? 4.0 : 0.0); - box->impl->radius_bl = (is_input ? 0.0 : 4.0); + box->impl->radius_tl = (is_input ? 0.0 : 5.0); + box->impl->radius_tr = (is_input ? 5.0 : 0.0); + box->impl->radius_br = (is_input ? 5.0 : 0.0); + box->impl->radius_bl = (is_input ? 0.0 : 5.0); break; case GANV_DIRECTION_DOWN: - box->impl->radius_tl = (is_input ? 0.0 : 4.0); - box->impl->radius_tr = (is_input ? 0.0 : 4.0); - box->impl->radius_br = (is_input ? 4.0 : 0.0); - box->impl->radius_bl = (is_input ? 4.0 : 0.0); + box->impl->radius_tl = (is_input ? 0.0 : 5.0); + box->impl->radius_tr = (is_input ? 0.0 : 5.0); + box->impl->radius_br = (is_input ? 5.0 : 0.0); + box->impl->radius_bl = (is_input ? 5.0 : 0.0); break; } |