]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/src/workplace.cpp
* Ahora el modelo carga las compuertas logicas y crea las lineas necesarias
[z.facultad/75.42/plaqui.git] / Constructor / src / workplace.cpp
1 #include "workplace.h"
2 #include "item.h"
3 #include "pump.h"
4 #include "exclusa.h"
5 #include "not.h"
6
7 int WorkPlace::pointed = -1;
8
9 WorkPlace::WorkPlace(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glade::Xml> &refGlade):Gtk::Fixed(cobject)
10 {
11         gc = Gdk::GC::create(get_window());
12         Glib::RefPtr<Gdk::Colormap> colormap = gc->get_colormap();
13         color_in = Gdk::Color("red");
14         color_out = Gdk::Color("blue");
15         color_dot = Gdk::Color("black");
16         colormap->alloc_color(color_in);
17         colormap->alloc_color(color_out);
18         colormap->alloc_color(color_dot);
19 }
20
21 WorkPlace::~WorkPlace()
22 {
23 }
24
25 void WorkPlace::on_realize()
26 {
27         Gtk::Fixed::on_realize();
28         gc = Gdk::GC::create(get_window());
29         Glib::RefPtr<Gdk::Colormap> colormap = gc->get_colormap();
30         color_in = Gdk::Color("red");
31         color_out = Gdk::Color("blue");
32         colormap->alloc_color(color_in);
33         colormap->alloc_color(color_out);
34 }
35
36 bool WorkPlace::on_expose_event(GdkEventExpose *event)
37 {
38         int x, y;
39         gc->set_foreground(color_dot);
40         for(x=0; x<get_width(); x+=32) 
41                 for (y=0; y<get_height();y+=32){
42                         get_window()->draw_point (gc, x,y);
43                         get_window()->draw_point (gc, x,y+1);
44                         get_window()->draw_point (gc, x,y-1);
45                         get_window()->draw_point (gc, x+1,y);
46                         get_window()->draw_point (gc, x-1,y);
47                 }
48                 
49         if ( *logica ) {        
50                 std::list<CItem *>::iterator j = listaItems->begin();
51                 while ( j != listaItems->end() ) {
52                         (*j)->update_logic_position();
53                         j++;
54                 }
55         }
56         
57         int a, b, w, z, x_offset, y_offset, img;
58         int item_x_offset, item_y_offset;
59         std::list<t_line>::iterator i = lista_lineas_in.begin();
60         while ( i != lista_lineas_in.end() ) {
61                 t_line temp = *i;
62                 if ( get_item(temp.store_id) != NULL && get_logic_item(temp.logic_id) != NULL ) {
63                         img = get_logic_item(temp.logic_id)->get_img_actual();
64                         item_y_offset = item_x_offset = 0;
65                         x_offset = y_offset = 0;
66                         if (dynamic_cast<Pump *>(get_item(temp.store_id))) {
67                                 item_y_offset = -15;
68                         } else if (dynamic_cast<Exclusa *>(get_item(temp.store_id))) {
69                                 if (get_item(temp.store_id)->get_img_actual()==0) {
70                                         item_y_offset = -15;
71                                 } else {
72                                         item_x_offset = 15;
73                                 }
74                         }
75                         switch (img) {
76                                 case 0:
77                                         x_offset = 15;
78                                 break;
79                                 case 1:
80                                         y_offset = 15;
81                                 break;
82                                 case 2:
83                                         x_offset = -15;
84                                 break;
85                                 case 3:
86                                         y_offset = -15;
87                         }
88                         get_logic_item(temp.logic_id)->get_out_logic_connect_position(a, b);
89                         get_logic_item(temp.logic_id)->set_out_connected(true);
90                         get_item(temp.store_id)->get_in_logic_connect_position(w,z);
91                         draw_line(a+x_offset, b+y_offset, w+item_x_offset, z+item_y_offset, color_in);
92                         get_window()->draw_line(gc, a, b, a+x_offset, b+y_offset);
93                         get_window()->draw_line(gc, w, z, w+item_x_offset, z+item_y_offset);
94                 }
95                 i++;
96         }
97         i = lista_lineas_out.begin();
98         while ( i != lista_lineas_out.end() ) {
99                 t_line temp = *i;
100                 if ( get_item(temp.store_id) != NULL && get_logic_item(temp.logic_id) != NULL ) {
101                         img = get_logic_item(temp.logic_id)->get_img_actual();
102                         item_y_offset = item_x_offset = 0;
103                         x_offset = y_offset = 0;
104                         switch (img) {
105                                 case 0:
106                                         x_offset = -15;
107                                 break;
108                                 case 1:
109                                         y_offset = -15;
110                                 break;
111                                 case 2:
112                                         x_offset = 15;
113                                 break;
114                                 case 3:
115                                         y_offset = 15;
116                         }
117                         get_item(temp.store_id)->get_out_logic_connect_position(w,z);
118                         if (dynamic_cast<Not *>(get_logic_item(temp.logic_id))) 
119                                 get_logic_item(temp.logic_id)->set_in_connected(true);
120                         get_logic_item(temp.logic_id)->get_in_logic_connect_position(a, b);
121                         draw_line(w+item_y_offset, z+item_y_offset, a+x_offset, b+y_offset,color_out);
122                         get_window()->draw_line(gc, a, b, a+x_offset, b+y_offset);
123                 }
124                 i++;
125         }
126         return true;
127 }
128
129 void WorkPlace::delete_item(int _id)
130 {
131         delete_line(_id);
132         std::list<CItem*>::iterator i = listaItems->begin();
133         while ( i != listaItems->end() ){
134         CItem *temp = *i;
135                 if ( temp->get_id() == _id ){
136                         listaItems->erase(i);
137                         delete temp;
138                         break;
139                 }
140                 i++;
141         }
142         i = lista_logic_Items->begin();
143         while ( i != lista_logic_Items->end() ){
144         CItem *temp = *i;
145                 if ( temp->get_id() == _id ){
146                         lista_logic_Items->erase(i);
147                         delete temp;
148                         break;
149                 }
150                 i++;
151         }
152         CItem::gate_id = -1;    
153 }
154
155 CItem* WorkPlace::get_logic_item(int _id)
156 {
157         std::list<CItem *>::iterator i = lista_logic_Items->begin();
158         while ( i != lista_logic_Items->end() ){
159                 if ( (*i)->get_id() == _id ) 
160                         return *i;
161                 i++;
162         }
163         return NULL;
164 }
165
166 CItem *WorkPlace::get_item(int _id)
167 {
168         std::list<CItem *>::iterator i = listaItems->begin();
169         while ( i != listaItems->end() ){
170                 if ( (*i)->get_id() == _id ) 
171                         return *i;
172                 i++;
173         }
174         return NULL;
175 }
176
177 int WorkPlace::get_logic_id(const std::string &_s)
178 {
179         std::list<CItem *>::iterator i = lista_logic_Items->begin();
180         while ( i != lista_logic_Items->end() ){
181                 if ( (*i)->get_name() == _s ) 
182                         return (*i)->get_id();
183                 i++;
184         }
185         return -1;
186 }
187
188 int WorkPlace::get_item_id(const std::string &_s)
189 {
190         std::list<CItem *>::iterator i = listaItems->begin();
191         while ( i != listaItems->end() ){
192                 if ( (*i)->get_name() == _s ) 
193                         return (*i)->get_id();
194                 i++;
195         }
196         return -1;
197 }
198         
199 void WorkPlace::delete_line(int _id)
200 {
201         std::list<t_line>::iterator i = lista_lineas_in.begin();
202         while ( i != lista_lineas_in.end() ){
203                 if (get_item( (*i).store_id ) != NULL)
204                         if ( get_item( (*i).store_id )->get_id() == _id ) {
205                                 lista_lineas_in.erase(i);
206                                 i = lista_lineas_in.begin();
207                         }
208                 i++;
209         }
210
211         i = lista_lineas_in.begin();
212         while ( i != lista_lineas_in.end() ){
213                 if ( get_logic_item((*i).logic_id) != NULL)
214                         if ( get_logic_item((*i).logic_id)->get_id() == _id) {
215                                 get_logic_item((*i).logic_id)->set_out_connected(false);        
216                                 lista_lineas_in.erase(i);
217                                 i = lista_lineas_in.begin();
218                         }
219                 i++;
220         }
221
222         std::list<t_line>::iterator j = lista_lineas_out.begin();
223         while ( j != lista_lineas_out.end() ){
224                 if ( get_item((*j).store_id) != NULL )
225                         if ( get_item((*j).store_id)->get_id() == _id ) {
226                                 lista_lineas_out.erase(j);
227                                 j = lista_lineas_out.begin();
228                         }
229                 j++;
230         }       
231
232         j = lista_lineas_out.begin();
233         while ( j != lista_lineas_out.end() ){
234                 if ( get_logic_item((*j).logic_id) != NULL )
235                         if ( get_logic_item((*j).logic_id)->get_id() == _id ) {
236                                 if (dynamic_cast<Not *>(get_logic_item((*i).logic_id))) 
237                                         get_logic_item((*j).logic_id)->set_in_connected(false);
238                                 lista_lineas_out.erase(j);
239                                 j = lista_lineas_out.begin();
240                         }
241                 j++;
242         }       
243 }
244
245 void WorkPlace::update_logic_position()
246 {
247         std::list<CItem*>::iterator i = listaItems->begin();
248         while ( i != listaItems->end() ){
249                 (*i)->update_logic_position();
250                 i++;
251         }
252         i = lista_logic_Items->begin();
253         while ( i != lista_logic_Items->end() ){
254                 (*i)->update_logic_position();
255                 i++;
256         }
257 }
258                 
259 void WorkPlace::draw_line(int x1, int y1, int x2, int y2, Gdk::Color &color)
260 {
261         gc->set_foreground(color);
262         gc->set_line_attributes(3, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_MITER);
263         get_window()->draw_line (gc, x1, y1, x1, y2);
264         get_window()->draw_line (gc, x1, y2, x2, y2);
265 }