frametreemodel.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "frametreemodel.h"
  2. #include <QDebug>
  3. #include "object.h"
  4. #include <QIcon>
  5. FrameTreeModel::FrameTreeModel()
  6. : QAbstractItemModel(),
  7. seq( 0 )
  8. {
  9. }
  10. FrameTreeModel::~FrameTreeModel()
  11. {
  12. if( seq )
  13. seq->refRelease();
  14. }
  15. // Prüft, ob ein Index valide ist
  16. bool FrameTreeModel::isIndexValid( const QModelIndex &i ) const
  17. {
  18. return i.internalPointer() != 0 && ((FrameTreeNode*)i.internalPointer())->getDepth() <= 2 &&
  19. ((FrameTreeNode*)i.internalPointer())->getDepth() >= 0 &&
  20. ((FrameTreeNode*)i.internalPointer())->getIndex() >= 0;
  21. }
  22. // Setzt die Sequenz, welche momenatan annotiert wird
  23. // s: die neue Sequenz
  24. void FrameTreeModel::setSequenz( Sequenz *s )
  25. {
  26. if( seq )
  27. seq->refRelease();
  28. seq = s;
  29. this->dataChanged( createIndex( 0, 0 ), createIndex( 1, 1 ) );
  30. }
  31. // Gibt zurück, was für einen bestimten Knoten angezeigt werden soll
  32. // index: Der Index des Knotens
  33. // role: Welche daten des Knotens abgefragt werden sollen (z.B.:Name oder Hintergrundfarbe...)
  34. QVariant FrameTreeModel::data(const QModelIndex &index, int role) const
  35. {
  36. switch( role )
  37. {
  38. case Qt::DisplayRole:
  39. if (!index.isValid() || role != Qt::DisplayRole || seq == 0 )
  40. return QVariant();
  41. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 0 && index.column() == 0 )
  42. return QVariant( ((Kamera*)((FrameTreeNode*)index.internalPointer()))->getName() );
  43. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 1 )
  44. return QVariant( ((Frame*)index.internalPointer())->getName() );
  45. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 2 && index.column() == 0 )
  46. {
  47. QString objectId = ((_ObjectPolygon*)((FrameTreeNode*)index.internalPointer()))->getId();
  48. return QVariant( objectId + " " + seq->getClassName( seq->getClassOfObject( objectId ) ) );
  49. }
  50. case Qt::DecorationRole:
  51. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 1 )
  52. {
  53. if( !((Frame*)index.internalPointer())->isCorrectAnnotated() )
  54. return QIcon(":/icons/warning.png");
  55. }
  56. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 0 )
  57. {
  58. if( !((Kamera*)index.internalPointer())->isCorrectAnnotated() )
  59. return QIcon(":/icons/warning.png");
  60. }
  61. break;
  62. case Qt::BackgroundRole:
  63. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 1 )
  64. {
  65. if( ((Frame*)index.internalPointer())->isNotAnnotated() )
  66. return QColor( 0x50, 0x50, 0x50 );
  67. if( seq && ((Frame*)index.internalPointer())->getIndex() == seq->getSelectedFrame() )
  68. return QColor( 48, 140, 198 );
  69. }
  70. }
  71. return QVariant();
  72. }
  73. // Gibt die Flags eines Knotens zurück
  74. // index: Der Index des Knotens
  75. Qt::ItemFlags FrameTreeModel::flags(const QModelIndex &index) const
  76. {
  77. if (!index.isValid() || seq == 0)
  78. return 0;
  79. return QAbstractItemModel::flags(index);
  80. }
  81. // Gibt die Grunddaten zurück, welche für das zeichnen benötigt werden
  82. QVariant FrameTreeModel::headerData(int section, Qt::Orientation orientation,
  83. int role) const
  84. {
  85. if( orientation == Qt::Horizontal && role == Qt::DisplayRole )
  86. return QVariant( "Kameras" );
  87. return QVariant();
  88. }
  89. QModelIndex FrameTreeModel::index(int row, int column,
  90. const QModelIndex &parent) const
  91. {
  92. if (!hasIndex(row, column, parent) || seq == 0)
  93. return QModelIndex();
  94. if( !parent.isValid() )
  95. {
  96. return createIndex( row, column, seq->getCameras().at( row ) );
  97. }
  98. else
  99. {
  100. if( ((FrameTreeNode*)parent.internalPointer())->getDepth() == 0 )
  101. return createIndex( row, column, ((Kamera*)((FrameTreeNode*)parent.internalPointer()))->getFrame( row )->getNodeObject() );
  102. if( ((FrameTreeNode*)parent.internalPointer())->getDepth() == 1 )
  103. return createIndex( row, column, ((Frame*)((FrameTreeNode*)parent.internalPointer()))->getObjects().at( row )->getNodeObject() );
  104. }
  105. return QModelIndex();
  106. }
  107. // gibt den Index des Elternknotens zurück
  108. QModelIndex FrameTreeModel::parent(const QModelIndex &index) const
  109. {
  110. FrameTreeNode *node = (FrameTreeNode*)index.internalPointer();
  111. if (!index.isValid() || seq == 0 || node == 0 || node->getParent() == 0 || !isIndexValid( index ) )
  112. return QModelIndex();
  113. return createIndex( node->getParent()->getIndex(), 0, node->getParent()->getNodeObject() );
  114. }
  115. // gibt die Anzahl der Kindknoten zurück
  116. int FrameTreeModel::rowCount(const QModelIndex &parent) const
  117. {
  118. if( seq == 0 )
  119. return 0;
  120. if( !parent.isValid() || parent.internalPointer() == 0 || !isIndexValid( parent ))
  121. return seq->getCameras().count();
  122. else
  123. return ((FrameTreeNode*)parent.internalPointer())->getChildCount();
  124. }
  125. // gibt die Anzahl der Attribute eines Kindknotens zurück
  126. int FrameTreeModel::columnCount(const QModelIndex &parent) const
  127. {
  128. if( seq == 0 )
  129. return 0;
  130. return 1;
  131. }
  132. // Ermittelt die zugehörige Kamera und das Zugehörige Bild eines Knotens
  133. bool FrameTreeModel::clickedOnFrame( const QModelIndex &index, int &camera, int &frame ) const
  134. {
  135. if( ((FrameTreeNode*)index.internalPointer())->getDepth() == 1 )
  136. {
  137. frame = ((FrameTreeNode*)index.internalPointer())->getIndex();
  138. camera = ((FrameTreeNode*)index.internalPointer())->getParent()->getIndex();
  139. return true;
  140. }
  141. return false;
  142. }
  143. // Gibt den Index des ausgewählten Bildes zurück
  144. QModelIndex FrameTreeModel::getFrameSelectionIndex() const
  145. {
  146. Frame *selection = seq->getFrame();
  147. return createIndex( selection->getIndex(), 0, selection );
  148. }
  149. // Gibt den Index der ausgewählten Kamera zurück
  150. QModelIndex FrameTreeModel::getCameraSelectionIndex() const
  151. {
  152. return createIndex( seq->getSelectedCamera(), 0, (void*) &seq->getCameras().at( seq->getSelectedCamera() ) );
  153. }
  154. // Gibt eine Liste mit ausgewählten Objekten zurück
  155. QList<QModelIndex> FrameTreeModel::getSelectedPackages() const
  156. {
  157. QList<QModelIndex> list;
  158. Frame *selectedFrame = seq->getFrame();
  159. QList<ObjectPolygon> objects = selectedFrame->getObjects();
  160. for( int i = 0; i < objects.size(); i++ )
  161. {
  162. if( objects.at( i )->isSelected() )
  163. list.append( createIndex( i, 0, objects.at( i )->getNodeObject() ) );
  164. }
  165. return list;
  166. }
  167. // Aktualisiert die Tree View
  168. void FrameTreeModel::update()
  169. {
  170. this->dataChanged( createIndex( 0, 0, seq->getCameras().at( 0 ) ), createIndex( seq->getCameras().size() - 1, 0, seq->getCameras().last() ) );
  171. }