add plugins setting window

Change-Id: Ic9817c9c3385c9fff880bc7ae7da475d6f0439ab
This commit is contained in:
杨万青 2015-09-01 19:31:14 +08:00
parent 7fc70a5d97
commit f8d3dd42f2
Notes: Deepin Code Review 2016-06-14 07:19:47 +00:00
Verified+1: Anonymous Coward #1000004
Code-Review+2: <mr.asianwang@gmail.com>
Submitted-by: <mr.asianwang@gmail.com>
Submitted-at: Sun, 06 Sep 2015 11:21:20 +0800
Reviewed-on: https://cr.deepin.io/6767
Project: dde/dde-dock
Branch: refs/heads/master
14 changed files with 400 additions and 40 deletions

View File

@ -67,10 +67,10 @@ QWidget * TrashPlugin::getApplet(QString)
return NULL;
}
void TrashPlugin::changeMode(Dock::DockMode newMode,
Dock::DockMode)
void TrashPlugin::changeMode(Dock::DockMode newMode, Dock::DockMode oldMode)
{
setMode(newMode);
if (newMode != oldMode)
setMode(newMode);
}
QString TrashPlugin::getMenuContent(QString)
@ -99,8 +99,10 @@ void TrashPlugin::setMode(Dock::DockMode mode)
if (mode == Dock::FashionMode)
m_proxy->itemAddedEvent(m_id);
else
else{
m_proxy->itemRemovedEvent(m_id);
m_item->setParent(NULL);
}
}
QJsonObject TrashPlugin::createMenuItem(QString itemId, QString itemName, bool checkable, bool checked)
@ -121,7 +123,6 @@ QJsonObject TrashPlugin::createMenuItem(QString itemId, QString itemName, bool c
return itemObj;
}
TrashPlugin::~TrashPlugin()
{

View File

@ -63,3 +63,32 @@ PanelMenuItem:hover {
background: gray;
color: #ffffff
}
/********************************Plugin Setting********************/
QLabel#PluginSettingTitle {
color:#b4b4b4;
}
QLabel#PluginSettingLineTitle {
color:#b4b4b4;
}
QWidget#PluginsSettingFrame {
background-color: rgba(0,0,0,0.9);
border-radius: 3;
}
QPushButton#PluginSettingCloseButton{
border-image: url(":/images/Resource/dark/images/dark_close_small_normal.png");
}
QPushButton#PluginSettingCloseButton:hover{
border-image: url(":/images/Resource/dark/images/dark_close_small_hover.png");
}
QPushButton#PluginSettingCloseButton:pressed{
border-image: url(":/images/Resource/dark/images/dark_close_small_press.png");
}

View File

@ -47,7 +47,8 @@ SOURCES += \
src/Widgets/launcheritem.cpp \
src/Widgets/reflectioneffect.cpp \
src/Widgets/highlighteffect.cpp \
src/Widgets/previewarrowrectangle.cpp
src/Widgets/previewarrowrectangle.cpp \
src/Panel/pluginssettingframe.cpp
HEADERS += \
src/abstractdockitem.h \
@ -84,13 +85,14 @@ HEADERS += \
src/Widgets/launcheritem.h \
src/Widgets/reflectioneffect.h \
src/Widgets/highlighteffect.h \
src/Widgets/previewarrowrectangle.h
src/Widgets/previewarrowrectangle.h \
src/Panel/pluginssettingframe.h
RESOURCES += \
images.qrc \
qss.qrc
PKGCONFIG += gtk+-2.0 x11 cairo xcb xcb-ewmh xcb-damage
PKGCONFIG += gtk+-2.0 x11 cairo xcb xcb-ewmh xcb-damage dui
CONFIG += c++11 link_pkgconfig
target.path = /usr/bin/

View File

@ -107,6 +107,10 @@ void Panel::initPluginManager()
connect(pluginManager, &DockPluginManager::itemRemoved, [=](AbstractDockItem* item) {
m_pluginLayout->removeItem(item);
});
connect(PanelMenu::instance(), &PanelMenu::settingPlugin, [=]{
QRect rec = QApplication::desktop()->screenGeometry();
pluginManager->onPluginsSetting(rec.height() - height());
});
pluginManager->initAll();
}

View File

@ -77,6 +77,9 @@ void PanelMenu::slotItemInvoked(const QString &itemId, bool result)
case ToSmartHide:
changeToSmartHide();
break;
case ToPluginSetting:
emit settingPlugin();
break;
default:
break;
}

View File

@ -34,6 +34,7 @@ public:
void showMenu(int x,int y);
signals:
void settingPlugin();
private slots:
void slotItemInvoked(const QString &itemId,bool result);

