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"