• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

作図ソフト dia の改良版


Commit MetaInfo

Revisãoec0943877ba6b4adbe975f625380b983ec861ff9 (tree)
Hora2009-10-05 02:12:23
AutorHans Breuer <hans@breu...>
CommiterHans Breuer

Mensagem de Log

Bug 576548 - Refactoring of highlighting in interactive rendering

The previous implementation was keeping the state in every object
(DiaObject::highlight_color) and in the renderer to support it: e.g.
DiaGdkRenderer::highlight_color. But the real highlighting state is managed by
the diagram (where it needs to be).
We got rid of the object knowing about highlight state; provide methods in
the InteractiveRenderer interface to perform highlighted rendering and have
something like a "highlighting selection" (similar to standard selection)
to manage which object should be rendered highlighted.

From: Heikki Paajanen <hepaajan@iki.fi>
Date: Thu, 28 May 2009 18:37:49 +0300
Subject: Refactoring of highlighting in interactive rendering

https://bugzilla.gnome.org/attachment.cgi?id=135703

From: Hans Breuer <hans@breuer.org>
Date: Sat, 30 May 2009 14:07:08 +0200
Subject: Bug 576548 - Highlighting cleanup second iteration

https://bugzilla.gnome.org/attachment.cgi?id=135704

* app/display.c : don't crash if the renderer does not support highligthing
* lib/diagramdata.[ch] : renamed some functions and more consistent format
* app/highlight.c app/object_ops.c : reflect renaming
* lib/libdia.def : export highlight accessors
* lib/plug-ins.h : increment API_VERSION, object size changed

Mudança Sumário

Diff

