aboutsummaryrefslogtreecommitdiff
path: root/src/tool_text.c
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.org.uk>2011-10-09 22:06:39 +0200
committerThomas White <taw@bitwiz.org.uk>2011-10-09 22:06:39 +0200
commitfc8f986b76af09d4f2dea80854cceaf1f8fdd43f (patch)
tree066dc7a194d77ffb254c53ff89a2199d8e4e989b /src/tool_text.c
parent5ac069656c36aa1404d90cfad915d05736fa91d2 (diff)
Drag to create region
Diffstat (limited to 'src/tool_text.c')
-rw-r--r--src/tool_text.c66
1 files changed, 62 insertions, 4 deletions
diff --git a/src/tool_text.c b/src/tool_text.c
index a6a17d5..038b375 100644
--- a/src/tool_text.c
+++ b/src/tool_text.c
@@ -40,6 +40,12 @@ struct text_toolinfo
{
struct toolinfo base;
PangoContext *pc;
+
+ int create_dragging;
+ double start_corner_x;
+ double start_corner_y;
+ double drag_corner_x;
+ double drag_corner_y;
};
@@ -455,6 +461,42 @@ static void drag_object(struct toolinfo *tip, struct presentation *p,
}
+static void start_drag_create(struct toolinfo *tip, struct presentation *p,
+ double x, double y)
+{
+ struct text_toolinfo *ti = (struct text_toolinfo *)tip;
+
+ ti->start_corner_x = x;
+ ti->start_corner_y = y;
+ ti->create_dragging = 1;
+}
+
+
+static void drag_create(struct toolinfo *tip, struct presentation *p,
+ double x, double y)
+{
+ struct text_toolinfo *ti = (struct text_toolinfo *)tip;
+
+ ti->drag_corner_x = x;
+ ti->drag_corner_y = y;
+
+ redraw_overlay(p);
+}
+
+
+static void finish_drag_create(struct toolinfo *tip, struct presentation *p,
+ double x, double y)
+{
+ struct text_toolinfo *ti = (struct text_toolinfo *)tip;
+
+ ti->drag_corner_x = x;
+ ti->drag_corner_y = y;
+ ti->create_dragging = 0;
+
+ redraw_overlay(p);
+}
+
+
static void create_default(struct presentation *p, struct style *sty,
struct toolinfo *tip)
{
@@ -484,11 +526,24 @@ static int deselect_object(struct object *o, struct toolinfo *tip)
}
-static void draw_overlay(cairo_t *cr, struct object *o)
+static void draw_overlay(struct toolinfo *tip, cairo_t *cr, struct object *o)
{
- draw_editing_box(cr, o->x, o->y,
- o->bb_width, o->bb_height);
- draw_caret(cr, o);
+ struct text_toolinfo *ti = (struct text_toolinfo *)tip;
+
+ if ( o != NULL ) {
+ draw_editing_box(cr, o->x, o->y, o->bb_width, o->bb_height);
+ draw_caret(cr, o);
+ }
+
+ if ( ti->create_dragging ) {
+ cairo_new_path(cr);
+ cairo_rectangle(cr, ti->start_corner_x, ti->start_corner_y,
+ ti->drag_corner_x - ti->start_corner_x,
+ ti->drag_corner_y - ti->start_corner_y);
+ cairo_set_source_rgb(cr, 0.5, 0.5, 0.5);
+ cairo_set_line_width(cr, 0.5);
+ cairo_stroke(cr);
+ }
}
@@ -534,6 +589,9 @@ struct toolinfo *initialise_text_tool(GtkWidget *w)
ti->base.select = select_object;
ti->base.deselect = deselect_object;
ti->base.drag_object = drag_object;
+ ti->base.start_drag_create = start_drag_create;
+ ti->base.drag_create = drag_create;
+ ti->base.finish_drag_create = finish_drag_create;
ti->base.draw_editing_overlay = draw_overlay;
ti->base.key_pressed = key_pressed;
ti->base.im_commit = im_commit;