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"