File indexing completed on 2024-05-05 04:51:37
0001 /* 0002 SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl> 0003 SPDX-FileCopyrightText: 1998-2010 Sebastian Trueg <trueg@k3b.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "k3bexternalbinparamsmodel.h" 0009 #include "k3bexternalbinmanager.h" 0010 0011 #include <KLocalizedString> 0012 0013 #include <QFont> 0014 #include <QHash> 0015 #include <QList> 0016 #include <QRegularExpression> 0017 0018 namespace K3b { 0019 0020 class ExternalBinParamsModel::Private 0021 { 0022 public: 0023 Private( ExternalBinManager* m ) : manager( m ) {} 0024 0025 ExternalBinManager* manager; 0026 QList<ExternalProgram*> programs; 0027 QHash<ExternalProgram*,QString> parameters; 0028 }; 0029 0030 ExternalBinParamsModel::ExternalBinParamsModel( ExternalBinManager* manager, QObject* parent ) 0031 : QAbstractTableModel( parent ), 0032 d( new Private( manager ) ) 0033 { 0034 } 0035 0036 0037 ExternalBinParamsModel::~ExternalBinParamsModel() 0038 { 0039 delete d; 0040 } 0041 0042 0043 void ExternalBinParamsModel::reload() 0044 { 0045 beginResetModel(); 0046 0047 d->programs.clear(); 0048 d->parameters.clear(); 0049 0050 // load programs 0051 const QMap<QString, K3b::ExternalProgram*>& map = d->manager->programs(); 0052 for( QMap<QString, K3b::ExternalProgram*>::const_iterator it = map.begin(); it != map.end(); ++it ) { 0053 0054 K3b::ExternalProgram* p = *it; 0055 // load user parameters 0056 if( p->supportsUserParameters() ) { 0057 d->programs.append( p ); 0058 d->parameters.insert( p, p->userParameters().join( " " ) ); 0059 } 0060 } 0061 0062 endResetModel(); 0063 } 0064 0065 0066 void ExternalBinParamsModel::save() 0067 { 0068 static const QRegularExpression reSpace( "\\s" ); 0069 Q_FOREACH( ExternalProgram* program, d->programs ) { 0070 QStringList params = d->parameters[ program ].split( reSpace, Qt::SkipEmptyParts ); 0071 program->setUserParameters( params ); 0072 } 0073 } 0074 0075 0076 ExternalProgram* ExternalBinParamsModel::programForIndex( const QModelIndex& index ) const 0077 { 0078 if( index.isValid() && index.row() >= 0 && index.row() < d->programs.size() ) 0079 return d->programs.at( index.row() ); 0080 else 0081 return 0; 0082 } 0083 0084 0085 QModelIndex ExternalBinParamsModel::indexForProgram( ExternalProgram* program, int column ) const 0086 { 0087 int i = d->programs.indexOf( program ); 0088 if( i >= 0 && i < d->programs.size() ) 0089 return index( i, column ); 0090 else 0091 return QModelIndex(); 0092 } 0093 0094 0095 Qt::ItemFlags ExternalBinParamsModel::flags( const QModelIndex& index ) const 0096 { 0097 if( index.isValid() && index.column() == ParametersColumn ) 0098 return QAbstractTableModel::flags( index ) | Qt::ItemIsEditable; 0099 else 0100 return QAbstractTableModel::flags( index ); 0101 } 0102 0103 0104 QVariant ExternalBinParamsModel::data( const QModelIndex& index, int role ) const 0105 { 0106 if( ExternalProgram* program = programForIndex( index ) ) { 0107 if( Qt::DisplayRole == role || Qt::EditRole == role ) { 0108 switch( index.column() ) { 0109 case ProgramColumn: return program->name(); 0110 case ParametersColumn: return d->parameters[ program ]; 0111 default: break; 0112 } 0113 } 0114 else if( Qt::FontRole == role && index.column() == ProgramColumn ) { 0115 QFont font; 0116 font.setBold( true ); 0117 return font; 0118 } 0119 } 0120 return QVariant(); 0121 } 0122 0123 0124 bool ExternalBinParamsModel::setData( const QModelIndex& index, const QVariant& value, int role ) 0125 { 0126 if( ExternalProgram* program = programForIndex( index ) ) { 0127 if( Qt::EditRole == role && index.column() == ParametersColumn ) { 0128 QString params = value.toString(); 0129 if( params != d->parameters[ program ] ) { 0130 d->parameters[ program ] = params; 0131 Q_EMIT dataChanged( index, index ); 0132 return true; 0133 } 0134 } 0135 } 0136 return false; 0137 } 0138 0139 0140 int ExternalBinParamsModel::columnCount( const QModelIndex& /*parent*/ ) const 0141 { 0142 return NumColumns; 0143 } 0144 0145 0146 int ExternalBinParamsModel::rowCount( const QModelIndex& parent ) const 0147 { 0148 if( parent.isValid() ) 0149 return 0; 0150 else 0151 return d->programs.size(); 0152 } 0153 0154 0155 QVariant ExternalBinParamsModel::headerData( int section, Qt::Orientation orientation, int role ) const 0156 { 0157 if( orientation == Qt::Horizontal && role == Qt::DisplayRole ) { 0158 switch( section ) { 0159 case ProgramColumn: return i18n( "Program" ); 0160 case ParametersColumn: return i18n( "Parameters" ); 0161 default: return QVariant(); 0162 } 0163 } 0164 return QVariant(); 0165 } 0166 0167 QModelIndex ExternalBinParamsModel::buddy( const QModelIndex& index ) const 0168 { 0169 if( index.isValid() && index.column() == ProgramColumn ) 0170 return QAbstractTableModel::index( index.row(), ParametersColumn ); 0171 else 0172 return index; 0173 } 0174 0175 } // namespace K3b 0176 0177 #include "moc_k3bexternalbinparamsmodel.cpp"