1 /*
2     SPDX-FileCopyrightText: 2010 Michal Malek <michalm@jabster.pl>
3     SPDX-FileCopyrightText: 1998-2010 Sebastian Trueg <trueg@k3b.org>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #include "k3bexternalbinparamsmodel.h"
9 #include "k3bexternalbinmanager.h"
10 
11 #include <KLocalizedString>
12 
13 #include <QFont>
14 #include <QHash>
15 #include <QList>
16 #include <QRegExp>
17 
18 namespace K3b {
19 
20 class ExternalBinParamsModel::Private
21 {
22 public:
Private(ExternalBinManager * m)23     Private( ExternalBinManager* m ) : manager( m ) {}
24 
25     ExternalBinManager* manager;
26     QList<ExternalProgram*> programs;
27     QHash<ExternalProgram*,QString> parameters;
28 };
29 
ExternalBinParamsModel(ExternalBinManager * manager,QObject * parent)30 ExternalBinParamsModel::ExternalBinParamsModel( ExternalBinManager* manager, QObject* parent )
31     : QAbstractTableModel( parent ),
32       d( new Private( manager ) )
33 {
34 }
35 
36 
~ExternalBinParamsModel()37 ExternalBinParamsModel::~ExternalBinParamsModel()
38 {
39     delete d;
40 }
41 
42 
reload()43 void ExternalBinParamsModel::reload()
44 {
45     beginResetModel();
46 
47     d->programs.clear();
48     d->parameters.clear();
49 
50     // load programs
51     const QMap<QString, K3b::ExternalProgram*>& map = d->manager->programs();
52     for( QMap<QString, K3b::ExternalProgram*>::const_iterator it = map.begin(); it != map.end(); ++it ) {
53 
54         K3b::ExternalProgram* p = *it;
55         // load user parameters
56         if( p->supportsUserParameters() ) {
57             d->programs.append( p );
58             d->parameters.insert( p, p->userParameters().join( " " ) );
59         }
60     }
61 
62     endResetModel();
63 }
64 
65 
save()66 void ExternalBinParamsModel::save()
67 {
68     QRegExp reSpace( "\\s" );
69     Q_FOREACH( ExternalProgram* program, d->programs ) {
70         QStringList params = d->parameters[ program ].split( reSpace, QString::SkipEmptyParts );
71         program->setUserParameters( params );
72     }
73 }
74 
75 
programForIndex(const QModelIndex & index) const76 ExternalProgram* ExternalBinParamsModel::programForIndex( const QModelIndex& index ) const
77 {
78     if( index.isValid() && index.row() >= 0 && index.row() < d->programs.size() )
79         return d->programs.at( index.row() );
80     else
81         return 0;
82 }
83 
84 
indexForProgram(ExternalProgram * program,int column) const85 QModelIndex ExternalBinParamsModel::indexForProgram( ExternalProgram* program, int column ) const
86 {
87     int i = d->programs.indexOf( program );
88     if( i >= 0 && i < d->programs.size() )
89         return index( i, column );
90     else
91         return QModelIndex();
92 }
93 
94 
flags(const QModelIndex & index) const95 Qt::ItemFlags ExternalBinParamsModel::flags( const QModelIndex& index ) const
96 {
97     if( index.isValid() && index.column() == ParametersColumn )
98         return QAbstractTableModel::flags( index ) | Qt::ItemIsEditable;
99     else
100         return QAbstractTableModel::flags( index );
101 }
102 
103 
data(const QModelIndex & index,int role) const104 QVariant ExternalBinParamsModel::data( const QModelIndex& index, int role ) const
105 {
106     if( ExternalProgram* program = programForIndex( index ) ) {
107         if( Qt::DisplayRole == role || Qt::EditRole == role ) {
108             switch( index.column() ) {
109                 case ProgramColumn: return program->name();
110                 case ParametersColumn: return d->parameters[ program ];
111                 default: break;
112             }
113         }
114         else if( Qt::FontRole == role && index.column() == ProgramColumn ) {
115             QFont font;
116             font.setBold( true );
117             return font;
118         }
119     }
120     return QVariant();
121 }
122 
123 
setData(const QModelIndex & index,const QVariant & value,int role)124 bool ExternalBinParamsModel::setData( const QModelIndex& index, const QVariant& value, int role )
125 {
126     if( ExternalProgram* program = programForIndex( index ) ) {
127         if( Qt::EditRole == role && index.column() == ParametersColumn ) {
128             QString params = value.toString();
129             if( params != d->parameters[ program ] ) {
130                 d->parameters[ program ] = params;
131                 Q_EMIT dataChanged( index, index );
132                 return true;
133             }
134         }
135     }
136     return false;
137 }
138 
139 
columnCount(const QModelIndex &) const140 int ExternalBinParamsModel::columnCount( const QModelIndex& /*parent*/ ) const
141 {
142     return NumColumns;
143 }
144 
145 
rowCount(const QModelIndex & parent) const146 int ExternalBinParamsModel::rowCount( const QModelIndex& parent ) const
147 {
148     if( parent.isValid() )
149         return 0;
150     else
151         return d->programs.size();
152 }
153 
154 
headerData(int section,Qt::Orientation orientation,int role) const155 QVariant ExternalBinParamsModel::headerData( int section, Qt::Orientation orientation, int role ) const
156 {
157     if( orientation == Qt::Horizontal && role == Qt::DisplayRole ) {
158         switch( section ) {
159             case ProgramColumn: return i18n( "Program" );
160             case ParametersColumn: return i18n( "Parameters" );
161             default: return QVariant();
162         }
163     }
164     return QVariant();
165 }
166 
buddy(const QModelIndex & index) const167 QModelIndex ExternalBinParamsModel::buddy( const QModelIndex& index ) const
168 {
169     if( index.isValid() && index.column() == ProgramColumn )
170         return QAbstractTableModel::index( index.row(), ParametersColumn );
171     else
172         return index;
173 }
174 
175 } // namespace K3b
176 
177 
178