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