arbeitsview.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. #include "arbeitsview.h"
  2. #include <QLayout>
  3. #include "object.h"
  4. #include "frametreemodel.h"
  5. #include "mainwindow.h"
  6. #include <QDebug>
  7. #include "kmath.h"
  8. #include <QToolTip>
  9. // Errechnet die Farbe eines Objektes, so dass Objekte mit ähnlicher ID unterschiedliche Farben bekommen
  10. // start: Die Farbe des ersten Objektes
  11. // index: Die Id des Objektes, zu dem die Farbe ermittelt werden soll
  12. QColor colorFunction( QColor start, int index )
  13. {
  14. if( index < 0 )
  15. return start;
  16. if( index % 2 == 0 )
  17. return colorFunction( QColor( (start.green() + 10 * index) % 255, (start.blue() + 10 * index) % 255, (start.red() + 10 * index) % 255, start.alpha() ), index - 1 );
  18. else
  19. return colorFunction( QColor( (start.green() * index + 70) % 255, (start.blue() * index + 40) % 255, (start.red() * index + 60) % 255, start.alpha() ), index - 1 );
  20. }
  21. // Errechnet den Mittelpunkt eines Polygons
  22. QPointF centerOfPolygon( QPolygon p )
  23. {
  24. QPointF res;
  25. for( QPoint po : p )
  26. {
  27. res.setX( po.x() + res.x() );
  28. res.setY( po.y() + res.y() );
  29. }
  30. res /= p.size();
  31. return res;
  32. }
  33. // Inhalt der Arbeitsview Klasse
  34. //-------------------------------
  35. ArbeitsView::ArbeitsView(ArbeitsModel *model, QWidget *parent)
  36. : QWidget(parent),
  37. m( model ),
  38. c( 0 ),
  39. selectArea( 0 )
  40. {
  41. parent->layout()->addWidget( this );
  42. this->setMouseTracking( true );
  43. }
  44. ArbeitsView::~ArbeitsView()
  45. {
  46. delete selectArea;
  47. }
  48. // Setzt den Controller, der die Nutzereingaben verarbeiten soll
  49. void ArbeitsView::setController( ArbeitsController *controller )
  50. {
  51. c = controller;
  52. }
  53. // Zeichnet die View neu
  54. void ArbeitsView::paintEvent(QPaintEvent *)
  55. {
  56. m->setView( pos(), size() );
  57. QPainter painter( this );
  58. if( m->getFrame() )
  59. {
  60. if( m->getDeleteField() )
  61. {
  62. if( !selectArea )
  63. {
  64. selectArea = new QRubberBand( QRubberBand::Rectangle, this );
  65. selectArea->show();
  66. }
  67. selectArea->setGeometry( *m->getDeleteField() );
  68. }
  69. else if( selectArea )
  70. {
  71. selectArea->hide();
  72. delete selectArea;
  73. selectArea = 0;
  74. }
  75. // Zeichne Hintergrund Bild
  76. painter.drawImage( QRect( m->translate( QPoint( 0, 0 ) ), m->translate( QPoint( m->getImage().width(), m->getImage().height() ) ) ), m->getImage() );
  77. if( m->isMaskShown() && !m->getMask().isNull() )
  78. { // Zeichne Masken Overlay
  79. QPixmap img = m->getMask();
  80. painter.setOpacity( 0.75 );
  81. painter.drawPixmap( QRect( m->translate( QPoint( 0, 0 ) ), m->translate( QPoint( img.width(), img.height() ) ) ), img );
  82. painter.setOpacity( 1 );
  83. }
  84. QList<ObjectPolygon> objects = m->getFrame()->getObjects();
  85. QPen white( QColor( 255, 255, 255 ), 2 ); // Erstellt Stifte zum Zeichnen
  86. QPen grey( QColor( 200, 200, 200 ), 1 );
  87. QPen green( QColor( 0, 255, 0 ), 2 );
  88. QPen lightGreen( QColor( 100, 255, 100 ), 2 );
  89. QBrush blackBrush( QColor( 0, 0, 0 ), Qt::SolidPattern );
  90. for( ObjectPolygon o : objects )
  91. { // Schleife durch alle Objekte des Bildes
  92. if( o->isSelected() )
  93. {
  94. painter.setPen( white );
  95. int pIndex;
  96. if( o == m->getCopyedObject() || ( !m->getCopyedObject().isNull() && o->getId() != "-1" && o->getId() == m->getCopyedObject()->getId() ) )
  97. painter.setPen( green );
  98. else if( o == m->getFrame()->getObjectAt( m->inverseTranslate( m->getMousePoint() ), pIndex ) )
  99. painter.setPen( lightGreen );
  100. pIndex = 0;
  101. for( QPolygon pol : o->getPolygonList() )
  102. { // Schleife durch alle Polygone des Bildes
  103. QBrush tmpB = painter.brush();
  104. if( m->areColoresShown() )
  105. painter.setBrush( QBrush( colorFunction( QColor( 255, 127, 0, 127 ), o->getId().toInt() ), Qt::SolidPattern ) );
  106. painter.drawPolygon( m->translatePolygon( pol ) ); // Zeichne Polygon
  107. if( m->areIdsShown() )
  108. { // Zeichne Objekt ID
  109. QFont f = painter.font();
  110. f.setPointSize( 30 );
  111. f.setWeight(QFont::DemiBold);
  112. QPainterPath tPath;
  113. tPath.addText( centerOfPolygon( m->translatePolygon( pol ) ), f, o->getId() );
  114. painter.setBrush( blackBrush );
  115. painter.drawPath( tPath );
  116. }
  117. painter.setBrush(tmpB);
  118. int index = 0;
  119. for( QPoint p : pol )
  120. { // Schleife durch alle Eckpunkte des Polygons
  121. QPen tmp = painter.pen();
  122. if( ( o == m->getCopyedObject() ) ||
  123. ( o == m->getMoveObject() && m->getMoveIndex() == index && m->getMovePolygon() == pIndex ) ||
  124. ( index == m->getCutIndex() && o == m->getCutObject() && m->getCutPolygon() == pIndex ) )
  125. painter.setPen( green );
  126. painter.drawEllipse( m->translate( p ), 5, 5 ); // Zeichne Eckpunkt
  127. index++;
  128. painter.setPen( tmp );
  129. }
  130. pIndex++;
  131. }
  132. }
  133. else
  134. { // Falls das Objekt versteckt ist werden nur die Polygone gezeichnet
  135. painter.setPen( grey );
  136. if( o == m->getCopyedObject() )
  137. painter.setPen( green );
  138. for( QPolygon pol : o->getPolygonList() )
  139. {
  140. painter.drawPolygon( m->translatePolygon( pol ) );
  141. }
  142. }
  143. }
  144. if( m->getMode() == NEW )
  145. { // Zeichnen des neuen Objektes, welches noch nicht fertig erstellt wurde
  146. painter.setPen( QPen( QColor( 0, 255, 0 ), 2, Qt::DotLine ) );
  147. if( !m->getNewPolygon() )
  148. painter.drawEllipse( (int)(m->getMousePoint().x()) - 2, (int)(m->getMousePoint().y()) - 2, 5, 5 );
  149. else
  150. {
  151. for( auto p = m->getNewPolygon()->begin(); p != m->getNewPolygon()->end() - 1; p++ )
  152. painter.drawLine( m->translate( *p ), m->translate( *(p + 1) ) );
  153. if( m->inverseTranslate( m->getMousePoint() ).x() > m->getNewPolygon()->begin()->x() - 10 &&
  154. m->inverseTranslate( m->getMousePoint() ).x() < m->getNewPolygon()->begin()->x() + 10 &&
  155. m->inverseTranslate( m->getMousePoint() ).y() > m->getNewPolygon()->begin()->y() - 10 &&
  156. m->inverseTranslate( m->getMousePoint() ).y() < m->getNewPolygon()->begin()->y() + 10 )
  157. {
  158. painter.drawLine( m->translate( *m->getNewPolygon()->begin() ), m->translate( *(m->getNewPolygon()->end() - 1) ) );
  159. }
  160. else
  161. {
  162. painter.drawLine( m->translate( *m->getNewPolygon()->begin() ), m->getMousePoint() );
  163. painter.drawLine( m->getMousePoint(), m->translate( *(m->getNewPolygon()->end() - 1) ) );
  164. painter.drawEllipse( (int)(m->getMousePoint().x()) - 2, (int)(m->getMousePoint().y()) - 2, 5, 5 );
  165. }
  166. }
  167. }
  168. if( !m->getCopyedObject().isNull() )
  169. { // Zeichnet das Kopierte Objekt um die Maus herum
  170. QPoint mousePos = m->inverseTranslate( m->getMousePoint() );
  171. int pIndex;
  172. if( m->getFrame()->getObjectAt( mousePos, pIndex ).isNull() )
  173. {
  174. QMatrix m;
  175. m.QMatrix::translate( mousePos.x(), mousePos.y() );
  176. m.rotate( this->m->getCopyedRotation() );
  177. m.translate( -this->m->getCopyedCenter().x(), -this->m->getCopyedCenter().y() );
  178. painter.setPen( QPen( QColor( 0, 255, 0 ), 2, Qt::DotLine ) );
  179. for( QPolygon pol : this->m->getCopyedObject()->getPolygonList() )
  180. painter.drawPolygon( this->m->translatePolygon( m.map( pol ) ) );
  181. }
  182. }
  183. if( !m->getMoveObject().isNull() && m->getInsertIndex() >= 0 )
  184. { // Zeichnet beim Bewegen den zu bewegenden Eckpunkt
  185. painter.setPen( green );
  186. painter.drawEllipse( m->translate(m->getNewVertex() ), 5, 5 );
  187. }
  188. }
  189. }
  190. // Leitet nutzereingaben an den Controller weiter
  191. void ArbeitsView::mousePressEvent( QMouseEvent *e )
  192. {
  193. if( c && m->getFrame() )
  194. c->mousePressEvent( e );
  195. }
  196. // Leitet nutzereingaben an den Controller weiter
  197. void ArbeitsView::mouseMoveEvent( QMouseEvent *e )
  198. {
  199. if( c && m->getFrame() )
  200. c->mouseMoveEvent( e );
  201. }
  202. // Leitet nutzereingaben an den Controller weiter
  203. void ArbeitsView::mouseReleaseEvent( QMouseEvent *e )
  204. {
  205. if( c && m->getFrame() )
  206. c->mouseReleaseEvent( e );
  207. }
  208. // Leitet nutzereingaben an den Controller weiter
  209. void ArbeitsView::wheelEvent(QWheelEvent *e)
  210. {
  211. if( c && m->getFrame() )
  212. c->wheelEvent( e );
  213. }
  214. // Zeigt tooltip für Objekte an
  215. bool ArbeitsView::event( QEvent *e )
  216. {
  217. if (e->type() == QEvent::ToolTip)
  218. {
  219. QHelpEvent *helpEvent = static_cast<QHelpEvent *>(e);
  220. int pIndex;
  221. if( m->getFrame() )
  222. {
  223. ObjectPolygon p = m->getFrame()->getObjectAt( m->inverseTranslate( helpEvent->pos() ), pIndex );
  224. if ( !p.isNull() ) {
  225. QToolTip::showText(helpEvent->globalPos(), "Objekt: " + p->getId(), this);
  226. } else {
  227. QToolTip::hideText();
  228. e->ignore();
  229. }
  230. return true;
  231. }
  232. }
  233. return QWidget::event( e );
  234. }