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 }