aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2011-10-05 18:01:36 +0200
committerThomas White <taw@physics.org>2011-10-05 18:01:36 +0200
commitc89e22542ffd440e646b9217c963ca98c5c7a5ad (patch)
treee78b5445690cc1e348b7e4ac7de9b8b6d4395837
parent48cbffa2da42612a242f96fa0fd09683e9d1442b (diff)
Redraw and drag logic
-rw-r--r--src/mainwindow.c2
-rw-r--r--src/mainwindow.h3
-rw-r--r--src/objects.h1
-rw-r--r--src/tool_select.c10
-rw-r--r--src/tool_text.c12
5 files changed, 27 insertions, 1 deletions
diff --git a/src/mainwindow.c b/src/mainwindow.c
index b98ed00..6ea3fa7 100644
--- a/src/mainwindow.c
+++ b/src/mainwindow.c
@@ -545,7 +545,7 @@ static void redraw_object(struct object *o)
}
-static void redraw_overlay(struct presentation *p)
+void redraw_overlay(struct presentation *p)
{
gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE);
}
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 36cd289..ee27997 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -32,4 +32,7 @@ extern int open_mainwindow(struct presentation *p);
extern void notify_slide_changed(struct presentation *p);
extern void notify_slide_update(struct presentation *p);
+extern void redraw_overlay(struct presentation *p);
+
+
#endif /* MAINWINDOW_H */
diff --git a/src/objects.h b/src/objects.h
index 96212ff..3789261 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -52,6 +52,7 @@ struct object
int empty;
void (*render_object)(cairo_t *cr, struct object *o);
+ void (*update_object)(struct object *o);
void (*delete_object)(struct object *o);
};
diff --git a/src/tool_select.c b/src/tool_select.c
index 2e9aa37..6a67ee9 100644
--- a/src/tool_select.c
+++ b/src/tool_select.c
@@ -65,10 +65,20 @@ static void drag_object(struct toolinfo *tip, struct presentation *p,
struct object *o, double x, double y)
{
struct select_toolinfo *ti = (struct select_toolinfo *)tip;
+ double eright, ebottom;
o->x = x + ti->drag_offs_x;
o->y = y + ti->drag_offs_y;
+ /* Enforce margins */
+ eright = o->parent->parent->slide_width - o->style->margin_right;
+ ebottom = o->parent->parent->slide_height - o->style->margin_bottom;
+ if ( o->x < o->style->margin_left ) o->x = o->style->margin_left;
+ if ( o->y < o->style->margin_top ) o->y = o->style->margin_top;
+ if ( o->x+o->bb_width > eright ) o->x = eright - o->bb_width;
+ if ( o->y+o->bb_height > ebottom ) o->y = ebottom - o->bb_height;
+
+ o->update_object(o);
p->view_slide->object_seq++;
gdk_window_invalidate_rect(p->drawingarea->window, NULL, FALSE);
diff --git a/src/tool_text.c b/src/tool_text.c
index c5555b6..6a5c8a1 100644
--- a/src/tool_text.c
+++ b/src/tool_text.c
@@ -269,12 +269,14 @@ void move_cursor(struct object *op, int dir)
void move_cursor_left(struct object *op)
{
move_cursor(op, -1);
+ redraw_overlay(op->parent->parent);
}
void move_cursor_right(struct object *op)
{
move_cursor(op, +1);
+ redraw_overlay(op->parent->parent);
}
@@ -298,6 +300,8 @@ void handle_text_backspace(struct object *op)
update_text(o);
o->base.parent->object_seq++;
+
+ redraw_overlay(op->parent->parent);
}
@@ -353,6 +357,13 @@ static void draw_caret(cairo_t *cr, struct object *op)
}
+static void update_text_object(struct object *op)
+{
+ struct text_object *o = (struct text_object *)op;
+ update_text(o);
+}
+
+
static void delete_text_object(struct object *op)
{
struct text_object *o = (struct text_object *)op;
@@ -392,6 +403,7 @@ static struct object *add_text_object(struct slide *s, double x, double y,
/* Methods for this object */
new->base.render_object = render_text_object;
new->base.delete_object = delete_text_object;
+ new->base.update_object = update_text_object;
if ( add_object_to_slide(s, (struct object *)new) ) {
delete_object((struct object *)new);