View File

@ -0,0 +1,171 @@
#include "pluginssettingframe.h"
PluginsSettingLine::PluginsSettingLine(bool checked, const QString &id, const QString &title, const QPixmap &icon, QWidget *parent)
:m_pluginId(id), QLabel(parent)
{
QHBoxLayout *mainLayout = new QHBoxLayout(this);
mainLayout->setContentsMargins(CONTENT_MARGIN, 0, CONTENT_MARGIN, 0);
mainLayout->setSpacing(0);
m_iconLabel = new QLabel;
m_iconLabel->setFixedSize(ICON_SIZE, ICON_SIZE);
m_iconLabel->setPixmap(icon.scaled(ICON_SIZE, ICON_SIZE));
m_titleLabel = new QLabel;
m_titleLabel->setObjectName("PluginSettingLineTitle");
m_titleLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
setTitle(title);
m_switchButton = new DSwitchButton;
m_switchButton->setChecked(checked);
connect(m_switchButton, &DSwitchButton::checkedChanged, [=](bool checked){
emit disableChanged(m_pluginId, !checked);
});
mainLayout->addWidget(m_iconLabel);
mainLayout->addSpacing(ICON_SPACING);
mainLayout->addWidget(m_titleLabel);
mainLayout->addStretch();
mainLayout->addWidget(m_switchButton);
}
void PluginsSettingLine::setTitle(const QString &title)
{
m_titleLabel->setText(title);
QFontMetrics fm(m_titleLabel->font());
m_titleLabel->setText(fm.elidedText(title,Qt::ElideRight, MAX_TEXT_WIDTH));
}
void PluginsSettingLine::setIcon(const QPixmap &icon)
{
m_iconLabel->setPixmap(icon.scaled(ICON_SIZE, ICON_SIZE));
}
QString PluginsSettingLine::pluginId() const
{
return m_pluginId;
}
bool PluginsSettingLine::checked(bool check)
{
return m_switchButton->checked();
}
void PluginsSettingLine::setPluginId(const QString &pluginId)
{
m_pluginId = pluginId;
}
void PluginsSettingLine::setChecked(const bool checked)
{
m_switchButton->setChecked(checked);
}
PluginsSettingFrame::PluginsSettingFrame(QWidget *parent) :
QFrame(parent)
{
setObjectName("PluginsSettingFrame");
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
QWidget *contentFrame = new QWidget;
contentFrame->setObjectName("PluginsSettingFrame");
QVBoxLayout *contentLayout = new QVBoxLayout(this);
contentLayout->setContentsMargins(0, 0, 0, 0);
contentLayout->setSpacing(0);
contentLayout->addWidget(contentFrame);
m_mainLayout = new QVBoxLayout(contentFrame);
m_mainLayout->setSpacing(LINE_SPACING);
m_mainLayout->setContentsMargins(0, 0, 0, 0);
initCloseTitle();
setFixedWidth(WIN_WIDTH);
}
void PluginsSettingFrame::onPluginAdd(bool checked, const QString &id, const QString &title, const QPixmap &icon)
{
if (m_lineMap.keys().indexOf(id) != -1)
return;
PluginsSettingLine *line = new PluginsSettingLine(checked, id, title, icon);
connect(line, &PluginsSettingLine::disableChanged, this, &PluginsSettingFrame::disableChanged);
m_mainLayout->addWidget(line, 1, Qt::AlignTop);
m_lineMap.insert(id, line);
resizeWithLineCount();
}
void PluginsSettingFrame::onPluginRemove(const QString &id)
{
PluginsSettingLine * line = m_lineMap.take(id);
if (line){
m_mainLayout->removeWidget(line);
line->deleteLater();
resizeWithLineCount();
}
}
void PluginsSettingFrame::clear()
{
foreach (QString uuid, m_lineMap.keys()) {
m_lineMap.take(uuid)->deleteLater();
}
}
void PluginsSettingFrame::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalPos() - m_pressPosition);
QFrame::mouseMoveEvent(event);
}
void PluginsSettingFrame::mousePressEvent(QMouseEvent *event)
{
if(event->button() & Qt::LeftButton)
{
m_pressPosition = event->globalPos() - frameGeometry().topLeft();
}
QFrame::mousePressEvent(event);
}
void PluginsSettingFrame::mouseReleaseEvent(QMouseEvent *event)
{
QFrame::mouseReleaseEvent(event);
}
void PluginsSettingFrame::resizeWithLineCount()
{
setFixedHeight((m_lineMap.count() + 1) * (LINE_HEIGHT + LINE_SPACING));
}
void PluginsSettingFrame::initCloseTitle()
{
QLabel *titleLabel = new QLabel(tr("Notice Region Setting"));
titleLabel->setAlignment(Qt::AlignCenter);
titleLabel->setObjectName("PluginSettingTitle");
QPushButton *closeButton = new QPushButton;
closeButton->setFocusPolicy(Qt::NoFocus);
closeButton->setFixedSize(ICON_SIZE, ICON_SIZE);
closeButton->setObjectName("PluginSettingCloseButton");
connect(closeButton, &QPushButton::clicked, [=]{
this->hide();
});
QHBoxLayout *titleLayout = new QHBoxLayout;
titleLayout->setAlignment(Qt::AlignVCenter);
titleLayout->setContentsMargins(0, CONTENT_MARGIN, CONTENT_MARGIN, 0);
titleLayout->setSpacing(0);
titleLayout->addWidget(titleLabel, 1);
titleLayout->addWidget(closeButton, 1);
m_mainLayout->addLayout(titleLayout, 1);
DSeparatorHorizontal *sp = new DSeparatorHorizontal;
m_mainLayout->addWidget(sp);
}

