]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Constructor/src/splitter.cpp
* Se mejora la deteccion de conexiones en el constructor
[z.facultad/75.42/plaqui.git] / Constructor / src / splitter.cpp
index c2284087343bbcaca51aa1f4c57981ee52147d39..ea7f2d41c31896acbc912f531ef330f76c04a3dc 100644 (file)
@@ -2,6 +2,7 @@
 
 Splitter::Splitter(int orientacion)
 {
+       in_x = -1;
        imageN = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/codo_n.png");
        imageS = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/codo_s.png");
        imageE = Gdk::Pixbuf::create_from_file(PACKAGE_DATA_DIR"/plaqui-constructor/pixmaps/codo_e.png");
@@ -39,7 +40,10 @@ Splitter::~Splitter()
 bool Splitter::on_button_press_event(GdkEventButton *event)
 {
        if ((event->type == GDK_BUTTON_PRESS) && ( event->button == 1)) {
-               combo_entry->set_text(name);
+               list_pointed->push_back(name);
+               combo_entry->set_popdown_strings(*list_pointed);
+               combo_entry->get_entry()->set_text (name);
+               workplace->queue_draw();
                WorkPlace::pointed = ID;
        }
        
@@ -124,91 +128,195 @@ void Splitter::save(FILE *archivo)
 
 bool Splitter::check_connection()
 {
-       ConnectorType aux;
+       ConnectorType aux, aux1, aux2;
        CItem *_item0, *_item1;
        switch (get_img_actual()) {
                        case 0:
-                               connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h
-                               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
+                               aux1 = is_other_connection_area( get_position_x()-5, get_position_y()+16, &_item0); //arriba-izquierda h
+                               aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item1);//abajo-derecha v
                                break;  
                        case 1:
-                               connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v
-                               connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h
+                               aux1 = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5,& _item0);//arriba-derecha v
+                               aux2 = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item1);//abajo-izquierda h
                                break;
                        case 2:
-                               connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v
-                               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
+                               aux2 = is_other_connection_area( get_position_x() + 16, get_position_y() - 5, &_item1);//arriba-izquierda v
+                               aux1 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item0); //abajo-derecha h
                                break;
                        case 3:
-                               connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h
-                               connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v
+                               aux2 = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item1);//arriba-derecha h
+                               aux1 = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item0); //abajo-izquierda v
        }
