mirror of
https://github.com/linuxdeepin/dde-dock.git
synced 2025-06-04 09:23:03 +00:00
record container config
Change-Id: I9bbe88b784066514495b087a62eee22d100c9e7d
This commit is contained in:
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
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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;}
|
||||
|
@ -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();
|
||||
|
@ -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:
|
||||
|
@ -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>();
|
||||
}
|
||||
|
@ -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_/../
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user