View File

@ -0,0 +1,87 @@
#ifndef PLUGINSSETTINGFRAME_H
#define PLUGINSSETTINGFRAME_H
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QPushButton>
#include <QFrame>
#include <QLabel>
#include <QDebug>
#include <libdui/dswitchbutton.h>
#include <libdui/dseparatorhorizontal.h>
DUI_USE_NAMESPACE
class PluginsSettingLine : public QLabel
{
Q_OBJECT
public:
explicit PluginsSettingLine(bool checked = false,
const QString &id = "",
const QString &title = "",
const QPixmap &icon = QPixmap(),
QWidget *parent = 0);
void setIcon(const QPixmap &icon);
void setTitle(const QString &title);
void setPluginId(const QString &pluginId);
void setChecked(const bool checked);
QString pluginId() const;
bool checked(bool check);
signals:
void disableChanged(QString id, bool check);
private:
QLabel *m_iconLabel = NULL;
QLabel *m_titleLabel = NULL;
DSwitchButton *m_switchButton = NULL;
QString m_pluginId = "";
const int ICON_SIZE = 16;
const int ICON_SPACING = 6;
const int CONTENT_MARGIN = 6;
const int MAX_TEXT_WIDTH = 125;
};
class PluginsSettingFrame : public QFrame
{
Q_OBJECT
public:
explicit PluginsSettingFrame(QWidget *parent = 0);
public slots:
void onPluginAdd(bool checked = false,
const QString &id = "",
const QString &title = "",
const QPixmap &icon = QPixmap());
void onPluginRemove(const QString &id);
void clear();
signals:
void disableChanged(QString id, bool check);
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
private:
void resizeWithLineCount();
void initCloseTitle();
QPoint m_pressPosition;
QVBoxLayout *m_mainLayout;
QMap<QString, PluginsSettingLine *> m_lineMap;
const int ICON_SIZE = 24;
const int CONTENT_MARGIN = 6;
const int LINE_SPACING = 5;
const int LINE_HEIGHT = 30;
const int WIN_WIDTH = 230;
};
#endif // PLUGINSSETTINGFRAME_H

View File

@ -21,7 +21,6 @@ signals:
void pressed();
void released();
public slots:
private:
void setIcon(const QString &path);

View File

@ -1,6 +1,7 @@
#ifndef DOCKPLUGININTERFACE_H
#define DOCKPLUGININTERFACE_H
#include <QPixmap>
#include <QObject>
#include <QStringList>
@ -21,6 +22,7 @@ public:
virtual QString getName(QString id) = 0;
virtual QString getTitle(QString id) = 0;
virtual QString getCommand(QString id) = 0;
virtual QPixmap getIcon(QString id) {Q_UNUSED(id); return QPixmap("");}
virtual bool canDisable(QString id) = 0;
virtual bool isDisabled(QString id) = 0;
virtual void setDisabled(QString id, bool disabled) = 0;

View File

