model.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #include "model.h"
  2. #include "arbeitsview.h"
  3. Model::Model()
  4. {}
  5. // Fügt eine View hinzu
  6. void Model::addView( QWidget *v )
  7. {
  8. views.append( v );
  9. }
  10. // Aktualisiert die Views
  11. void Model::notifyViews()
  12. {
  13. for( QWidget *v : views )
  14. v->update();
  15. }
  16. // Entfernt alle Views
  17. void Model::removeViews()
  18. {
  19. views.clear();
  20. }
  21. // Inhalt der ArbeitsModel Klasse
  22. //--------------------------------
  23. ArbeitsModel::ArbeitsModel( MainWindow *w )
  24. : f( 0 ),
  25. deleteField( 0 ),
  26. mode( MOVE ),
  27. newPolygon( 0 ),
  28. window( w ),
  29. xScaleFactor( 1 ),
  30. yScaleFactor( 1 ),
  31. xOffset( 0 ),
  32. yOffset( 0 ),
  33. mousePressed( false ),
  34. rotation( 0 ),
  35. cutIndex( -1 ),
  36. showMask( 1 ),
  37. insertIndex( -1 ),
  38. moveIndex( -1 ),
  39. showColors( 0 ),
  40. showIds( 1 )
  41. {}
  42. ArbeitsModel::~ArbeitsModel()
  43. {
  44. delete deleteField;
  45. }
  46. // Transformiert einen Punkt von Bildkoordinaten nach Bildschirmkoordinaten
  47. QPoint ArbeitsModel::translate( QPoint p )
  48. {
  49. return QPoint( (int)((p.x()-xOffset) * xScaleFactor), (int)((p.y()-yOffset) * yScaleFactor) );
  50. }
  51. // Transformiert ein Polygon von Bildkoordinaten nach Bildschirmkoordinaten
  52. QPolygon ArbeitsModel::translatePolygon( QPolygon p )
  53. {
  54. QPolygon result;
  55. for( auto point = p.begin(); point != p.end(); point++ )
  56. result.append( translate( *point ) );
  57. return result;
  58. }
  59. // Transformiert einen Punkt von Bildschirmkoordinaten nach Bildkoordinaten
  60. QPoint ArbeitsModel::inverseTranslate( QPoint p )
  61. {
  62. return QPoint( (int)(p.x() / xScaleFactor + xOffset), (int)(p.y() / yScaleFactor + yOffset) );
  63. }
  64. // Setzt das ausgewählte Frame
  65. void ArbeitsModel::setFrame( Frame *frame )
  66. {
  67. this->f = frame;
  68. if( f )
  69. {
  70. image = f->getImage();
  71. if( xScaleFactor == INFINITY || yScaleFactor == INFINITY )
  72. resetZoom();
  73. }
  74. }
  75. // Setzt den ausgewählten Modus
  76. void ArbeitsModel::setMode( UserMode mode )
  77. {
  78. moveObject = ObjectPolygon();
  79. cutObject = ObjectPolygon();
  80. cutIndex = 0;
  81. if( mode != PIPETTE_SET )
  82. copyedObject = ObjectPolygon();
  83. this->mode = mode;
  84. if( mode != SELECT && mode != DELETE && deleteField )
  85. {
  86. delete deleteField;
  87. deleteField = 0;
  88. }
  89. }
  90. // Gibt den ausgewählten Modus zurück
  91. UserMode ArbeitsModel::getMode() const
  92. {
  93. return mode;
  94. }
  95. // Legt fest, ob die Objekt IDs angezeigt werden sollen
  96. void ArbeitsModel::setShowId( bool sid )
  97. {
  98. showIds = sid;
  99. }
  100. // Gibt 1 zurück, falls die ObjektIDs angezeigt werden sollen
  101. bool ArbeitsModel::areIdsShown() const
  102. {
  103. return showIds;
  104. }
  105. // Legt fest, ob die Maske angezeigt werden soll
  106. void ArbeitsModel::setShowMask( bool sm )
  107. {
  108. showMask = sm;
  109. }
  110. // Gibt 1 zurück, wenn die Maske angezeigt werden soll
  111. bool ArbeitsModel::isMaskShown() const
  112. {
  113. return showMask;
  114. }
  115. // Legt fest, ob die Objekte eingefärbt werden sollen
  116. void ArbeitsModel::setShowColors( bool sc )
  117. {
  118. showColors = sc;
  119. }
  120. // Gibt 1 zurück, falls die Objekte eingefärbt werden sollen
  121. bool ArbeitsModel::areColoresShown() const
  122. {
  123. return showColors;
  124. }
  125. // Setzt das Maskenbild
  126. void ArbeitsModel::setMask( QPixmap m )
  127. {
  128. this->m = m;
  129. }
  130. // Gibt das Maskenbild zurück
  131. QPixmap ArbeitsModel::getMask() const
  132. {
  133. return m;
  134. }
  135. // Gibt das ausgewählte Bild zurück
  136. Frame *ArbeitsModel::getFrame() const
  137. {
  138. return f;
  139. }
  140. // Gibt das Hauptfenster zurück
  141. MainWindow *ArbeitsModel::getWindow() const
  142. {
  143. return window;
  144. }
  145. // Gibt das angezeigte Bild zurück
  146. QImage ArbeitsModel::getImage() const
  147. {
  148. return image;
  149. }
  150. // Legt fest, ob die Maus gedrück wird
  151. void ArbeitsModel::setMousePressed( bool pressed )
  152. {
  153. mousePressed = pressed;
  154. }
  155. // Legt die Maustaste fest
  156. void ArbeitsModel::setMouseButtonPressed( Qt::MouseButton btn, QPoint pos )
  157. {
  158. mousePressed = true;
  159. mouseButton = btn;
  160. mouseStart = pos;
  161. mousePos = pos;
  162. }
  163. // Setzt die Position der Maus fest
  164. void ArbeitsModel::setMousePoint( QPoint mp )
  165. {
  166. mousePos = mp;
  167. }
  168. // Gibt 1 zurück, falls die MAus gedrückt wird
  169. bool ArbeitsModel::isMousePressed() const
  170. {
  171. return mousePressed;
  172. }
  173. // Gibt 1 zurück, falls der angegebene Maus Knopf gedrückt wird
  174. bool ArbeitsModel::isMouseButtonPressed( Qt::MouseButton btn ) const
  175. {
  176. return mouseButton == btn && mousePressed;
  177. }
  178. // Gibt die Position der Maus zurück, als diese gedrückt wurde
  179. QPoint ArbeitsModel::getMousePressPoint() const
  180. {
  181. return mouseStart;
  182. }
  183. // Gibt die aktuelle Position der Maus zurück
  184. QPoint ArbeitsModel::getMousePoint() const
  185. {
  186. return mousePos;
  187. }
  188. // Setzt die Position im Bild, die links oben an der View erscheinen soll
  189. void ArbeitsModel::setOffset( int xo, int yo )
  190. {
  191. xOffset = xo;
  192. yOffset = yo;
  193. }
  194. // Setzt den Skallierungsfaktor, mit dem das Bild vergrößert werden soll
  195. void ArbeitsModel::setScaleFactor( float xs, float ys )
  196. {
  197. xScaleFactor = xs;
  198. yScaleFactor = ys;
  199. }
  200. // Setzt die Position und die Größe der View auf dem Bildschirm
  201. void ArbeitsModel::setView( QPoint pos, QSize size )
  202. {
  203. if( viewPos != pos || viewSize != size )
  204. {
  205. viewPos = pos;
  206. viewSize = size;
  207. resetZoom();
  208. }
  209. }
  210. // Gibt die Größe der View zurück
  211. QSize ArbeitsModel::getViewSize() const
  212. {
  213. return viewSize;
  214. }
  215. // Gibt die x Position im Bild zurück, die links an der View erscheinen soll
  216. int ArbeitsModel::getXOffset() const
  217. {
  218. return xOffset;
  219. }
  220. // Gibt die y Position im Bild zurück, die oben an der View erscheinen soll
  221. int ArbeitsModel::getYOffset() const
  222. {
  223. return yOffset;
  224. }
  225. // Gibt den Skallierungsfaktor in x Richtung zurück
  226. float ArbeitsModel::getXScaleFactor() const
  227. {
  228. return xScaleFactor;
  229. }
  230. // Gibt den Skallierungsfaktor in y Richtung zurück
  231. float ArbeitsModel::getYScaleFactor() const
  232. {
  233. return yScaleFactor;
  234. }
  235. // Gibt die Position der View zurück
  236. QPoint ArbeitsModel::getViewPos() const
  237. {
  238. return viewPos;
  239. }
  240. // Setzt die Skallierung zurück, so dass wieder alles sichtbar ist
  241. void ArbeitsModel::resetZoom()
  242. {
  243. QRect imgRect( QPoint( 0, 0 ), viewSize );
  244. QSize imgS = image.size();
  245. if( imgS.width() > viewSize.width() )
  246. {
  247. imgS.scale( viewSize, Qt::KeepAspectRatio );
  248. imgRect.setSize( imgS );
  249. }
  250. xScaleFactor = imgRect.width() / (float)image.width();
  251. yScaleFactor = imgRect.height() / (float)image.height();
  252. xOffset = 0;
  253. yOffset = 0;
  254. }
  255. // Legt fest, welches Polygon verschoben werden soll
  256. void ArbeitsModel::setMoveObject( ObjectPolygon mo, int pIndex )
  257. {
  258. moveObject = mo;
  259. movePolygon = pIndex;
  260. }
  261. // Legt fest, welcher Eckpunkt verschoben werden soll
  262. void ArbeitsModel::setMoveIndex( int index )
  263. {
  264. moveIndex = index;
  265. }
  266. // Legt fest, an welcher Stelle eine Eckpunkt eingefügt werden soll
  267. void ArbeitsModel::setInsertIndex( int index )
  268. {
  269. insertIndex = index;
  270. }
  271. // Legt die Position des neuen Eckpunktes fest
  272. void ArbeitsModel::setNewVertex( QPoint vertex )
  273. {
  274. newVertex = vertex;
  275. }
  276. // Gibt das Objekt zurück, welches verschoben wird
  277. ObjectPolygon ArbeitsModel::getMoveObject() const
  278. {
  279. return moveObject;
  280. }
  281. // Gibt den Index des Eckpunktes zurück, der verschoben wird
  282. int ArbeitsModel::getMoveIndex() const
  283. {
  284. return moveIndex;
  285. }
  286. // Gibt den Index des neuen Eckpunktes zurück
  287. int ArbeitsModel::getInsertIndex() const
  288. {
  289. return insertIndex;
  290. }
  291. // Gibt die Position des neuen Eckpunktes zurück
  292. QPoint ArbeitsModel::getNewVertex() const
  293. {
  294. return newVertex;
  295. }
  296. // Gibt den Index des Polygons zurück, welches verschoben wird
  297. int ArbeitsModel::getMovePolygon() const
  298. {
  299. return movePolygon;
  300. }
  301. // Gibt das Objekt zurück, welches zerteilt werden soll
  302. ObjectPolygon ArbeitsModel::getCutObject() const
  303. {
  304. return cutObject;
  305. }
  306. // Gibt den Index des Eckpunktes zurück, an dem das Objekt zerteilt werden soll
  307. int ArbeitsModel::getCutIndex() const
  308. {
  309. return cutIndex;
  310. }
  311. // Gibt den Index des Polygons zurück, das zerteilt werden soll
  312. int ArbeitsModel::getCutPolygon() const
  313. {
  314. return cutPolygon;
  315. }
  316. // Setzt das Polygon, welches zerteilt werden soll
  317. void ArbeitsModel::setCutObject( ObjectPolygon o, int pIndex )
  318. {
  319. cutObject = o;
  320. cutPolygon = pIndex;
  321. }
  322. // Setzt den Index des Eckpunktes, an dem das Polygon zerteilt werden soll
  323. void ArbeitsModel::setCutIndex( int index )
  324. {
  325. cutIndex = index;
  326. }
  327. // Gibt das kopierte Objekt zurück
  328. ObjectPolygon ArbeitsModel::getCopyedObject() const
  329. {
  330. return copyedObject;
  331. }
  332. // Gibt die Rotierung des kopierten Objektes zurück
  333. float ArbeitsModel::getCopyedRotation() const
  334. {
  335. return rotation;
  336. }
  337. // Gibt den Mittelpunkt des Kopierten Objektes zurück
  338. QPoint ArbeitsModel::getCopyedCenter() const
  339. {
  340. return pSCenter;
  341. }
  342. // Setzt das Kopierte Objekt
  343. void ArbeitsModel::setCopyedObject( ObjectPolygon o, QPoint c )
  344. {
  345. copyedObject = o;
  346. pSCenter = c;
  347. }
  348. // Setzt die Rotierung des kopierten Objektes
  349. void ArbeitsModel::setCopyedRotation( float r )
  350. {
  351. rotation = r;
  352. }
  353. // Gibt das neue Polygon zurück, welches mit dem NEW Werkzeug erstellt wird
  354. QPolygon *ArbeitsModel::getNewPolygon() const
  355. {
  356. return newPolygon;
  357. }
  358. // Setzt das neue Polygon
  359. void ArbeitsModel::setNewPolygon( QPolygon *p )
  360. {
  361. if( newPolygon )
  362. delete newPolygon;
  363. newPolygon = p;
  364. }
  365. // Gibt das Feld zurück, in dem ale Eckpunkte gelöscht werden sollen
  366. QRect *ArbeitsModel::getDeleteField() const
  367. {
  368. return deleteField;
  369. }
  370. // Setzt das Feld, in dem alle Echpunkte gelöscht werden sollen
  371. void ArbeitsModel::setDeleteField( QRect *f )
  372. {
  373. deleteField = f;
  374. }