]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blob - Constructor/src/workplace.cpp
-Arregle un poco el tema de que cada compuerta puede tener una sola salida
[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_item(temp.store_id)->get_in_logic_connect_position(w,z);
90                         draw_line(a+x_offset, b+y_offset, w+item_x_offset, z+item_y_offset, color_in);
91                         get_window()->draw_line(gc, a, b, a+x_offset, b+y_offset);
92                         get_window()->draw_line(gc, w, z, w+item_x_offset, z+item_y_offset);
93                 }
94                 i++;
95         }
96         i = lista_lineas_out.begin();
97         while ( i != lista_lineas_out.end() ) {
98                 t_line temp = *i;
99                 if ( get_item(temp.store_id) != NULL && get_logic_item(temp.logic_id) != NULL ) {
100                         img = get_logic_item(temp.logic_id)->get_img_actual();
101                         item_y_offset = item_x_offset = 0;
102                         x_offset = y_offset = 0;
103                         switch (img) {
104                                 case 0:
105                                         x_offset = -15;
106                                 break;
107                                 case 1:
108                                         y_offset = -15;
109                                 break;
110                                 case 2:
111                                         x_offset = 15;
112                                 break;
113                                 case 3:
114                                         y_offset = 15;
115                         }
116                         get_item(temp.store_id)->get_out_logic_connect_position(w,z);
117                         get_logic_item(temp.logic_id)->get_in_logic_connect_position(a, b);
118                         draw_line(w+item_y_offset, z+item_y_offset, a+x_offset, b+y_offset,color_out);
119                         get_window()->draw_line(gc, a, b, a+x_offset, b+y_offset);
120                 }
121                 i++;
122         }
123         
124         i = lista_lineas_logic.begin();
125         while ( i != lista_lineas_logic.end() ) {
126                 t_line temp = *i;
127                 if ( get_logic_item(temp.store_id) != NULL && get_logic_item(temp.logic_id) != NULL ) {
128                         get_logic_item(temp.logic_id)->get_out_logic_connect_position(w,z);
129                         get_logic_item(temp.store_id)->get_in_logic_connect_position(a, b);
130                         get_window()->draw_line(gc, a, b, w,z);
131                 }
132                 i++;
133         }
134         return true;
135 }
136
137 void WorkPlace::delete_item(int _id)
138 {
139         delete_line(_id);
140         std::list<CItem*>::iterator i = listaItems->begin();
141         while ( i != listaItems->end() ){
142         CItem *temp = *i;
143                 if ( temp->get_id() == _id ){
144                         listaItems->erase(i);
145                         delete temp;
146                         break;
147                 }
148                 i++;
149         }
150         i = lista_logic_Items->begin();
151         while ( i != lista_logic_Items->end() ){
152         CItem *temp = *i;
153                 if ( temp->get_id() == _id ){
154                         lista_logic_Items->erase(i);
155                         delete temp;
156                         break;
157                 }
158                 i++;
159         }
160         CItem::gate_id = -1;    
161 }
162
163 CItem* WorkPlace::get_logic_item(int _id)
164 {
165         std::list<CItem *>::iterator i = lista_logic_Items->begin();
166         while ( i != lista_logic_Items->end() ){
167                 if ( (*i)->get_id() == _id ) 
168                         return *i;
169                 i++;
170         }
171         return NULL;
172 }
173
174 CItem *WorkPlace::get_item(int _id)
175 {
176         std::list<CItem *>::iterator i = listaItems->begin();
177         while ( i != listaItems->end() ){
178                 if ( (*i)->get_id() == _id ) 
179                         return *i;
180                 i++;
181         }
182         return NULL;
183 }
184
185 int WorkPlace::get_logic_id(const std::string &_s)
186 {
187         std::list<CItem *>::iterator i = lista_logic_Items->begin();
188         while ( i != lista_logic_Items->end() ){
189                 if ( (*i)->get_name() == _s ) 
190                         return (*i)->get_id();
191                 i++;
192         }
193         return -1;
194 }
195
196 int WorkPlace::get_item_id(const std::string &_s)
197 {
198         std::list<CItem *>::iterator i = listaItems->begin();
199         while ( i != listaItems->end() ){
200                 if ( (*i)->get_name() == _s ) 
201                         return (*i)->get_id();
202                 i++;
203         }
204         return -1;
205 }
206         
207 void WorkPlace::delete_line(int _id)
208 {
209         std::list<t_line>::iterator i = lista_lineas_in.begin();
210         while ( i != lista_lineas_in.end() ){
211                 if (get_item( (*i).store_id ) != NULL)
212                         if ( get_item( (*i).store_id )->get_id() == _id ) {
213                                 lista_lineas_in.erase(i);
214                                 i = lista_lineas_in.begin();
215                         }
216                 i++;
217         }
218
219         i = lista_lineas_in.begin();
220         while ( i != lista_lineas_in.end() ){
221                 if ( get_logic_item((*i).logic_id) != NULL)
222                         if ( get_logic_item((*i).logic_id)->get_id() == _id) {
223                                 get_logic_item((*i).logic_id)->set_out_connected(false);        
224                                 lista_lineas_in.erase(i);
225                                 i = lista_lineas_in.begin();
226                         }
227                 i++;
228         }
229
230         std::list<t_line>::iterator j = lista_lineas_out.begin();
231         while ( j != lista_lineas_out.end() ){
232                 if ( get_item((*j).store_id) != NULL )
233                         if ( get_item((*j).store_id)->get_id() == _id ) {
234                                 lista_lineas_out.erase(j);
235                                 j = lista_lineas_out.begin();
236                         }
237                 j++;
238         }       
239
240         j = lista_lineas_out.begin();
241         while ( j != lista_lineas_out.end() ){
242                 if ( get_logic_item((*j).logic_id) != NULL )
243                         if ( get_logic_item((*j).logic_id)->get_id() == _id ) {
244                                 if (dynamic_cast<Not *>(get_logic_item((*i).logic_id))) 
245                                         get_logic_item((*j).logic_id)->set_in_connected(false);
246                                 lista_lineas_out.erase(j);
247                                 j = lista_lineas_out.begin();
248                         }
249                 j++;
250         }       
251 }
252
253 void WorkPlace::update_logic_position()
254 {
255         std::list<CItem*>::iterator i = listaItems->begin();
256         while ( i != listaItems->end() ){
257                 (*i)->update_logic_position();
258                 i++;
259         }
260         i = lista_logic_Items->begin();
261         while ( i != lista_logic_Items->end() ){
262                 (*i)->update_logic_position();
263                 i++;
264         }
265 }
266                 
267 void WorkPlace::draw_line(int x1, int y1, int x2, int y2, Gdk::Color &color)
268 {
269         gc->set_foreground(color);
270         gc->set_line_attributes(3, Gdk::LINE_SOLID, Gdk::CAP_NOT_LAST, Gdk::JOIN_MITER);
271         get_window()->draw_line (gc, x1, y1, x1, y2);
272         get_window()->draw_line (gc, x1, y2, x2, y2);
273 }