Moka Ihm Qt
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
dialog-homothetie.qt.cc
Go to the documentation of this file.
1 /*
2  * Moka : Un modeleur de 3-G-cartes.
3  * Copyright (C) 2004, Moka Team, Université de Poitiers, Laboratoire SIC
4  * http://www.sic.sp2mi.univ-poitiers.fr/
5  * Copyright (C) 2009, Guillaume Damiand, CNRS, LIRIS,
6  * guillaume.damiand@liris.cnrs.fr, http://liris.cnrs.fr/
7  *
8  * This file is part of Moka
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #include "dialog-homothetie.qt.hh"
25 #include "window.qt.hh"
26 #include "HtmlEntities.hh"
27 #include "SpaceWidget.qt.hh"
28 
29 #include <QtGui/QPixmap>
30 #include <QtGui/QLabel>
31 #include <QtGui/QBoxLayout>
32 
33 // Constructeur
34 //-------------
36  GMap3d :: CControlerGMap * controler )
37  :
38  dialogOperations ( parent , HTML::decode("Homothety" ) ,
39  controler , Qt::BottomToolBarArea )
40 {
41 
42  /**** Partie gauche ****/
43  QWidget * gauche = new QWidget ;
44  QGridLayout * bgauche = new QGridLayout ( gauche ) ;
45  bgauche -> setSpacing(0);
46  bgauche -> setContentsMargins(0,0,0,0);
47 
48  FAffParam = new QLabel ( *HTML::decode(" Homothety with respect ")) ;
49  QLabel* FRapport = new QLabel (*HTML::decode("to: ")) ;
50  FSaisieParam = new QComboBox ;
51  FSaisieParam -> addItem ( "Vertex" ) ;
52  FSaisieParam -> addItem ( "Line" ) ;
53  FSaisieParam -> addItem ( "Plane" ) ;
54 
55  bgauche -> addWidget ( FAffParam, 0, 0, 1, 4 );
56  bgauche -> addWidget ( FRapport, 1, 0, Qt::AlignRight | Qt::AlignTop);
57  bgauche -> addWidget ( FSaisieParam, 1, 1, 1, 3,
58  Qt::AlignLeft | Qt::AlignTop) ;
59 
60  /**** Partie haute ****/
61  QWidget * haut = new QWidget ;
62  QHBoxLayout * bhaut = new QHBoxLayout ( haut ) ;
63  bhaut -> setSpacing(0);
64  bhaut -> setContentsMargins(0,0,0,0);
65 
66  FAffSommet = new QLabel ( " Vertex : " ) ;
67  FSaisiePonderation = new QCheckBox
68  ( *HTML::decode("Weighted Homothety") , haut ) ;
69 
70  FSaisie = new champsOperations ( this , bhaut ) ;
71  bhaut -> addSpacing ( SPACE_PIX_SIZE ) ;
72  bhaut -> addWidget ( FSaisiePonderation ) ;
73  bhaut -> addStretch ( 1 );
74 
75  /**** Partie basse ****/
76 
77  QWidget * bas = new QWidget ;
78  QHBoxLayout * bbas = new QHBoxLayout ( bas );
79  bbas -> setSpacing(0);
80  bbas -> setContentsMargins(0,0,0,0);
81 
82  FAffVecteur = new QLabel ;
83  FAffCoef = new QLabel ( "Weight : " );
84 
85  FSaisieCoef = new FloatSpinBox (0.2);
86  FSaisieCoef -> setWrapping ( true ) ;
87 
88  FSaisieIso = new QCheckBox ( "iso" ) ;
89  QIcon p2 ( ":/boutonAnnuler.png" ) ;
90  FClose = new QPushButton ( p2 , "Close" ) ;
91  FClose -> setShortcut ( Qt :: Key_Space ) ;
92 
93  bbas -> addWidget ( FAffVecteur ) ;
94  FSaisieVecteur = new champsOperations ( this , bbas ) ;
95  bbas -> addSpacing ( SPACE_PIX_SIZE ) ;
96  bbas -> addWidget ( FSaisieIso ) ;
97  bbas -> addSpacing ( SPACE_PIX_SIZE ) ;
98  bbas -> addWidget ( FAffCoef ) ;
99  bbas -> addWidget ( FSaisieCoef ) ;
100  bbas -> addSpacing ( SPACE_PIX_SIZE ) ;
101  bbas -> addWidget ( FClose ) ;
102  bbas -> addStretch ( 1 );
103 
104  /**** Partie basse (iso) ****/
105  QWidget * bas2 = new QWidget ;
106  QHBoxLayout * bbas2 = new QHBoxLayout ( bas2 );
107  bbas2 -> setSpacing(0);
108  bbas2 -> setContentsMargins(0,0,0,0);
109 
110  FAffCoeffs = new QLabel ( "Weights: " );
111 
112  FAffX = new QLabel ( " X : " ) ;
113  FSaisieX = new FloatSpinBox (0.2) ;
114  FSaisieX -> setWrapping ( true ) ;
115 
116  FAffY = new QLabel ( " Y : " ) ;
117  FSaisieY = new FloatSpinBox (0.2) ;
118  FSaisieY -> setWrapping ( true ) ;
119 
120  FAffZ = new QLabel ( " Z : " ) ;
121  FSaisieZ = new FloatSpinBox (0.2) ;
122  FSaisieZ -> setWrapping ( true ) ;
123 
124  bbas2 -> addWidget ( FAffX ) ;
125  bbas2 -> addWidget ( FSaisieX ) ;
126  bbas2 -> addWidget ( FAffY ) ;
127  bbas2 -> addWidget ( FSaisieY ) ;
128  bbas2 -> addWidget ( FAffZ ) ;
129  bbas2 -> addWidget ( FSaisieZ ) ;
130  bbas2 -> addStretch ( 1 );
131 
132  // Ajout au layout principal
133  QWidget * centre = new QWidget ;
134  QGridLayout * gl = new QGridLayout ( centre );
135 
136  gl -> setHorizontalSpacing(0);
137  gl -> setVerticalSpacing(5);
138  gl -> setContentsMargins(0,0,0,0);
139  gl -> addWidget(FAffSommet, 0, 0, Qt::AlignRight) ;
140  gl -> addWidget(FAffVecteur, 1, 0, Qt::AlignRight) ;
141  gl -> addWidget(FAffCoeffs, 2, 0, Qt::AlignRight) ;
142  gl -> addWidget(haut, 0, 1) ;
143  gl -> addWidget(bas, 1, 1) ;
144  gl -> addWidget(bas2, 2, 1) ;
145 
146  // Ajout a la toolbar
147  addWidget(gauche);
148  addSeparator();
149  addWidget(centre);
150 
151  update ( ) ;
152 
153  connect ( FSaisieParam , SIGNAL ( activated ( int ) ) ,
154  this , SLOT ( callbackDistance ( ) ) ) ;
155 
156  connect ( FSaisie -> getSaisieX ( ) , SIGNAL ( valueChanged ( double ) ) ,
157  this , SLOT ( callbackCx ( ) ) ) ;
158 
159  connect ( FSaisie -> getSaisieY ( ) , SIGNAL ( valueChanged ( double ) ) ,
160  this , SLOT ( callbackCy ( ) ) ) ;
161 
162  connect ( FSaisie -> getSaisieZ ( ) , SIGNAL ( valueChanged ( double ) ) ,
163  this , SLOT ( callbackCz ( ) ) ) ;
164 
165  connect ( FSaisie -> getButtonRecuperer ( ) , SIGNAL ( clicked ( ) ) ,
166  this, SLOT ( callbackTakeCenter ( ) ) ) ;
167 
168  connect ( FSaisiePonderation , SIGNAL ( clicked ( ) ) ,
169  this , SLOT ( callbackTogglePonderation ( ) ) ) ;
170 
171  connect ( FSaisieVecteur -> getSaisieX ( ) ,
172  SIGNAL ( valueChanged ( double ) ) ,
173  this , SLOT ( callbackVx ( ) ) ) ;
174 
175  connect ( FSaisieVecteur -> getSaisieY ( ) ,
176  SIGNAL ( valueChanged ( double ) ) ,
177  this , SLOT ( callbackVy ( ) ) ) ;
178 
179  connect ( FSaisieVecteur -> getSaisieZ ( ) ,
180  SIGNAL ( valueChanged ( double ) ) ,
181  this , SLOT ( callbackVz ( ) ) ) ;
182 
183  connect ( FSaisieVecteur -> getButtonRecuperer ( ) ,
184  SIGNAL ( clicked ( ) ) ,
185  this, SLOT ( callbackTakeVector ( ) ) ) ;
186 
187  connect ( FSaisieCoef , SIGNAL ( valueChanged (double ) ) ,
188  this , SLOT ( callbackIsoCoef ( ) ) ) ;
189 
190  connect ( FSaisieX , SIGNAL ( valueChanged ( double ) ) ,
191  this , SLOT ( callbackKx ( ) ) ) ;
192 
193  connect ( FSaisieY , SIGNAL ( valueChanged ( double ) ) ,
194  this , SLOT ( callbackKy ( ) ) ) ;
195 
196  connect ( FSaisieZ , SIGNAL ( valueChanged ( double ) ) ,
197  this , SLOT ( callbackKz ( ) ) ) ;
198 
199  connect ( FSaisieIso , SIGNAL ( clicked ( ) ) ,
200  this , SLOT ( callbackToggleIsoButton ( ) ) ) ;
201 
202  connect ( FClose , SIGNAL ( clicked ( ) ) ,
203  this , SLOT ( callbackClose ( ) ) ) ;
204 }
205 
206 // Destructeur
207 //------------
209 {}
210 // Mise a jour de l'affichage
211 //----------------------------
213 {
214  FUpdate = true ;
216 
217  assert ( FParent != NULL ) ;
218 
219  FSaisieParam->setCurrentIndex(getControler()->getObjectScaleType());
220  FSaisiePonderation->setChecked(getControler()->getObjectScalePonderation());
221 
222  switch ( getControler ( ) -> getObjectScaleType ( ) ) {
223  case 0 : // sommet
224  FAffVecteur -> setText ( " " ) ;
225  // setIso ( true ); break ;
226  case 1 : // droite
227  FAffVecteur -> setText ( " Directing Vector: " ) ; break ;
228  case 2 : // plan
229  FAffVecteur -> setText ( " Normal Vector: " ) ; break ;
230  default : { }
231  }
232 
233  bool enabled = (getControler()->getObjectScaleType()!=DistanceToVertex);
234  FSaisieVecteur -> getLabelX ( ) -> setEnabled ( enabled ) ;
235  FSaisieVecteur -> getLabelY ( ) -> setEnabled ( enabled ) ;
236  FSaisieVecteur -> getLabelZ ( ) -> setEnabled ( enabled ) ;
237  FSaisieVecteur -> getSaisieX ( ) -> setEnabled ( enabled ) ;
238  FSaisieVecteur -> getSaisieY ( ) -> setEnabled ( enabled ) ;
239  FSaisieVecteur -> getSaisieZ ( ) -> setEnabled ( enabled ) ;
240  FSaisieVecteur -> getButtonRecuperer ( ) -> setEnabled ( enabled );
241 
242 
243  bool not_iso_mode = ! ( getControler()->getObjectScaleIso() ) ;
244 
245  FSaisieIso ->setChecked ( !not_iso_mode ) ;
246 
247  FSaisieCoef -> setVisible ( !not_iso_mode ) ;
248  FAffCoef -> setVisible ( !not_iso_mode ) ;
249 
250  FAffCoeffs -> setVisible ( not_iso_mode ) ;
251  FAffX -> setVisible ( not_iso_mode ) ;
252  FSaisieX -> setVisible ( not_iso_mode ) ;
253  FAffY -> setVisible ( not_iso_mode ) ;
254  FSaisieY -> setVisible ( not_iso_mode ) ;
255  FAffZ -> setVisible ( not_iso_mode ) ;
256  FSaisieZ -> setVisible ( not_iso_mode ) ;
257 
258  FSaisie -> setValueX ( getCx ( ) ) ;
259  FSaisie -> setValueY ( getCy ( ) ) ;
260  FSaisie -> setValueZ ( getCz ( ) ) ;
261 
262  FSaisieVecteur -> setValueX ( getVx ( ) ) ;
263  FSaisieVecteur -> setValueY ( getVy ( ) ) ;
264  FSaisieVecteur -> setValueZ ( getVz ( ) ) ;
265 
266  if (!not_iso_mode)
267  FSaisieCoef->setValuef(getControler() -> getObjectScaleIsoCoef());
268  else
269  {
270  FSaisieX -> setValuef(getKx()) ;
271  FSaisieY -> setValuef(getKy()) ;
272  FSaisieZ -> setValuef(getKz()) ;
273  }
274 
275  FParent -> repaint ( ) ;
276  FUpdate = false ;
277 }
278 
279 // Accesseurs
280 //-----------
281 void dialogHomothetie :: setDistanceType ( TScaleType type )
282 {
283  assert ( FParent != NULL ) ;
284  if ( type == getControler ( ) -> getObjectScaleType ( ) )
285  return;
286 
287  getControler ( ) -> setObjectScaleType ( type ) ;
288  update ( ) ;
289 }
290 
292 {
293  assert ( FParent != NULL ) ;
294  if ( b == getControler ( ) -> getObjectScaleIso ( ) )
295  return;
296 
297  getControler ( ) -> setObjectScaleIso ( b ) ;
298  update ( ) ;
299 }
300 
301 // SLOTS
302 //------
304 {
305  if ( ! FUpdate )
306  setCx ( FSaisie -> getValueX ( ) ) ;
307 }
308 
310 {
311  if ( ! FUpdate )
312  setCy ( FSaisie -> getValueY ( ) ) ;
313 }
314 
316 {
317  if ( ! FUpdate )
318  setCz ( FSaisie -> getValueZ ( ) ) ;
319 }
320 
322 {
323  if ( ! FUpdate )
324  setVx ( FSaisieVecteur -> getValueX ( ) ) ;
325 }
326 
328 {
329 if ( ! FUpdate )
330  setVy ( FSaisieVecteur -> getValueY ( ) ) ;
331 }
332 
334 {
335  if ( ! FUpdate )
336  setVz ( FSaisieVecteur -> getValueZ ( ) ) ;
337 }
338 
340 {
341  if ( ! FUpdate )
342  setKx ( FSaisieX -> valuef ( ) ) ;
343 }
344 
346 {
347  if ( ! FUpdate )
348  setKy( FSaisieY -> valuef ( ) ) ;
349 }
350 
352 {
353  if ( ! FUpdate )
354  setKz ( FSaisieZ -> valuef ( ) ) ;
355 }
356 
358 {
359  if ( ! FUpdate )
360  setIso ( FSaisieIso -> isChecked ( ) ) ;
361 }
362 
364 {
365  if ( ! FUpdate )
366  setIsoCoef ( FSaisieCoef -> valuef ( ) ) ;
367 }
368 
370 {
371  if ( ! FUpdate )
372  setDistanceType ( ( TDistanceType ) (FSaisieParam -> currentIndex ( ) ) );
373 }
374 
376 {
377  assert ( FParent != NULL ) ;
378 
379  CVertex center;
380  if ( getControler ( ) -> takeCenter ( center ) )
381  setC ( center ) ;
382 }
383 
385 {
386  assert ( FParent != NULL ) ;
387 
388  CVertex vector;
389  if ( getControler ( ) -> takeVector ( vector ) )
390  setV ( vector ) ;
391 }
392 
394 {
395  if ( ! FUpdate )
396  {
397  getControler ( ) -> toggleObjectScalePonderation ( ) ;
398  FParent -> repaint ( ) ;
399  }
400 }
401 
402 // Accesseurs en lecture
403 //----------------------
404 TCoordinate dialogHomothetie :: getCx ( ) const
405 {
406  assert ( FParent != NULL ) ;
407  return getControler ( ) -> getObjectScaleCenter ( ) . getX ( ) ;
408 }
409 
410 TCoordinate dialogHomothetie :: getCy ( ) const
411 {
412  assert ( FParent != NULL ) ;
413  return getControler ( ) -> getObjectScaleCenter ( ) . getY ( ) ;
414 }
415 
416 TCoordinate dialogHomothetie :: getCz ( ) const
417 {
418  assert ( FParent != NULL ) ;
419  return getControler ( ) -> getObjectScaleCenter ( ) . getZ ( ) ;
420 }
421 
422 TCoordinate dialogHomothetie :: getVx ( ) const
423 {
424  assert ( FParent != NULL ) ;
425  return getControler ( ) -> getObjectScaleVector ( ) . getX ( ) ;
426 }
427 
428 TCoordinate dialogHomothetie :: getVy ( ) const
429 {
430  assert ( FParent != NULL ) ;
431  return getControler ( ) -> getObjectScaleVector ( ) . getY ( ) ;
432 }
433 
434 TCoordinate dialogHomothetie :: getVz ( ) const
435 {
436  assert ( FParent != NULL ) ;
437  return getControler ( ) -> getObjectScaleVector ( ) . getZ ( ) ;
438 }
439 
440 TCoordinate dialogHomothetie :: getKx ( ) const
441 {
442  assert ( FParent != NULL ) ;
443  return getControler ( ) -> getObjectScaleCoef ( 0 ) ;
444 }
445 
446 TCoordinate dialogHomothetie :: getKy ( ) const
447 {
448  assert ( FParent != NULL ) ;
449  return getControler ( ) -> getObjectScaleCoef ( 1 ) ;
450 }
451 
452 TCoordinate dialogHomothetie :: getKz ( ) const
453 {
454  assert ( FParent != NULL ) ;
455  return getControler ( ) -> getObjectScaleCoef ( 2 ) ;
456 }
457 
458 // Accesseurs en ecriture
459 //-----------------------
460 void dialogHomothetie :: setCx ( TCoordinate k )
461 {
462  setC ( CVertex ( k , getCy ( ) , getCz ( ) ) ) ;
463 }
464 
465 void dialogHomothetie :: setCy ( TCoordinate k )
466 {
467  setC ( CVertex ( getCx ( ) , k , getCz ( ) ) ) ;
468 }
469 
470 void dialogHomothetie :: setCz ( TCoordinate k )
471 {
472  setC ( CVertex ( getCx ( ) , getCy ( ) , k ) ) ;
473 }
474 
475 void dialogHomothetie :: setVx ( TCoordinate k )
476 {
477  setV ( CVertex ( k , getVy ( ) , getVz ( ) ) ) ;
478 }
479 
480 void dialogHomothetie :: setVy ( TCoordinate k )
481 {
482  setV ( CVertex ( getVx ( ) , k , getVz ( ) ) ) ;
483 }
484 
485 void dialogHomothetie :: setVz ( TCoordinate k )
486 {
487  setV ( CVertex ( getVx ( ) , getVy ( ) , k ) ) ;
488 }
489 
490 void dialogHomothetie :: setKx ( TCoordinate k )
491 {
492  setK ( CVertex ( k , getKy ( ) , getKz ( ) ) ) ;
493 }
494 
495 void dialogHomothetie :: setKy ( TCoordinate k )
496 {
497  setK ( CVertex ( getKx ( ) , k , getKz ( ) ) ) ;
498 }
499 
500 void dialogHomothetie :: setKz ( TCoordinate k )
501 {
502  setK ( CVertex ( getKx ( ) , getKy ( ) , k ) ) ;
503 }
504 
505 void dialogHomothetie :: setC ( const CVertex & C )
506 {
507  assert ( FParent != NULL ) ;
508  if ( C == getControler ( ) -> getObjectScaleCenter ( ) )
509  return;
510 
511  getControler ( ) -> setObjectScaleCenter ( C ) ;
512  update ( ) ;
513 }
514 
515 void dialogHomothetie :: setV (const CVertex & V )
516 {
517  assert ( FParent != NULL ) ;
518  if ( V == getControler ( ) -> getObjectScaleVector ( ) )
519  return;
520 
521  getControler ( ) -> setObjectScaleVector ( V ) ;
522  update ( ) ;
523 }
524 
525 void dialogHomothetie :: setK ( const CVertex & K )
526 {
527  assert ( FParent != NULL ) ;
528  if ( K == getControler ( ) -> getObjectScaleCoef ( ) )
529  return;
530 
531  getControler ( ) -> setObjectScaleCoef ( K ) ;
532  update ( ) ;
533 }
534 
535 void dialogHomothetie :: setIsoCoef ( TCoordinate x )
536 {
537  assert ( FParent != NULL ) ;
538  if ( x == getControler ( ) -> getObjectScaleIsoCoef ( ) )
539  return;
540 
541  getControler ( ) -> setObjectScaleIsoCoef ( x ) ;
542  update ( ) ;
543 }