diff --git a/controller/dockitemcontroller.cpp b/controller/dockitemcontroller.cpp index 839e1ad4a..985e2e6d1 100644 --- a/controller/dockitemcontroller.cpp +++ b/controller/dockitemcontroller.cpp @@ -39,10 +39,29 @@ DockItemController::DockItemController(QObject *parent) void DockItemController::appItemAdded(const QDBusObjectPath &path) { - qDebug() << path.path(); + qDebug() << "entry add: " << path.path(); + + AppItem *item = new AppItem(path); + + m_itemList.append(item); + emit itemInserted(0, item); } -void DockItemController::appItemRemoved(const QString &itemId) +void DockItemController::appItemRemoved(const QString &appId) { - qDebug() << itemId; + for (int i(0); i != m_itemList.size(); ++i) + { + if (m_itemList[i]->itemType() != DockItem::App) + continue; + + AppItem *app = static_cast(m_itemList[i]); + if (app->appId() != appId) + continue; + + emit itemRemoved(m_itemList[i]); + m_itemList[i]->deleteLater(); + m_itemList.removeAt(i); + + break; + } } diff --git a/controller/dockitemcontroller.h b/controller/dockitemcontroller.h index 0505a4cb7..9349aa215 100644 --- a/controller/dockitemcontroller.h +++ b/controller/dockitemcontroller.h @@ -17,12 +17,13 @@ public: const QList itemList() const; signals: - void dockItemCountChanged(const int count) const; + void itemInserted(const int index, DockItem *item); + void itemRemoved(DockItem *item); private: explicit DockItemController(QObject *parent = 0); void appItemAdded(const QDBusObjectPath &path); - void appItemRemoved(const QString &itemId); + void appItemRemoved(const QString &appId); private: QList m_itemList; diff --git a/dbus/dbusdockentry.cpp b/dbus/dbusdockentry.cpp index bdd64f45f..11a3c8a1c 100644 --- a/dbus/dbusdockentry.cpp +++ b/dbus/dbusdockentry.cpp @@ -18,8 +18,8 @@ DBusDockEntry::DBusDockEntry(const QString &path, QObject *parent) : QDBusAbstractInterface("com.deepin.dde.daemon.Dock", path, staticInterfaceName(), QDBusConnection::sessionBus(), parent) { - qRegisterMetaType("Dict"); - qDBusRegisterMetaType(); + qRegisterMetaType("WindowDict"); + qDBusRegisterMetaType(); QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); } diff --git a/dbus/dbusdockentry.h b/dbus/dbusdockentry.h index 8d6beb8f0..9beb838ae 100644 --- a/dbus/dbusdockentry.h +++ b/dbus/dbusdockentry.h @@ -20,7 +20,7 @@ #include #include -typedef QMap Dict; +typedef QMap WindowDict; /* * Proxy class for interface dde.dock.Entry @@ -57,17 +57,21 @@ public: ~DBusDockEntry(); - Q_PROPERTY(Dict Data READ data NOTIFY DataChanged) - inline Dict data() const - { return qvariant_cast< Dict >(property("Data")); } + Q_PROPERTY(bool IsActive READ active NOTIFY ActiveChanged) + inline bool active() const + { return qvariant_cast< bool >(property("IsActive")); } + + Q_PROPERTY(WindowDict WindowTitles READ titles NOTIFY TitlesChanged) + inline WindowDict titles() const + { return qvariant_cast< WindowDict >(property("WindowTitles")); } Q_PROPERTY(QString Id READ id NOTIFY IdChanged) inline QString id() const { return qvariant_cast< QString >(property("Id")); } - Q_PROPERTY(QString Type READ type NOTIFY TypeChanged) - inline QString type() const - { return qvariant_cast< QString >(property("Type")); } + Q_PROPERTY(QString Title READ title NOTIFY TitleChanged) + inline QString title() const + { return qvariant_cast< QString >(property("Title")); } public Q_SLOTS: // METHODS inline QDBusPendingReply<> Activate() @@ -76,12 +80,20 @@ public Q_SLOTS: // METHODS return asyncCallWithArgumentList(QStringLiteral("Activate"), argumentList); } + inline QDBusPendingReply<> Activate1() + { + QList argumentList; + argumentList << QVariant::fromValue(qint32(0)) << QVariant::fromValue(qint32(0)) << QVariant::fromValue(quint32(0)); + return asyncCallWithArgumentList(QStringLiteral("Activate"), argumentList); + } + Q_SIGNALS: // SIGNALS - void DataChanged(const QString &in0, const QString &in1); + void TitlesChanged(const quint32 xid, const QString &title); // begin property changed signals +void ActiveChanged(); void DataChanged(); void IdChanged(); -void TypeChanged(); +void TitleChanged(); }; namespace dde { diff --git a/dbus/dbusmenu.cpp b/dbus/dbusmenu.cpp new file mode 100644 index 000000000..ff70802c8 --- /dev/null +++ b/dbus/dbusmenu.cpp @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2015 Deepin Technology Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + **/ + +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbusmenu.h" + +/* + * Implementation of interface class DBusMenuManager + */ + +DBusMenuManager::DBusMenuManager(QObject *parent) + : QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent) +{ +} + +DBusMenuManager::~DBusMenuManager() +{ +} + diff --git a/dbus/dbusmenu.h b/dbus/dbusmenu.h new file mode 100644 index 000000000..767c98ff0 --- /dev/null +++ b/dbus/dbusmenu.h @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2015 Deepin Technology Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + **/ + +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSMENUMANAGER_H_1436158928 +#define DBUSMENUMANAGER_H_1436158928 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface com.deepin.menu.Manager + */ +class DBusMenuManager: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticServerPath() + { return "com.deepin.menu"; } + static inline const char *staticInterfacePath() + { return "/com/deepin/menu"; } + static inline const char *staticInterfaceName() + { return "com.deepin.menu.Manager"; } + +public: + explicit DBusMenuManager(QObject *parent = 0); + + ~DBusMenuManager(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply RegisterMenu() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("RegisterMenu"), argumentList); + } + + inline QDBusPendingReply<> UnregisterMenu(const QString &menuObjectPath) + { + QList argumentList; + argumentList << QVariant::fromValue(menuObjectPath); + return asyncCallWithArgumentList(QStringLiteral("UnregisterMenu"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +namespace com { + namespace deepin { + namespace menu { + typedef ::DBusMenuManager Manager; + } + } +} +#endif diff --git a/dde-dock.pro b/dde-dock.pro index 203afbd14..6c5eabae6 100644 --- a/dde-dock.pro +++ b/dde-dock.pro @@ -18,7 +18,8 @@ SOURCES += main.cpp \ util/docksettings.cpp \ item/placeholderitem.cpp \ dbus/dbusclientmanager.cpp \ - dbus/dbusdock.cpp + dbus/dbusdock.cpp \ + dbus/dbusmenu.cpp HEADERS += \ window/mainwindow.h \ @@ -32,4 +33,5 @@ HEADERS += \ util/docksettings.h \ item/placeholderitem.h \ dbus/dbusclientmanager.h \ - dbus/dbusdock.h + dbus/dbusdock.h \ + dbus/dbusmenu.h diff --git a/item/appitem.cpp b/item/appitem.cpp index bc182825f..de6e33bb7 100644 --- a/item/appitem.cpp +++ b/item/appitem.cpp @@ -11,7 +11,7 @@ #define APP_DRAG_THRESHOLD 20 DBusClientManager *AppItem::ClientInter = nullptr; -uint AppItem::ActiveWindowId = 0; +//uint AppItem::ActiveWindowId = 0; AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent) : DockItem(App, parent), @@ -20,9 +20,17 @@ AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent) { initClientManager(); - m_data = m_itemEntry->data(); + m_titles = m_itemEntry->titles(); + m_id = m_itemEntry->id(); + qDebug() << m_titles; - connect(m_itemEntry, static_cast(&DBusDockEntry::DataChanged), this, &AppItem::entryDataChanged); + connect(m_itemEntry,&DBusDockEntry::TitlesChanged, this, &AppItem::entryDataChanged); + connect(m_itemEntry, &DBusDockEntry::ActiveChanged, this, static_cast(&AppItem::update)); +} + +const QString AppItem::appId() const +{ + return m_id; } void AppItem::paintEvent(QPaintEvent *e) @@ -42,6 +50,13 @@ void AppItem::paintEvent(QPaintEvent *e) QPainter painter(this); + if (m_itemEntry->active()) + { + painter.fillRect(rect(), Qt::blue); + } else { + painter.fillRect(rect(), Qt::gray); + } + // // draw current active background // if (m_windows.contains(ActiveWindowId)) // { @@ -59,7 +74,8 @@ void AppItem::paintEvent(QPaintEvent *e) painter.fillRect(iconRect, Qt::yellow); // draw text - painter.drawText(rect(), m_itemEntry->id()); + painter.setPen(Qt::red); + painter.drawText(rect(), m_itemEntry->title()); } void AppItem::mouseReleaseEvent(QMouseEvent *e) @@ -67,7 +83,7 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e) // activate // TODO: dbus signature changed if (e->button() == Qt::LeftButton) - m_itemEntry->Activate(); + m_itemEntry->Activate1(); } void AppItem::mousePressEvent(QMouseEvent *e) @@ -103,7 +119,7 @@ void AppItem::startDrag() const Qt::DropAction result = drag->exec(Qt::MoveAction); - qDebug() << result; + qDebug() << "dnd result: " << result; m_draging = false; update(); @@ -115,18 +131,12 @@ void AppItem::initClientManager() return; ClientInter = new DBusClientManager(this); - connect(ClientInter, &DBusClientManager::ActiveWindowChanged, [&] (const uint wid) { - ActiveWindowId = wid; - }); +// connect(ClientInter, &DBusClientManager::ActiveWindowChanged, [&] (const uint wid) { +// ActiveWindowId = wid; +// }); } -void AppItem::entryDataChanged(const QString &key, const QString &value) +void AppItem::entryDataChanged(const quint32 xid, const QString &title) { - qDebug() << "data chanegd" << key << value; - - // update data - m_data[key] = value; - -// if (key == APP_STATUS_KEY) - return update(); + qDebug() << "title changed: " << xid << title; } diff --git a/item/appitem.h b/item/appitem.h index ee45459b0..f6172e098 100644 --- a/item/appitem.h +++ b/item/appitem.h @@ -12,6 +12,8 @@ class AppItem : public DockItem public: explicit AppItem(const QDBusObjectPath &entry, QWidget *parent = nullptr); + const QString appId() const; + private: void paintEvent(QPaintEvent *e); void mouseReleaseEvent(QMouseEvent *e); @@ -20,20 +22,20 @@ private: void startDrag(); void initClientManager(); - void entryDataChanged(const QString &key, const QString &value); + void entryDataChanged(const quint32 xid, const QString &title); private: DBusDockEntry *m_itemEntry; bool m_draging; - QMap m_data; - QMap m_windows; + WindowDict m_titles; + QString m_id; QPoint m_mousePressPos; static DBusClientManager *ClientInter; - static uint ActiveWindowId; +// static uint ActiveWindowId; }; #endif // APPITEM_H diff --git a/item/dockitem.cpp b/item/dockitem.cpp index 8b2c11f25..df7360aab 100644 --- a/item/dockitem.cpp +++ b/item/dockitem.cpp @@ -5,7 +5,6 @@ DockItem::DockItem(const ItemType type, QWidget *parent) m_side(DockSettings::Top), m_type(type) { - } void DockItem::setDockSide(const DockSettings::DockSide side) diff --git a/panel/mainpanel.cpp b/panel/mainpanel.cpp index 8c8be7fb2..6b4a77ea5 100644 --- a/panel/mainpanel.cpp +++ b/panel/mainpanel.cpp @@ -13,10 +13,13 @@ MainPanel::MainPanel(QWidget *parent) setObjectName("MainPanel"); setStyleSheet("QWidget #MainPanel {" "border:none;" - "background-color:red;" + "background-color:green;" "border-radius:5px 5px 5px 5px;" "}"); + connect(m_itemController, &DockItemController::itemInserted, this, &MainPanel::itemInserted); + connect(m_itemController, &DockItemController::itemRemoved, this, &MainPanel::itemRemoved); + const QList itemList = m_itemController->itemList(); for (auto item : itemList) m_itemLayout->addWidget(item); @@ -69,4 +72,20 @@ void MainPanel::adjustItemSize() default:; } } + + updateGeometry(); +} + +void MainPanel::itemInserted(const int index, DockItem *item) +{ + m_itemLayout->insertWidget(index, item); + + item->setFixedWidth(80); + + adjustSize(); +} + +void MainPanel::itemRemoved(DockItem *item) +{ + m_itemLayout->removeWidget(item); } diff --git a/panel/mainpanel.h b/panel/mainpanel.h index f62ef2bc8..4b7bc235e 100644 --- a/panel/mainpanel.h +++ b/panel/mainpanel.h @@ -23,6 +23,8 @@ private: void dropEvent(QDropEvent *e); void adjustItemSize(); + void itemInserted(const int index, DockItem *item); + void itemRemoved(DockItem *item); private: QBoxLayout *m_itemLayout;