optimize plugin load order

Change-Id: Ib4d0fb0dfbe3d4cc83f2f898c98b07f79d84ca27
This commit is contained in:
石博文 2016-08-02 14:41:42 +08:00
parent 6825063b6a
commit 0acfa37a67
Notes: Deepin Code Review 2016-08-02 07:14:21 +00:00
Verified+1: Anonymous Coward #1000004
Code-Review+2: 石博文 <sbw@sbw.so>
Submitted-by: 石博文 <sbw@sbw.so>
Submitted-at: Tue, 02 Aug 2016 07:14:21 +0000
Reviewed-on: https://cr.deepin.io/14853
Project: dde/dde-dock
Branch: refs/heads/master
9 changed files with 90 additions and 41 deletions

View File

@ -0,0 +1,35 @@
#include "dockpluginloader.h"
#include "dockpluginscontroller.h"
#include <QDebug>
DockPluginLoader::DockPluginLoader(QObject *parent)
: QThread(parent)
{
}
void DockPluginLoader::run()
{
#ifdef QT_DEBUG
const QDir pluginsDir("plugins");
#else
const QDir pluginsDir("../lib/dde-dock/plugins");
#endif
const QStringList plugins = pluginsDir.entryList(QDir::Files);
for (const QString file : plugins)
{
if (!QLibrary::isLibrary(file))
continue;
// TODO: old dock plugins is uncompatible
if (file.startsWith("libdde-dock-"))
continue;
msleep(150);
emit pluginFounded(pluginsDir.absoluteFilePath(file));
}
emit finished();
}

View File

@ -0,0 +1,21 @@
#ifndef DOCKPLUGINLOADER_H
#define DOCKPLUGINLOADER_H
#include <QThread>
class DockPluginLoader : public QThread
{
Q_OBJECT
public:
explicit DockPluginLoader(QObject *parent);
signals:
void finished() const;
void pluginFounded(const QString &pluginFile) const;
protected:
void run();
};
#endif // DOCKPLUGINLOADER_H

View File

