]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/src/and.cpp
ccaf8973c3bb0a99d9f26a83b7e6391d7cf81e61
[z.facultad/75.42/plaqui.git] / Constructor / src / and.cpp
1 #include "and.h"
2
3 And::And()
4 {
5         out_connected = false;
6         in_x = x;
7         in_y = y+16;
8         out_x = x+32;
9         out_y = y+16;
10         imageN = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/and_n.png");
11         imageS = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/and_s.png");
12         imageE = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/and_e.png");
13         imageO = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/and_o.png");
14         null = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/null.png");
15         imgActual = 0;
16         image = imageE;
17         set_size_request(image->get_width(), image->get_height());
18         name = "and";
19         menulist.push_back( Gtk::Menu_Helpers::ImageMenuElem("Conectar", menu_image_linea,SigC::slot(*this, &CItem::on_menu_popup_conectar) ) ) ;
20 }
21
22 And::~And()
23 {
24 }
25
26 bool And::on_button_press_event(GdkEventButton *event)
27 {
28         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 1)) {
29                 if ( CItem::logic_connect ) {
30                         if ( detect_click_position((int)event->x, (int)event->y ) == OUT && !out_connected) {
31                                 CItem::gate_id = ID;
32                                 WorkPlace::pointed = ID;
33                         }
34                         if ( detect_click_position((int)event->x, (int)event->y ) == IN ) {
35                                 CItem::gate_id = ID;
36                                 WorkPlace::pointed = ID;
37                         }
38                 }                       
39                 list_pointed->push_back(name);
40                 combo_entry->set_popdown_strings(*list_pointed);
41                 combo_entry->get_entry()->set_text (name);
42                 workplace->queue_draw();
43         }
44         
45         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 2)){
46                 image = null;   
47                 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);
48                 imgActual++;
49                 switch (imgActual) {
50                         case 1:
51                                 image = imageS;
52                                 in_x = x +16;
53                                 in_y = y;
54                                 out_x = x+16;
55                                 out_y = y+32;
56                                 break;
57                         case 2:
58                                 image = imageO;
59                                 in_x = x+32;
60                                 in_y = y+16;
61                                 out_x = x;
62                                 out_y = y+16;
63                                 break;
64                         case 3:
65                                 image = imageN;
66                                 in_x = x+16;
67                                 in_y = y+32;
68                                 out_x = x+16;
69                                 out_y = y;
70                                 break;
71                         default: 
72                                 imgActual = 0;
73                                 image = imageE;                 
74                                 in_x = x;
75                                 in_y = y+16;
76                                 out_x = x+32;
77                                 out_y = y+16;
78                 }
79                 set_size_request(image->get_width(),image->get_height());
80                 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);
81         }
82         if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 3)){
83                 menu_popup.popup(event->button, event->time);
84                  return true; //It has been handled.
85         }
86         workplace->queue_draw();
87         return true;
88 }
89 void And::on_menu_popup_rotar()
90 {
91         GdkEventButton event; 
92         event.type = GDK_BUTTON_PRESS;
93         event.button = 2;
94         And::on_button_press_event(&event);
95 }
96
97 void And::save(FILE *archivo)
98 {
99         vec_connector.clear();
100         check_connection();
101         Glib::ustring dato;
102         char c_img[50], c_x[50], c_y[50], c_id[50];
103         sprintf(c_id,"%d",ID);
104         sprintf(c_img,"\t\t<orientacion>%d</orientacion>\n",imgActual);
105         sprintf(c_x,"\t\t<x>%d</x>\n",x);
106         sprintf(c_y,"\t\t<y>%d</y>\n",y);
107         dato = "\t<and nombre=\""+name+"\" id=\"";
108         dato += c_id;
109         dato += "\">\n";
110         dato += c_img;
111         dato += c_x;
112         dato += c_y;
113         for ( int i=0; i<=vec_connector.size()-1&&!vec_connector.empty(); i++) {
114                 if ( vec_connector[i].type == IN ) {
115                         dato += "\t\t<entrada>";
116                         dato += vec_connector[i].name_dest + "</entrada>\n";
117                 } else {
118                         dato += "\t\t<salida>";
119                         dato += vec_connector[i].name_dest + "</salida>\n";
120                 }       
121         }       
122         dato += "\t</and>\n";
123         fprintf(archivo, dato.c_str() );
124 }
125
126 bool And::check_connection()
127 {
128         int cant_in = 0, cant_out =0;
129         t_logic_connector temp;
130         std::list<t_line>::iterator i = workplace->lista_lineas_in.begin();
131         while ( i != workplace->lista_lineas_in.end() ) {
132                 if ( workplace->get_logic_item((*i).logic_id)->get_id() == ID ) {
133                         temp.type = OUT;
134                         temp.name_dest = workplace->get_item((*i).store_id)->get_name();
135                         vec_connector.push_back(temp);
136                         cant_out++;
137                 }
138                 i++;
139         }
140
141         i = workplace->lista_lineas_out.begin();
142         while ( i != workplace->lista_lineas_out.end() ) {
143                 if ( workplace->get_logic_item((*i).logic_id)->get_id() == ID ) {
144                         temp.type = IN;
145                         temp.name_dest = workplace->get_item((*i).store_id)->get_name();
146                         vec_connector.push_back(temp);
147                         cant_in++;
148                 }
149                 i++;
150         }
151         return true;
152 }
153
154 ConnectorType And::detect_click_position(int _a, int _b)
155 {
156         switch (imgActual) {
157                 case 0: 
158                         if ( (_a<=32 )&&(_a>=22)&&(_b<=20)&&(_b>=10) )
159                                 return OUT;
160                         if ( (_a<=10)&&(_a>=0)&&(_b<=20)&&(_b>=10) )
161                                 return IN;
162                         break;  
163                 case 1: 
164                         if ( (_a<=20 )&&(_a>=10)&&(_b<=32)&&(_b>=22) )
165                                 return OUT;
166                         if ( (_a<=20)&&(_a>=10)&&(_b<=10)&&(_b>=0) )
167                                 return IN;
168                         break;
169                 case 2: 
170                         if ( (_a<=10 )&&(_a>=0)&&(_b<=20)&&(_b>=10) )
171                                 return OUT;
172                         if ( (_a<=32)&&(_a>=22)&&(_b<=20)&&(_b>=10) )
173                                 return IN;
174                         break;
175                 case 3: 
176                         if ( (_a<=20 )&&(_a>=10)&&(_b<=10)&&(_b>=0) )
177                                 return OUT;
178                         if ( (_a<=20)&&(_a>=10)&&(_b<=32)&&(_b>=22) )
179                                 return IN;
180         }
181         return UNDEF;
182 }
183
184 void And::update_logic_position() 
185 {
186         switch (imgActual) {
187                 case 0: 
188                         in_x = x;
189                         in_y = y+16;
190                         out_x = x+32;
191                         out_y = y+16;
192                         break;
193                 case 1:
194                         in_x = x+16;
195                         in_y = y;
196                         out_x = x+16;
197                         out_y = y+32;
198                         break;
199                 case 2:
200                         in_x = x+32;
201                         in_y = y+16;
202                         out_x = x;
203                         out_y = y+16;
204                         break;
205                 case 3:
206                         in_x = x+16;
207                         in_y = y+32;
208                         out_x = x+16;
209                         out_y = y;
210         }
211 }
212
213 void And::get_in_logic_connect_position(int& _a, int& _b)
214 {
215         _a = in_x;
216         _b = in_y;
217 }
218
219 void And::get_out_logic_connect_position(int& _a, int& _b)
220 {
221         _a =out_x;
222         _b =out_y;
223 }
224
225 void And::set_out_connected(bool _o)
226 {
227         out_connected = _o;
228 }