diff --git a/dde-dock-systray-plugin/compositetrayitem.cpp b/dde-dock-systray-plugin/compositetrayitem.cpp new file mode 100644 index 000000000..7a47889d5 --- /dev/null +++ b/dde-dock-systray-plugin/compositetrayitem.cpp @@ -0,0 +1,69 @@ +#include +#include + +#include "compositetrayitem.h" + +static const int Margins = 4; +static const int ColumnWidth = 20; + +CompositeTrayItem::CompositeTrayItem(QWidget *parent) : + QFrame(parent) +{ + +} + +CompositeTrayItem::~CompositeTrayItem() +{ + qDebug() << "CompositeTrayItem destroyed."; +} + +void CompositeTrayItem::addWidget(QWidget * widget) +{ + widget->setParent(this); + + uint childrenCount = children().length(); + + // update background and size + if (childrenCount <= 4) { + m_columnCount = 2; + } else if (childrenCount <= 6) { + m_columnCount = 3; + } else if (childrenCount <= 8) { + m_columnCount = 4; + } else if (childrenCount <= 10) { + m_columnCount = 5; + } else if (childrenCount <= 12) { + m_columnCount = 6; + } + setFixedSize(Margins * 2 + ColumnWidth * m_columnCount, 48); + setStyleSheet("QFrame { background-image: url(':/images/darea_container_4.svg') }"); + style()->polish(this); + + // move the widget to right position + int x = (childrenCount - 1) % m_columnCount * ColumnWidth + Margins + (ColumnWidth - 16) / 2; + int y = (childrenCount - 1) / m_columnCount * ColumnWidth + Margins + (ColumnWidth - 16) / 2; + widget->move(x, y); +} + +void CompositeTrayItem::removeWidget(QWidget *widget) +{ + widget->setParent(NULL); + + uint childrenCount = children().length(); + + // update background and size + if (childrenCount <= 4) { + m_columnCount = 2; + } else if (childrenCount <= 6) { + m_columnCount = 3; + } else if (childrenCount <= 8) { + m_columnCount = 4; + } else if (childrenCount <= 10) { + m_columnCount = 5; + } else if (childrenCount <= 12) { + m_columnCount = 6; + } + setFixedSize(Margins * 2 + ColumnWidth * m_columnCount, 48); + setStyleSheet("QFrame { background-image: url(':/images/darea_container_4.svg') }"); + style()->polish(this); +} diff --git a/dde-dock-systray-plugin/compositetrayitem.h b/dde-dock-systray-plugin/compositetrayitem.h new file mode 100644 index 000000000..3d9c4b8fc --- /dev/null +++ b/dde-dock-systray-plugin/compositetrayitem.h @@ -0,0 +1,20 @@ +#ifndef COMPOSITETRAYITEM_H +#define COMPOSITETRAYITEM_H + +#include + +class CompositeTrayItem : public QFrame +{ + Q_OBJECT +public: + explicit CompositeTrayItem(QWidget *parent = 0); + virtual ~CompositeTrayItem(); + + void addWidget(QWidget * widget); + void removeWidget(QWidget * widget); + +private: + uint m_columnCount = 2; +}; + +#endif // COMPOSITETRAYITEM_H diff --git a/dde-dock-systray-plugin/dde-dock-systray-plugin.pro b/dde-dock-systray-plugin/dde-dock-systray-plugin.pro index 1a37da198..4936822ad 100644 --- a/dde-dock-systray-plugin/dde-dock-systray-plugin.pro +++ b/dde-dock-systray-plugin/dde-dock-systray-plugin.pro @@ -15,12 +15,14 @@ TARGET = $$qtLibraryTarget(dock-systray-plugin) TEMPLATE = lib SOURCES += systrayplugin.cpp \ - docktrayitem.cpp \ - dbustraymanager.cpp + dbustraymanager.cpp \ + compositetrayitem.cpp HEADERS += systrayplugin.h \ - docktrayitem.h \ - dbustraymanager.h + dbustraymanager.h \ + compositetrayitem.h + +RESOURCES += images.qrc target.path = /usr/share/dde-dock/plugins/ INSTALLS += target diff --git a/dde-dock-systray-plugin/docktrayitem.cpp b/dde-dock-systray-plugin/docktrayitem.cpp deleted file mode 100644 index ca5a857d7..000000000 --- a/dde-dock-systray-plugin/docktrayitem.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include - -#include "docktrayitem.h" - -DockTrayItem * DockTrayItem::fromWinId(WId winId) -{ - DockTrayItem *item = new DockTrayItem; - - QWindow *win = QWindow::fromWinId(winId); - QWidget *child = QWidget::createWindowContainer(win, item); - child->setFixedSize(item->size()); - child->setParent(item); - - return item; -} - -DockTrayItem::DockTrayItem(QWidget *parent) - : QWidget(parent) -{ - setFixedSize(16, 16); -} - -DockTrayItem::~DockTrayItem() -{ - -} diff --git a/dde-dock-systray-plugin/docktrayitem.h b/dde-dock-systray-plugin/docktrayitem.h deleted file mode 100644 index ac57f23df..000000000 --- a/dde-dock-systray-plugin/docktrayitem.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef DOCKTRAYITEM_H -#define DOCKTRAYITEM_H - -#include -#include - -class DockTrayItem : public QWidget -{ - Q_OBJECT - - enum Style { Simple, Composite }; -public: - ~DockTrayItem(); - - static DockTrayItem* fromWinId(WId winId); - -private: - DockTrayItem(QWidget *parent = 0); -}; - -#endif // DOCKTRAYITEM_H diff --git a/dde-dock-systray-plugin/images.qrc b/dde-dock-systray-plugin/images.qrc new file mode 100644 index 000000000..9223bcdd8 --- /dev/null +++ b/dde-dock-systray-plugin/images.qrc @@ -0,0 +1,10 @@ + + + images/darea_container_4.svg + images/darea_container_6.svg + images/darea_container_8.svg + images/darea_container_10.svg + images/darea_container_12.svg + images/darea_cover.svg + + diff --git a/dde-dock-systray-plugin/images/darea_container_10.svg b/dde-dock-systray-plugin/images/darea_container_10.svg new file mode 100755 index 000000000..84350e014 --- /dev/null +++ b/dde-dock-systray-plugin/images/darea_container_10.svg @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dde-dock-systray-plugin/images/darea_container_12.svg b/dde-dock-systray-plugin/images/darea_container_12.svg new file mode 100755 index 000000000..baa0c04f1 --- /dev/null +++ b/dde-dock-systray-plugin/images/darea_container_12.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dde-dock-systray-plugin/images/darea_container_4.svg b/dde-dock-systray-plugin/images/darea_container_4.svg new file mode 100755 index 000000000..02a167707 --- /dev/null +++ b/dde-dock-systray-plugin/images/darea_container_4.svg @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dde-dock-systray-plugin/images/darea_container_6.svg b/dde-dock-systray-plugin/images/darea_container_6.svg new file mode 100755 index 000000000..02a1bf6f6 --- /dev/null +++ b/dde-dock-systray-plugin/images/darea_container_6.svg @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dde-dock-systray-plugin/images/darea_container_8.svg b/dde-dock-systray-plugin/images/darea_container_8.svg new file mode 100755 index 000000000..dce2a0b66 --- /dev/null +++ b/dde-dock-systray-plugin/images/darea_container_8.svg @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dde-dock-systray-plugin/images/darea_cover.svg b/dde-dock-systray-plugin/images/darea_cover.svg new file mode 100755 index 000000000..d1fe16365 --- /dev/null +++ b/dde-dock-systray-plugin/images/darea_cover.svg @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/dde-dock-systray-plugin/systrayplugin.cpp b/dde-dock-systray-plugin/systrayplugin.cpp index 7c732ff1b..1aeb8a890 100644 --- a/dde-dock-systray-plugin/systrayplugin.cpp +++ b/dde-dock-systray-plugin/systrayplugin.cpp @@ -1,6 +1,10 @@ -#include +#include +#include #include "systrayplugin.h" +#include "compositetrayitem.h" + +static const QString CompositeItemKey = "composite_item_key"; SystrayPlugin::~SystrayPlugin() { @@ -40,7 +44,47 @@ QWidget * SystrayPlugin::getItem(QString uuid) QString SystrayPlugin::name() { - return QString("systray"); + return QString("System Tray"); +} + +void SystrayPlugin::changeMode(Dock::DockMode newMode, Dock::DockMode oldMode) +{ + m_mode = newMode; + + if (oldMode == Dock::FashionMode && newMode != Dock::FashionMode) { + CompositeTrayItem * compositeItem = qobject_cast(m_items.value(CompositeItemKey)); + compositeItem->setParent(NULL); + + qDebug() << "SystrayPlugin change mode to other mode."; + foreach (QWidget * widget, m_items) { + if (widget != compositeItem) { + compositeItem->removeWidget(widget); + m_proxier->itemAddedEvent(m_items.key(widget)); + } + } + + m_proxier->itemRemovedEvent(CompositeItemKey); + } else if (newMode == Dock::FashionMode && oldMode != Dock::FashionMode) { + CompositeTrayItem * compositeItem = NULL; + + QWidget * widget = m_items.value(CompositeItemKey); + if (!widget) { + compositeItem = new CompositeTrayItem; + m_items[CompositeItemKey] = compositeItem; + } else { + compositeItem = qobject_cast(widget); + } + + qDebug() << "SystrayPlugin change mode to fashion mode."; + foreach (QWidget * widget, m_items) { + if (widget != compositeItem) { + compositeItem->addWidget(widget); + m_proxier->itemRemovedEvent(m_items.key(widget)); + } + } + + m_proxier->itemAddedEvent(CompositeItemKey); + } } // private methods @@ -52,20 +96,51 @@ void SystrayPlugin::clearItems() m_items.clear(); } +void SystrayPlugin::addItem(QString uuid, QWidget * item) +{ + m_items[uuid] = item; + + if (m_mode == Dock::FashionMode) { + CompositeTrayItem * compositeItem = qobject_cast(m_items.value(CompositeItemKey)); + compositeItem->addWidget(item); + } else { + m_proxier->itemAddedEvent(uuid); + } +} + +void SystrayPlugin::removeItem(QString uuid) +{ + QWidget * item = m_items[uuid]; + + if (m_mode == Dock::FashionMode) { + CompositeTrayItem * compositeItem = qobject_cast(m_items.value(CompositeItemKey)); + compositeItem->removeWidget(item); + } + + m_items.remove(uuid); + item->deleteLater(); + + m_proxier->itemRemovedEvent(uuid); +} + // private slots void SystrayPlugin::onAdded(WId winId) { QString key = QString::number(winId); - DockTrayItem *item = DockTrayItem::fromWinId(winId); - m_items[key] = item; + QWidget *item = new QWidget; + item->setFixedSize(16, 16); - m_proxier->itemAddedEvent(key); + QWindow *win = QWindow::fromWinId(winId); + QWidget *w = QWidget::createWindowContainer(win, item); + w->setFixedSize(item->size()); + + addItem(key, item); } void SystrayPlugin::onRemoved(WId winId) { QString key = QString::number(winId); - m_proxier->itemRemovedEvent(key); + removeItem(key); } diff --git a/dde-dock-systray-plugin/systrayplugin.h b/dde-dock-systray-plugin/systrayplugin.h index eca50778a..fb28a5f83 100644 --- a/dde-dock-systray-plugin/systrayplugin.h +++ b/dde-dock-systray-plugin/systrayplugin.h @@ -3,8 +3,10 @@ #include #include +#include +#include -#include "docktrayitem.h" +#include "dockconstants.h" #include "dockplugininterface.h" #include "dockpluginproxyinterface.h" #include "dbustraymanager.h" @@ -19,8 +21,10 @@ public: ~SystrayPlugin(); void init(DockPluginProxyInterface * proxier) Q_DECL_OVERRIDE; + QStringList uuids() Q_DECL_OVERRIDE; QWidget * getItem(QString uuid) Q_DECL_OVERRIDE; + void changeMode(Dock::DockMode newMode, Dock::DockMode oldMode); QString name() Q_DECL_OVERRIDE; @@ -28,8 +32,11 @@ private: QMap m_items; DockPluginProxyInterface * m_proxier = 0; com::deepin::dde::TrayManager *m_dbusTrayManager = 0; + Dock::DockMode m_mode; void clearItems(); + void addItem(QString uuid, QWidget * item); + void removeItem(QString uuid); private slots: void onAdded(WId winId); diff --git a/dde-dock/src/Panel/panel.cpp b/dde-dock/src/Panel/panel.cpp index 59ef81b18..492d25a68 100644 --- a/dde-dock/src/Panel/panel.cpp +++ b/dde-dock/src/Panel/panel.cpp @@ -1,6 +1,8 @@ #include "panel.h" #include "dockpluginproxy.h" #include "dockpluginmanager.h" +#include "Controller/dockmodedata.h" +#include Panel::Panel(QWidget *parent) : QLabel(parent),parentWidget(parent) @@ -26,11 +28,27 @@ Panel::Panel(QWidget *parent) connect(dockCons, SIGNAL(dockModeChanged(Dock::DockMode,Dock::DockMode)), this, SLOT(slotDockModeChanged(Dock::DockMode,Dock::DockMode))); + + QHBoxLayout * testLayout = new QHBoxLayout; + testLayout->addStretch(); + this->setLayout(testLayout); + DockPluginManager *pluginManager = new DockPluginManager(this); + connect(DockModeData::instance(), &DockModeData::dockModeChanged, + pluginManager, &DockPluginManager::onDockModeChanged); + QList proxies = pluginManager->getAll(); foreach (DockPluginProxy* proxy, proxies) { - connect(proxy, &DockPluginProxy::itemAdded, [=](AbstractDockItem* item) { rightLayout->addItem(item); }); - connect(proxy, &DockPluginProxy::itemRemoved, [=](AbstractDockItem* item) { rightLayout->removeItem(rightLayout->indexOf(item)); }); + connect(proxy, &DockPluginProxy::itemAdded, [=](AbstractDockItem* item) { + testLayout->addWidget(item); + }); + connect(proxy, &DockPluginProxy::itemRemoved, [=](AbstractDockItem* item) { + int index = testLayout->indexOf(item); + if (index != -1) { + testLayout->removeWidget(item); + item->deleteLater(); + } + }); } panelMenu = new PanelMenu(); diff --git a/dde-dock/src/Widgets/docklayout.cpp b/dde-dock/src/Widgets/docklayout.cpp index 391640e3d..4a2f9fac0 100644 --- a/dde-dock/src/Widgets/docklayout.cpp +++ b/dde-dock/src/Widgets/docklayout.cpp @@ -168,8 +168,8 @@ int DockLayout::getContentsWidth() tmpWidth += appList.at(i)->width(); } - if (hasSpacingItemInList() && tmpAppMap.firstKey()) - tmpWidth += tmpAppMap.firstKey()->width() + itemSpacing; +// if (hasSpacingItemInList() && tmpAppMap.firstKey()) +// tmpWidth += tmpAppMap.firstKey()->width() + itemSpacing; return tmpWidth; } diff --git a/dde-dock/src/dockplugininterface.h b/dde-dock/src/dockplugininterface.h index 551eaf17e..222e3661f 100644 --- a/dde-dock/src/dockplugininterface.h +++ b/dde-dock/src/dockplugininterface.h @@ -4,6 +4,7 @@ #include #include +#include "dockconstants.h" #include "dockpluginproxyinterface.h" class DockPluginInterface @@ -14,6 +15,7 @@ public: virtual QStringList uuids() = 0; virtual QWidget* getItem(QString uuid) = 0; + virtual void changeMode(Dock::DockMode newMode, Dock::DockMode oldMode) = 0; virtual QString name() = 0; }; diff --git a/dde-dock/src/dockpluginmanager.cpp b/dde-dock/src/dockpluginmanager.cpp index 763542b0c..881ad11bb 100644 --- a/dde-dock/src/dockpluginmanager.cpp +++ b/dde-dock/src/dockpluginmanager.cpp @@ -26,6 +26,18 @@ QList DockPluginManager::getAll() return m_proxies.values(); } +// public slots +void DockPluginManager::onDockModeChanged(Dock::DockMode newMode, + Dock::DockMode oldMode) +{ + qDebug() << "DockPluginManager::onDockModeChanged " << newMode << oldMode; + + foreach (DockPluginProxy * proxy, m_proxies) { + DockPluginInterface * plugin = proxy->plugin(); + plugin->changeMode(newMode, oldMode); + } +} + // private methods DockPluginProxy* DockPluginManager::loadPlugin(QString &path) { @@ -35,9 +47,11 @@ DockPluginProxy* DockPluginManager::loadPlugin(QString &path) if (plugin) { DockPluginInterface * interface = qobject_cast(plugin); if (interface) { + qDebug() << "Plugin loaded: " << path; + DockPluginProxy *proxy = new DockPluginProxy(interface); interface->init(proxy); - qDebug() << "Plugin loaded: " << path; + return proxy; } else { qWarning() << "Load plugin failed(failed to convert) " << path; diff --git a/dde-dock/src/dockpluginmanager.h b/dde-dock/src/dockpluginmanager.h index 5d6f0e4e2..50bfe9544 100644 --- a/dde-dock/src/dockpluginmanager.h +++ b/dde-dock/src/dockpluginmanager.h @@ -3,7 +3,9 @@ #include #include -#include +#include + +#include "dockconstants.h" class DockPluginProxy; class DockPluginManager : public QObject @@ -14,6 +16,10 @@ public: QList getAll(); +public slots: + void onDockModeChanged(Dock::DockMode newMode, + Dock::DockMode oldMode); + private: QStringList m_searchPaths; QMap m_proxies; diff --git a/dde-dock/src/dockpluginproxy.cpp b/dde-dock/src/dockpluginproxy.cpp index 1014b835d..78a80ecbc 100644 --- a/dde-dock/src/dockpluginproxy.cpp +++ b/dde-dock/src/dockpluginproxy.cpp @@ -7,21 +7,33 @@ DockPluginProxy::DockPluginProxy(DockPluginInterface * plugin, QObject * parent) { } +DockPluginInterface * DockPluginProxy::plugin() +{ + return m_plugin; +} + void DockPluginProxy::itemAddedEvent(QString uuid) { - qDebug() << "Item added on plugin " << m_plugin->name(); + qDebug() << "Item added on plugin " << m_plugin->name() << uuid; AbstractDockItem * item = new PluginItemWrapper(m_plugin, uuid); m_items << item; + qDebug() << item->geometry(); + emit itemAdded(item); } void DockPluginProxy::itemRemovedEvent(QString uuid) { - qDebug() << "Item removed on plugin " << m_plugin->name(); + qDebug() << "Item removed on plugin " << m_plugin->name() << uuid; - emit itemRemoved(getItem(uuid)); + AbstractDockItem * item = getItem(uuid); + if (item) { + m_items.takeAt(m_items.indexOf(item)); + + emit itemRemoved(item); + } } AbstractDockItem * DockPluginProxy::getItem(QString uuid) diff --git a/dde-dock/src/dockpluginproxy.h b/dde-dock/src/dockpluginproxy.h index c3bca2457..4f3a4cafc 100644 --- a/dde-dock/src/dockpluginproxy.h +++ b/dde-dock/src/dockpluginproxy.h @@ -11,6 +11,8 @@ class DockPluginProxy : public QObject, public DockPluginProxyInterface public: DockPluginProxy(DockPluginInterface * plugin, QObject * parent = 0); + DockPluginInterface * plugin(); + void itemAddedEvent(QString uuid) Q_DECL_OVERRIDE; void itemRemovedEvent(QString uuid) Q_DECL_OVERRIDE; diff --git a/dde-dock/src/pluginitemwrapper.cpp b/dde-dock/src/pluginitemwrapper.cpp index ada9de163..55045d603 100644 --- a/dde-dock/src/pluginitemwrapper.cpp +++ b/dde-dock/src/pluginitemwrapper.cpp @@ -2,22 +2,33 @@ PluginItemWrapper::PluginItemWrapper(DockPluginInterface *plugin, QString uuid, QWidget * parent) : - AbstractDockItem(parent) + AbstractDockItem(parent), + m_plugin(plugin), + m_uuid(uuid) { - m_plugin = plugin; - m_uuid = uuid; + qDebug() << "PluginItemWrapper created " << m_plugin->name() << m_uuid; + +// setStyleSheet("PluginItemWrapper { background-color: red } "); if (m_plugin) { QWidget * item = m_plugin->getItem(uuid); + setFixedSize(item->size()); if (item) { setFixedSize(item->size()); - item->setParent(this); + item->move(0, 0); + + emit widthChanged(); } } } +PluginItemWrapper::~PluginItemWrapper() +{ + qDebug() << "PluginItemWrapper destroyed " << m_plugin->name() << m_uuid; +} + QString PluginItemWrapper::uuid() const { return m_uuid; diff --git a/dde-dock/src/pluginitemwrapper.h b/dde-dock/src/pluginitemwrapper.h index 696c808fb..6c5e1dfc4 100644 --- a/dde-dock/src/pluginitemwrapper.h +++ b/dde-dock/src/pluginitemwrapper.h @@ -9,7 +9,7 @@ class PluginItemWrapper : public AbstractDockItem Q_OBJECT public: PluginItemWrapper(DockPluginInterface *plugin, QString uuid, QWidget * parent = 0); - + virtual ~PluginItemWrapper(); QString uuid() const;