controller.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. #include "controller.h"
  2. #include "arbeitsview.h"
  3. #include "mainwindow.h"
  4. #include "kmath.h"
  5. #include <QRubberBand>
  6. #include <QDebug>
  7. ArbeitsController *ArbeitsController::controller[ USERMODE_COUNT ];
  8. // gibt den Controller zurück, welcher in einem Bestimmten Modus verwendet
  9. // wird
  10. // m: der Modus, bei dem der gesuchte Controller benutzt wird
  11. ArbeitsController *ArbeitsController::getController( UserMode m )
  12. {
  13. return controller[ m ];
  14. }
  15. // Erstellt die Controller, welche bei den verschiedenen Modis benutzt
  16. // werden sollen
  17. // m: Das Modell, welches alle nötigen Daten vür die Arbeitsansicht enthält
  18. void ArbeitsController::initStaticController( ArbeitsModel *m )
  19. {
  20. controller[ SELECT ] = new HideController( m );
  21. controller[ MOVE ] = new MoveController( m );
  22. controller[ NEW ] = new NewController( m );
  23. controller[ PIPETTE_SELECT ] = new CopyController( m );
  24. controller[ PIPETTE_SET ] = new PasteController( m );
  25. controller[ DELETE ] = new DeleteController( m );
  26. controller[ CUT ] = new CutController( m );
  27. controller[ ZOOM_IN ] = new ZoomInController( m );
  28. }
  29. ArbeitsController::ArbeitsController( ArbeitsModel *m )
  30. {
  31. model = m;
  32. }
  33. // Setzt den Controller zurück
  34. void ArbeitsController::restartController()
  35. {
  36. model->notifyViews();
  37. }
  38. // verwaltet das drehen des Mausrades
  39. void ArbeitsController::wheelEvent(QWheelEvent *e)
  40. {
  41. if( !model->getFrame() )
  42. return;
  43. // Ermitteln der View Größe und der Bildgröße
  44. QSize s = model->getViewSize();
  45. QRect imgRect( QPoint( 0, 0 ), s );
  46. QSize imgS = model->getImage().size();
  47. if( imgS.width() > s.width() )
  48. {
  49. imgS.scale( s, Qt::KeepAspectRatio );
  50. imgRect.setSize( imgS );
  51. }
  52. QPoint bottomRight = model->inverseTranslate( imgRect.bottomRight() );
  53. int xOffset = model->getXOffset(); // Aktualisieren des aus dem Bild angezeigten gebietes
  54. int yOffset = model->getYOffset();
  55. xOffset += (int)( e->angleDelta().y() * (imgRect.width() / 500.0) ) / 2;
  56. yOffset += (int)( e->angleDelta().y() * (imgRect.height() / 500.0) ) / 2;
  57. QPoint nBottomRight( bottomRight.x() - (int)( e->angleDelta().y() * (imgRect.width() / 500.0) ) / 2,
  58. bottomRight.y() - (int)( e->angleDelta().y() * (imgRect.height() / 500.0) ) / 2 );
  59. if( e->angleDelta().y() > 0 )
  60. {
  61. QPoint center( model->getViewPos().x() + model->getViewSize().width() / 2, model->getViewPos().y() + model->getViewSize().height() / 2 );
  62. QPoint move = e->pos() - center;
  63. xOffset += move.x();
  64. yOffset += move.y();
  65. nBottomRight.setX( nBottomRight.x() + move.x() );
  66. nBottomRight.setY( nBottomRight.y() + move.y() );
  67. }
  68. if( xOffset < 0 )
  69. {
  70. nBottomRight.setX( nBottomRight.x() - xOffset );
  71. xOffset -= xOffset;
  72. }
  73. if( yOffset < 0 )
  74. {
  75. nBottomRight.setY( nBottomRight.y() - yOffset );
  76. yOffset -= yOffset;
  77. }
  78. if( nBottomRight.x() > model->getImage().width() )
  79. {
  80. xOffset -= nBottomRight.x() - model->getImage().width();
  81. nBottomRight.setX( model->getImage().width() );
  82. }
  83. if( nBottomRight.y() > model->getImage().height() )
  84. {
  85. yOffset -= nBottomRight.y() - model->getImage().height();
  86. nBottomRight.setY( model->getImage().height() );
  87. }
  88. if( xOffset >= nBottomRight.x() || yOffset >= nBottomRight.y() )
  89. return; // abbruch
  90. // Aktualisieren der Sklallierungsfaktoren
  91. if( xOffset < 0 || yOffset < 0 )
  92. {
  93. xOffset = 0;
  94. yOffset = 0;
  95. model->setScaleFactor(imgRect.width() / (float)model->getImage().width(), imgRect.height() / (float)model->getImage().height());
  96. model->notifyViews();
  97. return;
  98. }
  99. model->setScaleFactor( imgRect.width() / (float)(nBottomRight.x() - xOffset), imgRect.height() / (float)(nBottomRight.y() - yOffset));
  100. model->setOffset( xOffset, yOffset );
  101. model->notifyViews();
  102. }
  103. // verwaltet das Drücken einer Maustaste
  104. void ArbeitsController::mousePressEvent( QMouseEvent *e )
  105. {
  106. model->setMouseButtonPressed( e->button(), e->pos() );
  107. model->notifyViews();
  108. }
  109. // verwaltet das Bewegen der Maus
  110. void ArbeitsController::mouseMoveEvent( QMouseEvent *e )
  111. {
  112. if( model->isMouseButtonPressed( Qt::MidButton ) )
  113. { // Falls die mittlere Masutaste gedrückt ist, kann der nutzer den angezeigten Bereich des Bildes verschieben
  114. QPoint diff = e->pos() - model->getMousePoint();
  115. diff = QPoint( (int)(diff.x() / model->getXScaleFactor()) * 5, (int)(diff.y() / model->getYScaleFactor()) * 5 );
  116. if( diff != QPoint( 0, 0 ) )
  117. {
  118. QSize s = model->getViewSize();
  119. QRect imgRect( QPoint( 0, 0 ), s );
  120. QSize imgS = model->getImage().size();
  121. if( imgS.width() > s.width() )
  122. {
  123. imgS.scale( s, Qt::KeepAspectRatio );
  124. imgRect.setSize( imgS );
  125. }
  126. QPoint bottomRight = model->inverseTranslate( imgRect.bottomRight() );
  127. int xOffset = model->getXOffset(), yOffset = model->getYOffset();
  128. bottomRight.setX( bottomRight.x() + diff.x() );
  129. bottomRight.setY( bottomRight.y() + diff.y() );
  130. xOffset += diff.x();
  131. yOffset += diff.y();
  132. if( xOffset < 0 )
  133. {
  134. bottomRight.setX( bottomRight.x() - xOffset );
  135. xOffset -= xOffset;
  136. }
  137. if( yOffset < 0 )
  138. {
  139. bottomRight.setY( bottomRight.y() - yOffset );
  140. yOffset -= yOffset;
  141. }
  142. if( bottomRight.x() > model->getImage().width() )
  143. {
  144. xOffset -= bottomRight.x() - model->getImage().width();
  145. bottomRight.setX( model->getImage().width() );
  146. }
  147. if( bottomRight.y() > model->getImage().height() )
  148. {
  149. yOffset -= bottomRight.y() - model->getImage().height();
  150. bottomRight.setY( model->getImage().height() );
  151. }
  152. if( xOffset >= bottomRight.x() || yOffset >= bottomRight.y() )
  153. return;
  154. model->setOffset( xOffset, yOffset );
  155. model->notifyViews();
  156. }
  157. }
  158. model->setMousePoint( e->pos() );
  159. model->notifyViews();
  160. }
  161. // verwaltet das Loslassen einer Maustaste
  162. void ArbeitsController::mouseReleaseEvent( QMouseEvent *e )
  163. {
  164. model->setMousePressed( false );
  165. model->notifyViews();
  166. }
  167. /*
  168. * Controller für den SELECT Modus
  169. */
  170. HideController::HideController( ArbeitsModel *m )
  171. : ArbeitsController( m )
  172. {}
  173. void HideController::mouseReleaseEvent( QMouseEvent *e )
  174. { // Verstecken oder sichtbarmachen des Objektes, auf das geklickt wurde
  175. if( model->isMouseButtonPressed( Qt::LeftButton ) && e )
  176. {
  177. model->getFrame()->selectObjectAt( model->inverseTranslate( e->pos() ) );
  178. model->getWindow()->setFrameTreeSelection();
  179. }
  180. ArbeitsController::mouseReleaseEvent( e );
  181. }
  182. /*
  183. * Controller für den MOVE Modus
  184. */
  185. MoveController::MoveController( ArbeitsModel *m )
  186. : ArbeitsController( m )
  187. {}
  188. void MoveController::mousePressEvent( QMouseEvent *e )
  189. { // Auswahl des Punktes der verschoben werden soll
  190. if( e->button() == Qt::LeftButton && !model->getMoveObject().isNull() && model->getInsertIndex() >= 0 )
  191. {
  192. model->getMoveObject()->insertVertex( model->getInsertIndex(), model->getNewVertex(), model->getMovePolygon() );
  193. model->setMoveIndex( model->getInsertIndex() );
  194. model->setInsertIndex( -1 );
  195. }
  196. ArbeitsController::mousePressEvent( e );
  197. }
  198. void MoveController::mouseMoveEvent( QMouseEvent *e )
  199. { // Verschieben des ausgewählten Punktes und findes des der Maus nächstgelegenen Punktes
  200. if( e )
  201. {
  202. if( !model->isMousePressed() )
  203. { // findes des der Maus nächstgelegenen Punktes
  204. bool foundNp = false;
  205. QPoint mousePos = model->inverseTranslate(e->pos());
  206. double mdiff = 0;
  207. for( ObjectPolygon obj : model->getFrame()->getObjects() )
  208. {
  209. if( obj->isSelected() )
  210. {
  211. int pIndex = 0;
  212. for( QPolygon o : obj->getPolygonList() )
  213. {
  214. QPoint last = o.last();
  215. int index = 0;
  216. for( QPoint point : o )
  217. {
  218. QPoint tmp = Math::getNearestPointOnLine( mousePos, point, last );
  219. QPoint dir = mousePos - tmp;
  220. int tmpDiff = dir.x() * dir.x() + dir.y() * dir.y();
  221. if( !foundNp || tmpDiff < mdiff )
  222. {
  223. if( Math::diffSquare( tmp, point ) < 500 )
  224. {
  225. model->setMoveObject( obj, pIndex );
  226. model->setMoveIndex( index );
  227. model->setInsertIndex( -1 );
  228. }
  229. else if( Math::diffSquare( tmp, last ) < 500 )
  230. {
  231. model->setMoveObject( obj, pIndex );
  232. model->setMoveIndex( index - 1 );
  233. model->setInsertIndex( -1 );
  234. if( index - 1 < 0 )
  235. model->setMoveIndex( o.count() - 1 );
  236. }
  237. else
  238. {
  239. model->setMoveObject( obj, pIndex );
  240. model->setInsertIndex( index );
  241. model->setMoveIndex( -1 );
  242. model->setNewVertex( tmp );
  243. }
  244. foundNp = true;
  245. mdiff = tmpDiff;
  246. }
  247. last = point;
  248. index++;
  249. }
  250. pIndex++;
  251. }
  252. }
  253. }
  254. if( !foundNp || mdiff > 500 )
  255. {
  256. model->setInsertIndex( -1 );
  257. model->setMoveIndex( -1 );
  258. }
  259. }
  260. // move
  261. if( model->isMouseButtonPressed( Qt::LeftButton ) && model->getMoveIndex() >= 0 && !model->getMoveObject().isNull() )
  262. {
  263. model->getMoveObject()->moveVertex( model->getMoveIndex(), model->inverseTranslate( e->pos() ), model->getImage().size(), model->getMovePolygon() );
  264. }
  265. }
  266. ArbeitsController::mouseMoveEvent( e );
  267. }
  268. /*
  269. * Controller für den CUT Modus
  270. */
  271. CutController::CutController( ArbeitsModel *m )
  272. : ArbeitsController( m )
  273. {}
  274. void CutController::mouseReleaseEvent( QMouseEvent *e )
  275. {
  276. if( model->isMouseButtonPressed( Qt::LeftButton ) && e )
  277. { // Auswahl der Punkte an denen das Objekt zerschnitten werden soll
  278. QPoint pos = model->inverseTranslate( e->pos() );
  279. QList< ObjectPolygon > objects = model->getFrame()->getObjects();
  280. if( model->getCutObject().isNull() )
  281. { // Auswahl des ersten Punktes
  282. for( auto p = objects.begin(); p != objects.end(); p++ )
  283. {
  284. int pIndex = 0;
  285. for( QPolygon pol : (*p)->getPolygonList() )
  286. {
  287. int index = 0;
  288. for( QPoint point : pol )
  289. {
  290. if( pos.x() > point.x() - 10 && pos.x() < point.x() + 10 && pos.y() > point.y() - 10 && pos.y() < point.y() + 10 )
  291. {
  292. model->setCutObject( *p, pIndex );
  293. model->setCutIndex( index );
  294. }
  295. index++;
  296. }
  297. if( !model->getCutObject().isNull() )
  298. break;
  299. pIndex++;
  300. }
  301. }
  302. }
  303. else
  304. { // Auswahl des zweiten Punktes
  305. if( !model->getCutObject().isNull() && model->getFrame() )
  306. {
  307. int index = 0;
  308. foreach( QPoint point, model->getCutObject()->getPolygonList().at( model->getCutPolygon() ) )
  309. {
  310. if( pos.x() > point.x() - 10 && pos.x() < point.x() + 10 && pos.y() > point.y() - 10 && pos.y() < point.y() + 10 )
  311. break;
  312. index++;
  313. }
  314. if( index >= model->getCutIndex() - 1 && index <= model->getCutIndex() + 1 )
  315. return;
  316. if( ( model->getCutIndex() == 0 && index == model->getCutObject()->getPolygonList().at( model->getCutPolygon() ).size() - 1 ) ||
  317. ( index == 0 && model->getCutIndex() == model->getCutObject()->getPolygonList().at( model->getCutPolygon() ).size() - 1 ) ||
  318. index == model->getCutObject()->getPolygonList().at( model->getCutPolygon() ).size() )
  319. return;
  320. // Zerschneiden des Objektes an den zwei eckpunkten
  321. model->getFrame()->splitObject( model->getCutObject(), model->getCutIndex(), index, model->getCutPolygon() );
  322. model->setCutObject( ObjectPolygon(), 0 );
  323. model->setCutIndex( -1 );
  324. model->getWindow()->setupFrameTree();
  325. }
  326. }
  327. }
  328. ArbeitsController::mouseReleaseEvent( e );
  329. }
  330. /*
  331. * Controller für den PIPETTE_SELECT Modus
  332. */
  333. CopyController::CopyController( ArbeitsModel *m )
  334. : ArbeitsController( m )
  335. {}
  336. void CopyController::mouseReleaseEvent( QMouseEvent *e )
  337. { // Auswahl des Objektes, welches kopiert werden soll
  338. if( model->isMouseButtonPressed( Qt::LeftButton ) && e )
  339. {
  340. if( model->getFrame() )
  341. {
  342. int pIndex;
  343. model->setCopyedObject( model->getFrame()->getObjectAt( model->inverseTranslate( e->pos() ), pIndex ), model->inverseTranslate( e->pos() ) );
  344. model->setCopyedRotation( 0 );
  345. if( !model->getCopyedObject().isNull() )
  346. model->getWindow()->setMode( PIPETTE_SET );
  347. }
  348. }
  349. ArbeitsController::mouseReleaseEvent( e );
  350. }
  351. /*
  352. * Controller für den PIPETTE_SET Modus
  353. */
  354. PasteController::PasteController( ArbeitsModel *m )
  355. : ArbeitsController( m )
  356. {}
  357. void PasteController::mouseMoveEvent( QMouseEvent *e )
  358. { // Setzen der Position und der Rotierung des kopierten Objektes
  359. if( model->isMouseButtonPressed( Qt::RightButton ) )
  360. {
  361. if( !model->getCopyedObject().isNull() )
  362. model->setCopyedRotation( model->getCopyedRotation() + e->pos().x() - model->getMousePoint().x() );
  363. }
  364. ArbeitsController::mouseMoveEvent( e );
  365. }
  366. void PasteController::mouseReleaseEvent( QMouseEvent *e )
  367. { // Einfpgen des Objektes oder der Objekt-ID
  368. if( model->isMouseButtonPressed( Qt::LeftButton ) && e )
  369. {
  370. if( model->getFrame() )
  371. {
  372. model->getFrame()->setObjectAt( model->inverseTranslate( e->pos() ), model->getCopyedObject(), model->getCopyedCenter(), model->getCopyedRotation() );
  373. model->getWindow()->setupFrameTree();
  374. int pIndex;
  375. model->setCopyedObject( model->getFrame()->getObjectAt( model->inverseTranslate( e->pos() ), pIndex ), model->inverseTranslate( e->pos() ) );
  376. model->setCopyedRotation( 0 );
  377. }
  378. }
  379. ArbeitsController::mouseReleaseEvent( e );
  380. }
  381. /*
  382. * Controller für den NEW Modus
  383. */
  384. NewController::NewController( ArbeitsModel *m )
  385. : ArbeitsController( m )
  386. {}
  387. void NewController::mouseReleaseEvent( QMouseEvent *e )
  388. {
  389. if( model->isMouseButtonPressed( Qt::LeftButton ) && e )
  390. { // Hinzufügen von Punkten zum neuen Polygon
  391. if( !model->getNewPolygon() )
  392. model->setNewPolygon( new QPolygon() );
  393. QPoint pos = model->inverseTranslate( e->pos() );
  394. if( model->getNewPolygon()->size() > 3 &&
  395. pos.x() > model->getNewPolygon()->begin()->x() - 10 && pos.x() < model->getNewPolygon()->begin()->x() + 10 &&
  396. pos.y() > model->getNewPolygon()->begin()->y() - 10 && pos.y() < model->getNewPolygon()->begin()->y() + 10 )
  397. { // Polygon ist fertig und wird zur Sequenz hinzugefügt
  398. QList<QPolygon> polygons;
  399. polygons.append( *model->getNewPolygon() );
  400. if( model->getFrame() )
  401. model->getFrame()->addObject( "-1", 0, polygons );
  402. model->setNewPolygon( 0 );
  403. model->getWindow()->setupFrameTree();
  404. }
  405. else
  406. model->getNewPolygon()->append( pos );
  407. }
  408. if( model->isMouseButtonPressed( Qt::RightButton ) && e )
  409. { // Letzten Punkt vom Polygon entfernen
  410. if( model->getNewPolygon() )
  411. {
  412. if( model->getNewPolygon()->size() == 1 )
  413. model->setNewPolygon( 0 );
  414. else
  415. model->getNewPolygon()->pop_back();
  416. }
  417. }
  418. ArbeitsController::mouseReleaseEvent( e );
  419. }
  420. void NewController::restartController()
  421. { // Neues Polygon beenden und zur Sequenz hinzufügen
  422. if( model->getNewPolygon() && model->getNewPolygon()->size() >= 3 )
  423. {
  424. QList<QPolygon> polygons;
  425. polygons.append( *model->getNewPolygon() );
  426. model->getFrame()->addObject( "-1", 0, polygons );
  427. model->setNewPolygon( 0 );
  428. model->getWindow()->setupFrameTree();
  429. ArbeitsController::restartController();
  430. }
  431. }
  432. /*
  433. * Controller für den DELETE Modus
  434. */
  435. DeleteController::DeleteController( ArbeitsModel *m )
  436. : ArbeitsController( m )
  437. {}
  438. void DeleteController::mousePressEvent( QMouseEvent *e )
  439. { // Setzt den Beginn des auswahl feldes
  440. if( e && e->button() == Qt::LeftButton )
  441. {
  442. if (!model->getDeleteField() )
  443. model->setDeleteField( new QRect(e->pos(), QSize()) );
  444. }
  445. ArbeitsController::mousePressEvent( e );
  446. }
  447. void DeleteController::mouseMoveEvent( QMouseEvent *e )
  448. { // Setze das Ende des Auswahl Feldes
  449. if( e && model->isMouseButtonPressed( Qt::LeftButton ) && model->getDeleteField() )
  450. {
  451. *model->getDeleteField() = QRect( model->getMousePressPoint(), e->pos() ).normalized();
  452. }
  453. ArbeitsController::mouseMoveEvent( e );
  454. }
  455. void DeleteController::mouseReleaseEvent( QMouseEvent *e )
  456. { // Lösche alle Eckpunkte im ausgewählten Feld
  457. if( model->isMouseButtonPressed( Qt::LeftButton ) && e && model->getDeleteField() && model->getFrame() )
  458. {
  459. if( model->getDeleteField()->size() == QSize( 0, 0 ) )
  460. model->getFrame()->selectObjectAt( model->inverseTranslate( e->pos() ) );
  461. else
  462. {
  463. QRect field = *model->getDeleteField();
  464. model->getFrame()->removeSelectedVertices(QRect( model->inverseTranslate( field.topLeft() ), model->inverseTranslate( field.bottomRight() ) ));
  465. delete model->getDeleteField();
  466. model->setDeleteField( 0 );
  467. model->getWindow()->setupFrameTree();
  468. }
  469. }
  470. ArbeitsController::mouseReleaseEvent( e );
  471. }
  472. /*
  473. * Controller für den ZOOM_IN Modus
  474. */
  475. ZoomInController::ZoomInController( ArbeitsModel *m )
  476. : ArbeitsController( m )
  477. {}
  478. void ZoomInController::mousePressEvent( QMouseEvent *e )
  479. { // Setzte den Startpunkt des sichtbaren Gebiets
  480. if( e->button() == Qt::LeftButton )
  481. {
  482. if (!model->getDeleteField() )
  483. model->setDeleteField( new QRect(e->pos(), QSize()) );
  484. }
  485. ArbeitsController::mousePressEvent( e );
  486. }
  487. void ZoomInController::mouseMoveEvent( QMouseEvent *e )
  488. { // Setzte den Endpunkt des sichtbaren Gebiets
  489. if( model->isMouseButtonPressed( Qt::LeftButton ) && model->getDeleteField() && e )
  490. {
  491. *model->getDeleteField() = QRect( model->getMousePressPoint(), e->pos() ).normalized();
  492. }
  493. ArbeitsController::mouseMoveEvent( e );
  494. }
  495. void ZoomInController::mouseReleaseEvent( QMouseEvent *e )
  496. { // Aktualisiere die Ansicht auf das ausgewählte Gebiet
  497. if( model->isMouseButtonPressed( Qt::LeftButton ) && e && model->getFrame() && model->getDeleteField() )
  498. {
  499. if( model->getDeleteField()->size() == QSize( 0, 0 ) )
  500. model->getFrame()->selectObjectAt( model->inverseTranslate( e->pos() ) );
  501. else
  502. {
  503. QRect field = *model->getDeleteField();
  504. QPoint leftTop = model->inverseTranslate( field.topLeft() );
  505. int xOffset = leftTop.x(), yOffset = leftTop.y();
  506. if( xOffset < 0 )
  507. xOffset = 0;
  508. if( yOffset < 0 )
  509. yOffset = 0;
  510. QPoint bottomRight = model->inverseTranslate( field.bottomRight() );
  511. if( bottomRight.x() >= model->getImage().width() )
  512. bottomRight.setX( model->getImage().width() );
  513. if( bottomRight.y() >= model->getImage().height() )
  514. bottomRight.setY( model->getImage().height() );
  515. if( bottomRight.x() > xOffset && bottomRight.y() > yOffset )
  516. {
  517. QSize s = model->getViewSize();
  518. QRect imgRect( QPoint( 0, 0 ), s );
  519. QSize imgS = model->getImage().size();
  520. if( imgS.width() > s.width() )
  521. {
  522. imgS.scale( s, Qt::KeepAspectRatio );
  523. imgRect.setSize( imgS );
  524. }
  525. model->setScaleFactor( imgRect.width() / (float)(bottomRight.x() - xOffset), imgRect.height() / (float)(bottomRight.y() - yOffset));
  526. model->setOffset( xOffset, yOffset );
  527. }
  528. delete model->getDeleteField();
  529. model->setDeleteField( 0 );
  530. model->getWindow()->setupFrameTree();
  531. }
  532. }
  533. ArbeitsController::mouseReleaseEvent( e );
  534. }