1
2 #include "aboutplugins.h"
3 #include "config.h"
4
5 #include <QApplication>
6 #include <KLocale>
7 #include <KIcon>
8 #include <KPushButton>
9 #include <QLayout>
10 #include <QLabel>
11 #include <QListWidget>
12 #include <QToolTip>
13
14
AboutPlugins(Config * _config,QWidget * parent,Qt::WFlags f)15 AboutPlugins::AboutPlugins( Config *_config, QWidget* parent, Qt::WFlags f )
16 : KDialog( parent, f ),
17 config( _config ),
18 currentPlugin( 0 )
19 {
20 setCaption( i18n("About plugins") );
21 setWindowIcon( KIcon("preferences-plugin") );
22 setButtons( KDialog::Close );
23 setButtonFocus( KDialog::Close );
24
25 const int fontHeight = QFontMetrics(QApplication::font()).boundingRect("M").size().height();
26
27 QWidget *widget = new QWidget( this );
28 setMainWidget( widget );
29 QHBoxLayout *box = new QHBoxLayout( widget );
30
31 QVBoxLayout *pluginListBox = new QVBoxLayout( widget );
32 box->addLayout( pluginListBox );
33
34 QLabel *installedPlugins = new QLabel( i18n("Installed plugins:"), this );
35 pluginListBox->addWidget( installedPlugins );
36
37 QListWidget *pluginsList = new QListWidget( this );
38 pluginListBox->addWidget( pluginsList );
39 connect( pluginsList, SIGNAL(currentTextChanged(const QString&)), this, SLOT(currentPluginChanged(const QString&)) );
40
41 QStringList pluginNames;
42 QList<CodecPlugin*> codecPlugins = config->pluginLoader()->getAllCodecPlugins();
43 for( int i=0; i<codecPlugins.count(); i++ )
44 {
45 pluginNames += codecPlugins.at(i)->name();
46 }
47 pluginNames.sort();
48 pluginsList->addItems( pluginNames );
49
50 pluginNames.clear();
51 QList<FilterPlugin*> filterPlugins = config->pluginLoader()->getAllFilterPlugins();
52 for( int i=0; i<filterPlugins.count(); i++ )
53 {
54 pluginNames += filterPlugins.at(i)->name();
55 }
56 pluginNames.sort();
57 pluginsList->addItems( pluginNames );
58
59 pluginNames.clear();
60 QList<ReplayGainPlugin*> replaygainPlugins = config->pluginLoader()->getAllReplayGainPlugins();
61 for( int i=0; i<replaygainPlugins.count(); i++ )
62 {
63 pluginNames += replaygainPlugins.at(i)->name();
64 }
65 pluginNames.sort();
66 pluginsList->addItems( pluginNames );
67
68 pluginNames.clear();
69 QList<RipperPlugin*> ripperPlugins = config->pluginLoader()->getAllRipperPlugins();
70 for( int i=0; i<ripperPlugins.count(); i++ )
71 {
72 pluginNames += ripperPlugins.at(i)->name();
73 }
74 pluginNames.sort();
75 pluginsList->addItems( pluginNames );
76
77 pluginsList->setFixedWidth( 15*fontHeight );
78
79 box->addSpacing( fontHeight );
80
81 QVBoxLayout *pluginInfoBox = new QVBoxLayout( widget );
82 box->addLayout( pluginInfoBox );
83
84 aboutPluginLabel = new QLabel( this );
85 aboutPluginLabel->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
86 aboutPluginLabel->setWordWrap( true );
87 aboutPluginLabel->setTextFormat( Qt::RichText );
88 pluginInfoBox->addWidget( aboutPluginLabel );
89 connect( aboutPluginLabel, SIGNAL(linkActivated(const QString&)), this, SLOT(showProblemInfo(const QString&)) );
90
91 pluginInfoBox->addStretch();
92
93 QHBoxLayout *configurePluginBox = new QHBoxLayout( widget );
94 pluginInfoBox->addLayout( configurePluginBox );
95 configurePlugin = new KPushButton( KIcon("configure"), "", widget );
96 configurePlugin->hide();
97 configurePluginBox->addWidget( configurePlugin );
98 configurePluginBox->addStretch();
99 connect( configurePlugin, SIGNAL(clicked()), this, SLOT(configurePluginClicked()) );
100
101 pluginsList->setCurrentRow(0);
102 QListWidgetItem *currentItem = pluginsList->currentItem();
103 if( currentItem )
104 {
105 currentPluginChanged( currentItem->text() );
106 }
107
108 setInitialSize( QSize(50*fontHeight,40*fontHeight) );
109 KSharedConfig::Ptr conf = KGlobal::config();
110 KConfigGroup group = conf->group( "AboutPlugins" );
111 restoreDialogSize( group );
112 }
113
~AboutPlugins()114 AboutPlugins::~AboutPlugins()
115 {
116 KSharedConfig::Ptr conf = KGlobal::config();
117 KConfigGroup group = conf->group( "AboutPlugins" );
118 saveDialogSize( group );
119 }
120
currentPluginChanged(const QString & pluginName)121 void AboutPlugins::currentPluginChanged( const QString& pluginName )
122 {
123 currentPlugin = config->pluginLoader()->backendPluginByName( pluginName );
124 if( !currentPlugin )
125 {
126 aboutPluginLabel->setText( "" );
127 return;
128 }
129
130 QStringList info;
131 info += i18n("About plugin %1:",pluginName);
132
133 info += i18n("Plugin type: %1",currentPlugin->type());
134
135 QMap<QString,QString> binaries = currentPlugin->binaries;
136 QStringList binariesString;
137 if( binaries.count() > 0 )
138 {
139 binariesString += i18n("Backend binaries:");
140 }
141 for( int i=0; i<binaries.count(); i++ )
142 {
143 if( !binaries.values().at(i).isEmpty() )
144 binariesString += i18n("%1 (found at: %2)",binaries.keys().at(i),"<span style=\"color:green\">" + binaries.values().at(i) + "</span>");
145 else
146 binariesString += "<span style=\"color:red\">" + i18n("%1 (not found)",binaries.keys().at(i)) + "</span>";
147 }
148 info += binariesString.join("<br>");
149
150 problemInfos.clear();
151 if( currentPlugin->type() == "codec" )
152 {
153 CodecPlugin *codecPlugin = qobject_cast<CodecPlugin*>(currentPlugin);
154
155 QStringList codecsString;
156 QMap<QString,int> encodeCodecs;
157 QMap<QString,int> decodeCodecs;
158 QList<ConversionPipeTrunk> codecTable = codecPlugin->codecTable();
159 for( int i=0; i<codecTable.count(); i++ )
160 {
161 if( codecTable.at(i).codecTo != "wav" )
162 encodeCodecs[codecTable.at(i).codecTo] += codecTable.at(i).enabled;
163
164 if( codecTable.at(i).codecFrom != "wav" )
165 decodeCodecs[codecTable.at(i).codecFrom] += codecTable.at(i).enabled;
166 }
167 codecsString += i18n("Supported codecs:");
168 QStringList list;
169 for( int i=0; i<encodeCodecs.count(); i++ )
170 {
171 const QString codecName = encodeCodecs.keys().at(i);
172 problemInfos["encode-"+codecName] = i18n("Currently deactivated.") + "\n\n" + config->pluginLoader()->pluginEncodeProblems( pluginName, codecName );
173 list += encodeCodecs.values().at(i) ? "<span style=\"color:green\">" + codecName + "</span>" : "<a style=\"color:red\" href=\"encode-"+codecName+"\">" + codecName + "</a>";
174 }
175 codecsString += i18n("Encode: %1",list.join(", "));
176 list.clear();
177 for( int i=0; i<decodeCodecs.count(); i++ )
178 {
179 const QString codecName = decodeCodecs.keys().at(i);
180 problemInfos["decode-"+codecName] = i18n("Currently deactivated.") + "\n\n" + config->pluginLoader()->pluginDecodeProblems( pluginName, codecName );
181 list += decodeCodecs.values().at(i) ? "<span style=\"color:green\">" + codecName + "</span>" : "<a style=\"color:red\" href=\"decode-"+codecName+"\">" + codecName + "</a>";
182 }
183 codecsString += i18n("Decode: %1",list.join(", "));
184 info += codecsString.join("<br>");
185 }
186 else if( currentPlugin->type() == "filter" )
187 {
188 CodecPlugin *codecPlugin = qobject_cast<CodecPlugin*>(currentPlugin);
189
190 QStringList codecsString;
191 QMap<QString,int> encodeCodecs;
192 QMap<QString,int> decodeCodecs;
193 QList<ConversionPipeTrunk> codecTable = codecPlugin->codecTable();
194 for( int i=0; i<codecTable.count(); i++ )
195 {
196 if( codecTable.at(i).codecTo != "wav" )
197 encodeCodecs[codecTable.at(i).codecTo] += codecTable.at(i).enabled;
198
199 if( codecTable.at(i).codecFrom != "wav" )
200 decodeCodecs[codecTable.at(i).codecFrom] += codecTable.at(i).enabled;
201 }
202 codecsString += i18n("Supported codecs:");
203 QStringList list;
204 for( int i=0; i<encodeCodecs.count(); i++ )
205 {
206 const QString codecName = encodeCodecs.keys().at(i);
207 problemInfos["encode-"+codecName] = i18n("Currently deactivated.") + "\n\n" + config->pluginLoader()->pluginEncodeProblems( pluginName, codecName );
208 list += encodeCodecs.values().at(i) ? "<span style=\"color:green\">" + codecName + "</span>" : "<a style=\"color:red\" href=\"encode-"+codecName+"\">" + codecName + "</a>";
209 }
210 codecsString += i18n("Encode: %1",list.join(", "));
211 list.clear();
212 for( int i=0; i<decodeCodecs.count(); i++ )
213 {
214 const QString codecName = decodeCodecs.keys().at(i);
215 problemInfos["decode-"+codecName] = i18n("Currently deactivated.") + "\n\n" + config->pluginLoader()->pluginDecodeProblems( pluginName, codecName );
216 list += decodeCodecs.values().at(i) ? "<span style=\"color:green\">" + codecName + "</span>" : "<a style=\"color:red\" href=\"decode-"+codecName+"\">" + codecName + "</a>";
217 }
218 codecsString += i18n("Decode: %1",list.join(", "));
219 info += codecsString.join("<br>");
220 }
221 else if( currentPlugin->type() == "replaygain" )
222 {
223 ReplayGainPlugin *replaygainPlugin = qobject_cast<ReplayGainPlugin*>(currentPlugin);
224
225 QStringList codecs;
226 QList<ReplayGainPipe> codecTable = replaygainPlugin->codecTable();
227 for( int i=0; i<codecTable.count(); i++ )
228 {
229 const QString codecName = codecTable.at(i).codecName;
230 problemInfos["replaygain-"+codecName] = i18n("Currently deactivated.") + "\n\n" + config->pluginLoader()->pluginReplayGainProblems( pluginName, codecName );
231 codecs += codecTable.at(i).enabled ? "<span style=\"color:green\">" + codecName + "</span>" : "<a style=\"color:red\" href=\"replaygain-"+codecName+"\">" + codecName + "</a>";
232 }
233 info += QString( i18n("Supported codecs:") + "<br>" + codecs.join(", ") );
234 }
235 else if( currentPlugin->type() == "ripper" )
236 {
237 }
238
239 aboutPluginLabel->setText( info.join("<br><br>") );
240
241 if( currentPlugin->isConfigSupported(BackendPlugin::General,"") )
242 {
243 configurePlugin->setText( i18n("Configure %1 ...",currentPlugin->name()) );
244 configurePlugin->show();
245 }
246 else
247 {
248 configurePlugin->hide();
249 }
250 }
251
configurePluginClicked()252 void AboutPlugins::configurePluginClicked()
253 {
254 if( currentPlugin )
255 {
256 currentPlugin->showConfigDialog( BackendPlugin::General, "", this );
257 }
258 }
259
showProblemInfo(const QString & problemId)260 void AboutPlugins::showProblemInfo( const QString& problemId )
261 {
262 QToolTip::showText( QCursor::pos(), problemInfos[problemId], aboutPluginLabel );
263 }
264
265