]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/splitter.cpp
para que lo vean
[z.facultad/75.42/plaqui.git] / Constructor / splitter.cpp
1 #include "splitter.h"
2
3 Splitter::Splitter()
4 {
5         imageN = Gdk::Pixbuf::create_from_file("codo_n.png");
6         imageS = Gdk::Pixbuf::create_from_file("codo_s.png");
7         imageE = Gdk::Pixbuf::create_from_file("codo_e.png");
8         imageO = Gdk::Pixbuf::create_from_file("codo_o.png");
9         null = Gdk::Pixbuf::create_from_file("null.png");
10         imgActual = 0;
11         image = imageO;
12         set_size_request(image->get_width(), image->get_height());
13         property_wnd->set_title("Propiedades del Codo");        
14         name = "codo";
15         Connector temp;
16         temp.id_dest = -1;
17         temp.type = UNDEF;
18         connect_vec.push_back(temp);
19         connect_vec.push_back(temp);
20 }
21
22 Splitter::~Splitter()
23 {
24 }
25
26 bool Splitter::on_button_press_event(GdkEventButton *event)
27 {
28         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 1))
29                 combo_entry->set_text(name);
30         
31         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 2)){
32                 image = null;   
33                 image->render_to_drawable(get_window(),get_style()->get_black_gc(),0,0,0,0,image->get_width(),image->get_height(),Gdk::RGB_DITHER_NONE,0,0);
34                 imgActual++;
35                 switch (imgActual) {
36                         case 1:
37                                 image = imageN;
38                                 break;
39                         case 2:
40                                 image = imageE;
41                                 break;
42                         case 3:
43                                 image = imageS;
44                                 break;
45                         default: 
46                                 imgActual = 0;
47                                 image = imageO;                 
48                 }
49                 set_size_request(image->get_width(),image->get_height());
50                 image->render_to_drawable(get_window(),get_style()->get_black_gc(),0,0,0,0,image->get_width(),image->get_height(),Gdk::RGB_DITHER_NONE,0,0);
51         }
52         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 3)){
53                 menu_popup.popup(event->button, event->time);
54                  return true; //It has been handled.
55         }
56         
57         if ((event->type == GDK_2BUTTON_PRESS) && ( event->button == 1)){
58                 property_wnd->spin_caudal->set_value( caudal_max );
59                 property_wnd->txt_item_name->set_text( name );
60                 property_wnd->show();
61         }
62         return true;
63 }
64 void Splitter::on_menu_popup_rotar()
65 {
66         GdkEventButton event; 
67         event.type = GDK_BUTTON_PRESS;
68         event.button = 2;
69         Splitter::on_button_press_event(&event);
70 }
71
72 void Splitter::on_menu_popup_propiedades()
73 {
74         GdkEventButton event;
75         event.type = GDK_2BUTTON_PRESS;
76         event.button = 1;
77         Splitter::on_button_press_event(&event);
78 }
79
80 void Splitter::save(FILE *archivo)
81 {
82         char c_id[50], c_caudal[50], c_x[50], c_y[50], c_img[50];
83         Glib::ustring  con0, con1;
84         if (connect_vec[0].type == IN)
85                 con0 = "\t\t\t<entrada>"+get_other_name(connect_vec[0].id_dest)+"</entrada>\n";
86         else
87                 con0 = "\t\t\t<salida>"+get_other_name(connect_vec[0].id_dest)+"</salida>\n";
88         if (connect_vec[1].type == IN) 
89                 con1 = "\t\t\t<entrada>"+get_other_name(connect_vec[1].id_dest)+"</entrada>\n";
90         else
91                 con1 = "\t\t\t<salida>"+get_other_name(connect_vec[1].id_dest)+"</salida>\n";
92         sprintf(c_x,"\t\t<x>%d</x>\n",x);
93         sprintf(c_y,"\t\t<y>%d</y>\n",y);
94         sprintf(c_id,"%d",ID);
95         sprintf(c_caudal,"\t\t<caudal>%.2f</caudal>\n", caudal_max);
96         sprintf(c_img,"\t\t<orientacion>%d</orientacion>\n",imgActual);
97         Glib::ustring dato;
98         dato = "\t<codo nombre=\""+name+"\" id=\"";
99         dato += c_id;
100         dato += "\">\n";
101         dato += c_caudal;
102         dato += "\t\t<conector>\n"+con0 + con1+"\t\t</conector>\n";
103         dato += c_img;
104         dato += c_x; 
105         dato += c_y;
106         dato += "\t</codo>\n";
107         fprintf(archivo,dato.c_str());  
108 }
109
110 bool Splitter::check_connection()
111 {
112         ConnectorType aux;
113         CItem *_item0, *_item1;
114         switch (get_img_actual()) {
115                         case 0:
116                                 connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h
117                                 connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item1);//abajo-derecha v
118                                 break;  
119                         case 1:
120                                 connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v
121                                 connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h
122                                 break;
123                         case 2:
124                                 connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v
125                                 connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item0); //abajo-derecha h
126                                 break;
127                         case 3:
128                                 connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h
129                                 connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v
130         }
131         if (connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF) {
132                 aux = connect_vec[0].type; 
133                 connect_vec[0].type = connect_vec[1].type;
134                 connect_vec[1].type = aux;
135                 connect_vec[0].id_dest = _item0->get_id();
136                 connect_vec[1].id_dest = _item1->get_id();
137                 return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
138         }
139         else return is_connected;
140 }
141
142 ConnectorType Splitter::get_connector_type(int _a, int _b)
143 {
144         CItem *_item;
145         if ( ! is_connected ) {
146                 switch (imgActual) {
147                         case 0: 
148                                 if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h
149                                         return is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item);
150                                 if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) )//abajo-derecha v
151                                         return is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item);
152                                 break;
153                         case 1:
154                                  if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v
155                                          return  is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item);
156                                  if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h
157                                          return is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item);
158                                  break;
159                         case 2:
160                                 if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v
161                                         return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item); 
162                                 if  ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-derecha h
163                                         return is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item);
164                                 break;
165                         case 3:
166                                 if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h
167                                         return is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item);
168                                 if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v
169                                         return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item);
170                 }
171         } else {
172                 switch (imgActual) {
173                         case 0: 
174                                 if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h
175                                         return connect_vec[0].type;
176                                 if ( (_a <= x+image->get_width()-10)&&(_a>=x+image->get_width()-22)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) )//abajo-derecha v
177                                         return connect_vec[1].type;
178                                 break;
179                         case 1:
180                                  if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v
181                                          return  connect_vec[0].type;
182                                  if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h
183                                          return connect_vec[1].type;
184                                  break;
185                         case 2:
186                                 if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v
187                                         return connect_vec[1].type;
188                                 if  ( (_a <= x+image->get_width()-1)&&(_a>=x+image->get_width()-10)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-derecha h
189                                         return connect_vec[0].type;
190                                 break;
191                         case 3:
192                                 if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h
193                                         return connect_vec[1].type;
194                                 if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v
195                                         return connect_vec[0].type;
196                 }
197         }
198         return UNDEF;
199 }       
200
201 void Splitter::set_default_connector()
202 {
203         connect_vec[0].type = UNDEF;
204         connect_vec[1].type = UNDEF;
205 }