--- a/app/create_object.c
+++ b/app/create_object.c
@@ -233,7 +233,7 @@ create_object_motion(CreateObjectTool *tool, GdkEventMotion *event,
233233
234234 if (connectionpoint != NULL) {
235235 to = connectionpoint->pos;
236- highlight_object(connectionpoint->object, NULL, ddisp->diagram);
236+ highlight_object(connectionpoint->object, DIA_HIGHLIGHT_CONNECTIONPOINT, ddisp->diagram);
237237 ddisplay_set_all_cursor(get_cursor(CURSOR_CONNECT));
238238 }
239239 }
--- a/app/display.c
+++ b/app/display.c
@@ -618,7 +618,15 @@ ddisplay_obj_render(DiaObject *obj, DiaRenderer *renderer,
618618 DDisplay *ddisp = (DDisplay *)data;
619619 int i;
620620
621- DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj);
621+ DiaInteractiveRendererInterface *irenderer =
622+ DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
623+ DiaHighlightType hltype = data_object_get_highlight(DIA_DIAGRAM_DATA(ddisp->diagram), obj);
624+
625+ if (hltype != DIA_HIGHLIGHT_NONE && irenderer->draw_object_highlighted != NULL)
626+ irenderer->draw_object_highlighted(renderer, obj, hltype);
627+ else /* maybe the renderer does not support highlighting */
628+ DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj);
629+
622630 if (ddisp->show_cx_pts &&
623631 obj->parent_layer != NULL && obj->parent_layer->connectable) {
624632 for (i=0;i<obj->num_connections;i++) {
--- a/app/highlight.c
+++ b/app/highlight.c
@@ -40,15 +40,10 @@
4040 * as it knows about the conversion.
4141 */
4242
43-static Color red = { 1.0, 0.0, 0.0 };
44-
4543 void
46-highlight_object(DiaObject *obj, Color *col, Diagram *dia)
44+highlight_object(DiaObject *obj, DiaHighlightType type, Diagram *dia)
4745 {
48- if (col)
49- obj->highlight_color = col;
50- else
51- obj->highlight_color = &red;
46+ data_highlight_add(dia->data, obj, type);
5247
5348 object_add_updates(obj, dia);
5449 }
@@ -56,11 +51,8 @@ highlight_object(DiaObject *obj, Color *col, Diagram *dia)
5651 void
5752 highlight_object_off(DiaObject *obj, Diagram *dia)
5853 {
59- if (obj->highlight_color != NULL) {
60- /* Must add updates first, so we get the border erased. */
61- object_add_updates(obj, dia);
62- obj->highlight_color = NULL;
63- }
54+ object_add_updates(obj, dia);
55+ data_highlight_remove(dia->data, obj);
6456 }
6557
6658 /** Resets all highlighting in this layer. Helper function for
--- a/app/highlight.h
+++ b/app/highlight.h
@@ -31,7 +31,7 @@
3131 * If color is NULL, a standard #FF0000 color (red) is used.
3232 * The exact method used for highlighting depends on the renderer.
3333 */
34-void highlight_object(DiaObject *obj, Color *col, Diagram *dia);
34+void highlight_object(DiaObject *obj, DiaHighlightType type, Diagram *dia);
3535 /** Remove highlighting from an object.
3636 */
3737 void highlight_object_off(DiaObject *obj, Diagram *dia);
--- a/app/modify_tool.c
+++ b/app/modify_tool.c
@@ -414,11 +414,6 @@ modify_move_already(ModifyTool *tool, DDisplay *ddisp, Point *to)
414414 }
415415 }
416416
417-/** Used for highlighting mainpoint connections. */
418-static Color mainpoint_color = { 1.0, 0.8, 0.0 };
419-/** Used for highlighting normal connections. */
420-static Color cp_color = { 1.0, 0.0, 0.0 };
421-
422417 static void
423418 modify_motion(ModifyTool *tool, GdkEventMotion *event,
424419 DDisplay *ddisp)
@@ -535,14 +530,14 @@ modify_motion(ModifyTool *tool, GdkEventMotion *event,
535530 connectionpoint =
536531 object_find_connectpoint_display(ddisp, &to, tool->object, TRUE);
537532 if (connectionpoint != NULL) {
538- Color *hi_color;
533+ DiaHighlightType type;
539534 to = connectionpoint->pos;
540535 if (connectionpoint->flags & CP_FLAGS_MAIN) {
541- hi_color = &mainpoint_color;
536+ type = DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN;
542537 } else {
543- hi_color = &cp_color;
538+ type = DIA_HIGHLIGHT_CONNECTIONPOINT;
544539 }
545- highlight_object(connectionpoint->object, hi_color, ddisp->diagram);
540+ highlight_object(connectionpoint->object, type, ddisp->diagram);
546541 ddisplay_set_all_cursor(get_cursor(CURSOR_CONNECT));
547542 }
548543 }
--- a/app/object_ops.c
+++ b/app/object_ops.c
@@ -35,7 +35,7 @@ object_add_updates(DiaObject *obj, Diagram *dia)
3535 int i;
3636
3737 /* Bounding box */
38- if (obj->highlight_color != NULL) {
38+ if (data_object_get_highlight(dia->data,obj) != DIA_HIGHLIGHT_NONE) {
3939 diagram_add_update_with_border(dia, &obj->bounding_box, 5);
4040 } else {
4141 diagram_add_update(dia, dia_object_get_enclosing_box (obj));
--- a/app/render_gdk.c
+++ b/app/render_gdk.c
@@ -23,10 +23,20 @@
2323 #include <string.h>
2424 #include <gdk/gdk.h>
2525
26+#include "object.h"
2627 #include "message.h"
2728 #include "render_gdk.h"
2829 #include "diagdkrenderer.h"
2930
31+
32+/** Used for highlighting mainpoint connections. */
33+static Color cp_main_color = { 1.0, 0.8, 0.0 };
34+/** Used for highlighting normal connections. */
35+static Color cp_color = { 1.0, 0.0, 0.0 };
36+
37+static Color text_edit_color = {1.0, 1.0, 0.0 };
38+
39+
3040 static void clip_region_clear(DiaRenderer *renderer);
3141 static void clip_region_add_rect(DiaRenderer *renderer,
3242 Rectangle *rect);
@@ -49,6 +59,9 @@ static void set_size (DiaRenderer *renderer,
4959 static void copy_to_window (DiaRenderer *renderer,
5060 gpointer window,
5161 int x, int y, int width, int height);
62+static void draw_object_highlighted (DiaRenderer *renderer,
63+ DiaObject *object,
64+ DiaHighlightType type);
5265
5366 static void dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface)
5467 {
@@ -59,6 +72,7 @@ static void dia_gdk_renderer_iface_init (DiaInteractiveRendererInterface* iface)
5972 iface->fill_pixel_rect = fill_pixel_rect;
6073 iface->copy_to_window = copy_to_window;
6174 iface->set_size = set_size;
75+ iface->draw_object_highlighted = draw_object_highlighted;
6276 }
6377
6478 DiaRenderer *
@@ -246,3 +260,32 @@ fill_pixel_rect(DiaRenderer *object,
246260 gdk_draw_rectangle (renderer->pixmap, gc, TRUE,
247261 x, y, width, height);
248262 }
263+
264+static void
265+draw_object_highlighted (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type)
266+{
267+ DiaGdkRenderer *gdk_rend = DIA_GDK_RENDERER(renderer);
268+ Color *color = NULL;
269+ switch (type) {
270+ case DIA_HIGHLIGHT_CONNECTIONPOINT:
271+ color = &cp_color;
272+ break;
273+ case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN:
274+ color = &cp_main_color;
275+ break;
276+ case DIA_HIGHLIGHT_TEXT_EDIT:
277+ color = &text_edit_color;
278+ break;
279+ case DIA_HIGHLIGHT_NONE:
280+ color = NULL;
281+ break;
282+ }
283+ if( color ) {
284+ gdk_rend->highlight_color = color;
285+ object->ops->draw(object, renderer);
286+ gdk_rend->highlight_color = NULL;
287+ }
288+
289+ object->ops->draw(object, renderer);
290+}
291+
--- a/app/textedit.c
+++ b/app/textedit.c
@@ -124,14 +124,12 @@ textedit_exit(DDisplay *ddisp)
124124 static void
125125 textedit_begin_edit(DDisplay *ddisp, Focus *focus)
126126 {
127- Color *focus_col = color_new_rgb(1.0, 1.0, 0.0);
128-
129127 g_assert(dia_object_is_selected(focus_get_object(focus)));
130128 if (!textedit_mode(ddisp)) {
131129 textedit_enter(ddisp);
132130 }
133131 ddisplay_set_active_focus(ddisp, focus);
134- highlight_object(focus->obj, focus_col, ddisp->diagram);
132+ highlight_object(focus->obj, DIA_HIGHLIGHT_TEXT_EDIT, ddisp->diagram);
135133 object_add_updates(focus->obj, ddisp->diagram);
136134 /* Undo not quite ready yet.
137135 undo_push_change(ddisp->diagram->undo, text_edit_create_change(focus->text));
--- a/lib/diagdkrenderer.c
+++ b/lib/diagdkrenderer.c
@@ -46,6 +46,7 @@
4646 #include <pango/pangoft2.h>
4747 #endif
4848
49+
4950 static int get_width_pixels (DiaRenderer *);
5051 static int get_height_pixels (DiaRenderer *);
5152
@@ -1056,16 +1057,10 @@ fill_rounded_rect (DiaRenderer *self,
10561057 fill_rect (self, ul_corner, lr_corner, color);
10571058 }
10581059
1060+
10591061 static void
10601062 draw_object (DiaRenderer *renderer, DiaObject *object)
10611063 {
1062- if (renderer->is_interactive &&
1063- object->highlight_color != NULL) {
1064- DiaGdkRenderer *gdk_rend = DIA_GDK_RENDERER(renderer);
1065- gdk_rend->highlight_color = object->highlight_color;
1066- object->ops->draw(object, renderer);
1067- gdk_rend->highlight_color = NULL;
1068- }
10691064 object->ops->draw(object, renderer);
10701065 }
10711066
--- a/lib/diagramdata.c
+++ b/lib/diagramdata.c
@@ -45,6 +45,11 @@ enum {
4545 LAST_SIGNAL
4646 };
4747
48+typedef struct {
49+ DiaObject *obj;
50+ DiaHighlightType type;
51+} ObjectHighlight;
52+
4853 static guint diagram_data_signals[LAST_SIGNAL] = { 0, };
4954
5055 static gpointer parent_class = NULL;
@@ -117,6 +122,8 @@ diagram_data_init(DiagramData *data)
117122
118123 data->selected_count_private = 0;
119124 data->selected = NULL;
125+
126+ data->highlighted = NULL;
120127
121128 data->is_compressed = compress; /* Overridden by doc */
122129
@@ -327,6 +334,53 @@ data_delete_layer(DiagramData *data, Layer *layer)
327334 }
328335 }
329336
337+static ObjectHighlight *
338+find_object_highlight(GList *list, DiaObject *obj)
339+{
340+ ObjectHighlight *oh=NULL;
341+ while(list) {
342+ oh = (ObjectHighlight*)list->data;
343+ if (oh && oh->obj == obj) {
344+ return oh;
345+ }
346+ list = g_list_next(list);
347+ }
348+ return NULL;
349+}
350+
351+void
352+data_highlight_add(DiagramData *data, DiaObject *obj, DiaHighlightType type)
353+{
354+ ObjectHighlight *oh;
355+ if (find_object_highlight (data->highlighted, obj))
356+ return; /* should this be an error?`*/
357+ oh = g_malloc(sizeof(ObjectHighlight));
358+ oh->obj = obj;
359+ oh->type = type;
360+ data->highlighted = g_list_prepend(data->highlighted, oh);
361+}
362+
363+void
364+data_highlight_remove(DiagramData *data, DiaObject *obj)
365+{
366+ ObjectHighlight *oh;
367+ if (!(oh = find_object_highlight (data->highlighted, obj)))
368+ return; /* should this be an error?`*/
369+ data->highlighted = g_list_remove(data->highlighted, oh);
370+ g_free(oh);
371+}
372+
373+DiaHighlightType
374+data_object_get_highlight(DiagramData *data, DiaObject *obj)
375+{
376+ ObjectHighlight *oh;
377+ DiaHighlightType type = DIA_HIGHLIGHT_NONE;
378+ if (oh = find_object_highlight (data->highlighted, obj)) {
379+ type = oh->type;
380+ }
381+ return type;
382+}
383+
330384 /** Select an object in a diagram. Note that this does not unselect other
331385 * objects currently selected in the diagram.
332386 * @param data The diagram to select in.
--- a/lib/diagramdata.h
+++ b/lib/diagramdata.h
@@ -82,6 +82,9 @@ struct _DiagramData {
8282 /** The focus (from text_edits) that's currently being edited, if any.
8383 * Updated by focus.c */
8484 Focus *active_text_edit;
85+
86+ GList *highlighted; /*!< List of objects that are highlighted */
87+
8588 };
8689
8790 /**
@@ -120,6 +123,13 @@ struct _Layer {
120123 layer_get_parent_diagram() */
121124 };
122125
126+typedef enum {
127+ DIA_HIGHLIGHT_NONE,
128+ DIA_HIGHLIGHT_CONNECTIONPOINT,
129+ DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN,
130+ DIA_HIGHLIGHT_TEXT_EDIT
131+} DiaHighlightType;
132+
123133 Layer *new_layer (char *name, DiagramData *parent);
124134 void layer_destroy(Layer *layer);
125135
@@ -134,6 +144,10 @@ int data_layer_get_index (const DiagramData *data, const Layer *layer);
134144 int data_layer_count(const DiagramData *data);
135145 Layer *data_layer_get_nth (const DiagramData *data, guint index);
136146
147+void data_highlight_add(DiagramData *data, DiaObject *obj, DiaHighlightType type);
148+void data_highlight_remove(DiagramData *data, DiaObject *obj);
149+DiaHighlightType data_object_get_highlight(DiagramData *data, DiaObject *obj);
150+
137151 void data_select(DiagramData *data, DiaObject *obj);
138152 void data_unselect(DiagramData *data, DiaObject *obj);
139153 void data_remove_all_selected(DiagramData *data);
--- a/lib/diainteractiverenderer.c
+++ b/lib/diainteractiverenderer.c
@@ -33,6 +33,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
3333 iface->fill_pixel_rect = NULL;
3434 iface->copy_to_window = NULL;
3535 iface->set_size = NULL;
36+ iface->draw_object_highlighted = NULL;
3637 }
3738
3839 GType
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -27,6 +27,8 @@
2727 #include "geometry.h"
2828 #include "font.h" /* not strictly needed by this header, but needed in almost any plug-in/ */
2929
30+#include "diagramdata.h"
31+
3032 G_BEGIN_DECLS
3133
3234 /*! GObject boiler plate, create runtime information */
@@ -289,6 +291,10 @@ struct _DiaInteractiveRendererInterface
289291 void (*copy_to_window) (DiaRenderer *renderer,
290292 gpointer window,
291293 int x, int y, int width, int height);
294+
295+ void (*draw_object_highlighted) (DiaRenderer *renderer,
296+ DiaObject *object,
297+ DiaHighlightType type);
292298 };
293299
294300 GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST;
--- a/lib/libdia.def
+++ b/lib/libdia.def
@@ -150,6 +150,9 @@ EXPORTS
150150 data_foreach_object
151151 data_get_sorted_selected
152152 data_get_sorted_selected_remove
153+ data_highlight_add
154+ data_highlight_remove
155+ data_object_get_highlight
153156 data_int
154157 data_layer_count
155158 data_layer_get_index
--- a/lib/object.h
+++ b/lib/object.h
@@ -489,9 +489,6 @@ struct _DiaObject {
489489 GList *children; /*!< In case this object is a parent of other object the children are listed here */
490490 gint flags; /*!< Various flags that can be set for this object, see defines above */
491491
492- Color *highlight_color; /*!< The color that this object is currently
493- highlighted with, or NULL if it is not
494- highlighted. */
495492 /** The area that contains all parts rendered interactively, so includes
496493 * handles, bezier controllers etc. Despite historical difference, this
497494 * should not be accessed directly, but through dia_object_get_bounding_box().
--- a/lib/plug-ins.h
+++ b/lib/plug-ins.h
@@ -48,7 +48,7 @@ G_BEGIN_DECLS
4848 * The list is by no means complete. If in doubt about your change
4949 * please ask on dia-list or alternative increment ;-) --hb
5050 */
51-#define DIA_PLUGIN_API_VERSION 13
51+#define DIA_PLUGIN_API_VERSION 14
5252
5353 typedef enum {
5454 DIA_PLUGIN_INIT_OK,
--- a/plug-ins/libart/dialibartrenderer.c
+++ b/plug-ins/libart/dialibartrenderer.c
@@ -1329,13 +1329,6 @@ draw_image(DiaRenderer *self,
13291329 static void
13301330 draw_object (DiaRenderer *renderer, DiaObject *object)
13311331 {
1332- if (renderer->is_interactive &&
1333- object->highlight_color != NULL) {
1334- DiaLibartRenderer *libart_rend = DIA_LIBART_RENDERER(renderer);
1335- libart_rend->highlight_color = object->highlight_color;
1336- object->ops->draw(object, renderer);
1337- libart_rend->highlight_color = NULL;
1338- }
13391332 object->ops->draw(object, renderer);
13401333 }
13411334
--- a/plug-ins/libart/render_libart.c
+++ b/plug-ins/libart/render_libart.c
@@ -26,11 +26,20 @@
2626
2727 #ifdef HAVE_LIBART
2828
29+#include "object.h"
2930 #include "dialibartrenderer.h"
3031 #include <libart_lgpl/art_rgb.h>
3132 #include "font.h"
3233 #include "color.h"
3334
35+/** Used for highlighting mainpoint connections. */
36+static Color cp_main_color = { 1.0, 0.8, 0.0 };
37+/** Used for highlighting normal connections. */
38+static Color cp_color = { 1.0, 0.0, 0.0 };
39+
40+static Color text_edit_color = {1.0, 1.0, 0.0 };
41+
42+
3443 static void clip_region_clear(DiaRenderer *self);
3544 static void clip_region_add_rect(DiaRenderer *self,
3645 Rectangle *rect);
@@ -51,6 +60,9 @@ static void set_size(DiaRenderer *self, gpointer window,
5160 int width, int height);
5261 static void copy_to_window (DiaRenderer *self, gpointer window,
5362 int x, int y, int width, int height);
63+static void draw_object_highlighted (DiaRenderer *renderer,
64+ DiaObject *object,
65+ DiaHighlightType type);
5466
5567
5668 void
@@ -63,6 +75,7 @@ dia_libart_renderer_iface_init (DiaInteractiveRendererInterface* iface)
6375 iface->fill_pixel_rect = fill_pixel_rect;
6476 iface->copy_to_window = copy_to_window;
6577 iface->set_size = set_size;
78+ iface->draw_object_highlighted = draw_object_highlighted;
6679 }
6780
6881
@@ -460,6 +473,35 @@ fill_pixel_rect(DiaRenderer *self,
460473 }
461474 }
462475
476+
477+static void
478+draw_object_highlighted (DiaRenderer *renderer, DiaObject *object, DiaHighlightType type)
479+{
480+ DiaLibartRenderer *libart_rend = DIA_LIBART_RENDERER(renderer);
481+ Color *color = NULL;
482+ switch (type) {
483+ case DIA_HIGHLIGHT_CONNECTIONPOINT:
484+ color = &cp_color;
485+ break;
486+ case DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN:
487+ color = &cp_main_color;
488+ break;
489+ case DIA_HIGHLIGHT_TEXT_EDIT:
490+ color = &text_edit_color;
491+ break;
492+ case DIA_HIGHLIGHT_NONE:
493+ color = NULL;
494+ break;
495+ }
496+ if( color ) {
497+ libart_rend->highlight_color = color;
498+ object->ops->draw(object, renderer);
499+ libart_rend->highlight_color = NULL;
500+ }
501+
502+ object->ops->draw(object, renderer);
503+}
504+
463505 #else
464506
465507 DiaRenderer *