File indexing completed on 2024-05-26 04:24:16

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 <QStandardItemModel>
0011 #include <QPainter>
0012 #include <QHeaderView>
0013 #include <QTreeView>
0014 
0015 #include <KGanttView>
0016 #include <KGanttDateTimeGrid>
0017 
0018 using namespace KGantt;
0019 
0020 /* A custom formatter that displays tabs for every 10 minutes.
0021  */
0022 class MyDateTimeScaleFormatter : public DateTimeScaleFormatter {
0023 public:
0024     MyDateTimeScaleFormatter();
0025 
0026     /*reimp*/QDateTime nextRangeBegin( const QDateTime& datetime ) const override;
0027     /*reimp*/QDateTime currentRangeBegin( const QDateTime& datetime ) const override;
0028 
0029     /*reimp*/QString text( const QDateTime& dt ) const override;
0030 };
0031 
0032 MyDateTimeScaleFormatter::MyDateTimeScaleFormatter()
0033     : DateTimeScaleFormatter( Hour, "hh" )
0034 {
0035 }
0036 
0037 QDateTime MyDateTimeScaleFormatter::nextRangeBegin( const QDateTime& datetime ) const
0038 {
0039     return currentRangeBegin( datetime ).addSecs( 60*10 );
0040 }
0041 
0042 QDateTime MyDateTimeScaleFormatter::currentRangeBegin( const QDateTime& datetime ) const
0043 {
0044     QDateTime dt( datetime );
0045     dt.setTime( QTime( dt.time().hour(), ( dt.time().minute()/10 ) * 10, 0, 0 ) );
0046     return dt;
0047 }
0048 
0049 QString MyDateTimeScaleFormatter::text( const QDateTime& dt ) const
0050 {
0051     return QObject::tr( ":%1\nXX" ).arg( dt.time().toString( "mm" ) );
0052 }
0053 
0054 /* A custom headerview that is taller than standard
0055  * so we can fit more lines into it on the graphicsview
0056  * side.
0057  */
0058 class MyHeaderView : public QHeaderView {
0059 public:
0060     explicit MyHeaderView( QWidget* parent = nullptr )
0061         : QHeaderView( Qt::Horizontal, parent ) {
0062     }
0063 
0064     /*reimp*/QSize sizeHint() const override {
0065         QSize s = QHeaderView::sizeHint(); s.rheight() *= 3; return s;
0066     }
0067 };
0068 
0069 int main( int argc, char** argv ) {
0070     QApplication app( argc, argv );
0071 
0072     QStandardItemModel model( 1, 1 );
0073     model.setHeaderData( 0, Qt::Horizontal, QObject::tr( "Task" ) );
0074 
0075     /*** A view with some alternative header labels ***/
0076     View view1;
0077     DateTimeGrid grid1;
0078     grid1.setUserDefinedUpperScale( new DateTimeScaleFormatter( DateTimeScaleFormatter::Year,
0079                                                                 QString::fromLatin1( "yyyy" ),
0080                                                                 QString::fromLatin1( "In the year %1." ),
0081                                                                 Qt::AlignLeft ) );
0082     grid1.setUserDefinedLowerScale( new DateTimeScaleFormatter( DateTimeScaleFormatter::Month,
0083                                                                 QString::fromLatin1( "MMMM" ),
0084                                                                 QString::fromLatin1( "In the month %1." ),
0085                                                                 Qt::AlignRight ) );
0086     grid1.setScale( DateTimeGrid::ScaleUserDefined );
0087     grid1.setDayWidth( 6. );
0088     view1.setGrid( &grid1 );
0089     view1.setModel( &model );
0090     view1.show();
0091 
0092     /*** A view with header and vertical grid lines for every 10 minutes */
0093     View view2;
0094     QTreeView* tw = qobject_cast<QTreeView*>( view2.leftView() );
0095     if ( tw ) tw->setHeader( new MyHeaderView );
0096     DateTimeGrid grid2;
0097     grid2.setDayWidth( 5000 );
0098     grid2.setUserDefinedUpperScale( new DateTimeScaleFormatter( DateTimeScaleFormatter::Hour, QString::fromLatin1( "hh" ) ) );
0099     grid2.setUserDefinedLowerScale( new MyDateTimeScaleFormatter );
0100     grid2.setScale( DateTimeGrid::ScaleUserDefined );
0101     view2.setGrid( &grid2 );
0102     view2.setModel( &model );
0103     view2.show();
0104 
0105     return app.exec();
0106 }