model.cpp 9.2 KB

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