File indexing completed on 2024-05-12 04:39:39

0001 /*
0002     SPDX-FileCopyrightText: 2010 Andreas Pakulat <apaku@gmx.de>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-or-later
0005 */
0006 
0007 #include "definesmodel.h"
0008 
0009 #include <KLocalizedString>
0010 
0011 using namespace KDevelop;
0012 
0013 DefinesModel::DefinesModel( QObject* parent )
0014     : QAbstractTableModel( parent )
0015 {
0016 }
0017 
0018 QVariant DefinesModel::data( const QModelIndex& index, int role ) const
0019 {
0020     if( !index.isValid() || ( role != Qt::DisplayRole && role != Qt::EditRole ) ) {
0021         return QVariant();
0022     }
0023 
0024     if( index.row() < 0 || index.row() >= rowCount() || index.column() < 0 || index.column() >= columnCount() ) {
0025         return QVariant();
0026     }
0027 
0028     // Only show the hint for display, once the user goes into edit mode leave an empty line
0029     // makes the setData check easier and follows common behaviour of this in lineedits etc.
0030     if( index.row() == m_defines.count() && index.column() == 0 && role == Qt::DisplayRole ) {
0031         return i18n( "Double-click here to insert a new define to be used for the path" );
0032     } else if( index.row() < m_defines.count() ) {
0033         switch( index.column() ) {
0034         case 0:
0035             return m_defines.at( index.row() ).first;
0036         case 1:
0037             return m_defines.at( index.row() ).second;
0038         default:
0039             Q_ASSERT_X( 0, "DefinesModel::data", "Invalid column requested" );
0040             break;
0041         }
0042     }
0043     return QVariant();
0044 }
0045 
0046 int DefinesModel::rowCount( const QModelIndex& parent ) const
0047 {
0048     if( parent.isValid() ) {
0049         return 0;
0050     }
0051     return m_defines.count() + 1;
0052 }
0053 
0054 int DefinesModel::columnCount(const QModelIndex& parent) const
0055 {
0056     if( parent.isValid() ) {
0057         return 0;
0058     }
0059     return 2;
0060 }
0061 
0062 QVariant DefinesModel::headerData(int section, Qt::Orientation orientation, int role) const
0063 {
0064     if( orientation == Qt::Horizontal && role == Qt::DisplayRole ) {
0065         switch( section ) {
0066         case 0:
0067             return i18nc("@title:column", "Define");
0068         case 1:
0069             return i18nc("@title:column", "Value");
0070         default:
0071             Q_ASSERT_X( 0, "DefinesModel::headerData", "Invalid column requested" );
0072             break;
0073         }
0074     }
0075     return QVariant();
0076 }
0077 
0078 
0079 bool DefinesModel::setData( const QModelIndex& index, const QVariant& value, int role )
0080 {
0081     if( !index.isValid() || role != Qt::EditRole ) {
0082         return false;
0083     }
0084     if( index.row() < 0 || index.row() >= rowCount() || index.column() < 0 || index.column() >= columnCount() ) {
0085         return false;
0086     }
0087 
0088     if( index.row() == m_defines.count() ) {
0089         if( index.column() == 0 && !value.toString().isEmpty() ) {
0090             beginInsertRows( QModelIndex(), m_defines.count(), m_defines.count() );
0091             m_defines << qMakePair<QString,QString>(value.toString(), QString());
0092             endInsertRows();
0093         }
0094     } else {
0095         switch( index.column() ) {
0096         case 0:
0097             m_defines[ index.row() ].first = value.toString();
0098             break;
0099         case 1:
0100             m_defines[ index.row() ].second = value.toString();
0101             break;
0102         default:
0103             Q_ASSERT_X( 0, "DefinesModel::setData", "Invalid column requested" );
0104             return false;
0105         }
0106         emit dataChanged( index, index );
0107         return true;
0108 
0109     }
0110 
0111     return false;
0112 }
0113 
0114 Qt::ItemFlags DefinesModel::flags( const QModelIndex& index ) const
0115 {
0116     if( !index.isValid() ) {
0117         return Qt::NoItemFlags;
0118     }
0119 
0120     if( index.row() == m_defines.count() && index.column() == 1 ) {
0121         return Qt::NoItemFlags;
0122     }
0123     return Qt::ItemFlags( Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
0124 }
0125 
0126 Defines DefinesModel::defines() const
0127 {
0128     Defines ret;
0129     ret.reserve(m_defines.size());
0130     for (const auto& pair : m_defines) {
0131         ret[pair.first] = pair.second;
0132     }
0133     return ret;
0134 }
0135 
0136 void DefinesModel::setDefines(const Defines& includes )
0137 {
0138     beginResetModel();
0139     m_defines.clear();
0140     m_defines.reserve(includes.size());
0141     for ( auto it = includes.begin(); it != includes.end(); ++it ) {
0142         m_defines << qMakePair<QString,QString>( it.key(), it.value() );
0143     }
0144     endResetModel();
0145 }
0146 
0147 bool DefinesModel::removeRows( int row, int count, const QModelIndex& parent )
0148 {
0149     if( row >= 0 && count > 0 && row < m_defines.count() ) {
0150         beginRemoveRows( parent, row, row + count - 1 );
0151         for( int i = 0; i < count; ++i ) {
0152             m_defines.removeAt( row );
0153         }
0154         endRemoveRows();
0155         return true;
0156     }
0157     return false;
0158 }
0159 
0160 #include "moc_definesmodel.cpp"