Re: Goocanvasmm



On 2/20/08, Gennaro Bellizio <genbell tiscali it> wrote:
>
>
>  >----Messaggio originale----
>  >Da: jonathon quotidian org
>  >Data: 20/02/2008 16.54
>
> >A: "Gennaro Bellizio"<genbell tiscali it>
>  >Cc: <gtkmm-list gnome org>
>  >Ogg: Re: Goocanvasmm
>  >
>
>
> >I'm afraid I don't really understand exactly what the problem is.
>  >Could you provide a small code example that shows the issue that
>  >you're having?
>  >
>  >--
>  >jonner
>  >
>
>
> Let's consider the coordinates example. When I run the application no
>  rectangle is displayed onto the canvas. Nevertheless if I click some
>  button the item bounds labels are updated correctly. By applying the
>  following patch to window.h
>
>  Index: window.h
>  ===================================================================
>  --- window.h    (revisione 1357)
>  +++ window.h    (copia locale)
>  @@ -29,7 +29,7 @@
>    void update_label();
>
>    Goocanvas::Canvas m_canvas;
>  -  Glib::RefPtr<Goocanvas::Rect> m_rect;
>  +  Glib::RefPtr<Goocanvas::RectModel> m_rect;
>
>    Gtk::VBox m_box;
>    Gtk::HBox m_button_box;
>
>  and the following to window.cc
>
>  Index: window.cc
>  ===================================================================
>  --- window.cc   (revisione 1357)
>  +++ window.cc   (copia locale)
>  @@ -34,8 +34,9 @@
>    m_canvas.set_size_request(640, 480);
>    m_canvas.set_bounds(0, 0, 1000, 1000);
>
>  -  Glib::RefPtr<Goocanvas::Item> root = m_canvas.get_root_item();
>  -  m_rect = Goocanvas::Rect::create(10, 10, 60, 60);
>  +  Glib::RefPtr<Goocanvas::ItemModel> root = Goocanvas::GroupModel::
>  create() ;
>  +  m_canvas->set_root_item_model(root) ;
>  +  m_rect = Goocanvas::RectModel::create(10, 10, 60, 60);
>    root->add_child(m_rect);
>    m_rect->property_line_width().set_value(10.0);
>    m_rect->property_stroke_color().set_value("yellow");
>  @@ -74,6 +75,7 @@
>           ", width=" << m_rect->property_width() << ",  height=" <<
>  m_rect->property_height() <<
>           ", line_width=" << m_rect->property_line_width() << std::
>  endl;
>
>  +  // No bounds are available now, so the following will not compile
>    Goocanvas::Bounds bounds = m_rect->get_bounds();
>    str << "Item bounds: x1=" << bounds.get_x1() << ", y1=" << bounds.
>  get_y1() << ", x2=" << bounds.get_x2() << ", y2=" << bounds.get_y2() <<
>  std::endl;
>
>  the rectangle is displayed but now its bounds aren't available because
>  the *Model classes do not provide the get_bounds() method. The same
>  happens for the Goocanvas::Ellipse instances.
>
>  Goocanvas::Text instances, instead, are displayed correctly like it
>  can be seen by applying the following patch
>
>  Index: window.h
>  ===================================================================
>  --- window.h    (revisione 1357)
>  +++ window.h    (copia locale)
>  @@ -29,7 +29,7 @@
>    void update_label();
>
>    Goocanvas::Canvas m_canvas;
>  -  Glib::RefPtr<Goocanvas::Rect> m_rect;
>  +  Glib::RefPtr<Goocanvas::Text> m_text;
>
>    Gtk::VBox m_box;
>    Gtk::HBox m_button_box;
>
>  Index: window.cc
>  ===================================================================
>  --- window.cc   (revisione 1357)
>  +++ window.cc   (copia locale)
>  @@ -35,11 +35,9 @@
>    m_canvas.set_bounds(0, 0, 1000, 1000);
>
>    Glib::RefPtr<Goocanvas::Item> root = m_canvas.get_root_item();
>  -  m_rect = Goocanvas::Rect::create(10, 10, 60, 60);
>  -  root->add_child(m_rect);
>  -  m_rect->property_line_width().set_value(10.0);
>  -  m_rect->property_stroke_color().set_value("yellow");
>  -  m_rect->property_fill_color().set_value("gray");
>  +  m_text = Goocanvas::Text::create("This is displayed\nand bounds are
>  available");
>  +  root->add_child(m_text);
>  +  m_text->property_fill_color().set_value("blue");
>
>
>    Gtk::ScrolledWindow* sw = Gtk::manage(new Gtk::ScrolledWindow());
>  @@ -70,11 +68,11 @@
>   void ExampleWindow::update_label()
>   {
>    std::stringstream str;
>  -  str << "Rect: x=" << m_rect->property_x() << ", y=" << m_rect-
>  >property_y() <<
>  -         ", width=" << m_rect->property_width() << ",  height=" <<
>  m_rect->property_height() <<
>  -         ", line_width=" << m_rect->property_line_width() << std::
>  endl;
>  +  str << "Rect: x=" << m_text->property_x() << ", y=" << m_text-
>  >property_y() <<
>  +         ", width=" << m_text->property_width() <<
>  +         ", line_width=" << m_text->property_line_width() << std::
>  endl;
>
>  -  Goocanvas::Bounds bounds = m_rect->get_bounds();
>  +  Goocanvas::Bounds bounds = m_text->get_bounds();
>    str << "Item bounds: x1=" << bounds.get_x1() << ", y1=" << bounds.
>  get_y1() << ", x2=" << bounds.get_x2() << ", y2=" << bounds.get_y2() <<
>  std::endl;
>
>
>  @@ -84,21 +82,21 @@
>
>   void ExampleWindow::on_button_translate()
>   {
>  -  m_rect->translate(20, 20);
>  +  m_text->translate(20, 20);
>    update_label();
>   }
>
>   void ExampleWindow::on_button_setxy()
>   {
>  -  m_rect->property_x() = 50;
>  -  m_rect->property_y() = 50;
>  +  m_text->property_x() = 50;
>  +  m_text->property_y() = 50;
>    update_label();
>   }
>
>
>   void ExampleWindow::on_button_scale()
>   {
>  -  m_rect->scale(1.2, 1.2);
>  +  m_text->scale(1.2, 1.2);
>    update_label();
>   }
>
>  In my application I used a Goocanvas::GroupModel for stacking a
>  Goocanvas::EllipseModel and a Goocanvas::TextModel in order to draw a
>  graph node with a text-label. My problem is to get the text-label
>  bounds in order to correctly center it into the node.
>
>  I hope I have been more clear this time. :-)
>
>  Thanks in advance.
>
>  Gennaro Bellizio

What version of goocanvasmm are you using?  Because it is not possible
to get the bounds in any released version, but I just recently
committed a change to svn that adds a get/set_bounds function to
ItemSimple (which is a base class for Rect, Ellipse, etc).  So I think
it should work if you use goocanvasmm from svn.  If it does not,
please file a bug.

-- 
jonner


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]