[gtkmm] Gnome::Canvas::Canvas problem dragging text item
- From: Manuel Martinez Fernandez <manuel martinez isotrol com>
- To: lista gtkmm <gtkmm-list gnome org>
- Subject: [gtkmm] Gnome::Canvas::Canvas problem dragging text item
- Date: 03 Jun 2003 13:28:18 +0200
I'm trying to drag some Gnome::Canvas::Canvas' items. The Rect and
Pixbuf items works fine, but the Text items not.
I can drag Text items, the problem appears when i release them up the
coordinate y 100, then Text item will not receive more events.This not
occurs with the Rect and Pixbuf items.
Perhaps i'm doing something wrong or my libgnomecanvasmm/libgnomecanvas
has some bugs... I've upgrated from libgnomecanvas-2.0 2.0.2 to 2.3.0
but the problem is still here.
$ pkg-config libgnomecanvas-2.0 --modversion
2.3.0
$ pkg-config libgnomecanvasmm-2.0 --modversion
1.3.11
$ pkg-config gtkmm-2.0 --modversion
2.0.0
a little example is attached.
Thanks!
#include <gtkmm/box.h>
#include <libgnomecanvasmm/canvas.h>
#include <libgnomecanvasmm/item.h>
#include <libgnomecanvasmm/rect.h>
#include <libgnomecanvasmm/text.h>
#include <libgnomecanvasmm/canvas-property.h>
#include <libgnomecanvasmm/init.h>
#include <gtkmm/main.h>
#include <gtkmm/window.h>
#include <gtkmm/scrolledwindow.h>
#include <glibmm/main.h>
#include <gdkmm/cursor.h>
#include <iostream>
using namespace Gnome::Canvas::Properties;
using namespace Gnome::Canvas;
using namespace std;
//class MyCanvas: public Gnome::Canvas::CanvasAA
class MyCanvas: public Gnome::Canvas::Canvas
{
public:
MyCanvas () :
fleur_(Gdk::FLEUR),
dragging_(false)
{
set_scroll_region(0,0,1000,1000);
//Draw a Rectangle
item_ = manage(new Gnome::Canvas::Rect (*root(), 0, 0, 100, 100));
*item_ << width_pixels (5) << outline_color ("red");
item_->signal_event().connect(SigC::bind(SigC::slot(*this, &MyCanvas::itemEvent), item_));
//Draw a simple text
item_ = manage(new Gnome::Canvas::Text(*root(), 120, 120, Glib::locale_to_utf8("Hello World!")));
*item_ << fill_color ("blue") << font("Arial 20");
item_->signal_event().connect(SigC::bind(SigC::slot(*this, &MyCanvas::itemEvent), item_));
}
private:
bool itemEvent(GdkEvent* event, Gnome::Canvas::Item* item)
{
cout << "Event" << endl;
double item_x, item_y;
item_x = event->button.x;
item_y = event->button.y;
switch (event->type)
{
case GDK_BUTTON_PRESS:
{
switch(event->button.button)
{
case 3:
{
item_ = item;
x_ = item_x;
y_ = item_y;
item_->raise_to_top();
item_->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, fleur_, event->button.time);
dragging_ = true;
}
break;
}
}
break;
case GDK_MOTION_NOTIFY:
{
if (dragging_ && (event->motion.state & GDK_BUTTON3_MASK))
{
item_->move(item_x - x_, item_y - y_);
x_ = item_x;
y_ = item_y;
}
}
break;
case GDK_BUTTON_RELEASE:
{
cout << "x: " << item_x << " y: " << item_y << endl;
item_->ungrab(event->button.time);
dragging_ = false;
}
break;
default:
break;
}
return true;
}
Gnome::Canvas::Item *item_;
Gdk::Cursor fleur_;
bool dragging_;
double x_, y_;
};
class MyWindow: public Gtk::Window
{
public:
MyWindow()
{
add(scrolledWindow_);
scrolledWindow_.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
scrolledWindow_.add(canvas_);
set_resizable(false);
set_size_request(400,300);
show_all_children();
}
~MyWindow() {}
private:
MyCanvas canvas_;
Gtk::ScrolledWindow scrolledWindow_;
};
int main (int argc, char **argv)
{
Gtk::Main m (argc, argv);
Gnome::Canvas::init ();
MyWindow w;
m.run(w);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]