-       if (connect_vec[0].type != UNDEF && connect_vec[1].type != UNDEF) {
-               aux = connect_vec[0].type; 
-               connect_vec[0].type = connect_vec[1].type;
-               connect_vec[1].type = aux;
+       if ((aux2 != UNDEF) && (aux1 != UNDEF)) {
+               if (!is_connected) {
+                       connect_vec[0].type = aux2;
+                       connect_vec[1].type = aux1;
+               }
                connect_vec[0].id_dest = _item0->get_id();
                connect_vec[1].id_dest = _item1->get_id();
                return ( is_connected = (connect_vec[0].type != connect_vec[1].type) );
        }
-       else return is_connected;
+       return is_connected = false;
 }
 
 ConnectorType Splitter::get_connector_type(int _a, int _b)
 {
        CItem *_item;
-       if ( ! is_connected ) {
-               switch (imgActual) {
-                       case 0: 
-                               if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h
-                                       return is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item);
-                               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
-                                       return is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item);
-                               break;
-                       case 1:
-                                if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v
-                                        return  is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item);
-                                if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h
-                                        return is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item);
-                                break;
-                       case 2:
-                               if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v
-                                       return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item); 
-                               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
-                                       return is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item);
-                               break;
-                       case 3:
-                               if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h
-                                       return is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item);
-                               if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v
-                                       return is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item);
-               }
-       } else {
-               switch (imgActual) {
-                       case 0: 
-                               if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) // arriba - izquierda h
-                                       return connect_vec[0].type;
-                               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
-                                       return connect_vec[1].type;
-                               break;
-                       case 1:
-                                if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) //arriba-derecha v
-                                        return  connect_vec[0].type;
-                                if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) // abajo-izquierda h
-                                        return connect_vec[1].type;
-                                break;
-                       case 2:
-                               if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) //arriba-izquierda v
-                                       return connect_vec[1].type;
-                               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
-                                       return connect_vec[0].type;
-                               break;
-                       case 3:
-                               if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) //arriba-derecha h
-                                       return connect_vec[1].type;
-                               if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) // abajo-izquierda v
-                                       return connect_vec[0].type;
-               }
+       switch (imgActual) {
+               case 0: 
+                       if ( (_a <= x+10)&&(_a > x) && (_b <=y+22)&&(_b>=y+10) ) {// arriba - izquierda h
+                               if ( is_connected ) return connect_vec[0].type;
+                               connect_vec[1].type = is_other_connection_area (get_position_x()+get_image()->get_width()-16, +get_position_y()+get_image()->get_height() + 5, &_item);
+                               switch ( connect_vec[1].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                       break;
+                                       case OUT:
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                       break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[0].type;
+                       }
+                       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
+                               if ( is_connected ) return connect_vec[1].type;
+                               connect_vec[0].type = is_other_connection_area( get_position_x()-5, get_position_y()+16,& _item);
+                               switch ( connect_vec[0].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                               break;
+                                       case OUT:
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                               break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[1].type;
+                       }
+               break;
+               case 1:
+                       if ( (_a <= x+image->get_width()-10)&&(_a >= x+image->get_width()-22) && (_b <=y+10)&&(_b > y) ) {//arriba-derecha v
+                               if (is_connected) return connect_vec[0].type;
+                               connect_vec[1].type = is_other_connection_area( get_position_x()-5, get_position_y()+get_image()->get_height()-16, &_item);
+                               switch ( connect_vec[1].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                       break;
+                                       case OUT:
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                       break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[0].type;
+                       }
+                                       
+                       if ( (_a <= x+10)&&(_a > x)&&(_b<=y+image->get_height()-10)&&(_b>=y+image->get_height()-22) ) {// abajo-izquierda h
+                               if ( is_connected ) return connect_vec[1].type;
+                               connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width() - 16, get_position_y() -5, &_item);
+                               switch ( connect_vec[0].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                               break;
+                                       case OUT:
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                               break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[1].type;
+                       }
+               break;
+               case 2:
+                       if ( (_a <= x+22)&&(_a >= x+10) && (_b <=y+10)&&(_b > y) ) {//arriba-izquierda v
+                               if ( is_connected ) return connect_vec[1].type;
+                               connect_vec[0].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y()+get_image()->get_height() - 16, &_item); 
+                               switch ( connect_vec[0].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                               break;
+                                       case OUT:
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                               break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[1].type;
+                       }
+
+                       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
+                               if (is_connected ) return connect_vec[0].type;
+                               connect_vec[1].type = is_other_connection_area( get_position_x() + 16, get_position_y() - 5,& _item);
+                               switch ( connect_vec[1].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                       break;
+                                       case OUT:
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                       break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[0].type;
+                       }
+                       break;
+               case 3:
+                       if ( (_a <= x+image->get_width()-1)&&(_a >= x+image->get_width()-10) && (_b <=y+22)&&(_b>=y+10) ) {//arriba-derecha h
+                               if ( is_connected ) return connect_vec[1].type;
+                               connect_vec[0].type = is_other_connection_area( get_position_x() + 16, get_position_y()+get_image()->get_height() + 5, &_item);
+                               switch ( connect_vec[0].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                               break;
+                                       case OUT:
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                               break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[1].type;
+                       }
+                               
+                       if ( (_a <= x+22)&&(_a>=x+10)&&(_b<=y+image->get_height()-1)&&(_b>=y+image->get_height()-10) ) {// abajo-izquierda v
+                               if ( is_connected ) return connect_vec[0].type;
+                               connect_vec[1].type = is_other_connection_area( get_position_x()+get_image()->get_width()+5, get_position_y() +16,& _item);
+                               switch ( connect_vec[1].type ) {
+                                       case IN: 
+                                               connect_vec[0].type = IN;
+                                               connect_vec[1].type = OUT;
+                                       break;
+                                       case OUT:
+                                               connect_vec[0].type = OUT;
+                                               connect_vec[1].type = IN;
+                                       break;
+                                       case UNDEF:
+                                               return UNDEF;
+                               }
+                               is_connected = true;
+                               return connect_vec[0].type;
+                       }
        }
        return UNDEF;
 }