record container config

Change-Id: I9bbe88b784066514495b087a62eee22d100c9e7d
This commit is contained in:
石博文 2016-08-15 14:11:19 +08:00
parent 5dad2f11d0
commit 338f159999
Notes: Deepin Code Review 2016-08-15 06:28:14 +00:00
Verified+1: Anonymous Coward #1000004
Verified+1: <zhaofangfang@linuxdeepin.com>
Code-Review+2: 石博文 <sbw@sbw.so>
Submitted-by: 石博文 <sbw@sbw.so>
Submitted-at: Mon, 15 Aug 2016 06:28:14 +0000
Reviewed-on: https://cr.deepin.io/15197
Project: dde/dde-dock
Branch: refs/heads/master
10 changed files with 123 additions and 10 deletions

View File

@ -88,6 +88,12 @@ void DockItemController::itemMove(DockItem * const moveItem, DockItem * const re
void DockItemController::itemDroppedIntoContainer(DockItem * const item)
{
Q_ASSERT(item->itemType() == DockItem::Plugins);
PluginsItem *pi = static_cast<PluginsItem *>(item);
if (!pi->allowContainer())
return;
if (m_containerItem->contains(item))
return;
@ -98,6 +104,7 @@ void DockItemController::itemDroppedIntoContainer(DockItem * const item)
m_itemList.removeOne(item);
// add to container
pi->setInContainer(true);
m_containerItem->addItem(item);
}
@ -111,7 +118,10 @@ void DockItemController::itemDragOutFromContainer(DockItem * const item)
// insert to panel
switch (item->itemType())
{
case DockItem::Plugins: pluginItemInserted(static_cast<PluginsItem *>(item)); break;
case DockItem::Plugins:
static_cast<PluginsItem *>(item)->setInContainer(false);
pluginItemInserted(static_cast<PluginsItem *>(item));
break;
default: Q_UNREACHABLE();
}
}
@ -214,6 +224,13 @@ void DockItemController::appItemRemoved(AppItem *appItem)
void DockItemController::pluginItemInserted(PluginsItem *item)
{
// check item is in container
if (item->allowContainer() && item->isInContainer())
{
emit itemManaged(item);
return itemDroppedIntoContainer(item);
}
// find first plugins item position
int firstPluginPosition = -1;
for (int i(0); i != m_itemList.size(); ++i)

View File

@ -28,6 +28,7 @@ signals:
void itemInserted(const int index, DockItem *item) const;
void itemRemoved(DockItem *item) const;
void itemMoved(DockItem *item, const int index) const;
void itemManaged(DockItem *item) const;
public slots:
void updatePluginsItemOrderKey();

View File

@ -57,6 +57,27 @@ void PluginsItem::detachPluginWidget()
widget->setParent(nullptr);
}
bool PluginsItem::allowContainer() const
{
if (DockDisplayMode == Dock::Fashion)
return false;
return m_pluginInter->itemAllowContainer(m_itemKey);
}
bool PluginsItem::isInContainer() const
{
if (DockDisplayMode == Dock::Fashion)
return false;
return m_pluginInter->itemIsInContainer(m_itemKey);
}
void PluginsItem::setInContainer(const bool container)
{
m_pluginInter->setItemIsInContainer(m_itemKey, container);
}
void PluginsItem::mousePressEvent(QMouseEvent *e)
{
QWidget::mousePressEvent(e);

View File

@ -16,6 +16,10 @@ public:
void setItemSortKey(const int order) const;
void detachPluginWidget();
bool allowContainer() const;
bool isInContainer() const;
void setInContainer(const bool container);
using DockItem::showContextMenu;
inline ItemType itemType() const {return Plugins;}

View File

@ -71,6 +71,7 @@ MainPanel::MainPanel(QWidget *parent)
connect(m_itemController, &DockItemController::itemInserted, this, &MainPanel::itemInserted, Qt::DirectConnection);
connect(m_itemController, &DockItemController::itemRemoved, this, &MainPanel::itemRemoved, Qt::DirectConnection);
connect(m_itemController, &DockItemController::itemMoved, this, &MainPanel::itemMoved);
connect(m_itemController, &DockItemController::itemManaged, this, &MainPanel::manageItem);
connect(m_itemAdjustTimer, &QTimer::timeout, this, &MainPanel::adjustItemSize, Qt::QueuedConnection);
m_itemAdjustTimer->setSingleShot(true);
@ -79,7 +80,7 @@ MainPanel::MainPanel(QWidget *parent)
const QList<DockItem *> itemList = m_itemController->itemList();
for (auto item : itemList)
{
initItemConnection(item);
manageItem(item);
m_itemLayout->addWidget(item);
}
@ -143,7 +144,8 @@ void MainPanel::dragEnterEvent(QDragEnterEvent *e)
if (dragSourceItem)
{
e->accept();
DragingItem->show();
if (DragingItem)
DragingItem->show();
return;
}
@ -227,7 +229,7 @@ void MainPanel::dropEvent(QDropEvent *e)
}
}
void MainPanel::initItemConnection(DockItem *item)
void MainPanel::manageItem(DockItem *item)
{
connect(item, &DockItem::dragStarted, this, &MainPanel::itemDragStarted, Qt::UniqueConnection);
connect(item, &DockItem::itemDropped, this, &MainPanel::itemDropped, Qt::UniqueConnection);
@ -405,7 +407,7 @@ void MainPanel::itemInserted(const int index, DockItem *item)
// hide new item, display it after size adjust finished
item->hide();
initItemConnection(item);
manageItem(item);
m_itemLayout->insertWidget(index, item);
m_itemAdjustTimer->start();

View File

@ -38,7 +38,7 @@ private:
void dragLeaveEvent(QDragLeaveEvent *e);
void dropEvent(QDropEvent *e);
void initItemConnection(DockItem *item);
void manageItem(DockItem *item);
DockItem *itemAt(const QPoint &point);
private slots:

View File

@ -27,6 +27,13 @@ public:
// reset sort key when plugins order changed
virtual void setSortKey(const QString &itemKey, const int order) {Q_UNUSED(itemKey); Q_UNUSED(order);}
// item allow to move to container
virtual bool itemAllowContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;}
// item is in container
virtual bool itemIsInContainer(const QString &itemKey) {Q_UNUSED(itemKey); return false;}
// set item status
virtual void setItemIsInContainer(const QString &itemKey, const bool container) {Q_UNUSED(itemKey); Q_UNUSED(container);}
// dock display mode changed
virtual void displayModeChanged(const Dock::DisplayMode displayMode) {Q_UNUSED(displayMode);}
// dock position changed
@ -34,12 +41,12 @@ public:
protected:
Dock::DisplayMode displayMode() const
inline Dock::DisplayMode displayMode() const
{
return qApp->property(PROP_DISPLAY_MODE).value<Dock::DisplayMode>();
}
Dock::Position position() const
inline Dock::Position position() const
{
return qApp->property(PROP_POSITION).value<Dock::Position>();
}

