File indexing completed on 2024-06-09 04:18:51
0001 /** 0002 * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved. 0003 * 0004 * This file is part of the KGantt library. 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include <QApplication> 0010 #include <QModelIndex> 0011 #include <QStandardItemModel> 0012 #include <QTimer> 0013 0014 #include <cassert> 0015 0016 #include <KGanttView> 0017 #include <KGanttConstraintModel> 0018 0019 /* Test model that uses beginMoveRows() */ 0020 class MyTaskModel : public QAbstractTableModel { 0021 struct Task { 0022 QString title; 0023 QDateTime start, end; 0024 }; 0025 QList<Task> m_tasks; 0026 public: 0027 MyTaskModel( QObject* parent = nullptr ) 0028 : QAbstractTableModel( parent ) 0029 { 0030 Task task; 0031 task.title = tr( "Item 1" ); 0032 task.start = QDateTime::currentDateTime(); 0033 task.end = task.start.addDays( 1 ); 0034 m_tasks.push_back( task ); 0035 task.title = tr( "Item 2" ); 0036 task.start = QDateTime::currentDateTime().addDays( 2 ); 0037 task.end = task.start.addDays( 1 ); 0038 m_tasks.push_back( task ); 0039 task.title = tr( "Item 3" ); 0040 task.start = QDateTime::currentDateTime().addDays( 4 ); 0041 task.end = task.start.addDays( 1 ); 0042 m_tasks.push_back( task ); 0043 task.title = tr( "Item 4" ); 0044 task.start = QDateTime::currentDateTime().addDays( 6 ); 0045 task.end = task.start.addDays( 1 ); 0046 m_tasks.push_back( task ); 0047 } 0048 0049 /*reimp*/int rowCount( const QModelIndex& index = QModelIndex() ) const override { 0050 return index.isValid()?0:m_tasks.size(); 0051 } 0052 /*reimp*/int columnCount( const QModelIndex& index = QModelIndex() ) const override { 0053 return index.isValid()?0:4; 0054 } 0055 /*reimp*/QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const override 0056 { 0057 if ( index.isValid() && index.row() < rowCount() && index.column() < columnCount() ) { 0058 switch ( index.column() ) { 0059 case 0: return ( role == Qt::DisplayRole ) 0060 ?QVariant::fromValue( m_tasks[index.row()].title ) 0061 :QVariant(); 0062 case 1: return ( role == Qt::DisplayRole ) 0063 ?QVariant::fromValue( ( int )KGantt::TypeTask ) 0064 :QVariant(); 0065 case 2: return ( role == KGantt::StartTimeRole || role == Qt::DisplayRole ) 0066 ?QVariant::fromValue( m_tasks[index.row()].start ) 0067 :QVariant(); 0068 case 3: return ( role == KGantt::EndTimeRole || role == Qt::DisplayRole) 0069 ?QVariant::fromValue( m_tasks[index.row()].end ) 0070 :QVariant(); 0071 } 0072 } 0073 return QVariant(); 0074 } 0075 0076 void moveRow( int from, int to ) { 0077 if ( from == to ) return; 0078 if ( from >= m_tasks.size() || to >= m_tasks.size()+1 ) return; 0079 0080 if ( beginMoveRows( QModelIndex(), from, from, QModelIndex(), to ) ) { 0081 m_tasks.move( from, to ); 0082 endMoveRows(); 0083 } else { 0084 assert( 0 ); 0085 } 0086 } 0087 }; 0088 0089 /* Test class to see the effect of moving rows */ 0090 class MoveHelper : public QObject { 0091 public: 0092 MoveHelper( MyTaskModel* model, 0093 KGantt::ConstraintModel*, 0094 KGantt::View*, 0095 #if 0 0096 KGantt::ConstraintModel* constraints, 0097 KGantt::View* view, 0098 #endif 0099 int row1, int row2 ) 0100 : QObject( model ), 0101 m_model( model ), 0102 #if 0 0103 m_constraints( constraints ), 0104 m_view( view ), 0105 #endif 0106 m_row1( row1 ), 0107 m_row2( row2 ) 0108 { 0109 } 0110 0111 void showContraints( const QString& /*pfx*/ ) { 0112 #if 0 0113 qDebug() << pfx << *m_constraints; 0114 qDebug() << "0:" << m_constraints->constraintsForIndex( m_model->index( 0, 0 ) ); 0115 qDebug() << "1:"<< m_constraints->constraintsForIndex( m_model->index( 1, 0 ) ); 0116 qDebug() << "2:"<< m_constraints->constraintsForIndex( m_model->index( 2, 0 ) ); 0117 qDebug() << "3:"<< m_constraints->constraintsForIndex( m_model->index( 3, 0 ) ); 0118 #endif 0119 } 0120 0121 ~MoveHelper() override { 0122 qDebug() << "Moving row" << m_row1 << "to" << m_row2; 0123 showContraints( "Before:" ); 0124 m_model->moveRow( m_row1, m_row2 ); 0125 showContraints( "After:" ); 0126 0127 // Hack until KGantt supports this: 0128 //m_view->setConstraintModel( m_constraints ); 0129 } 0130 0131 private: 0132 MyTaskModel* m_model; 0133 #if 0 0134 KGantt::ConstraintModel* m_constraints; 0135 KGantt::View* m_view; 0136 #endif 0137 int m_row1, m_row2; 0138 }; 0139 0140 int main( int argc, char** argv ) 0141 { 0142 QApplication app( argc, argv ); 0143 0144 0145 KGantt::View* view = new KGantt::View; 0146 0147 MyTaskModel model; 0148 0149 KGantt::ConstraintModel constraints; 0150 constraints.addConstraint( KGantt::Constraint( model.index( 0, 0 ), model.index( 1, 0 ) ) ); 0151 constraints.addConstraint( KGantt::Constraint( model.index( 0, 0 ), model.index( 2, 0 ) ) ); 0152 constraints.addConstraint( KGantt::Constraint( model.index( 1, 0 ), model.index( 3, 0 ) ) ); 0153 0154 view->setModel( &model ); 0155 view->setConstraintModel( &constraints ); 0156 view->show(); 0157 0158 /* After 5 seconds, move row 1 to pos 0: */ 0159 QTimer::singleShot( 5000, new MoveHelper( &model, &constraints, view, 1, 0 ), SLOT(deleteLater()) ); 0160 0161 return app.exec(); 0162 }