]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/src/exclusa.cpp
-se pueden tirar cables de una manera mas comoda pero como diria TU SAM puede fallar...
[z.facultad/75.42/plaqui.git] / Constructor / src / exclusa.cpp
1 #include "exclusa.h"
2 #include "exclusaptywnd.h"
3
4 Exclusa::Exclusa(int orientacion)
5 {
6         in_x = x + 48;
7         in_y = y;
8         out_x = in_x;
9         out_y = y + 32;
10         imageN = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/exclusa_h.png");
11         imageS = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/exclusa_s.png");
12         null = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/null.png");
13         imgActual = orientacion;
14         switch (imgActual) {
15                 case 1:
16                         image = imageS;
17                         break;
18                 default: 
19                         imgActual = 0;
20                         image = imageN;                 
21         }
22         set_size_request(image->get_width(), image->get_height());
23         
24         Glib::RefPtr<Gnome::Glade::Xml> ref = Gnome::Glade::Xml::create(PACKAGE_DATA_DIR"/plaqui-constructor/dialogs/constructor.glade", "exclusa_pty_wnd");
25         ref->get_widget_derived("exclusa_pty_wnd",exclusa_pty_wnd);
26         exclusa_pty_wnd->exclusa = this;
27         name = "exclusa";
28         
29         Connector temp;
30         temp.id_dest = -1;
31         temp.type = UNDEF;
32         connect_vec.push_back(temp);
33         connect_vec.push_back(temp);
34 }
35
36 Exclusa::~Exclusa()
37 {
38 }
39
40 bool Exclusa::on_button_press_event(GdkEventButton *event)
41 {
42         t_line tmp_line;
43         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 1)) {
44                 combo_entry->set_text(name);
45                 WorkPlace::pointed = ID;
46                 if (CItem::logic_connect) {
47                         if ( detect_click_position(event->x, event->y) == IN) {
48                                 tmp_line.logic =  workplace->get_logic_item(CItem::gate_id);
49                                 tmp_line.store = this;
50                                 workplace->lista_lineas_in.push_back(tmp_line);
51                                 workplace->queue_draw();        
52                         } else {        
53                                 tmp_line.logic =  workplace->get_logic_item(CItem::gate_id);
54                                 tmp_line.store = this;
55                                 workplace->lista_lineas_out.push_back(tmp_line);
56                                 workplace->queue_draw();
57                         }
58                 }
59         }
60         
61         if ((event->type == GDK_BUTTON_PRESS) && ( event->button ==2)){
62                 image = null; 
63                 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);
64                 imgActual++;
65                 switch (imgActual) {
66                         case 1:
67                                 image = imageS;
68                                 in_x = x + image->get_width();
69                                 in_y = y + image->get_height()/2;
70                                 out_x = x;
71                                 out_y = in_y;
72                                 break;
73                         default: 
74                                 imgActual = 0;
75                                 image = imageN;                 
76                                 in_x = x + image->get_width()/2;
77                                 in_y = y;
78                                 out_x = in_x;
79                                 out_y = y +image->get_height();
80                 }
81                 set_size_request(image->get_width(),image->get_height());               
82                 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);
83         }
84         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 3)){
85                 menu_popup.popup(event->button, event->time);
86                  return true; //It has been handled.
87         }
88         
89         if ((event->type == GDK_2BUTTON_PRESS) && (event->button ==1)){
90                 exclusa_pty_wnd->txt_exclusa_name->set_text( name);
91                 if (estado) exclusa_pty_wnd->rd_btn_open->set_active(true);
92                 exclusa_pty_wnd->show();
93         }
94         workplace->queue_draw();
95         return true;
96 }
97
98 void Exclusa::set_estado(bool _state)
99 {
100         estado = _state;
101 }
102
103 bool Exclusa::get_estado()
104 {
105         return estado;
106 }
107
108 void Exclusa::on_menu_popup_rotar()
109 {
110         GdkEventButton event; 
111                 event.type = GDK_BUTTON_PRESS;
112                 event.button = 2;
113         Exclusa::on_button_press_event(&event);
114 }
115
116 void Exclusa::on_menu_popup_propiedades()
117 {
118         GdkEventButton event;
119         event.type = GDK_2BUTTON_PRESS;
120         event.button = 1;
121         Exclusa::on_button_press_event(&event);
122 }
123
124 void Exclusa::save(FILE *archivo)
125 {
126         char c_id[50], c_est[50], c_x[50], c_y[50], c_img[50];
127         int est;
128         Glib::ustring  con0, con1;
129         if (connect_vec[0].type == IN)
130                 con0 = "\t\t\t<entrada>"+get_other_name(connect_vec[0].id_dest)+"</entrada>\n";
131         else
132                 con0 = "\t\t\t<salida>"+get_other_name(connect_vec[0].id_dest)+"</salida>\n";
133         if (connect_vec[1].type == IN) 
134                 con1 = "\t\t\t<entrada>"+get_other_name(connect_vec[1].id_dest)+"</entrada>\n";
135         else
136                 con1 = "\t\t\t<salida>"+get_other_name(connect_vec[1].id_dest)+"</salida>\n";
137         sprintf(c_x,"\t\t<x>%d</x>\n",x);
138         sprintf(c_y,"\t\t<y>%d</y>\n",y);
139         sprintf(c_id,"%d",ID);
140         if (estado) est = 1;
141         else est = 0;
142         sprintf(c_est,"\t\t<estado>%d</estado>\n", est);
143         sprintf(c_img,"\t\t<orientacion>%d</orientacion>\n",imgActual);
144         Glib::ustring dato;
145         dato = "\t<exclusa nombre=\""+name+"\" id=\"";
146         dato += c_id;
147         dato += "\">\n";
148         dato += "\t\t<conector>\n"+con0 + con1+"\t\t</conector>\n";
149         dato += c_img;
150         dato += c_est;
151         dato += c_x; 
152         dato += c_y;
153         dato += "\t</exclusa>\n";
154         fprintf(archivo,dato.c_str());  
155 }
156
157 bool Exclusa::check_connection()
158 {
159         ConnectorType aux;
160         CItem *_item0, *_item1;
161         switch (get_img_actual()) {
162                         case 0:
163                                 connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //izquierda
164                                 connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+16,& _item1); //derecha
165                         break;          
166                         case 1:
167                                 connect_vec[0].type =  is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item0); // arriba
168                                 connect_vec[1].type = is_other_connection_area( get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item1); //abajo
169         }
170         if ( connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF ) {
171                 aux = connect_vec[0].type; 
172                 connect_vec[0].type = connect_vec[1].type;
173                 connect_vec[1].type = aux;
174                 connect_vec[0].id_dest = _item0->get_id();
175                 connect_vec[1].id_dest = _item1->get_id();
176                 return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
177         }
178         else return is_connected;
179 }
180
181 ConnectorType Exclusa::get_connector_type(int _a, int _b)
182 {
183         CItem * _item;
184         if ( ! is_connected ) {
185                 switch (imgActual) {
186                         case 0:
187                                 if ((_a <= x+10 )&&(_a > 0) && (_b <= y+image->get_height()-10) &&(_b >= y+10 )) //izquierda
188                                         return is_other_connection_area(get_position_x()+get_image()->get_width()+5, get_position_y()+16, &_item);//pregunto por la derecha
189                                 if ((_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <= y+image->get_height()-10) &&(_b >= y +10 )) //derecha
190                                         return is_other_connection_area(get_position_x()-5, get_position_y()+16, &_item); //pregunto por la izquierda.
191                                 break;
192                         case 1: 
193                                 if ( (_a <= x+image->get_width()-10 )&&(_a >= x + 10) && (_b <= y+10) &&(_b > 0 ) )  //arriba
194                                         return is_other_connection_area(get_position_x()+16, get_position_y()+get_image()->get_height() +5, &_item); //pregunto que hay abajo
195                                 if ((_a <= x+22 )&&(_a >= x + 10) && (_b <= y+image->get_height()-1) &&(_b >= y+image->get_height()-10 ))//abajo
196                                         return is_other_connection_area( get_position_x()+16, get_position_y()-5, &_item);//pregunto que hay arriba.
197                 }
198         } else {
199                 switch (imgActual) {
200                         case 0: 
201                                 if ((_a <= x+10 )&&(_a > 0) && (_b <= y+image->get_height()-10) &&(_b >= y+10 )) //izquierda
202                                         return connect_vec[0].type;
203                                 if ((_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <= y+image->get_height()-10) &&(_b >= y +10 )) //derecha
204                                         return connect_vec[1].type;
205                                 break;
206                         case 1:
207                                 if ( (_a <= x+image->get_width()-10 )&&(_a >= x + 10) && (_b <= y+10) &&(_b > 0 ) ) //arriba
208                                         return connect_vec[0].type;
209                                 if ((_a <= x+22 )&&(_a >= x + 10) && (_b <= y+image->get_height()-1) &&(_b >= y+image->get_height()-10 )) //abajo
210                                         return connect_vec[1].type;
211                 }
212         }
213         return UNDEF;
214 }
215         
216 void Exclusa::set_default_connector()
217 {
218         connect_vec[0].type = UNDEF;
219         connect_vec[1].type = UNDEF;
220 }
221
222 void Exclusa::get_in_logic_connect_position(int& _a, int& _b)
223 {
224         _a = in_x;
225         _b = in_y;
226 }
227
228 void Exclusa::get_out_logic_connect_position(int& _a, int& _b)
229 {
230         _a = out_x;
231         _b = out_y;
232 }
233         
234 ConnectorType Exclusa::detect_click_position(int _a, int _b)
235 {
236         switch (imgActual) {
237                 case 0:
238                         if ( (_a <= image->get_width()/2+10)&&(_a>=image->get_width()/2-10)&&(_b<=16)&&(_b >= 0) )
239                                 return IN;
240                         if ( (_a <= image->get_width()/2+10)&&(_a>=image->get_width()/2-10)&&(_b<=32)&&(_b > 16) )
241                                 return OUT;
242                         break;
243                 case 1:
244                         if ( (_a <=32)&&(_a> 16)&&(_b<=image->get_height()/2+10)&&(_b >= image->get_height()/2-10) )
245                                 return IN;
246                         if ( (_a <= 16)&&(_a>=0)&&(_b<=image->get_height()/2+10)&&(_b >= image->get_height()/2-10) )
247                                 return OUT;
248                 }
249                 return UNDEF;
250 }
251
252 void Exclusa::update_logic_position()
253 {
254         switch (imgActual) {
255                 case 1:
256                         in_x = x + image->get_width();
257                         in_y = y + image->get_height()/2;
258                         out_x = x;
259                         out_y = in_y;
260                         break;
261                 case 0: 
262                         in_x = x + image->get_width()/2;
263                         in_y = y;
264                         out_x = in_x;
265                         out_y = y +image->get_height();
266         }
267 }