summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2015-03-15 01:35:46 +0000
committerDavid Robillard <d@drobilla.net>2015-03-15 01:35:46 +0000
commit6391901e7dca631b14364dca7e5e0e664e473a6f (patch)
treeebc97600bb4efafc8d0f679b2755d1c1c636af89 /src
parentd31536d69b6972c2834c390689fa05f8b118c0e9 (diff)
downloadganv-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.c29
-rw-r--r--src/ganv-private.h1
-rw-r--r--src/port.c18
3 files changed, 37 insertions, 11 deletions
diff --git a/src/box.c b/src/box.c
index c5206e1..e883647 100644
--- a/src/box.c
+++ b/src/box.c
@@ -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 */
diff --git a/src/port.c b/src/port.c
index ecdbe90..99c3283 100644
--- a/src/port.c
+++ b/src/port.c
@@ -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;
}