I have some problem to move an object on canvas. I don't understand if I make a programming error. Someone can help me? I send my code... in attach (sorry!!!) Thanks... -- Rocker alias "Davide Anastasia" "Everything you know is wrong" Linux User #341094 Mail signed with GnuPG <http://www.gnupg.org/faq.html>
//
// File: ModelClassObject.cc
// Created by: Davide "Rocker" Anastasia <s242248 studenti ing unipi it>
// Created on: Thu Jul 29 00:39:16 2004
//
#define SIDE_BORDER 15
#define UP_DOWN_BORDER 6
#define SIZE_FONT 16
#define LIFE_LINE 40
#define LIFE_TIME 200
#define LIFE_TIME_BORDER 6
#define TEXT_TO_LINE 1
#include "ModelClassObject.h"
#include "CanvasMgr.h"
#include "DragBox.h"
#include <libgnomecanvasmm.h>
#include <gtkmm.h>
#include <iostream>
// CanvasMgr è derivato da Gnome::Canvas::Canvas
ModelClassObject::ModelClassObject(CanvasMgr* mgr, int id) :
ModelObjBase(mgr, id)
{
// Questo gruppo contiene tutti gli oggetti facenti parte dell'elemento di modello
my_self_group_ = manage( new Gnome::Canvas::Group( *(mgr->root()) ) );
// Label di testo
label_ = manage( new Gnome::Canvas::Text(*my_self_group_) );
label_->property_text() = ":Untitled";
label_->property_x() = SIDE_BORDER + label_->property_text_width()/2;
label_->property_y() = UP_DOWN_BORDER + label_->property_text_height()/2;
label_->property_font() = "Sans SIZE_FONT";
label_->property_fill_color() = "black";
// label_->property_underline_set() = "true";
underline_points_ = new Gnome::Canvas::Points();
underline_points_->push_back(Gnome::Art::Point(SIDE_BORDER, UP_DOWN_BORDER+label_->property_text_height()+TEXT_TO_LINE));
underline_points_->push_back(Gnome::Art::Point(SIDE_BORDER+label_->property_text_width(), UP_DOWN_BORDER+label_->property_text_height()+TEXT_TO_LINE));
underline_line_ = manage( new Gnome::Canvas::Line(*my_self_group_, *underline_points_) );
setIsObject(true);
// Variabili utili
double right_box_pos = SIDE_BORDER*2 + label_->property_text_width();
double bottom_box_pos = UP_DOWN_BORDER*2 + label_->property_text_height();
// Box con il nome della classe...
box_ = manage( new Gnome::Canvas::Rect(*my_self_group_,
0, 0,
right_box_pos, bottom_box_pos) );
box_->property_outline_color() = "black";
// Linea temporale
upper_points_ = new Gnome::Canvas::Points();
upper_points_->push_back(Gnome::Art::Point(right_box_pos/2,bottom_box_pos));
upper_points_->push_back(Gnome::Art::Point(right_box_pos/2,bottom_box_pos + LIFE_LINE));
upper_line_ = manage( new Gnome::Canvas::Line(*my_self_group_, *upper_points_) );
upper_line_->property_line_style() = Gdk::LINE_ON_OFF_DASH; // Linea tratteggiata!
upper_line_->property_fill_color() = "black";
upper_line_->property_width_pixels() = 1;
// Vita dell'oggetto
lifetime_box_ = manage ( new Gnome::Canvas::Rect(*my_self_group_,
right_box_pos/2 - LIFE_TIME_BORDER, bottom_box_pos + LIFE_LINE,
right_box_pos/2 + LIFE_TIME_BORDER, bottom_box_pos + LIFE_LINE + LIFE_TIME) );
lifetime_box_->property_outline_color() = "black";
// Linea temporale
lower_points_ = new Gnome::Canvas::Points();
lower_points_->push_back(Gnome::Art::Point(right_box_pos/2,bottom_box_pos + LIFE_LINE + LIFE_TIME));
lower_points_->push_back(Gnome::Art::Point(right_box_pos/2,bottom_box_pos + LIFE_LINE*2 + LIFE_TIME));
lower_line_ = manage( new Gnome::Canvas::Line(*my_self_group_, *lower_points_) );
lower_line_->property_line_style() = Gdk::LINE_ON_OFF_DASH; // Linea tratteggiata!
lower_line_->property_fill_color() = "black";
// Definizione dei DragBox...
db_box_ = manage( new DragBox(*my_self_group_) );
db_box_->move_drag_box(right_box_pos, bottom_box_pos);
db_lifeline_up_ = manage( new DragBox(*my_self_group_) );
db_lifeline_up_->move_drag_box(right_box_pos/2 - LIFE_TIME_BORDER, bottom_box_pos + LIFE_LINE);
db_lifeline_down_ = manage( new DragBox(*my_self_group_) );
db_lifeline_down_->move_drag_box(right_box_pos/2 + LIFE_TIME_BORDER, bottom_box_pos + LIFE_LINE + LIFE_TIME);
// Connessione dei segnali
signal_event().connect(slot(*this, &ModelClassObject::on_item_event));
}
ModelClassObject::~ModelClassObject()
{
delete lower_points_;
delete upper_points_;
}
void
ModelClassObject::setIsObject(bool var)
{
if ( var == true ) {
underline_line_->property_fill_color() = "black";
} else {
underline_line_->property_fill_color().reset_value();
}
}
bool
ModelClassObject::getIsObject() {
return is_object_;
}
bool
//ModelClassObject::on_item_event(GdkEvent* event, Gnome::Canvas::Item* item )
ModelClassObject::on_item_event(GdkEvent* event)
{
std::cerr << "Evento gestito!"; // DEBUG!
static double x, y;
double item_x, item_y;
static bool dragging;
item_x = event->button.x;
item_y = event->button.y;
my_self_group_->property_parent().get_value()->w2i(item_x, item_y);
switch(event->type) {
case GDK_BUTTON_PRESS:
switch(event->button.button) {
case 1:
// Tasto 1 del mouse (<-)
if(event->button.state & GDK_SHIFT_MASK) {
// Eliminazione dell'oggetto "on_focus"
// dal vector in CanvasMgr... come si fa?!
// delete item;
} else {
// Spostamento dell'oggetto
x = item_x;
y = item_y;
my_self_group_->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
Gdk::Cursor(Gdk::FLEUR),
event->button.time);
dragging = true;
}
break;
case 2:
// Tasto 2 del mouse (->)
if(event->button.state & GDK_SHIFT_MASK) {
// Porta in primo piano (tasto 2 + shift)
my_self_group_->lower_to_bottom();
} else {
// Porta verso su di 1
my_self_group_->lower(1);
}
break;
case 3:
// Tasto 3 del mouse (<->)
if(event->button.state & GDK_SHIFT_MASK) {
// Porta sullo sfondo (tasto 3 + shift)
my_self_group_->raise_to_top();
} else {
// Porta verso giù di 1
my_self_group_->raise(1);
}
break;
default:
break;
}
break;
case GDK_MOTION_NOTIFY:
if(dragging &&(event->motion.state & GDK_BUTTON1_MASK)) {
double new_x = item_x;
double new_y = item_y;
my_self_group_->move(new_x - x, new_y - y);
x = new_x;
y = new_y;
}
break;
case GDK_BUTTON_RELEASE:
my_self_group_->ungrab(event->button.time);
dragging = false;
break;
default:
break;
}
return false;
}
void
ModelClassObject::move(double x, double y)
{
my_self_group_->move(x, y);
}
void
ModelClassObject::move_to(double x, double y)
{
my_self_group_->property_x() = x;
my_self_group_->property_y() = y;
}
void
ModelClassObject::foo()
{
std::cout << "evento gestito!";
}
//
// File: ModelClassObject.h
// Created by: Davide "Rocker" Anastasia <s242248 studenti ing unipi it>
// Created on: Thu Jul 29 00:39:16 2004
//
// Questa classe definisce la forma di una classe o di un oggetto nel diagramma
// La sola differenza tra l'una e l'altra è la sottolineatura della label.
#ifndef _MODELCLASSOBJECT_H_
#define _MODELCLASSOBJECT_H_
#include "ModelObjBase.h"
#include "CanvasMgr.h"
#include "DragBox.h"
class ModelClassObject : public ModelObjBase
{
public:
ModelClassObject(CanvasMgr*, int);
~ModelClassObject();
// Gestione delle proprietÃ
void setIsConcurrent(bool);
bool getIsConcurrent();
void setIsObject(bool);
bool getIsObject();
// Gestione degli eventi
bool on_item_event(GdkEvent*);
// Gestione del movimento
void move(double, double);
void move_to(double, double);
// Fuck function!
virtual void getXMI() {};
virtual void getSVG() {};
virtual void update() {};
void foo();
protected:
Gnome::Canvas::Group* my_self_group_;
Gnome::Canvas::Rect* box_;
Gnome::Canvas::Text* label_;
Gnome::Canvas::Points* underline_points_;
Gnome::Canvas::Line* underline_line_;
Gnome::Canvas::Points* upper_points_;
Gnome::Canvas::Line* upper_line_;
Gnome::Canvas::Rect* lifetime_box_;
Gnome::Canvas::Points* lower_points_;
Gnome::Canvas::Line* lower_line_;
DragBox* db_box_;
DragBox* db_lifeline_up_;
DragBox* db_lifeline_down_;
// Definisco se l'oggetto è una classe o un oggetto e se è o no concorrente
bool is_concurrent_;
bool is_object_;
//SigC::Signal0<void> signal_event_;
};
#endif //_MODELCLASSOBJECT_H_
//
// File: ModelObjBase.cc
// Created by: Davide "Rocker" Anastasia <s242248 studenti ing unipi it>
// Created on: Sun May 30 23:55:33 2004
//
#include "ModelObjBase.h"
#include "CanvasMgr.h"
#include <libgnomecanvasmm.h>
//#include <gdkmm.h>
ModelObjBase::ModelObjBase(CanvasMgr* canvas, int id) //:
// Gnome::Canvas::Group( *(canvas->root()) )
{
my_manager_ = canvas;
myId = id;
}
ModelObjBase::~ModelObjBase()
{
}
//
// File: ModelObjBase.h
// Created by: Davide "Rocker" Anastasia <s242248 studenti ing unipi it>
// Created on: Sun May 30 23:55:33 2004
//
#ifndef _MODELOBJBASE_H_
#define _MODELOBJBASE_H_
#include <libgnomecanvasmm.h>
#include <gtkmm.h>
#include "CanvasMgr.h"
class CanvasMgr;
class ModelObjBase : // public SigC::Object
public Gtk::EventBox
{
public:
ModelObjBase(CanvasMgr*, int);
virtual ~ModelObjBase();
// ModelObjBase interface
virtual void getXMI() = 0; // Da definire il tipo di ritorno!
virtual void getSVG() = 0; // Da definire il tipo di ritorno!
// Probabilmente il tipo di ritorno di queste
// due funzioni è un oggetto di Xerces-C++
virtual void update() = 0;
protected:
CanvasMgr* my_manager_;
int myId;
};
#endif //_MODELOBJBASE_H_
Attachment:
signature.asc
Description: Questa parte del messaggio =?ISO-8859-1?Q?=E8?= firmata