From 14b90634123f7e25fe94014555a9ad330cf691a0 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 24 Apr 2012 04:33:57 +0000 Subject: Fix font size stuff. git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@4262 a436a847-0d15-0410-975c-d299462d15a1 --- ganv/node.h | 5 +++++ ganv/text.h | 2 ++ src/Canvas.cpp | 68 +++++++++++++++++++++++++++++++++++----------------------- src/module.c | 23 +++++++++++++++----- src/node.c | 16 ++++++++++++++ src/text.c | 2 +- 6 files changed, 83 insertions(+), 33 deletions(-) diff --git a/ganv/node.h b/ganv/node.h index 9150945..24682e9 100644 --- a/ganv/node.h +++ b/ganv/node.h @@ -53,6 +53,8 @@ struct _GanvNodeClass { void (*resize)(GanvNode* node); + void (*redraw_text)(GanvNode* node); + void (*disconnect)(GanvNode* node); gboolean (*is_within)(const GanvNode* self, @@ -149,6 +151,9 @@ ganv_node_move_to(GanvNode* node, void ganv_node_resize(GanvNode* node); +void +ganv_node_redraw_text(GanvNode* node); + void ganv_node_disconnect(GanvNode* node); diff --git a/ganv/text.h b/ganv/text.h index 56e5cea..e7193a8 100644 --- a/ganv/text.h +++ b/ganv/text.h @@ -42,6 +42,8 @@ struct _GanvTextClass { GType ganv_text_get_type(void); +void ganv_text_layout(GanvText* text); + G_END_DECLS #endif /* GANV_TEXT_H */ diff --git a/src/Canvas.cpp b/src/Canvas.cpp index f42997c..2303ee4 100644 --- a/src/Canvas.cpp +++ b/src/Canvas.cpp @@ -164,6 +164,8 @@ struct GanvCanvasImpl { void resize(double width, double height); + void set_zoom_and_font_size(double zoom, double points); + void for_each_node(GanvNodeFunction f, void* data); void for_each_edge_from(const GanvNode* tail, GanvEdgeFunction f); void for_each_edge_to(const GanvNode* head, GanvEdgeFunction f); @@ -1371,6 +1373,27 @@ GanvCanvasImpl::resize(double width, double height) } } +void +GanvCanvasImpl::set_zoom_and_font_size(double zoom, double points) +{ + points = std::max(points, 1.0); + zoom = std::max(zoom, 0.01); + + if (zoom == _zoom && points == _font_size) + return; + + if (zoom != _zoom) { + _zoom = zoom; + ganv_canvas_base_set_pixels_per_unit(GANV_CANVAS_BASE(_gcanvas), zoom); + } + + _font_size = points; + + FOREACH_ITEM(_items, i) { + ganv_node_redraw_text(*i); + } +} + namespace Ganv { static gboolean @@ -1432,24 +1455,7 @@ Canvas::set_font_size(double points) void Canvas::set_zoom_and_font_size(double zoom, double points) { - points = std::max(points, 1.0); - zoom = std::max(zoom, 0.01); - - if (zoom == impl()->_zoom && points == impl()->_font_size) - return; - - if (zoom != impl()->_zoom) { - impl()->_zoom = zoom; - ganv_canvas_base_set_pixels_per_unit(GANV_CANVAS_BASE(impl()->_gcanvas), zoom); - } - - impl()->_font_size = points; - -#if 0 - FOREACH_ITEM(impl()->_items, i) { - (*i)->redraw_text(); - } -#endif + impl()->set_zoom_and_font_size(zoom, points); } void @@ -1773,6 +1779,7 @@ enum { PROP_WIDTH, PROP_HEIGHT, PROP_DIRECTION, + PROP_FONT_SIZE, PROP_LOCKED }; @@ -1805,14 +1812,12 @@ ganv_canvas_set_property(GObject* object, case PROP_DIRECTION: ganv_canvas_set_direction(canvas, (GanvDirection)g_value_get_enum(value)); break; - case PROP_LOCKED: { - const gboolean tmp = g_value_get_boolean(value); - if (canvas->locked != tmp) { - // TODO: change background color - canvas->locked = tmp; - } + case PROP_FONT_SIZE: + ganv_canvas_set_font_size(canvas, g_value_get_double(value)); + break; + case PROP_LOCKED: + canvas->locked = g_value_get_boolean(value); break; - } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; @@ -1886,6 +1891,15 @@ ganv_canvas_class_init(GanvCanvasClass* klass) GANV_DIRECTION_RIGHT, (GParamFlags)G_PARAM_READWRITE)); + g_object_class_install_property( + gobject_class, PROP_FONT_SIZE, g_param_spec_double( + "font-size", + _("Font size"), + _("The default font size for the canvas"), + 0.0, G_MAXDOUBLE, + 12.0, + (GParamFlags)G_PARAM_READWRITE)); + g_object_class_install_property( gobject_class, PROP_LOCKED, g_param_spec_boolean( "locked", @@ -1952,13 +1966,13 @@ ganv_canvas_get_default_font_size(const GanvCanvas* canvas) double ganv_canvas_get_font_size(const GanvCanvas* canvas) { - return ganv_canvas_get_default_font_size(canvas); + return canvas->impl->_font_size; } void ganv_canvas_set_font_size(GanvCanvas* canvas, double points) { - g_object_set(canvas, "font-size", points, NULL); + canvas->impl->set_zoom_and_font_size(canvas->impl->_zoom, points); } static void diff --git a/src/module.c b/src/module.c index 3dfcd13..bb1e832 100644 --- a/src/module.c +++ b/src/module.c @@ -76,8 +76,8 @@ ganv_module_destroy(GtkObject* object) GanvModuleImpl* impl = module->impl; if (impl->ports) { - FOREACH_PORT(impl->ports, p) { - g_object_unref(GTK_OBJECT(*p)); + FOREACH_PORT(impl->ports, p) { + g_object_unref(GTK_OBJECT(*p)); } g_ptr_array_free(impl->ports, TRUE); impl->ports = NULL; @@ -475,6 +475,18 @@ ganv_module_resize(GanvNode* self) } } +static void +ganv_module_redraw_text(GanvNode* self) +{ + FOREACH_PORT(GANV_MODULE(self)->impl->ports, p) { + ganv_node_redraw_text(GANV_NODE(*p)); + } + + if (parent_class->parent_class.redraw_text) { + parent_class->parent_class.redraw_text(self); + } +} + static void ganv_module_add_port(GanvModule* module, GanvPort* port) @@ -696,9 +708,10 @@ ganv_module_class_init(GanvModuleClass* class) item_class->draw = ganv_module_draw; item_class->point = ganv_module_point; - node_class->move = ganv_module_move; - node_class->move_to = ganv_module_move_to; - node_class->resize = ganv_module_resize; + node_class->move = ganv_module_move; + node_class->move_to = ganv_module_move_to; + node_class->resize = ganv_module_resize; + node_class->redraw_text = ganv_module_redraw_text; } GanvModule* diff --git a/src/node.c b/src/node.c index 25afd90..7c4b0d1 100644 --- a/src/node.c +++ b/src/node.c @@ -362,6 +362,15 @@ ganv_node_default_resize(GanvNode* node) } } +static void +ganv_node_default_redraw_text(GanvNode* node) +{ + if (node->impl->label) { + ganv_text_layout(node->impl->label); + ganv_node_resize(node); + } +} + static gboolean ganv_node_default_event(GanvItem* item, GdkEvent* event) @@ -631,6 +640,7 @@ ganv_node_class_init(GanvNodeClass* class) class->move = ganv_node_default_move; class->move_to = ganv_node_default_move_to; class->resize = ganv_node_default_resize; + class->redraw_text = ganv_node_default_redraw_text; class->tick = ganv_node_default_tick; class->tail_vector = ganv_node_default_tail_vector; class->head_vector = ganv_node_default_head_vector; @@ -727,6 +737,12 @@ ganv_node_resize(GanvNode* node) GANV_NODE_GET_CLASS(node)->resize(node); } +void +ganv_node_redraw_text(GanvNode* node) +{ + GANV_NODE_GET_CLASS(node)->redraw_text(node); +} + void ganv_node_disconnect(GanvNode* node) { diff --git a/src/text.c b/src/text.c index 9d70051..06a29bc 100644 --- a/src/text.c +++ b/src/text.c @@ -86,7 +86,7 @@ ganv_text_destroy(GtkObject* object) } } -static void +void ganv_text_layout(GanvText* text) { GanvTextImpl* impl = text->impl; -- cgit v1.2.1