From e5f9e15b59fc1ade287321c796ec7c4b9aa27600 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Thu, 23 Oct 2003 17:31:39 +0000 Subject: [PATCH] Subo esto que compila pero se cuelga cuando soltas un item, y ademas no se como hacer para que actualice la imagen cuando se rota. Supongo que se cuelga en el evento que recive el drag, pero no se donde ni porque. Voy a seguir probando. --- Constructor/btn_salir.cpp | 15 -- Constructor/btn_salir.h | 14 -- Constructor/canio.cpp | 34 +++ Constructor/canio.h | 19 ++ Constructor/canio_n.png | Bin 0 -> 365 bytes Constructor/canio_s.png | Bin 0 -> 445 bytes Constructor/codo.cpp | 42 ++++ Constructor/codo.h | 21 ++ Constructor/codo_e.png | Bin 0 -> 1157 bytes Constructor/codo_n.png | Bin 0 -> 1140 bytes Constructor/codo_o.png | Bin 0 -> 1152 bytes Constructor/codo_s.png | Bin 0 -> 1149 bytes Constructor/constructor.cpp | 136 +++++++++++ Constructor/constructor.glade | 422 ++++++++++++++++++++++++++++++---- Constructor/constructor.h | 48 ++++ Constructor/ico_canio.png | Bin 0 -> 352 bytes Constructor/ico_codo.png | Bin 0 -> 687 bytes Constructor/ico_y.png | Bin 0 -> 664 bytes Constructor/item.cpp | 30 +++ Constructor/item.h | 21 ++ Constructor/item_canio.png | Bin 0 -> 365 bytes Constructor/item_codo.png | Bin 0 -> 1152 bytes Constructor/item_y.png | Bin 0 -> 742 bytes Constructor/main.cpp | 13 +- Constructor/null.png | Bin 0 -> 251 bytes Constructor/ventana.cpp | 43 ---- Constructor/ventana.h | 23 -- Constructor/workplace.cpp | 22 ++ Constructor/workplace.h | 17 ++ Constructor/y.cpp | 42 ++++ Constructor/y.h | 21 ++ Constructor/y_e.png | Bin 0 -> 992 bytes Constructor/y_n.png | Bin 0 -> 742 bytes Constructor/y_o.png | Bin 0 -> 990 bytes Constructor/y_s.png | Bin 0 -> 686 bytes 35 files changed, 833 insertions(+), 150 deletions(-) delete mode 100644 Constructor/btn_salir.cpp delete mode 100644 Constructor/btn_salir.h create mode 100644 Constructor/canio.cpp create mode 100644 Constructor/canio.h create mode 100644 Constructor/canio_n.png create mode 100644 Constructor/canio_s.png create mode 100644 Constructor/codo.cpp create mode 100644 Constructor/codo.h create mode 100644 Constructor/codo_e.png create mode 100644 Constructor/codo_n.png create mode 100644 Constructor/codo_o.png create mode 100644 Constructor/codo_s.png create mode 100644 Constructor/constructor.cpp create mode 100644 Constructor/constructor.h create mode 100644 Constructor/ico_canio.png create mode 100644 Constructor/ico_codo.png create mode 100644 Constructor/ico_y.png create mode 100644 Constructor/item.cpp create mode 100644 Constructor/item.h create mode 100644 Constructor/item_canio.png create mode 100644 Constructor/item_codo.png create mode 100644 Constructor/item_y.png create mode 100644 Constructor/null.png delete mode 100644 Constructor/ventana.cpp delete mode 100644 Constructor/ventana.h create mode 100644 Constructor/workplace.cpp create mode 100644 Constructor/workplace.h create mode 100644 Constructor/y.cpp create mode 100644 Constructor/y.h create mode 100644 Constructor/y_e.png create mode 100644 Constructor/y_n.png create mode 100644 Constructor/y_o.png create mode 100644 Constructor/y_s.png diff --git a/Constructor/btn_salir.cpp b/Constructor/btn_salir.cpp deleted file mode 100644 index 87a850b..0000000 --- a/Constructor/btn_salir.cpp +++ /dev/null @@ -1,15 +0,0 @@ -//btn_salir.cpp -#include "btn_salir.h" -BtnSalir::BtnSalir(BaseObjectType* cobject, const Glib::RefPtr& refGlade) -{ - //btn_salir.signal_released().connect(SigC::slot(*this,&BtnSalir::on_pressed)); -} - -BtnSalir::~BtnSalir() -{ -} - -void BtnSalir::on_pressed() -{ - Gtk::Main::quit(); -} diff --git a/Constructor/btn_salir.h b/Constructor/btn_salir.h deleted file mode 100644 index 6717254..0000000 --- a/Constructor/btn_salir.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef BTN_SALIR_H -#define BTN_SALIR_H -#include -#include -#include -class BtnSalir : public Gtk::Button{ -public: - BtnSalir(BaseObjectType* cobject, const Glib::RefPtr& refGlade); - virtual ~BtnSalir(); -protected: - virtual void on_pressed(); -}; - -#endif diff --git a/Constructor/canio.cpp b/Constructor/canio.cpp new file mode 100644 index 0000000..387ce31 --- /dev/null +++ b/Constructor/canio.cpp @@ -0,0 +1,34 @@ +#include "canio.h" + +Canio::Canio() +{ + imageN = Gdk::Pixbuf::create_from_file("canio_n.png"); + imageS = Gdk::Pixbuf::create_from_file("canio_s.png"); + null = Gdk::Pixbuf::create_from_file("null.png"); + imgActual = 0; + image = imageN; + set_size_request(image->get_width(), image->get_height()); +} + +Canio::~Canio() +{ +} + +bool Canio::on_button_press_event(GdkEventButton *event) +{ + if (event->type == GDK_2BUTTON_PRESS){ + image = null; //como hago para actualizar????? + 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); + imgActual++; + switch (imgActual) { + case 1: + image = imageS; + break; + default: + imgActual = 0; + image = imageN; + } + 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); + } + return true; +} diff --git a/Constructor/canio.h b/Constructor/canio.h new file mode 100644 index 0000000..b014b5d --- /dev/null +++ b/Constructor/canio.h @@ -0,0 +1,19 @@ +// canio.h +#ifndef _CANIO_H_ +#define _CANIO_H_ + +#include "item.h" + +class Canio : public CItem { + public: + Canio(); + virtual ~Canio(); + virtual bool on_button_press_event(GdkEventButton *event); + private: + int imgActual; + + Glib::RefPtr imageN; // 0 + Glib::RefPtr imageS; // 1 + Glib::RefPtr null; +}; +#endif diff --git a/Constructor/canio_n.png b/Constructor/canio_n.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7008e6d7341c58118952ee017f8a3dac6eb040 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^3P2pk!3HFqg2Y^b6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)AP6(or^HVL3bL1Y`ns}T<`U(V6@8zO&}%WQZeW4Ek(bh4gw7i>pdNH zt6B9v$Z+v}JQv`rRo%v=*OU{he_;X_--RV|ldMD>4?GH3?{A_g`e$>b>CKt`Yi4uC zOt#$MzsLC?W5qqr0)BDpt^ar#nOHak6c#)Xt%x~U#~gp)>9JSy4~PnceUcZrwe4*7 z`{kKQGVZ4~-MO+qQ)<;JrKKfC^2sf8KEIM}Q@ma}_hv=k@#MH^PoKv0-~Hdf05Qw~ z7eiy$I&14a^PbP#mTfMYe^2VyzWu(MbKeLis}wjtOI&&=zW@Dvg#!1o*?wRX{$xAc dsNVUPJz2H>ri;6%4looLJYD@<);T3K0RUYjfu#Td literal 0 HcmV?d00001 diff --git a/Constructor/canio_s.png b/Constructor/canio_s.png new file mode 100644 index 0000000000000000000000000000000000000000..6e867c303f76e7687d76ca447025b5c227b6f78a GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^aX_rV!3HE}|2lskNUg*aQ;`zX7%Bx-PPOld7V`7g>Ji=1JC$odQ=DU0h)Ah#u zVhf2+VxOzU;yPQylO9fus8ChD_&Wc?z0Gm!e>cACZ2BIzN0IwK>+G__dE15Mg(kl( z;|{*rrt?QpM~wT_qA9V0GgqyP*t^z6`dcqlKax@C%t-})@_+Q3qi5LpO72ogD6ARCMtvO-# zMtc2`L)sfZcget_width(), image->get_height()); +} + +Codo::~Codo() +{ +} + +bool Codo::on_button_press_event(GdkEventButton *event) +{ + if (event->type == GDK_2BUTTON_PRESS){ + image = null; //como hago para actualizar????? + 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); + imgActual++; + switch (imgActual) { + case 1: + image = imageE; + break; + case 2: + image = imageS; + break; + case 3: + image = imageO; + break; + default: + imgActual = 0; + image = imageN; + } + 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); + } + return true; +} diff --git a/Constructor/codo.h b/Constructor/codo.h new file mode 100644 index 0000000..edbed25 --- /dev/null +++ b/Constructor/codo.h @@ -0,0 +1,21 @@ +// codo.h +#ifndef _CODO_H_ +#define _CODO_H_ + +#include "item.h" + +class Codo : public CItem { + public: + Codo(); + virtual ~Codo(); + virtual bool on_button_press_event(GdkEventButton *event); + private: + int imgActual; + + Glib::RefPtr imageN; // 0 + Glib::RefPtr imageS; // 1 + Glib::RefPtr imageE; // 2 + Glib::RefPtr imageO; // 3 + Glib::RefPtr null; +}; +#endif diff --git a/Constructor/codo_e.png b/Constructor/codo_e.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fe30c2d9e4bd9e22c85398aac7cccb4b8f3607 GIT binary patch literal 1157 zcmV;01bX|4P)9zhi94ngod!LSh;dbd6cfAXpml;6Zy31W&mHss|T(>7KkS`41L7 zIKx|7KJwv3~)!=x4~6bUdIjZDJo>gtfo<=!wU#t6j% zj{Z7Q9cC~XaCLR{T6H0YC>D^-W>tq73$YHCV#9pQU{kXKy>$S4%xa=Ea(yQ@0yh35sH ze|nBoDn%}rtMmm?9&BFc*%VFzQ4}Fb5`#owe0&@e6BA5oF@cB*4q29ea=YCGMu)@U zpj0YFO0pjsurlhz3gw|rr<0k0`T2SBcsz7^dRmeME&_&zhG=DFg_(p%BtjmKhtAK> z-|!Tmct1cCMI;glW>atE=Me;hL3DO@z7B;#bbEWttadRJC4ki*;TJ|nM)6L1hh#Dd zhr>akP>6PRb_zeAGepsT003-nZ`0V=7~cQ!{!tqFu>Aqk)6V%Xc;!{Fc``uqD~ zu~=X>o6*qF0JGWrXJcdI4?4S!SltE{3jl!j_I8TJVz5~s|2vkqzrV%O(h|_n#?jdkz+zjWSOLLcknDClUj6!tLAnZb0F#xV4a(L5U&h+n8uj({F}o9# zeAIBb3jjcOcejws9dJw6(QSAP}HhI~GcXf#Tblanx+Oz`{tcsBYBFHJAi z7iai1_-F#|v%bDgv$L~^Mx$tMZbnB(2SibX*XxDvM_=&;pPGRCY;JB+B9VY3NsuH7 z8yg$Y>-F$@y%0qaEiEmmudj#EX#C%>H`)Iy@{|QU#P#(xR##U^k|Z1)9N_Zu64`9_ z!I97BaU!4a*%7J~1e?HYPq6AglhXw7Zh$wM0NxGoMiaoh0p2{#b-;H5;adiUJ^}v# X8;tvUybE8<00000NkvXXu0mjfj#K~b literal 0 HcmV?d00001 diff --git a/Constructor/codo_n.png b/Constructor/codo_n.png new file mode 100644 index 0000000000000000000000000000000000000000..75d86be80a147bab992daf7f7f6f9e759cf781e5 GIT binary patch literal 1140 zcmV-)1dIELP)?gVn$QLyTi1;LttUVeZx6g>0^n_cw@d)M4e*u;fVTnO zG6C>5z*{B&-UfKf1i;$>ZPqK0Yr z_xI@S?IkccoK7dH$=Oi1Kt7-U-QlQq+0;o81XXbj1)x|g`t5c*lfJB0tE#w$0#GOv zzyiRD!gaSN2oWn%)!<#Ook?9|h8y|0QUCw@OpE=S+t&>OeU$nzaJm*QMZ-r>ua>Px2uY6X7;(NT7_3dySuvx1OkX6s@uxx z=_y<;m&#}-i@FO0Csb8l54B3Ag08MEIzB#T;zg1q+TY(dP9?axxk-zQi|`J4ne->i zGDb&7Ro;%AXTa6f)vNCAZaVpJ!o~-ITrQVtFI)j!US5*d>!q!&EoOs{#bPu!H>cVQ zw_6~S$xt8=z}ngxUM#&})~_tf5JgdSeBA+@ot@Fj$_hVOu&>2RW@r3J06t!Qg&`@8k@^k8gk4CCYDcCLIGehxsyr#ENLli13B98(hZun9@aH$@^5CWAK&fOI-dv$L}_KR-|Te14hL;2R!5JRYZD zFh~Of1DfCSh69kzW@%$%gQljY$nW=4I2_hg;i+xx_5%a}_qCrE`z;1pmXSy#aBy&d zLZN_#g#}2G1i#;}`9q6ZeKPFho&=D2nj; zd>9%U`sRcFr-%fKKiKW|Um0Z9C3ZVP4j`M&*7fSKkl`0Y zdSwFOZGg8-0K5(GmI;8j0p7Bp34|^NJ$(k~O8b9=c9zhf+@lOPF%U}|;5n3&ZJx}vy(EP-Mq`%t6Gt?A3yJG*UfG&?cftbhWye1WDqCt@7(3NZVz*PMo)S8J+Lr9R}Wfe?LC_ z=Es}I6VL#H3;OjDpbHWhIMq~*Z~-`F;N)iD!9fkY6W}cq0Ph5N%LKqX0p2nJ@J@iY z8ksre0Jqys7K;T|tM#+9wY3$Uot=t%+Jpw91aT>i$%ZrXVnH`G8!29 z{A+A)Z`0J&6nVW~T3J~kA_D7K*8pzE{{B9Vjg3(#6r$tfW2PVs0pNDTVlk2=iPqQG znL#iV01#+*cb9xVAH`xZCJ+n<;C2iQ3{X5C*A2n20MhT%+9>sR{;Rv z>GoiFc=(=G@Bk_RRM|EU4GmS@3m!xT0Kn71rw~OETU%RIRl$P+005Cl1d5_m^$xq= z;U=Kn*$#)p0lVD}yWI|l!vUw$iShAqyqJ8!Ajp?>`sXQv!5~tpl;(2;c1L0kAd|@m z*=+Xrd_F&v%jJ;I=W%|1j^*WLIDd4aySp2~U=Y*O)A0BDnT5WUyUmSfj%P@vQqrqA0zRD=7ZMAn`k|Y@i01@Hv@Q^w>I+y|Q`Fxbi<-V`G9`JvXBuSWjD4(EG#S_8jUjXs-_V(q5wA6TXY`VcXf3ME|-hm{_z%1{7-aw_4M>$b8}PE z+D0nW&&8(E(NSz{Yydjxy;1t=0@9P z1)=goP#X!~33TTriX4Ey7zFzUfa8ueA6cFVY0(YXT+C)Acb$C#JY)jkod9o{0C*?B zTP6VB3GkK)fOi7CWdh)x0B@N9cqhPHCIH?E@YbUTP}>tBn?SJDEZp5X2mS_U{?`ot S&Pm1q0000qtDIRbS zm@Z?|g_smK(}gpP58N2R$6QG?qKJx)9W_A`AJBxa3t`$R1#i4x?z!Uqg}eP8znpW= z$;mMh5$+nMFHD3AhCqJ;4;aE|PX&NOhB$RV8AF&mjUhmE0irPkh%P`hh5*q8h(;It zfJ`Ryy)4UbWm(3~&JMEKEONQr|2~C60Z8-ZHfg;R+}PNl)zwwVvJ6?4kw_#^Sy>66 z&j-KXkA{W@*ladft=7+;M_)bqCrCMf0z)x%8VOihTB2AihRMlEI2;bNwzk6W_rvG& z;qiBmix0>s07O)hC!fz_e0-b&fdF-MbkOMNC>bs`jt#qeVJMX72503_FwSXfv&e_t)eM0ip{KjUhmE0irPk zh%P`hh5*q8h{g~gx&YA_0z?-e8bg5S0z`A~1(;9& refGlade):Gtk::Window(cobject) +{ + set_title("Constructor"); + + + ico_canio = Gdk::Pixbuf::create_from_file("item_canio.png"); + ico_y = Gdk::Pixbuf::create_from_file("item_y.png"); + ico_codo = Gdk::Pixbuf::create_from_file("item_codo.png"); + + refGlade->get_widget("btn_canio", btn_canio); + refGlade->get_widget("btn_codo", btn_codo); + refGlade->get_widget("btn_y", btn_y); + + refGlade->get_widget_derived("workplace", workplace); //fixed + + + + //Targets: + listTargets.push_back( Gtk::TargetEntry("STRING") ); + listTargets.push_back( Gtk::TargetEntry("text/plain") ); + listTargets.push_back( Gtk::TargetEntry("POINTER") ); + listTargets.push_back( Gtk::TargetEntry("application/pointer") ); + + btn_canio->drag_source_set(listTargets); + btn_y->drag_source_set(listTargets); + btn_codo->drag_source_set(listTargets); + + btn_canio->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_btn_canio_drag_get)); + btn_y->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_btn_y_drag_get)); + btn_codo->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_btn_codo_drag_get)); + // Señales para cambiar el icono cuando empieza el drag. + btn_canio->signal_drag_begin().connect( SigC::slot(*this, &Constructor::on_canio_drag_begin)); + btn_y->signal_drag_begin().connect( SigC::slot(*this, &Constructor::on_y_drag_begin)); + btn_codo->signal_drag_begin().connect( SigC::slot(*this, &Constructor::on_codo_drag_begin)); + + + workplace->drag_dest_set(listTargets); + workplace->signal_drag_data_received().connect( SigC::slot(*this, &Constructor::on_item_drop_drag_received) ); +} + +Constructor::~Constructor() +{ +} +void Constructor::on_btn_canio_drag_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time) +{ + gtk_selection_data_set (selection_data, selection_data->target, 8, (const guchar*)"item_canio.png", 14); +} + +void Constructor::on_btn_y_drag_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time) +{ + gtk_selection_data_set(selection_data, selection_data->target,8,(const guchar*)"item_y.png",10); +} + +void Constructor::on_btn_codo_drag_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time) +{ + gtk_selection_data_set(selection_data, selection_data->target,8,(const guchar*)"item_codo.png",13); +} + +void Constructor::on_canio_drag_begin(const Glib::RefPtr& context) +{ + context->set_icon(ico_canio, 5, 5); +} + +void Constructor::on_y_drag_begin(const Glib::RefPtr& context) +{ + context->set_icon(ico_y, 5, 5); +} + +void Constructor::on_codo_drag_begin(const Glib::RefPtr& context) +{ + context->set_icon(ico_codo, 5, 5); +} + +void Constructor::on_item_drag_begin(const Glib::RefPtr& context, CItem *item) +{ + context->set_icon(item->get_image(), 5, 5); +} + +void Constructor::on_item_drag_data_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time) +{ + if ( strcmp((const char *)selection_data->data,"item_codo.png")==0) + gtk_selection_data_set (selection_data, selection_data->target, 10, (const guchar*)"item_codo.png", 13); + if ( strcmp((const char *)selection_data->data,"item_canio.png")==0) + gtk_selection_data_set (selection_data, selection_data->target, 10, (const guchar*)"item_canio.png", 14); + if ( strcmp((const char *)selection_data->data,"item_y.png")==0) + gtk_selection_data_set (selection_data, selection_data->target, 10, (const guchar*)"item_y.png", 10); +} + +void Constructor::on_item_drop_drag_received(const Glib::RefPtr& context, int x, int y, GtkSelectionData* selection_data, guint info, guint time) +{ + /* Ajusto coordenada x e y para que caigan en un lugar de una cuadricula de 32x32 */ + int i,j; + // el +1 es para evitar un bug cuando se selecciona muy cerce de la + // separacion de 2 cuadritos + i = (x+1)/32; + j = (y+1)/32; + // El drag es de un item + if (selection_data->format == 10) { + workplace->move(*drag_get_source_widget(context), i*32, j*32); + } + + // El Drag es desde la barra de tareas + if ((selection_data->length >= 0) && (selection_data->format == 8)) + { + CItem *a; + if (strcmp((const char *)selection_data->data, "item_codo.png")==0) + a = Gtk::manage( new Codo() ); + else if (strcmp((const char *)selection_data->data, "item_canio.png")==0) + a = Gtk::manage( new Canio() ); + else if (strcmp((const char *)selection_data->data, "item_y.png")==0) { + a = Gtk::manage( new Y() ); + } else { + a = Gtk::manage( new CItem((const char *)selection_data->data) ); + } + workplace->put(*a, i*32, j*32); + // Seteo la lista de tipos de drags + a->drag_source_set(listTargets); + // Conecto las señales + a->signal_drag_data_get().connect( SigC::slot(*this, &Constructor::on_item_drag_data_get)); + + // Utilizo el SigC::bind para que el callback on_drag_begin acepte un + // parametro extra, en este caso un CItem *. Esto se hace para + // que cuando el usuario quiera mover un item, saber que item es + // y pedirle su ícono para mostrar cono icono durante la operacion, + // Esto va a permitir, que si un widget tiene una imagen rotara o algo + // raro se vea el widget tal cual. + a->signal_drag_begin().connect(SigC::bind( SigC::slot(*this, &Constructor::on_item_drag_begin), a)); + a->show(); + listaItems.push_back(a); + } + context->drag_finish(false, false, time); +} diff --git a/Constructor/constructor.glade b/Constructor/constructor.glade index 909386b..d6cdbf0 100644 --- a/Constructor/constructor.glade +++ b/Constructor/constructor.glade @@ -3,7 +3,7 @@ - + 640 480 True @@ -29,7 +29,7 @@ 1 - + True @@ -39,7 +39,7 @@ True - + @@ -78,7 +78,7 @@ - + True @@ -103,7 +103,7 @@ True - + @@ -136,19 +136,6 @@ - - - True - _View - True - - - - - - - - True @@ -156,7 +143,7 @@ True - + @@ -202,41 +189,202 @@ - 1 True GTK_BUTTONBOX_SPREAD 0 - + + 69 + 80 True True True - button6 - True GTK_RELIEF_NORMAL + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + ico_canio.png + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Canio + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + - + True True True - button7 - True GTK_RELIEF_NORMAL + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + ico_codo.png + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Codo + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + - + True True True - button8 - True GTK_RELIEF_NORMAL + + + + True + 0.5 + 0.5 + 0 + 0 + + + + True + False + 2 + + + + True + ico_y.png + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + Division +Empalme + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + @@ -258,8 +406,8 @@ True True - GTK_POLICY_ALWAYS - GTK_POLICY_ALWAYS + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT @@ -269,24 +417,8 @@ GTK_SHADOW_IN - + True - - - - 53 - 27 - True - True - button9 - True - GTK_RELIEF_NORMAL - - - 464 - 8 - - @@ -311,4 +443,198 @@ + + 271 + 194 + Propiedades + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER + False + False + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + -6 + + + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + -5 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + + + + 46 + 25 + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 100 1 10 10 + + + 168 + 16 + + + + + + 48 + 24 + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 100 1 10 10 + + + 168 + 56 + + + + + + 48 + 24 + True + True + 1 + 0 + False + GTK_UPDATE_ALWAYS + False + False + 1 0 100 1 10 10 + + + 168 + 96 + + + + + + 104 + 24 + True + Fluido Máximo + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 32 + 16 + + + + + + 120 + 24 + True + Fluido Mínimo + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 24 + 56 + + + + + + 96 + 24 + True + otra cosa + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + + + 32 + 96 + + + + + 0 + True + True + + + + + + diff --git a/Constructor/constructor.h b/Constructor/constructor.h new file mode 100644 index 0000000..b19281b --- /dev/null +++ b/Constructor/constructor.h @@ -0,0 +1,48 @@ +// ventana principal +#ifndef _CONSTRUCTOR_H_ +#define _CONSTRUCTOR_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "workplace.h" +#include "item.h" +#include "codo.h" +#include "canio.h" +#include "y.h" + + +class Constructor : public Gtk::Window { + public: + Constructor(BaseObjectType* cobject, const Glib::RefPtr& refGlade); + virtual ~Constructor(); + protected: + // / defino los elementos de la ventana. + Gtk::Button *btn_canio, *btn_codo, *btn_y; + WorkPlace *workplace; + Glib::RefPtr ico_canio, ico_y, ico_codo; + std::list listTargets; + Glib::RefPtr ico_last; + std::list listaItems; + + // /señales de control para los elementos de la ventana. + + virtual void on_btn_canio_drag_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time); + virtual void on_btn_y_drag_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time); + virtual void on_btn_codo_drag_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time); + + // señales para cambiar el icono. + virtual void on_canio_drag_begin(const Glib::RefPtr& context); + virtual void on_y_drag_begin(const Glib::RefPtr& context); + virtual void on_codo_drag_begin(const Glib::RefPtr& context); + + virtual void on_item_drag_begin(const Glib::RefPtr& context, CItem *); + virtual void on_item_drag_data_get(const Glib::RefPtr& context, GtkSelectionData* selection_data, guint info, guint time); + + virtual void on_item_drop_drag_received(const Glib::RefPtr& context, int x, int y, GtkSelectionData* selection_data, guint info, guint time); +}; +#endif diff --git a/Constructor/ico_canio.png b/Constructor/ico_canio.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6f83dabc1b8bdd9293e0dd4c9770f23a62672d GIT binary patch literal 352 zcmV-m0iXVfP)-!Fd4?g%742#YmP=sR5@EiSq(C*CgVG2Rq=74<1|o#(QirIyyPUNW@V)8Y{lD-1_;~Mq zAA#49!9dxf;PDHbib|)&AglV)xRL|+#1BNGECJ}5$3mDp0L#Oel^EzW}eOk?HC3O2rP z+!|u;%^U9Hn=z33i7p%Bp@*EEU& zz+$oN_s4=4!GrB5+ukGpk?MMa7|8wCM!b%b$z*oz>ze8w3-JY6lBD_m^&=Od$K!eF z`sPyA+3j{@GMPYs+<^DsF>ttjb|0eB?{c}!d#m2a;qu{)8k^0A+{fHN+yH6x*N)%s z$Ig!(VEJZ^$z(#K(HMyTlR03uTG4Da6*Xf8Fq_Q>olZwl6Q7R{1<>4v*X$8kT!HO< zE`2Xm=?1kq1uz@m3zJ z+=~Ig6{|%fX(!_W1VLu4*`a`}mGxIQSCxD|f8u#v*Hg>t^6sQP83b_UZMn>P5l~8n zO0CkEv1Y;`_eX>1x}I86m%;!|$yjQ yFb#t>^+^B4U-TTJFXo;A0K5b6mBIHu9>i};o_BptvE_9D0000 + +CItem::CItem(const char *filename):Gtk::DrawingArea() +{ + image = Gdk::Pixbuf::create_from_file(filename); + + set_size_request(image->get_width(), image->get_height()); +} + +CItem::CItem() +{ +} + +CItem::~CItem() +{ +} + +bool CItem::on_expose_event(GdkEventExpose* event) +{ + 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); + + // XXX Esto no deberia ser necesario! en todo caso devolves false en + // vez de true para que siga llamando a los otros handlers :) + //Gtk::DrawingArea::on_expose_event(event); + return true; +} diff --git a/Constructor/item.h b/Constructor/item.h new file mode 100644 index 0000000..01b8f87 --- /dev/null +++ b/Constructor/item.h @@ -0,0 +1,21 @@ + + +#ifndef GTKMM_EXAMPLE_DRAWINGAREALINES_H +#define GTKMM_EXAMPLE_DRAWINGAREALINES_H + +#include +#include + +//Custom drawing area with modified expose_event. +class CItem:public Gtk::DrawingArea { +public: + CItem(); + CItem(const char *filename); + ~CItem(); + virtual bool on_expose_event(GdkEventExpose* event); + Glib::RefPtr get_image() { return image; } +protected: + Glib::RefPtr image; +}; + +#endif //GTKMM_EXAMPLE_DRAWINGAREALINES_H diff --git a/Constructor/item_canio.png b/Constructor/item_canio.png new file mode 100644 index 0000000000000000000000000000000000000000..96d6972d48e149d62e1e823dfee9d7642b7ca5e8 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^3P2pk!3HFqg2Y^b6kC$Fy9>jA5L~c#`DCC7XMsm# zF#`j)00=X#Ro+_)6l5>)^mS#w%q7Mrp}Xpt?Ngx8FHaZ8kcv5PZz=j6br5KHSnuhm zTg|HXL57R(fThUo)FC zX0qi5|2@tJ87uB_7VwK(Z~e#1$i%`Sps?V9XhqD)I_CHTPmjHte?U|q?328}t!-zs z-!IQhl5sz^>CTn?nNq7(DJ?BAl22}#^ZAu*o8tA-xi>5Njwi=Wd-^n{|L*?=28dw} zxELC{)>&KcnfH9=wrq3J{CiTr_U-r8ocl&FS*5`FS>n<|@%``TD-^hw&GrME@F&~h dM)l6W?8&P2H(lICb%3G3;OXk;vd$@?2>>fZf?)sv literal 0 HcmV?d00001 diff --git a/Constructor/item_codo.png b/Constructor/item_codo.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea21e790cbc25fd361b82727426799d049e74e8 GIT binary patch literal 1152 zcmV-`1b_R9P)9zhf+@lOPF%U}|;5n3&ZJx}vy(EP-Mq`%t6Gt?A3yJG*UfG&?cftbhWye1WDqCt@7(3NZVz*PMo)S8J+Lr9R}Wfe?LC_ z=Es}I6VL#H3;OjDpbHWhIMq~*Z~-`F;N)iD!9fkY6W}cq0Ph5N%LKqX0p2nJ@J@iY z8ksre0Jqys7K;T|tM#+9wY3$Uot=t%+Jpw91aT>i$%ZrXVnH`G8!29 z{A+A)Z`0J&6nVW~T3J~kA_D7K*8pzE{{B9Vjg3(#6r$tfW2PVs0pNDTVlk2=iPqQG znL#iV01#+*cb9xVAH`xZCJ+n<;C2iQ3{X5C*A2n20MhT%+9>sR{;Rv z>GoiFc=(=G@Bk_RRM|EU4GmS@3m!xT0Kn71rw~OETU%RIRl$P+005Cl1d5_m^$xq= z;U=Kn*$#)p0lVD}yWI|l!vUw$iShAqyqJ8!Ajp?>`sXQv!5~tpl;(2;c1L0kAd|@m z*=+Xrd_F&v%jJ;I=W%|1j^*WLIDd4aySp2~U=Y*O)A0BDnT5WUyUmSfj%P@vQqrqA0zRD=7ZMAn`k|Y@i01@Hv@Q^w>I+y|Q`Fxbi<-V`G9`JvXBuSWjD4(EG#S_8jUjXs-_V(q5wA6TXY`VcXf3ME|-hm{_z%1{7-aw_4M>$b8}PE z+D0nW&&8(E(NSz{Yydjxy;1t=0@9P z1)=goP#X!~33TTriX4Ey7zFzUfa8ueA6cFVY0(YXT+C)Acb$C#JY)jkod9o{0C*?B zTP6VB3GkK)fOi7CWdh)x0B@N9cqhPHCIH?E@YbUTP}>tBn?SJDEZp5X2mS_U{?`ot S&Pm1q0000)^mS#w%q7Yz$8P?`iHU)Mso2xSF{EP7+dH=1!igeBKh~?< z-L`11>zZk~E^J~G6U38O${)~M+c>3;VSgjX>d*t%!Zz?3nKiYtY}+t_@!+v6-Qw*X zhs0*TdAG;rx!uj`wh2o9&(6(>H$UUkZ`;Fc@{`wHzki00n(fga_Y%*G6f^$dwrQ|q zKOlb5agXR(Tj{Gi>zU&Y^IrUMVn0iR1*3u=Lx(WKBkasCmW=!IA~!CQyu9uIf0lP9 zH_D}7e!9bZqh#UVioaLWPkcLlXnsTWfwfZX8<^}E{2TUup8m%E-ujJ?r+w-<`@D|l z4e|@W?S8=Rht%RtkLmad@O9*Qc>5$(9oN%oA=Z_`@FOF_~WSO z-HDrTo>_Kz<=U{--088e8rBIro%*EDTM#P{G`(K6A=W)$N_}cWtZTs3cw)aSdYRk6QX~5GVXFavGLCnhFHZX zQTtdHO&)wro-cZAZy5MYXA@O1TaS?83{1OW7N BKC1u# literal 0 HcmV?d00001 diff --git a/Constructor/main.cpp b/Constructor/main.cpp index 67c3ffc..715de7f 100644 --- a/Constructor/main.cpp +++ b/Constructor/main.cpp @@ -1,9 +1,9 @@ -// g++ -Wall -g `pkg-config --cflags --libs libglademm-2.0` -o ventana main.cc ventana.cc +// g++ -Wall -g `pkg-config --cflags --libs libglademm-2.0` -o ventana main.cpp #include #include #include -#include "ventana.h" +#include "constructor.h" int main (int argc, char **argv) { Gtk::Main kit(argc, argv); @@ -19,10 +19,9 @@ int main (int argc, char **argv) std::cerr << ex.what() << std::endl; return 1; } - - Ventana* pWindow = 0; - refXml->get_widget_derived("window1", pWindow); - pWindow->set_title("Una ventana posta"); - kit.run(*pWindow); + Constructor* pWindow = 0; + refXml->get_widget_derived("wnd_constructor", pWindow); + + kit.run(*pWindow); return 0; } diff --git a/Constructor/null.png b/Constructor/null.png new file mode 100644 index 0000000000000000000000000000000000000000..b7641345b4d7cca37a769c45899f5c59a309c83f GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^jv&mz1|<8wpL7LMY)RhkE)4%caKYZ?lYt_f1s;*b z3=G^tAk28_ZrvZCAbW|YuPggyE-?`vGx<5Jzkos=o-U3d6?5KRVB}>`;5o3Nss6k> zn@SGXv~@E-R{#EXfV)+JrKLeYfXT^$gM(3#R-6Y6DzljDOV6L^0J@36)78&qol`;+ E0H#Si_5c6? literal 0 HcmV?d00001 diff --git a/Constructor/ventana.cpp b/Constructor/ventana.cpp deleted file mode 100644 index bebf3a8..0000000 --- a/Constructor/ventana.cpp +++ /dev/null @@ -1,43 +0,0 @@ -//ventana.cpp -#include "ventana.h" -Ventana::Ventana(BaseObjectType* cobject, const Glib::RefPtr& refGlade): -Gtk::Window(cobject) -{ - refGlade->get_widget("button9", btn_salir); - refGlade->get_widget("fixed1", fixed); - refGlade->get_widget("button6",btn_dibujar); - btn_salir->signal_released().connect(SigC::slot(*this,&Ventana::on_btn_salir_pressed )); - btn_dibujar->signal_released().connect(SigC::slot(*this,&Ventana::on_btn_dibujar_released )); - //btn_dibujar->set_title("una N"); -} - -Ventana::~Ventana() -{ -} - -void Ventana::on_btn_salir_pressed() -{ - Gtk::Main::quit(); -} - -void Ventana::on_btn_dibujar_released() -{ - //quiero dibujar en el fixed - // como lo obtengo?? - Glib::RefPtr win = get_window(); - Glib::RefPtr gc = get_style()->get_black_gc(); - win->draw_line(gc,50,50, 50,100); - win->draw_line(gc,50,50, 80, 100); - win->draw_line (gc,80,100, 80,50); - - win->draw_line (gc,90,50, 90,100); - - win->draw_line (gc,100,50, 100,100); - win->draw_line (gc,100,50, 150,50); - win->draw_line (gc,100,100,150,100); - - win->draw_line (gc,160,50, 160,100); - win->draw_line (gc,160,50, 210,50); - win->draw_line (gc,160,100, 210,100); - win->draw_line (gc,210,50, 210,100); -} diff --git a/Constructor/ventana.h b/Constructor/ventana.h deleted file mode 100644 index df64078..0000000 --- a/Constructor/ventana.h +++ /dev/null @@ -1,23 +0,0 @@ -//ventana.h -#ifndef _VENTANA_H_ -#define _VENTANA_H_ -#include -#include -#include -#include -#include -class Ventana: public Gtk::Window -{ - public: - Ventana(BaseObjectType* cobject, const Glib::RefPtr& refGlade); - virtual ~Ventana(); - protected: - Gtk::Button* btn_salir; - Gtk::Button* btn_dibujar; - Gtk::Fixed* fixed; - virtual void on_btn_salir_pressed(); - virtual void on_btn_dibujar_released(); - -}; - -#endif diff --git a/Constructor/workplace.cpp b/Constructor/workplace.cpp new file mode 100644 index 0000000..f3874e3 --- /dev/null +++ b/Constructor/workplace.cpp @@ -0,0 +1,22 @@ + + +#include "workplace.h" +#include "item.h" +WorkPlace::WorkPlace( BaseObjectType* cobject, const Glib::RefPtr &refGlade):Gtk::Fixed(cobject) +{ + +} + +bool WorkPlace::on_expose_event(GdkEventExpose *e) +{ + int x, y; + for(x=0; xdraw_point (get_style()->get_black_gc(), x,y); + get_window()->draw_point (get_style()->get_black_gc(), x,y+1); + get_window()->draw_point (get_style()->get_black_gc(), x,y-1); + get_window()->draw_point (get_style()->get_black_gc(), x+1,y); + get_window()->draw_point (get_style()->get_black_gc(), x-1,y); + } + return true; +} diff --git a/Constructor/workplace.h b/Constructor/workplace.h new file mode 100644 index 0000000..8a26e1d --- /dev/null +++ b/Constructor/workplace.h @@ -0,0 +1,17 @@ + +#ifndef _H_WORKPLACE_ +#define _H_WORKPLACE_ + +#include +#include +#include +#include + +class WorkPlace:public Gtk::Fixed { +public: + WorkPlace(BaseObjectType* cobject, const Glib::RefPtr &refGlade); + virtual ~WorkPlace() {} + virtual bool on_expose_event(GdkEventExpose *); +}; + +#endif diff --git a/Constructor/y.cpp b/Constructor/y.cpp new file mode 100644 index 0000000..3d84582 --- /dev/null +++ b/Constructor/y.cpp @@ -0,0 +1,42 @@ +#include "y.h" + +Y::Y() +{ + imageN = Gdk::Pixbuf::create_from_file("y_n.png"); + imageS = Gdk::Pixbuf::create_from_file("y_s.png"); + imageE = Gdk::Pixbuf::create_from_file("y_e.png"); + imageO = Gdk::Pixbuf::create_from_file("y_o.png"); + null = Gdk::Pixbuf::create_from_file("null.png"); + imgActual = 0; + image = imageN; + set_size_request(image->get_width(), image->get_height()); +} + +Y::~Y() +{ +} + +bool Y::on_button_press_event(GdkEventButton *event) +{ + if (event->type == GDK_2BUTTON_PRESS){ + image = null; //como hago para actualizar????? + 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); + imgActual++; + switch (imgActual) { + case 1: + image = imageE; + break; + case 2: + image = imageS; + break; + case 3: + image = imageO; + break; + default: + imgActual = 0; + image = imageN; + } + 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); + } + return true; +} diff --git a/Constructor/y.h b/Constructor/y.h new file mode 100644 index 0000000..9ce089f --- /dev/null +++ b/Constructor/y.h @@ -0,0 +1,21 @@ +// y.h +#ifndef _Y_H_ +#define _Y_H_ + +#include "item.h" + +class Y : public CItem { + public: + Y(); + virtual ~Y(); + virtual bool on_button_press_event(GdkEventButton *event); + private: + int imgActual; + + Glib::RefPtr imageN; // 0 + Glib::RefPtr imageS; // 1 + Glib::RefPtr imageE; // 2 + Glib::RefPtr imageO; // 3 + Glib::RefPtr null; +}; +#endif diff --git a/Constructor/y_e.png b/Constructor/y_e.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd74285a4c398a19012c07812b9ab7906205c41 GIT binary patch literal 992 zcmV<610Vc}P)lR+HE@%JU&x)zr%f?bM>XlM)8#l>{%9LQQK6iVafKOhdaOTnRAiXF9E zV~2t@$Rnkr6dW8RK@h=7x900mL`xHG?zvyzr}>6V;V$=iaY>%%^4w!Y1g&Kr8sRN4 zZrQ;H7;`zGDAfdRTeh8rlFPAZtPw!$0mQBmKCg;07Hi_5`b0sq5xQjF9JZW@Pe?U7$9%> zEX#xmgd>FjF2YwT6``(h2Dl2}>2&mc2e=F`BB%mz9bOfHkML>$e1&%fFt)X|mFxfU z>FH_a=jTno*Zy9>oSU5+y6^0L#>&bHySuwgPEPiH4_*PsLw9{vU%_x4;jv{0pMh^6 z&*j44LWFO(+j4SpGW@vD)l7~lbd0dfg{kRt+Pi)_2hbGWIe@nCP60HAcLty}yc>Wz zYQyITI6{~}ZFn~`V9Bm+3gMl72WSl+1t6vH!2wbW9~2FAAkU#?3$*6kncFa0AHZ-sA1K-wbx>2XNT?W?P!}9 z^B)M^h11hhwFpj*1UEJ|j8+6E0LB=#2+qz0v?4e?8PbU0{A^Ggf?*utre*6Nz`g!| zkBbOvYim+2msx+dZqVvSc`Y{>%jfQe+34WtC_%e z^lqPbfxs-fx6eC4$XU_v9}pWMIsn8)NCE)jAtVC;aS)OMfba;(0YF%UBmp2CLb3o5 z1|ewx@Q;u@0Qf~v0Ra9G)Bu1V1XTcV9)Wib`a8Q?QeTM(r3WS932?`<6U}#(HO9aV z&aP3&QECBP)d(Q=0Akk&Aoc)am;Rfpe+0^wZGS304gfGOjPNF3AHM*t O0000FdgVnM;gM+Pr4v^cV&PreaSQ$B>FSZ|~T43nz*k{aCMZ zciW=5u4|^{y0D2&Ob}0ADStq3ZR3NblI4dRF zo$ZDwOX<&Eh9dV50d>g@F@k%h+~;!023y(-Ulmd%o$b+?3wzW zYe6!`}~o{|{cZ{43&w0Py4O+r*;1}o2--~Wa%Sn08tZ?(0 z!yur}aDFTQ!dXlHs6SL3FV-4RL)Lx3rg!PC{xWt~$(69AG| BKd=A* literal 0 HcmV?d00001 diff --git a/Constructor/y_o.png b/Constructor/y_o.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fb7193307e65b1cf1c1a1f9789bcbb3a9a6cc2 GIT binary patch literal 990 zcmV<410np0P)Db_ZhD2q1O`VwW3$0G~m` zZ7LD7+yFA*D{O6TiB$ymTi_mykB^&0P$g5Y%~XaT|dR5*2nAZvk?5rQp-Qbh>58cY!(_;NTkgedO=QbKS8=mIC@4owBY z4PXqo0ky?isl!u1aK8m^!^+BvSp=15K%VEBRRpz%pj8CbQNSXC`Y>n>!OJ|r5<pw;II1}Cj*Gn}I=kz{m`26kf z?@OH5No>vh@O+>~y&+t)Vh2xnzmMwmvtPlZ#z9fGU{Qbq{27)li(=xQ)Ugy73z zO$3z=`5py)jt<;$9|fWTXdtkF@X-yRqH-CPtUS*%Kv<;QWa$>YJqivL6#x_v94k5i z#6?H~0OBDe0|0Rlk^+G62+0A!Z-nl{E=O;Uyq+uBjgs^8^ITk9ct1~)0GF4Svb3~B zqtWnxvY0c$LBDppE!ApOilX@UOitm2Nc6y^!(TOkp~GJ#fKuVF3P9=bR{_8&ydbO@ z25=2u6ooK>aB2`hBYd@56>@`DfL8c+yKV0opc!67=gW}U@TLHKgf|1=E4&s!Wp8iK z=>x;m)D&}ba|7Sa{#w=T?(Q->GdpzK#Yw@&#szaQh0R$YvEM^EQVJD zuo_+mAjfQYcYsrb3CxDqxdPV89h*XUwP%3U@KFF#3LhLGweUd!QVbsqAl2|e08$R` z9U%4aUI8qG_Xc1kycYmV;ne}Gg;xcz7+wv)YIq%hWz2>b5yyRkUEmWm-~Hvied6W* z@AC_o4G)R#6AW1+fY=>~T_b?l9f)23JwSzXV5a2JKY;s+y@^mi0hTj(Gg;+f0RR91 M07*qoM6N<$g5&40JOBUy literal 0 HcmV?d00001 diff --git a/Constructor/y_s.png b/Constructor/y_s.png new file mode 100644 index 0000000000000000000000000000000000000000..62be04c5803461454c38aa0c956f6f391834f147 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^2|(FdgVnM;gMR`H&CYc~S}leMRdV@SoEw{sR|O9#pvw>MvP zYv!RdK9Yj10f8FJ*$jmv)y!?PypH%V8@B#q{Hwfc<%XNLUOBOa8>hKlIb(78*R9{7 zJ$;>bI%8(Pul`;)zu;Bh_j|Q=f&F_@(%L4ysZ4v*skXoM^X1}Wj|-^vjSzfynpAA_~-u{xG7 zjBHo(x$D{EnD&YuU)R9>Kz75{KNJ7m{@2xPFO(*BCp1)a^2sC1F0Z`!DOjZSX=Pq& ztdg!Q7UNr~Piqv(Ki5ONq5Pmjwj6#kUlcR}*!Mz^4lD4GBO literal 0 HcmV?d00001 -- 2.43.0