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