Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

window.cpp

Go to the documentation of this file.
00001 /* *************************************************************************************
00002         Writer:         Sebastien Bloc
00003         Copyright:      2003-2004
00004         eMail:          sebastien.bloc@free.fr
00005         URL:            http://mignonsoft.free.fr
00006 
00007         This program is free software; you can redistribute it and/or
00008         modify it under the terms of the GNU General Public License
00009         as published by the Free Software Foundation; either version 2
00010         of the License, or (at your option) any later version.
00011 
00012         This program is distributed in the hope that it will be useful,
00013         but WITHOUT ANY WARRANTY; without even the implied warranty of
00014         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015         GNU General Public License for more details.
00016         http://www.gnu.org/copyleft/gpl.html
00017 ************************************************************************************* */
00018 
00019 #include "3d.h"
00020 #include "input.h"
00021 #include "controlEngine.h"
00022 #include "window.h"
00023 #include "mylist.h"
00024 
00025 extern ControlEngine ce;
00026 
00027 // ********************************************************************************
00028 
00029 Window::Window() 
00030 {
00031         // init des variable
00032         name="Window";
00033         titleDock=top;
00034 
00035         // gestion des evenements
00036         canResize=TRUE;
00037         canRotate=TRUE;
00038 
00039         title.onTitle.close.connect(this,OnClose);
00040         onControl.mouse.left.down.connect(this,OnLMRButton);
00041         onControl.mouse.mid.down.connect(this,OnLMRButton);
00042         onControl.mouse.right.down.connect(this,OnLMRButton);
00043 }
00044 
00045 Window::~Window()
00046 {
00047 }
00048 
00049 // ********************************************************************************
00050 
00051 #define DEFAULT_XSIZE_WINDOW 400
00052 #define DEFAULT_YSIZE_WINDOW 300
00053 
00068 void Window::Create(double depth)
00069 {
00070         SetParent();
00071 
00072         faceNode = ce.primitive.AddBox(name,id,depth,TRUE); 
00073         faceNode->elem->material.SetDS(0.5,0.5,0.5);
00074         
00075         ce.Push(this);
00076         ce.primitive.GoTo(FACE_FRONT);
00077         // en haut centré avec marge de 2 pixel
00078         title.Create(this);
00079         switch (titleDock)
00080         {
00081         case top:
00082                 title.faceNode->elem->center.Set(0,-1);
00083                 title.faceNode->elem->position.y.Set(-2,0.5,&faceNode->elem->computeSize.y);
00084                 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00085                 title.faceNode->elem->size.y=24;
00086                 // en dessous du titre de 2 pixel, bordure de 2 pixel
00087                 client.Create();
00088                 client.faceNode->elem->center.Set(0,1);
00089                 client.faceNode->elem->position.y.Set(2,-0.5,&faceNode->elem->computeSize.y);
00090                 client.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00091                 client.faceNode->elem->size.y.Set(-28,1,&faceNode->elem->computeSize.y);
00092                 break;
00093         case bottom:
00094                 title.faceNode->elem->center.Set(0,1);
00095                 title.faceNode->elem->position.y.Set(2,-0.5,&faceNode->elem->computeSize.y);
00096                 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00097                 title.faceNode->elem->size.y=24;
00098                 // au dessus du titre de 2 pixel, bordure de 2 pixel
00099                 client.Create();
00100                 client.faceNode->elem->center.Set(0,-1);
00101                 client.faceNode->elem->position.y.Set(-2,0.5,&faceNode->elem->computeSize.y);
00102                 client.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.x);
00103                 client.faceNode->elem->size.y.Set(-28,1,&faceNode->elem->computeSize.y);
00104                 break;
00105         case left:
00106                 title.faceNode->elem->center.Set(0,-1);
00107                 title.faceNode->elem->angle.Set(0,0,90);
00108                 title.faceNode->elem->position.x.Set(2,-0.5,&faceNode->elem->computeSize.x);
00109                 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.y);
00110                 title.faceNode->elem->size.y=24;
00111                 // au dessus du titre de 2 pixel, bordure de 2 pixel
00112                 client.Create();
00113                 client.faceNode->elem->center.Set(1,0);
00114                 client.faceNode->elem->position.x.Set(30,-0.5,&faceNode->elem->computeSize.x);
00115                 client.faceNode->elem->size.x.Set(-32,1,&faceNode->elem->computeSize.x);
00116                 client.faceNode->elem->size.y.Set(-2,1,&faceNode->elem->computeSize.y);
00117                 break;
00118         case right:
00119                 title.faceNode->elem->center.Set(0,-1);
00120                 title.faceNode->elem->angle.Set(0,0,-90);
00121                 title.faceNode->elem->position.x.Set(-2,0.5,&faceNode->elem->computeSize.x);
00122                 title.faceNode->elem->size.x.Set(-4,1,&faceNode->elem->computeSize.y);
00123                 title.faceNode->elem->size.y=24;
00124                 // au dessus du titre de 2 pixel, bordure de 2 pixel
00125                 client.Create();
00126                 client.faceNode->elem->center.Set(-1,0);
00127                 client.faceNode->elem->position.x.Set(-30,0.5,&faceNode->elem->computeSize.x);
00128                 client.faceNode->elem->size.x.Set(-32,1,&faceNode->elem->computeSize.x);
00129                 client.faceNode->elem->size.y.Set(-2,1,&faceNode->elem->computeSize.y);
00130                 break;
00131         }
00132         ce.Pop();
00133 }
00134 
00135 // ********************************************************************************
00136 
00137 // on a demander la fermeture
00138 int Window::OnClose() 
00139 {
00140         Debug0Param("Window::OnClose()");
00141         Delete();
00142         return 1;
00143 }
00144 
00145 int Window::OnLMRButton(StateMouse *mouse,int face)
00146 {
00147         DebugMouse2("Window::OnLMRButton",mouse,face);
00148         title.GotFocus();
00149         return 1;
00150 }
00151 
00152 void Window::ToString(MyString &str)
00153 {
00154         str.AddFormat("name: %s canResize:%d",name,canResize);
00155 }
00156 
00157 // ----------------------------------------------------------------------------
00158 
00159 ResizingAndRotateControl::ResizingAndRotateControl()
00160 {
00161         trackButton = NULL;
00162         onControl.mouse.move.connect(this,OnHover);
00163 }
00164 
00165 ResizingAndRotateControl::~ResizingAndRotateControl()
00166 {
00167 //      onControl.mouse.move.disconnect();
00168 }
00169 
00171 
00172 int ResizingAndRotateControl::OnHover(StateMouse *mouse,int deltaX,int deltaY,int numFace)
00173 {
00174         //DebugMouse2("ResizingAndRotateControl::OnHover",mouse,numFace);
00175         double dx = 10; // maximum 2 texel du bord en X pour etre activé
00176         double dy = 10; // maximum 2 texel du bord en Y pour etre activé
00177         // gestion dans le cas ou la face et plus petite que les 10 texel ==> /2 de la taille original
00178         Face *face = faceNode->Elems(numFace);
00179         if (face->computeSize.x<(3.0*dx)) dx=face->computeSize.x/3.0;
00180         if (face->computeSize.y<(3.0*dy)) dy=face->computeSize.y/3.0;
00181 
00182         Point2D<double> localPos;
00183         Point2D<double> pos(mouse->pos.x,mouse->pos.y);
00184         localPos = GetLocalPos(numFace,pos);
00185         BOOL isOnLeft = fabs(localPos.x)<=dx;
00186         BOOL isOnRight = (localPos.x>=0)&&(fabs(face->computeSize.x-localPos.x)<=dx);
00187         BOOL isOnTop = fabs(localPos.y)<=dy;
00188         BOOL isOnBottom = (localPos.y>=0)&&(fabs(face->computeSize.y-localPos.y)<=dy);
00189         if (isOnLeft||isOnRight||isOnTop||isOnBottom)
00190         {       // affichage de la TrackButton
00191                 if (!trackButton)
00192                 {
00193                         ce.Push(this);
00194                         ce.primitive.GoTo(numFace);
00195                         trackButton = new TrackButton; 
00196                         trackButton->SetResizeAndRotate(canResize,canRotate);
00197                         if (trackButton->Create(20))
00198                         {
00199                                 trackButton->faceNode->elem->position.z=-8;
00200                                 trackButton->SetResizeAndRotate(canResize,canRotate);
00201                                 trackButton->onControl.over.out.connect(this,OnTrackButtonOver);
00202                         }
00203                         ce.Pop();
00204                 }
00205                 int orientation = 
00206                         (isOnLeft?left:0) |
00207                         (isOnRight?right:0) |
00208                         (isOnTop?top:0) |
00209                         (isOnBottom?bottom:0);
00210                 trackButton->SetMode((DockPos)orientation);
00211 
00212                 if (isOnTop) trackButton->YDockTop(0,16,TRUE);
00213                 else if (isOnBottom) trackButton->YDockBottom(0,16,TRUE);
00214                 else trackButton->YDockTop(localPos.y,16,TRUE); 
00215 
00216                 if (isOnLeft) trackButton->XDockLeft(0,16,TRUE);
00217                 else if (isOnRight) trackButton->XDockRight(0,16,TRUE);
00218                 else trackButton->XDockLeft(localPos.x,16,TRUE); 
00219                 return 1;
00220         }
00221         if (trackButton) ce.timerRefresh.onTimer.connect(this,OnNextFrame);
00222         return 0;
00223 }
00224 
00225 int ResizingAndRotateControl::OnNextFrame(Timer *timer)
00226 {
00227         timer->onTimer.disconnect(this);
00228         ce.pickingCursor.ResetCurrent();
00229         delete trackButton; 
00230         trackButton = NULL; 
00231         return 0;
00232 }
00233 
00234 int ResizingAndRotateControl::OnTrackButtonOver(Control *newControl,int face)
00235 {
00236         Debug2Param("ResizingAndRotateControl::OnTrackButtonOver(newCtrl:%s,int face)",newControl,face);
00237         ce.timerRefresh.onTimer.connect(this,OnNextFrame);
00238         return 0;
00239 }

Generated on Fri Aug 20 19:19:52 2004 for 3d Controls by doxygen 1.3.6