View File

@ -4,7 +4,7 @@ include(../../interfaces/interfaces.pri)
QT += widgets gui core dbus x11extras
TEMPLATE = lib
CONFIG += plugin c++11 link_pkgconfig
PKGCONFIG += xcb xcb-image xcb-composite
PKGCONFIG += xcb xcb-image xcb-icccm xcb-composite
TARGET = $$qtLibraryTarget(system-tray)
DESTDIR = $$_PRO_FILE_PWD_/../

View File

@ -3,13 +3,18 @@
#include <QWindow>
#include <QWidget>
#include <QX11Info>
#include "xcb/xcb_icccm.h"
#define FASHION_MODE_ITEM "fashion-mode-item"
SystemTrayPlugin::SystemTrayPlugin(QObject *parent)
: QObject(parent),
m_trayInter(new DBusTrayManager(this)),
m_tipsWidget(new TipsWidget)
m_tipsWidget(new TipsWidget),
m_containerSettings(new QSettings("deepin", "dde-dock-tray"))
{
m_tipsWidget->setObjectName("sys-tray");
m_fashionItem = new FashionTrayItem;
@ -63,6 +68,29 @@ QWidget *SystemTrayPlugin::itemPopupApplet(const QString &itemKey)
return nullptr;
}
bool SystemTrayPlugin::itemAllowContainer(const QString &itemKey)
{
Q_UNUSED(itemKey);
return true;
}
bool SystemTrayPlugin::itemIsInContainer(const QString &itemKey)
{
const QString widKey = getWindowClass(itemKey.toInt());
if (widKey.isEmpty())
return false;
return m_containerSettings->value(widKey, false).toBool();
}
void SystemTrayPlugin::setItemIsInContainer(const QString &itemKey, const bool container)
{
qDebug() << getWindowClass(itemKey.toInt());
m_containerSettings->setValue(getWindowClass(itemKey.toInt()), container);
}
void SystemTrayPlugin::updateTipsContent()
{
auto trayList = m_trayList.values();
@ -72,6 +100,28 @@ void SystemTrayPlugin::updateTipsContent()
m_tipsWidget->addWidgets(trayList);
}
const QString SystemTrayPlugin::getWindowClass(quint32 winId)
{
auto *connection = QX11Info::connection();
auto *reply = new xcb_icccm_get_wm_class_reply_t;
auto *error = new xcb_generic_error_t;
auto cookie = xcb_icccm_get_wm_class(connection, winId);
auto result = xcb_icccm_get_wm_class_reply(connection, cookie, reply, &error);
QString ret;
if (result == 1)
{
ret = QString("%1-%2").arg(reply->class_name).arg(reply->instance_name);
xcb_icccm_get_wm_class_reply_wipe(reply);
}
delete reply;
delete error;
return std::move(ret);
}
void SystemTrayPlugin::trayListChanged()
{
QList<quint32> trayList = m_trayInter->trayIcons();
@ -89,6 +139,8 @@ void SystemTrayPlugin::trayAdded(const quint32 winId)
if (m_trayList.contains(winId))
return;
getWindowClass(winId);
TrayWidget *trayWidget = new TrayWidget(winId);
m_trayList[winId] = trayWidget;

View File

@ -6,6 +6,8 @@
#include "tipswidget.h"
#include "dbus/dbustraymanager.h"
#include <QSettings>
class FashionTrayItem;
class SystemTrayPlugin : public QObject, PluginsItemInterface
{
@ -23,8 +25,13 @@ public:
QWidget *itemWidget(const QString &itemKey);
QWidget *itemPopupApplet(const QString &itemKey);
bool itemAllowContainer(const QString &itemKey);
bool itemIsInContainer(const QString &itemKey);
void setItemIsInContainer(const QString &itemKey, const bool container);
private:
void updateTipsContent();
const QString getWindowClass(quint32 winId);
private slots:
void trayListChanged();
@ -39,6 +46,8 @@ private:
QMap<quint32, TrayWidget *> m_trayList;
TipsWidget *m_tipsWidget;
QSettings *m_containerSettings;
};
#endif // SYSTEMTRAYPLUGIN_H