2015-08-27 14:25:14 +03:00
/*
* Bittorrent Client using Qt and libtorrent .
* Copyright ( C ) 2015 Vladimir Golovnev < glassez @ yandex . ru >
* Copyright ( C ) 2006 Christophe Dumez < chris @ qbittorrent . org >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
*
* In addition , as a special exception , the copyright holders give permission to
* link this program with the OpenSSL project ' s " OpenSSL " library ( or with
* modified versions of it that use the same license as the " OpenSSL " library ) ,
* and distribute the linked executables . You must obey the GNU General Public
* License in all respects for all of the code used other than " OpenSSL " . If you
* modify file ( s ) , you may extend this exception to your version of the file ( s ) ,
* but you are not obligated to do so . If you do not wish to do so , delete this
* exception statement from your version .
*
* Contact : chris @ qbittorrent . org
*/
2017-04-11 15:35:10 +03:00
# include "pluginselectdlg.h"
2017-12-03 10:32:58 +03:00
# include <QClipboard>
# include <QDropEvent>
# include <QFileDialog>
2015-08-27 14:25:14 +03:00
# include <QHeaderView>
2017-12-03 10:32:58 +03:00
# include <QImageReader>
2015-08-27 14:25:14 +03:00
# include <QMenu>
# include <QMessageBox>
# include <QMimeData>
# include <QTableView>
2017-12-03 10:32:58 +03:00
# include "autoexpandabledialog.h"
# include "base/net/downloadhandler.h"
# include "base/net/downloadmanager.h"
2015-09-24 10:33:02 +03:00
# include "base/utils/fs.h"
# include "base/utils/misc.h"
# include "guiiconprovider.h"
2017-12-03 10:32:58 +03:00
# include "pluginsourcedlg.h"
# include "searchwidget.h"
2017-04-11 15:35:10 +03:00
# include "ui_pluginselectdlg.h"
2017-12-03 10:32:58 +03:00
# include "utils.h"
2015-09-24 10:33:02 +03:00
enum PluginColumns
{
PLUGIN_NAME ,
PLUGIN_VERSION ,
PLUGIN_URL ,
PLUGIN_STATE ,
PLUGIN_ID
} ;
2015-08-27 14:25:14 +03:00
2018-01-29 17:05:29 +03:00
PluginSelectDlg : : PluginSelectDlg ( SearchPluginManager * pluginManager , QWidget * parent )
2015-08-27 14:25:14 +03:00
: QDialog ( parent )
2017-04-11 15:35:10 +03:00
, m_ui ( new Ui : : PluginSelectDlg ( ) )
2015-08-27 14:25:14 +03:00
, m_pluginManager ( pluginManager )
, m_asyncOps ( 0 )
2017-06-14 01:23:08 +03:00
, m_pendingUpdates ( 0 )
2015-08-27 14:25:14 +03:00
{
2017-04-11 15:35:10 +03:00
m_ui - > setupUi ( this ) ;
2015-09-24 10:33:02 +03:00
setAttribute ( Qt : : WA_DeleteOnClose ) ;
// This hack fixes reordering of first column with Qt5.
// https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777
QTableView unused ;
2017-04-11 15:35:10 +03:00
unused . setVerticalHeader ( m_ui - > pluginsTree - > header ( ) ) ;
m_ui - > pluginsTree - > header ( ) - > setParent ( m_ui - > pluginsTree ) ;
2015-09-24 10:33:02 +03:00
unused . setVerticalHeader ( new QHeaderView ( Qt : : Horizontal ) ) ;
2017-01-19 15:10:09 +03:00
2017-04-11 15:35:10 +03:00
m_ui - > pluginsTree - > setRootIsDecorated ( false ) ;
m_ui - > pluginsTree - > hideColumn ( PLUGIN_ID ) ;
2017-10-03 16:57:09 +03:00
m_ui - > pluginsTree - > header ( ) - > setSortIndicator ( 0 , Qt : : AscendingOrder ) ;
2015-09-24 10:33:02 +03:00
2017-04-11 15:35:10 +03:00
m_ui - > actionUninstall - > setIcon ( GuiIconProvider : : instance ( ) - > getIcon ( " list-remove " ) ) ;
2015-09-24 10:33:02 +03:00
2017-06-14 01:59:57 +03:00
connect ( m_ui - > actionEnable , & QAction : : toggled , this , & PluginSelectDlg : : enableSelection ) ;
connect ( m_ui - > pluginsTree , & QTreeWidget : : customContextMenuRequested , this , & PluginSelectDlg : : displayContextMenu ) ;
connect ( m_ui - > pluginsTree , & QTreeWidget : : itemDoubleClicked , this , & PluginSelectDlg : : togglePluginState ) ;
2015-09-24 10:33:02 +03:00
loadSupportedSearchPlugins ( ) ;
2018-01-29 17:05:29 +03:00
connect ( m_pluginManager , & SearchPluginManager : : pluginInstalled , this , & PluginSelectDlg : : pluginInstalled ) ;
connect ( m_pluginManager , & SearchPluginManager : : pluginInstallationFailed , this , & PluginSelectDlg : : pluginInstallationFailed ) ;
connect ( m_pluginManager , & SearchPluginManager : : pluginUpdated , this , & PluginSelectDlg : : pluginUpdated ) ;
connect ( m_pluginManager , & SearchPluginManager : : pluginUpdateFailed , this , & PluginSelectDlg : : pluginUpdateFailed ) ;
connect ( m_pluginManager , & SearchPluginManager : : checkForUpdatesFinished , this , & PluginSelectDlg : : checkForUpdatesFinished ) ;
connect ( m_pluginManager , & SearchPluginManager : : checkForUpdatesFailed , this , & PluginSelectDlg : : checkForUpdatesFailed ) ;
2015-09-24 10:33:02 +03:00
2017-12-03 10:32:58 +03:00
Utils : : Gui : : resize ( this ) ;
2015-09-24 10:33:02 +03:00
show ( ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
PluginSelectDlg : : ~ PluginSelectDlg ( )
{
2017-04-11 15:35:10 +03:00
delete m_ui ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : dropEvent ( QDropEvent * event )
{
event - > acceptProposedAction ( ) ;
QStringList files ;
if ( event - > mimeData ( ) - > hasUrls ( ) ) {
foreach ( const QUrl & url , event - > mimeData ( ) - > urls ( ) ) {
if ( ! url . isEmpty ( ) ) {
if ( url . scheme ( ) . compare ( " file " , Qt : : CaseInsensitive ) = = 0 )
files < < url . toLocalFile ( ) ;
else
files < < url . toString ( ) ;
}
}
}
else {
files = event - > mimeData ( ) - > text ( ) . split ( QLatin1String ( " \n " ) ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
if ( files . isEmpty ( ) ) return ;
2015-08-27 14:25:14 +03:00
2015-09-24 10:33:02 +03:00
foreach ( QString file , files ) {
2017-08-13 13:56:03 +03:00
qDebug ( " dropped %s " , qUtf8Printable ( file ) ) ;
2015-09-24 10:33:02 +03:00
startAsyncOp ( ) ;
m_pluginManager - > installPlugin ( file ) ;
}
2015-08-27 14:25:14 +03:00
}
// Decode if we accept drag 'n drop or not
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : dragEnterEvent ( QDragEnterEvent * event )
{
QString mime ;
foreach ( mime , event - > mimeData ( ) - > formats ( ) ) {
2017-08-13 13:56:03 +03:00
qDebug ( " mimeData: %s " , qUtf8Printable ( mime ) ) ;
2015-09-24 10:33:02 +03:00
}
if ( event - > mimeData ( ) - > hasFormat ( QLatin1String ( " text/plain " ) ) | | event - > mimeData ( ) - > hasFormat ( QLatin1String ( " text/uri-list " ) ) ) {
event - > acceptProposedAction ( ) ;
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : on_updateButton_clicked ( )
{
startAsyncOp ( ) ;
m_pluginManager - > checkForUpdates ( ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : togglePluginState ( QTreeWidgetItem * item , int )
{
PluginInfo * plugin = m_pluginManager - > pluginInfo ( item - > text ( PLUGIN_ID ) ) ;
m_pluginManager - > enablePlugin ( plugin - > name , ! plugin - > enabled ) ;
if ( plugin - > enabled ) {
item - > setText ( PLUGIN_STATE , tr ( " Yes " ) ) ;
2017-04-11 15:35:10 +03:00
setRowColor ( m_ui - > pluginsTree - > indexOfTopLevelItem ( item ) , " green " ) ;
2015-09-24 10:33:02 +03:00
}
else {
item - > setText ( PLUGIN_STATE , tr ( " No " ) ) ;
2017-04-11 15:35:10 +03:00
setRowColor ( m_ui - > pluginsTree - > indexOfTopLevelItem ( item ) , " red " ) ;
2015-09-24 10:33:02 +03:00
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : displayContextMenu ( const QPoint & )
{
QMenu myContextMenu ( this ) ;
// Enable/disable pause/start action given the DL state
2017-04-11 15:35:10 +03:00
QList < QTreeWidgetItem * > items = m_ui - > pluginsTree - > selectedItems ( ) ;
2015-09-24 10:33:02 +03:00
if ( items . isEmpty ( ) ) return ;
QString first_id = items . first ( ) - > text ( PLUGIN_ID ) ;
2017-04-11 15:35:10 +03:00
m_ui - > actionEnable - > setChecked ( m_pluginManager - > pluginInfo ( first_id ) - > enabled ) ;
myContextMenu . addAction ( m_ui - > actionEnable ) ;
2015-09-24 10:33:02 +03:00
myContextMenu . addSeparator ( ) ;
2017-04-11 15:35:10 +03:00
myContextMenu . addAction ( m_ui - > actionUninstall ) ;
2015-09-24 10:33:02 +03:00
myContextMenu . exec ( QCursor : : pos ( ) ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : on_closeButton_clicked ( )
{
close ( ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : on_actionUninstall_triggered ( )
{
bool error = false ;
2017-04-11 15:35:10 +03:00
foreach ( QTreeWidgetItem * item , m_ui - > pluginsTree - > selectedItems ( ) ) {
int index = m_ui - > pluginsTree - > indexOfTopLevelItem ( item ) ;
2015-09-24 10:33:02 +03:00
Q_ASSERT ( index ! = - 1 ) ;
QString id = item - > text ( PLUGIN_ID ) ;
if ( m_pluginManager - > uninstallPlugin ( id ) ) {
delete item ;
}
else {
error = true ;
// Disable it instead
m_pluginManager - > enablePlugin ( id , false ) ;
item - > setText ( PLUGIN_STATE , tr ( " No " ) ) ;
setRowColor ( index , " red " ) ;
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
if ( error )
2015-11-11 06:19:16 +03:00
QMessageBox : : warning ( this , tr ( " Uninstall warning " ) , tr ( " Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. \n Those plugins were disabled. " ) ) ;
2015-09-24 10:33:02 +03:00
else
2015-11-11 06:19:16 +03:00
QMessageBox : : information ( this , tr ( " Uninstall success " ) , tr ( " All selected plugins were uninstalled successfully " ) ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : enableSelection ( bool enable )
{
2017-04-11 15:35:10 +03:00
foreach ( QTreeWidgetItem * item , m_ui - > pluginsTree - > selectedItems ( ) ) {
int index = m_ui - > pluginsTree - > indexOfTopLevelItem ( item ) ;
2015-09-24 10:33:02 +03:00
Q_ASSERT ( index ! = - 1 ) ;
QString id = item - > text ( PLUGIN_ID ) ;
m_pluginManager - > enablePlugin ( id , enable ) ;
if ( enable ) {
item - > setText ( PLUGIN_STATE , tr ( " Yes " ) ) ;
setRowColor ( index , " green " ) ;
}
else {
item - > setText ( PLUGIN_STATE , tr ( " No " ) ) ;
setRowColor ( index , " red " ) ;
}
2015-08-27 14:25:14 +03:00
}
}
// Set the color of a row in data model
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : setRowColor ( int row , QString color )
{
2017-04-11 15:35:10 +03:00
QTreeWidgetItem * item = m_ui - > pluginsTree - > topLevelItem ( row ) ;
for ( int i = 0 ; i < m_ui - > pluginsTree - > columnCount ( ) ; + + i ) {
2015-09-24 10:33:02 +03:00
item - > setData ( i , Qt : : ForegroundRole , QVariant ( QColor ( color ) ) ) ;
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
QList < QTreeWidgetItem * > PluginSelectDlg : : findItemsWithUrl ( QString url )
{
QList < QTreeWidgetItem * > res ;
2017-04-11 15:35:10 +03:00
for ( int i = 0 ; i < m_ui - > pluginsTree - > topLevelItemCount ( ) ; + + i ) {
QTreeWidgetItem * item = m_ui - > pluginsTree - > topLevelItem ( i ) ;
2015-09-24 10:33:02 +03:00
if ( url . startsWith ( item - > text ( PLUGIN_URL ) , Qt : : CaseInsensitive ) )
res < < item ;
}
return res ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
QTreeWidgetItem * PluginSelectDlg : : findItemWithID ( QString id )
{
2017-04-11 15:35:10 +03:00
for ( int i = 0 ; i < m_ui - > pluginsTree - > topLevelItemCount ( ) ; + + i ) {
QTreeWidgetItem * item = m_ui - > pluginsTree - > topLevelItem ( i ) ;
2015-09-24 10:33:02 +03:00
if ( id = = item - > text ( PLUGIN_ID ) )
return item ;
}
return 0 ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : loadSupportedSearchPlugins ( )
{
// Some clean up first
2017-04-11 15:35:10 +03:00
m_ui - > pluginsTree - > clear ( ) ;
2015-09-24 10:33:02 +03:00
foreach ( QString name , m_pluginManager - > allPlugins ( ) )
addNewPlugin ( name ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : addNewPlugin ( QString pluginName )
{
2017-04-11 15:35:10 +03:00
QTreeWidgetItem * item = new QTreeWidgetItem ( m_ui - > pluginsTree ) ;
2015-09-24 10:33:02 +03:00
PluginInfo * plugin = m_pluginManager - > pluginInfo ( pluginName ) ;
item - > setText ( PLUGIN_NAME , plugin - > fullName ) ;
item - > setText ( PLUGIN_URL , plugin - > url ) ;
item - > setText ( PLUGIN_ID , plugin - > name ) ;
if ( plugin - > enabled ) {
item - > setText ( PLUGIN_STATE , tr ( " Yes " ) ) ;
2017-04-11 15:35:10 +03:00
setRowColor ( m_ui - > pluginsTree - > indexOfTopLevelItem ( item ) , " green " ) ;
2015-09-24 10:33:02 +03:00
}
else {
item - > setText ( PLUGIN_STATE , tr ( " No " ) ) ;
2017-04-11 15:35:10 +03:00
setRowColor ( m_ui - > pluginsTree - > indexOfTopLevelItem ( item ) , " red " ) ;
2015-09-24 10:33:02 +03:00
}
// Handle icon
if ( QFile : : exists ( plugin - > iconPath ) ) {
// Good, we already have the icon
item - > setData ( PLUGIN_NAME , Qt : : DecorationRole , QVariant ( QIcon ( plugin - > iconPath ) ) ) ;
}
else {
// Icon is missing, we must download it
2017-06-14 01:59:57 +03:00
using namespace Net ;
DownloadHandler * handler = DownloadManager : : instance ( ) - > downloadUrl ( plugin - > url + " /favicon.ico " , true ) ;
connect ( handler , static_cast < void ( DownloadHandler : : * ) ( const QString & , const QString & ) > ( & DownloadHandler : : downloadFinished )
, this , & PluginSelectDlg : : iconDownloaded ) ;
connect ( handler , & DownloadHandler : : downloadFailed , this , & PluginSelectDlg : : iconDownloadFailed ) ;
2015-09-24 10:33:02 +03:00
}
2016-05-14 17:46:40 +03:00
item - > setText ( PLUGIN_VERSION , plugin - > version ) ;
2015-08-27 14:25:14 +03:00
}
void PluginSelectDlg : : startAsyncOp ( )
{
+ + m_asyncOps ;
if ( m_asyncOps = = 1 )
setCursor ( QCursor ( Qt : : WaitCursor ) ) ;
}
void PluginSelectDlg : : finishAsyncOp ( )
{
- - m_asyncOps ;
if ( m_asyncOps = = 0 )
setCursor ( QCursor ( Qt : : ArrowCursor ) ) ;
}
2017-06-14 01:23:08 +03:00
void PluginSelectDlg : : finishPluginUpdate ( )
{
- - m_pendingUpdates ;
if ( m_pendingUpdates = = 0 & & ! m_updatedPlugins . isEmpty ( ) ) {
m_updatedPlugins . sort ( Qt : : CaseInsensitive ) ;
QMessageBox : : information ( this , tr ( " Search plugin update " ) , tr ( " Plugins installed or updated: %1 " ) . arg ( m_updatedPlugins . join ( " , " ) ) ) ;
m_updatedPlugins . clear ( ) ;
}
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : on_installButton_clicked ( )
{
PluginSourceDlg * dlg = new PluginSourceDlg ( this ) ;
2017-06-14 01:59:57 +03:00
connect ( dlg , & PluginSourceDlg : : askForLocalFile , this , & PluginSelectDlg : : askForLocalPlugin ) ;
connect ( dlg , & PluginSourceDlg : : askForUrl , this , & PluginSelectDlg : : askForPluginUrl ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : askForPluginUrl ( )
{
bool ok = false ;
QString clipTxt = qApp - > clipboard ( ) - > text ( ) ;
QString defaultUrl = " http:// " ;
if ( Utils : : Misc : : isUrl ( clipTxt ) & & clipTxt . endsWith ( " .py " ) )
defaultUrl = clipTxt ;
QString url = AutoExpandableDialog : : getText (
this , tr ( " New search engine plugin URL " ) ,
tr ( " URL: " ) , QLineEdit : : Normal , defaultUrl , & ok
) ;
while ( ok & & ! url . isEmpty ( ) & & ! url . endsWith ( " .py " ) ) {
QMessageBox : : warning ( this , tr ( " Invalid link " ) , tr ( " The link doesn't seem to point to a search engine plugin. " ) ) ;
url = AutoExpandableDialog : : getText (
this , tr ( " New search engine plugin URL " ) ,
tr ( " URL: " ) , QLineEdit : : Normal , url , & ok
) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
if ( ok & & ! url . isEmpty ( ) ) {
startAsyncOp ( ) ;
m_pluginManager - > installPlugin ( url ) ;
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : askForLocalPlugin ( )
{
QStringList pathsList = QFileDialog : : getOpenFileNames (
0 , tr ( " Select search plugins " ) , QDir : : homePath ( ) ,
tr ( " qBittorrent search plugin " ) + QLatin1String ( " (*.py) " )
) ;
foreach ( QString path , pathsList ) {
startAsyncOp ( ) ;
m_pluginManager - > installPlugin ( path ) ;
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : iconDownloaded ( const QString & url , QString filePath )
{
filePath = Utils : : Fs : : fromNativePath ( filePath ) ;
// Icon downloaded
2017-06-13 18:45:22 +03:00
QIcon icon ( filePath ) ;
// Detect a non-decodable icon
QList < QSize > sizes = icon . availableSizes ( ) ;
bool invalid = ( sizes . isEmpty ( ) | | icon . pixmap ( sizes . first ( ) ) . isNull ( ) ) ;
if ( ! invalid ) {
2015-09-24 10:33:02 +03:00
foreach ( QTreeWidgetItem * item , findItemsWithUrl ( url ) ) {
QString id = item - > text ( PLUGIN_ID ) ;
PluginInfo * plugin = m_pluginManager - > pluginInfo ( id ) ;
if ( ! plugin ) continue ;
2017-06-13 18:45:22 +03:00
QString iconPath = QString ( " %1/%2.%3 " )
2018-01-29 17:05:29 +03:00
. arg ( SearchPluginManager : : pluginsLocation ( ) )
2017-06-13 18:45:22 +03:00
. arg ( id )
. arg ( url . endsWith ( " .ico " , Qt : : CaseInsensitive ) ? " ico " : " png " ) ;
2017-06-13 17:55:48 +03:00
if ( QFile : : copy ( filePath , iconPath ) ) {
2017-06-13 18:45:22 +03:00
// This 2nd check is necessary. Some favicons (eg from piratebay)
// decode fine without an ext, but fail to do so when appending the ext
// from the url. Probably a Qt bug.
QIcon iconWithExt ( iconPath ) ;
QList < QSize > sizesExt = iconWithExt . availableSizes ( ) ;
bool invalidExt = ( sizesExt . isEmpty ( ) | | iconWithExt . pixmap ( sizesExt . first ( ) ) . isNull ( ) ) ;
if ( invalidExt ) {
Utils : : Fs : : forceRemove ( iconPath ) ;
continue ;
}
item - > setData ( PLUGIN_NAME , Qt : : DecorationRole , iconWithExt ) ;
2017-06-13 17:55:48 +03:00
m_pluginManager - > updateIconPath ( plugin ) ;
}
2015-09-24 10:33:02 +03:00
}
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
// Delete tmp file
Utils : : Fs : : forceRemove ( filePath ) ;
2015-08-27 14:25:14 +03:00
}
2015-09-24 10:33:02 +03:00
void PluginSelectDlg : : iconDownloadFailed ( const QString & url , const QString & reason )
{
2017-08-13 13:56:03 +03:00
qDebug ( " Could not download favicon: %s, reason: %s " , qUtf8Printable ( url ) , qUtf8Printable ( reason ) ) ;
2015-08-27 14:25:14 +03:00
}
2017-05-02 15:31:34 +03:00
void PluginSelectDlg : : checkForUpdatesFinished ( const QHash < QString , PluginVersion > & updateInfo )
2015-08-27 14:25:14 +03:00
{
finishAsyncOp ( ) ;
if ( updateInfo . isEmpty ( ) ) {
QMessageBox : : information ( this , tr ( " Search plugin update " ) , tr ( " All your plugins are already up to date. " ) ) ;
return ;
}
foreach ( const QString & pluginName , updateInfo . keys ( ) ) {
startAsyncOp ( ) ;
2017-06-14 01:23:08 +03:00
m_pendingUpdates + + ;
2015-08-27 14:25:14 +03:00
m_pluginManager - > updatePlugin ( pluginName ) ;
}
}
void PluginSelectDlg : : checkForUpdatesFailed ( const QString & reason )
{
finishAsyncOp ( ) ;
QMessageBox : : warning ( this , tr ( " Search plugin update " ) , tr ( " Sorry, couldn't check for plugin updates. %1 " ) . arg ( reason ) ) ;
}
void PluginSelectDlg : : pluginInstalled ( const QString & name )
{
addNewPlugin ( name ) ;
finishAsyncOp ( ) ;
2017-06-14 01:23:08 +03:00
m_updatedPlugins . append ( name ) ;
finishPluginUpdate ( ) ;
2015-08-27 14:25:14 +03:00
}
void PluginSelectDlg : : pluginInstallationFailed ( const QString & name , const QString & reason )
{
finishAsyncOp ( ) ;
QMessageBox : : information ( this , tr ( " Search plugin install " ) , tr ( " Couldn't install \" %1 \" search engine plugin. %2 " ) . arg ( name ) . arg ( reason ) ) ;
2017-06-14 01:23:08 +03:00
finishPluginUpdate ( ) ;
2015-08-27 14:25:14 +03:00
}
void PluginSelectDlg : : pluginUpdated ( const QString & name )
{
finishAsyncOp ( ) ;
2016-05-14 17:46:40 +03:00
PluginVersion version = m_pluginManager - > pluginInfo ( name ) - > version ;
2015-08-27 14:25:14 +03:00
QTreeWidgetItem * item = findItemWithID ( name ) ;
2016-05-14 17:46:40 +03:00
item - > setText ( PLUGIN_VERSION , version ) ;
2017-06-14 01:23:08 +03:00
m_updatedPlugins . append ( name ) ;
finishPluginUpdate ( ) ;
2015-08-27 14:25:14 +03:00
}
void PluginSelectDlg : : pluginUpdateFailed ( const QString & name , const QString & reason )
{
finishAsyncOp ( ) ;
QMessageBox : : information ( this , tr ( " Search plugin update " ) , tr ( " Couldn't update \" %1 \" search engine plugin. %2 " ) . arg ( name ) . arg ( reason ) ) ;
2017-06-14 01:23:08 +03:00
finishPluginUpdate ( ) ;
2015-08-27 14:25:14 +03:00
}