@ -1,6 +1,7 @@
#include "dockpluginscontroller.h"
#include "pluginsiteminterface.h"
#include "dockitemcontroller.h"
#include "dockpluginloader.h"
#include <QDebug>
#include <QDir>
@ -11,7 +12,7 @@ DockPluginsController::DockPluginsController(DockItemController *itemControllerI
{
qApp->installEventFilter(this);
QMetaObject::invokeMethod(this, "loadPlugins", Qt::QueuedConnection);
QMetaObject::invokeMethod(this, "startLoader", Qt::QueuedConnection);
}
DockPluginsController::~DockPluginsController()
@ -63,41 +64,14 @@ void DockPluginsController::itemRemoved(PluginsItemInterface * const itemInter,
// item->showPopupApplet();
//}
void DockPluginsController::loadPlugins()
void DockPluginsController::startLoader()
{
// Q_ASSERT(m_pluginLoaderList.isEmpty());
// Q_ASSERT(m_pluginsInterfaceList.isEmpty());
DockPluginLoader *loader = new DockPluginLoader(this);
#ifdef QT_DEBUG
const QDir pluginsDir("plugins");
#else
const QDir pluginsDir("../lib/dde-dock/plugins");
#endif
const QStringList plugins = pluginsDir.entryList(QDir::Files);
connect(loader, &DockPluginLoader::finished, loader, &DockPluginLoader::deleteLater, Qt::QueuedConnection);
connect(loader, &DockPluginLoader::pluginFounded, this, &DockPluginsController::loadPlugin, Qt::QueuedConnection);
int pluginIndex = 0;
for (const QString file : plugins)
{
if (!QLibrary::isLibrary(file))
continue;
// TODO: old dock plugins is uncompatible
if (file.startsWith("libdde-dock-"))
continue;
const QString pluginFilePath = pluginsDir.absoluteFilePath(file);
QPluginLoader *pluginLoader = new QPluginLoader(pluginFilePath, this);
PluginsItemInterface *interface = qobject_cast<PluginsItemInterface *>(pluginLoader->instance());
if (!interface)
{
pluginLoader->unload();
pluginLoader->deleteLater();
continue;
}
// delay load
QTimer::singleShot(100 + (++pluginIndex) * 50, [=] {interface->init(this);});
}
loader->start(QThread::LowestPriority);
}
void DockPluginsController::displayModeChanged()
@ -114,6 +88,20 @@ void DockPluginsController::positionChanged()
inter->positionChanged(position);
}
void DockPluginsController::loadPlugin(const QString &pluginFile)
{
QPluginLoader *pluginLoader = new QPluginLoader(pluginFile, this);
PluginsItemInterface *interface = qobject_cast<PluginsItemInterface *>(pluginLoader->instance());
if (!interface)
{
pluginLoader->unload();
pluginLoader->deleteLater();
return;
}
interface->init(this);
}
bool DockPluginsController::eventFilter(QObject *o, QEvent *e)
{
if (o != qApp)

View File

@ -28,9 +28,10 @@ signals:
void pluginItemRemoved(PluginsItem *pluginItem) const;
private slots:
void loadPlugins();
void startLoader();
void displayModeChanged();
void positionChanged();
void loadPlugin(const QString &pluginFile);
private:
bool eventFilter(QObject *o, QEvent *e);

View File

@ -32,7 +32,8 @@ SOURCES += main.cpp \
util/dockpopupwindow.cpp \
dbus/dbusxmousearea.cpp \
item/stretchitem.cpp \
item/placeholderitem.cpp
item/placeholderitem.cpp \
controller/dockpluginloader.cpp
HEADERS += \
window/mainwindow.h \
@ -56,7 +57,8 @@ HEADERS += \
util/dockpopupwindow.h \
dbus/dbusxmousearea.h \
item/stretchitem.h \
item/placeholderitem.h
item/placeholderitem.h \
controller/dockpluginloader.h
dbus_service.files += com.deepin.dde.dock.service
dbus_service.path = /usr/share/dbus-1/services

View File

@ -9,7 +9,6 @@ DiskMountPlugin::DiskMountPlugin(QObject *parent)
m_diskControlApplet(nullptr)
{
m_diskPluginItem->setVisible(false);
m_diskPluginItem->setDockDisplayMode(displayMode());
}
const QString DiskMountPlugin::pluginName() const
@ -22,6 +21,7 @@ void DiskMountPlugin::init(PluginProxyInterface *proxyInter)
m_proxyInter = proxyInter;
initCompoments();
m_diskPluginItem->setDockDisplayMode(displayMode());
}
QWidget *DiskMountPlugin::itemWidget(const QString &itemKey)

View File

@ -13,8 +13,8 @@ NetworkManager *NetworkManager::instance(QObject *parent)
void NetworkManager::init()
{
QTimer::singleShot(2000, this, &NetworkManager::reloadDevices);
QTimer::singleShot(2500, this, &NetworkManager::reloadActiveConnections);
QTimer::singleShot(100, this, &NetworkManager::reloadDevices);
QTimer::singleShot(150, this, &NetworkManager::reloadActiveConnections);
}
const NetworkDevice::NetworkTypes NetworkManager::states() const

View File

@ -9,8 +9,10 @@ SoundApplet::SoundApplet(QWidget *parent)
{
m_centeralLayout = new QVBoxLayout;
m_centeralWidget->setLayout(m_centeralLayout);
m_centeralWidget->setFixedWidth(WIDTH);
setFixedWidth(WIDTH);
setWidget(m_centeralWidget);
setFrameStyle(QFrame::NoFrame);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

View File

@ -40,7 +40,7 @@ void FashionTrayItem::paintEvent(QPaintEvent *e)
{
Q_UNUSED(e);
const QRect r = rect();
const QRectF r = rect();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
@ -48,7 +48,7 @@ void FashionTrayItem::paintEvent(QPaintEvent *e)
// draw circle
QPen circlePen(QColor(0, 164, 233));
circlePen.setWidth(3);
const int circleSize = std::min(r.width(), r.height()) * 0.8 / 2 - 3;
const double circleSize = (0.8 * std::min(r.width(), r.height()) - 8) / 2;
painter.setPen(circlePen);
painter.drawEllipse(r.center(), circleSize, circleSize);