@ -10,6 +10,8 @@
DockPluginManager::DockPluginManager(QObject *parent) :
QObject(parent)
{
m_settingFrame = new PluginsSettingFrame;
m_searchPaths << "/usr/share/dde-dock/plugins/";
m_watcher = new QFileSystemWatcher(this);
@ -27,6 +29,8 @@ DockPluginManager::DockPluginManager(QObject *parent) :
connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &DockPluginManager::watchedFileChanged);
connect(m_watcher, &QFileSystemWatcher::directoryChanged, this, &DockPluginManager::watchedDirectoryChanged);
}
void DockPluginManager::initAll()
@ -34,12 +38,22 @@ void DockPluginManager::initAll()
foreach (DockPluginProxy * proxy, m_proxies.values()) {
proxy->plugin()->init(proxy);
}
refreshSettingWindow();
}
void DockPluginManager::onPluginsSetting(int y)
{
m_settingFrame->move(QCursor::pos().x(), y - m_settingFrame->height());
m_settingFrame->show();
}
// public slots
void DockPluginManager::onDockModeChanged(Dock::DockMode newMode,
Dock::DockMode oldMode)
void DockPluginManager::onDockModeChanged(Dock::DockMode newMode, Dock::DockMode oldMode)
{
if (newMode == oldMode)
return;
qDebug() << "DockPluginManager::onDockModeChanged " << newMode << oldMode;
foreach (DockPluginProxy * proxy, m_proxies) {
@ -48,6 +62,7 @@ void DockPluginManager::onDockModeChanged(Dock::DockMode newMode,
}
updatePluginPos(newMode, oldMode);
refreshSettingWindow();
}
// private methods
@ -75,17 +90,10 @@ DockPluginProxy * DockPluginManager::loadPlugin(const QString &path)
if (proxy) {
m_proxies[path] = proxy;
m_watcher->addPath(path);
connect(proxy, &DockPluginProxy::itemAdded, [=](AbstractDockItem *item, QString uuid){
if (pluginLoader->metaData()["MetaData"].toObject()["sys_plugin"].toBool())
handleSysPluginAdd(item, uuid);
else
handleNormalPluginAdd(item);
});
connect(proxy, &DockPluginProxy::itemRemoved, [=](AbstractDockItem *item){
m_sysPlugins.remove(item);
m_normalPlugins.removeAt(m_normalPlugins.indexOf(item));
emit itemRemoved(item);
connect(proxy, &DockPluginProxy::itemAdded, this, &DockPluginManager::onPluginItemAdded);
connect(proxy, &DockPluginProxy::itemRemoved, this, &DockPluginManager::onPluginItemRemoved);
connect(m_settingFrame, &PluginsSettingFrame::disableChanged, [=](QString uuid, bool disable){
interface->setDisabled(uuid, disable);
});
return proxy;
@ -113,17 +121,54 @@ void DockPluginManager::unloadPlugin(const QString &path)
void DockPluginManager::updatePluginPos(Dock::DockMode newMode, Dock::DockMode oldMode)
{
if (newMode == Dock::FashionMode && oldMode != Dock::FashionMode){
foreach (AbstractDockItem *item, m_normalPlugins) {
foreach (AbstractDockItem *item, m_normalPlugins.keys()) {
emit itemMove(NULL, item); //Move to the front of the list
}
}else if (oldMode == Dock::FashionMode){
AbstractDockItem * systrayItem = sysPluginItem(SYSTRAY_PLUGIN_ID);
foreach (AbstractDockItem *item, m_normalPlugins) {
foreach (AbstractDockItem *item, m_normalPlugins.keys()) {
emit itemMove(systrayItem, item); //Move to the back of systray plugin
}
}
}
void DockPluginManager::refreshSettingWindow()
{
m_settingFrame->clear();
foreach (DockPluginProxy *proxy, m_proxies.values()) {
QStringList ids = proxy->plugin()->ids();
foreach (QString uuid, ids) {
if (proxy->plugin()->canDisable(uuid)){
m_settingFrame->onPluginAdd(!proxy->plugin()->isDisabled(uuid),
uuid,
proxy->plugin()->getName(uuid),
proxy->plugin()->getIcon(uuid));
}
}
}
}
void DockPluginManager::onPluginItemAdded(AbstractDockItem *item, QString uuid)
{
DockPluginProxy *proxy = qobject_cast<DockPluginProxy *>(sender());
if (!proxy)
return;
if (proxy->isSystemPlugin())
handleSysPluginAdd(item, uuid);
else
handleNormalPluginAdd(item, uuid);
}
void DockPluginManager::onPluginItemRemoved(AbstractDockItem *item, QString uuid)
{
m_sysPlugins.remove(item);
m_normalPlugins.remove(item);
emit itemRemoved(item);
}
// private slots
void DockPluginManager::watchedFileChanged(const QString & file)
{
@ -165,6 +210,9 @@ AbstractDockItem *DockPluginManager::sysPluginItem(QString id)
void DockPluginManager::handleSysPluginAdd(AbstractDockItem *item, QString uuid)
{
if (!item || m_sysPlugins.values().indexOf(uuid) != -1)
return;
m_sysPlugins.insert(item, uuid);
if (uuid == SYSTRAY_PLUGIN_ID){
@ -177,9 +225,12 @@ void DockPluginManager::handleSysPluginAdd(AbstractDockItem *item, QString uuid)
emit itemAppend(item);
}
void DockPluginManager::handleNormalPluginAdd(AbstractDockItem *item)
void DockPluginManager::handleNormalPluginAdd(AbstractDockItem *item, QString uuid)
{
m_normalPlugins.append(item);
if (!item || m_normalPlugins.values().indexOf(uuid) != -1)
return;
m_normalPlugins.insert(item, uuid);
if (m_dockModeData->getDockMode() == Dock::FashionMode)
emit itemInsert(NULL, item);

View File

@ -1,13 +1,14 @@
#ifndef DOCKPLUGINMANAGER_H
#define DOCKPLUGINMANAGER_H
#include <QObject>
#include <QMap>
#include <QObject>
#include <QStringList>
#include "dockconstants.h"
#include "abstractdockitem.h"
#include "Controller/dockmodedata.h"
#include "Panel/pluginssettingframe.h"
class QFileSystemWatcher;
class DockPluginProxy;
@ -26,6 +27,7 @@ signals:
void itemRemoved(AbstractDockItem * item);
public slots:
void onPluginsSetting(int y);
void onDockModeChanged(Dock::DockMode newMode,
Dock::DockMode oldMode);
@ -37,14 +39,18 @@ private:
AbstractDockItem * sysPluginItem(QString id);
DockPluginProxy * loadPlugin(const QString & path);
void handleSysPluginAdd(AbstractDockItem *item, QString uuid);
void handleNormalPluginAdd(AbstractDockItem *item);
void handleNormalPluginAdd(AbstractDockItem *item, QString uuid);
void unloadPlugin(const QString & path);
void updatePluginPos(Dock::DockMode newMode, Dock::DockMode oldMode);
void refreshSettingWindow();
void onPluginItemAdded(AbstractDockItem *item, QString uuid);
void onPluginItemRemoved(AbstractDockItem *item, QString uuid);
private:
PluginsSettingFrame *m_settingFrame = NULL;
QMap<AbstractDockItem *, QString> m_sysPlugins;
QMap<AbstractDockItem *, QString> m_normalPlugins;
QMap<QString, DockPluginProxy*> m_proxies;
QList<AbstractDockItem *> m_normalPlugins;
QFileSystemWatcher * m_watcher = NULL;
QStringList m_searchPaths;
DockModeData *m_dockModeData = DockModeData::instance();

View File

@ -13,8 +13,8 @@ DockPluginProxy::DockPluginProxy(QPluginLoader * loader, DockPluginInterface * p
DockPluginProxy::~DockPluginProxy()
{
foreach (AbstractDockItem * item, m_items.values()) {
emit itemRemoved(item);
foreach (QString id, m_items.keys()) {
emit itemRemoved(m_items.take(id), id);
}
m_items.clear();
@ -34,17 +34,20 @@ Dock::DockMode DockPluginProxy::dockMode()
return DockModeData::instance()->getDockMode();
}
bool DockPluginProxy::isSystemPlugin()
{
return m_loader->metaData()["MetaData"].toObject()["sys_plugin"].toBool();
}
void DockPluginProxy::itemAddedEvent(QString id)
{
qDebug() << "Item added on plugin " << m_plugin->getPluginName() << id;
if (m_plugin->getItem(id)) {
qDebug() << "Item added on plugin " << m_plugin->getPluginName() << id;
if (!m_items.contains(id)) {
if (m_plugin->getItem(id)) {
AbstractDockItem * item = new PluginItemWrapper(m_plugin, id);
m_items[id] = item;
AbstractDockItem * item = new PluginItemWrapper(m_plugin, id);
m_items[id] = item;
emit itemAdded(item, id);
}
emit itemAdded(item, id);
}
}
@ -56,7 +59,7 @@ void DockPluginProxy::itemRemovedEvent(QString id)
if (item) {
m_items.take(id);
emit itemRemoved(item);
emit itemRemoved(item, id);
}
}

View File

@ -13,6 +13,7 @@ public:
DockPluginProxy(QPluginLoader * loader, DockPluginInterface * plugin);
~DockPluginProxy();
bool isSystemPlugin();
DockPluginInterface * plugin();
Dock::DockMode dockMode() Q_DECL_OVERRIDE;
@ -24,7 +25,7 @@ public:
signals:
void itemAdded(AbstractDockItem * item, QString uuid);
void itemRemoved(AbstractDockItem * item);
void itemRemoved(AbstractDockItem * item, QString uuid);
private:
QMap<QString, AbstractDockItem*> m_items;