diff --git a/dde-dock/dde-dock.pro b/dde-dock/dde-dock.pro index d7bc2b06f..44e7d45c5 100644 --- a/dde-dock/dde-dock.pro +++ b/dde-dock/dde-dock.pro @@ -32,7 +32,7 @@ SOURCES += \ src/DBus/dbuspanelmanager.cpp \ src/DBus/dbusclientmanager.cpp \ src/DBus/dbusdockedappmanager.cpp \ - src/DBus/dbusdocksetting.cpp + src/DBus/dbusdocksetting.cpp \ src/pluginitemwrapper.cpp HEADERS += \ @@ -56,7 +56,7 @@ HEADERS += \ src/DBus/dbuspanelmanager.h \ src/DBus/dbusclientmanager.h \ src/DBus/dbusdockedappmanager.h \ - src/DBus/dbusdocksetting.h + src/DBus/dbusdocksetting.h \ src/pluginitemwrapper.h RESOURCES += \ diff --git a/dde-dock/src/Controller/appmanager.cpp b/dde-dock/src/Controller/appmanager.cpp index 78638357a..74e03eb98 100644 --- a/dde-dock/src/Controller/appmanager.cpp +++ b/dde-dock/src/Controller/appmanager.cpp @@ -2,6 +2,47 @@ AppManager::AppManager(QObject *parent) : QObject(parent) { - + m_entryManager = new DBusEntryManager(this); + connect(m_entryManager, SIGNAL(Added(QDBusObjectPath)),this, SLOT(slotEntryAdded(QDBusObjectPath))); + connect(m_entryManager, SIGNAL(Removed(QString)), this, SLOT(slotEntryRemoved(QString))); +} + +void AppManager::updateEntries() +{ + QList entryList = m_entryManager->entries(); + for (int i = 0; i < entryList.count(); i ++) + { + DBusEntryProxyer *dep = new DBusEntryProxyer(entryList.at(i).path()); + if (dep->isValid() && dep->type() == "App") + { + AppItem *item = new AppItem(); + item->setEntryProxyer(dep); + emit entryAdded(item); + } + } +} + +void AppManager::slotEntryAdded(const QDBusObjectPath &path) +{ + qWarning() << "entry add:" << path.path(); + DBusEntryProxyer *entryProxyer = new DBusEntryProxyer(path.path()); + if (entryProxyer->isValid()) + { +// qWarning() << "app-status" << entryProxyer->data().value("app-status"); +// qWarning() << "app-xids" << entryProxyer->data().value("app-xids"); +// qWarning() << "icon" << entryProxyer->data().value("icon"); +// qWarning() << "menu" << entryProxyer->data().value("menu"); +// qWarning() << "title" << entryProxyer->data().value("title"); + + AppItem *item = new AppItem(); + item->setEntryProxyer(entryProxyer); + emit entryAdded(item); + } +} + +void AppManager::slotEntryRemoved(const QString &id) +{ + qWarning() << "entry remove:" << id; + emit entryRemoved(id); } diff --git a/dde-dock/src/Controller/appmanager.h b/dde-dock/src/Controller/appmanager.h index e80aa345d..1d7cb0190 100644 --- a/dde-dock/src/Controller/appmanager.h +++ b/dde-dock/src/Controller/appmanager.h @@ -2,18 +2,33 @@ #define APPMANAGER_H #include +#include +#include +#include #include "DBus/dbusentrymanager.h" #include "DBus/dbusentryproxyer.h" +#include "Widgets/appitem.h" class AppManager : public QObject { Q_OBJECT public: explicit AppManager(QObject *parent = 0); + void updateEntries(); signals: + void entryAdded(AppItem *item); + void entryRemoved(const QString &id); -public slots: +private slots: + void slotEntryAdded(const QDBusObjectPath &path); + void slotEntryRemoved(const QString &id); + +private: + + +private: + DBusEntryManager *m_entryManager = NULL; }; #endif // APPMANAGER_H diff --git a/dde-dock/src/Controller/dockmodedata.cpp b/dde-dock/src/Controller/dockmodedata.cpp index 0d690bf2d..7a0598412 100644 --- a/dde-dock/src/Controller/dockmodedata.cpp +++ b/dde-dock/src/Controller/dockmodedata.cpp @@ -104,17 +104,18 @@ int DockModeData::getAppItemSpacing() int DockModeData::getAppIconSize() { - switch (m_currentMode) - { - case DockConstants::FashionMode: - return 48; - case DockConstants::EfficientMode: - return 42; - case DockConstants::ClassicMode: - return 24; - default: - return 32; - } +// switch (m_currentMode) +// { +// case DockConstants::FashionMode: +// return 48; +// case DockConstants::EfficientMode: +// return 48; +// case DockConstants::ClassicMode: +// return 24; +// default: +// return 32; +// } + return 48; } int DockModeData::getAppletsItemHeight() diff --git a/dde-dock/src/Panel/panel.cpp b/dde-dock/src/Panel/panel.cpp index 161b039c8..ff2a78223 100644 --- a/dde-dock/src/Panel/panel.cpp +++ b/dde-dock/src/Panel/panel.cpp @@ -16,18 +16,6 @@ Panel::Panel(QWidget *parent) leftLayout->resize(this->width() - rightLayout->width(),dockCons->getDockHeight()); leftLayout->move(0,0); - AppItem * b1 = new AppItem("App",":/test/Resources/images/brasero.png"); - AppItem * b2 = new AppItem("App",":/test/Resources/images/crossover.png"); - AppItem * b3 = new AppItem("App",":/test/Resources/images/vim.png"); - AppItem * b4 = new AppItem("App",":/test/Resources/images/google-chrome.png"); - AppItem * b5 = new AppItem("App",":/test/Resources/images/QtProject-qtcreator.png"); - - leftLayout->addItem(b1); - leftLayout->addItem(b2); - leftLayout->addItem(b3); - leftLayout->addItem(b4); - leftLayout->addItem(b5); - connect(leftLayout,SIGNAL(dragStarted()),this,SLOT(slotDragStarted())); connect(leftLayout,SIGNAL(itemDropped()),this,SLOT(slotItemDropped())); @@ -37,23 +25,13 @@ Panel::Panel(QWidget *parent) connect(dockCons, SIGNAL(dockModeChanged(DockConstants::DockMode,DockConstants::DockMode)), this, SLOT(slotDockModeChanged(DockConstants::DockMode,DockConstants::DockMode))); - SystrayManager *manager = new SystrayManager(); - foreach (AbstractDockItem *item, manager->trayIcons()) { - rightLayout->addItem(item); - qDebug() << item->geometry(); - } panelMenu = new PanelMenu(); + initAppManager(); + initSystrayManager(); + slotDockModeChanged(dockCons->getDockMode(),dockCons->getDockMode()); - - - - - - - /////////////////////////// - AppManager *appManager = new AppManager(this); } void Panel::resize(const QSize &size) @@ -124,6 +102,7 @@ void Panel::slotDockModeChanged(DockConstants::DockMode newMode, DockConstants:: this->resize(leftLayout->width() + rightLayout->width(),dockCons->getDockHeight()); this->move((parentWidget->width() - leftLayout->width() - rightLayout->width()) / 2,0); + qWarning() << "AppCount:********" << leftLayout->getItemCount(); } void Panel::slotLayoutContentsWidthChanged() @@ -140,7 +119,26 @@ void Panel::slotLayoutContentsWidthChanged() this->resize(leftLayout->width() + rightLayout->width(),dockCons->getDockHeight()); this->move((parentWidget->width() - leftLayout->width() - rightLayout->width()) / 2,0); } +} +void Panel::slotAddAppItem(AppItem *item) +{ + leftLayout->addItem(item); +} + +void Panel::slotRemoveAppItem(const QString &id) +{ + QList tmpList = leftLayout->getItemList(); + for (int i = 0; i < tmpList.count(); i ++) + { + AppItem *tmpItem = qobject_cast(tmpList.at(i)); + if (tmpItem->itemId() == id) + { + //TODO,remove from layout + return; + } + } + qWarning() << "=====" << leftLayout->getItemCount(); } void Panel::mousePressEvent(QMouseEvent *event) @@ -187,6 +185,23 @@ void Panel::hideMenu() } +void Panel::initAppManager() +{ + m_appManager = new AppManager(this); + connect(m_appManager,SIGNAL(entryAdded(AppItem*)),this, SLOT(slotAddAppItem(AppItem*))); + connect(m_appManager, SIGNAL(entryRemoved(QString)),this, SLOT(slotRemoveAppItem(QString))); + m_appManager->updateEntries(); +} + +void Panel::initSystrayManager() +{ + SystrayManager *manager = new SystrayManager(); + foreach (AbstractDockItem *item, manager->trayIcons()) { + rightLayout->addItem(item); + qDebug() << item->geometry()<<"=====++++++++"; + } +} + Panel::~Panel() { diff --git a/dde-dock/src/Panel/panel.h b/dde-dock/src/Panel/panel.h index 12fa16aaf..91b7a2fbd 100644 --- a/dde-dock/src/Panel/panel.h +++ b/dde-dock/src/Panel/panel.h @@ -35,6 +35,9 @@ private slots: void slotDockModeChanged(DockConstants::DockMode newMode,DockConstants::DockMode oldMode); void slotLayoutContentsWidthChanged(); + void slotAddAppItem(AppItem *item); + void slotRemoveAppItem(const QString &id); + protected: void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); @@ -45,9 +48,12 @@ private: void showMenu(); void hideMenu(); + void initAppManager(); + void initSystrayManager(); private: DockLayout * leftLayout; DockLayout *rightLayout; + AppManager *m_appManager = NULL; QWidget * parentWidget = NULL; ScreenMask * maskWidget = NULL; DockModeData *dockCons = DockModeData::getInstants(); diff --git a/dde-dock/src/Widgets/appicon.cpp b/dde-dock/src/Widgets/appicon.cpp index 699815401..0544c6a8d 100644 --- a/dde-dock/src/Widgets/appicon.cpp +++ b/dde-dock/src/Widgets/appicon.cpp @@ -36,9 +36,10 @@ AppIcon::AppIcon(QString iconPath, QWidget *parent, Qt::WindowFlags f) : this->setPixmap(iconPixmap); } -void AppIcon::setIcon(const QString &iconPath) +void AppIcon::setIcon(const QString &iconPath, int size) { - QString sysIconPath = getSysIcon(iconPath); + QString sysIconPath = getSysIcon(iconPath,size); +// qWarning() << "--" << iconPath; QPixmap iconPixmap(this->width(),this->height()); if (sysIconPath != "") { @@ -53,37 +54,37 @@ void AppIcon::setIcon(const QString &iconPath) QString AppIcon::getSysIcon(const QString &iconName, int size) { - return ""; -// char *name = iconName.toUtf8().data(); -// GtkIconTheme* theme; + char *name = iconName.toUtf8().data(); + GtkIconTheme* theme; + gtk_init(NULL, NULL); -// if (g_path_is_absolute(name)) -// return iconName; -// g_return_val_if_fail(name != NULL, NULL); + if (g_path_is_absolute(name)) + return iconName; + g_return_val_if_fail(name != NULL, NULL); -// int pic_name_len = strlen(name); -// char* ext = strrchr(name, '.'); -// if (ext != NULL) { -// if (g_ascii_strcasecmp(ext+1, "png") == 0 || g_ascii_strcasecmp(ext+1, "svg") == 0 || g_ascii_strcasecmp(ext+1, "jpg") == 0) { -// pic_name_len = ext - name; -// g_debug("Icon name should an absoulte path or an basename without extension"); -// } -// } + int pic_name_len = strlen(name); + char* ext = strrchr(name, '.'); + if (ext != NULL) { + if (g_ascii_strcasecmp(ext+1, "png") == 0 || g_ascii_strcasecmp(ext+1, "svg") == 0 || g_ascii_strcasecmp(ext+1, "jpg") == 0) { + pic_name_len = ext - name; + g_debug("Icon name should an absoulte path or an basename without extension"); + } + } -// char* pic_name = g_strndup(name, pic_name_len); -// theme = gtk_icon_theme_get_default(); + char* pic_name = g_strndup(name, pic_name_len); + theme = gtk_icon_theme_get_default(); -// GtkIconInfo* info = gtk_icon_theme_lookup_icon(theme, pic_name, size, GTK_ICON_LOOKUP_GENERIC_FALLBACK); -// g_free(pic_name); -// if (info) { -// char* path = g_strdup(gtk_icon_info_get_filename(info)); -//#if GTK_MAJOR_VERSION >= 3 -// g_object_unref(info); -//#elif GTK_MAJOR_VERSION == 2 -// gtk_icon_info_free(info); -//#endif -// return QString(path); -// } else { -// return NULL; -// } + GtkIconInfo* info = gtk_icon_theme_lookup_icon(theme, pic_name, size, GTK_ICON_LOOKUP_GENERIC_FALLBACK); + g_free(pic_name); + if (info) { + char* path = g_strdup(gtk_icon_info_get_filename(info)); +#if GTK_MAJOR_VERSION >= 3 + g_object_unref(info); +#elif GTK_MAJOR_VERSION == 2 + gtk_icon_info_free(info); +#endif + return QString(path); + } else { + return ""; + } } diff --git a/dde-dock/src/Widgets/appicon.h b/dde-dock/src/Widgets/appicon.h index de5f91f54..197786f14 100644 --- a/dde-dock/src/Widgets/appicon.h +++ b/dde-dock/src/Widgets/appicon.h @@ -14,7 +14,7 @@ public: explicit AppIcon(QWidget *parent = 0,Qt::WindowFlags f = 0); explicit AppIcon(QString iconPath, QWidget *parent = 0,Qt::WindowFlags f = 0);//default search system icon path - void setIcon(const QString &iconPath); + void setIcon(const QString &iconPath, int size = 42); signals: public slots: diff --git a/dde-dock/src/Widgets/appitem.cpp b/dde-dock/src/Widgets/appitem.cpp index f4c193adb..3bce6d6ec 100644 --- a/dde-dock/src/Widgets/appitem.cpp +++ b/dde-dock/src/Widgets/appitem.cpp @@ -6,58 +6,34 @@ AppItem::AppItem(QWidget *parent) : setAcceptDrops(true); resize(dockCons->getNormalItemWidth(), dockCons->getItemHeight()); initBackground(); + initClientManager(); connect(dockCons, &DockModeData::dockModeChanged,this, &AppItem::slotDockModeChanged); + + } -AppItem::AppItem(QString title, QWidget *parent): - AbstractDockItem(parent) +void AppItem::setEntryProxyer(DBusEntryProxyer *entryProxyer) { - m_itemTitle = title; + m_entryProxyer = entryProxyer; + m_entryProxyer->setParent(this); + connect(m_entryProxyer, SIGNAL(DataChanged(QString,QString)),this, SLOT(dbusDataChanged(QString,QString))); - setAcceptDrops(true); - resize(dockCons->getNormalItemWidth(), dockCons->getItemHeight()); - initBackground(); - connect(dockCons, &DockModeData::dockModeChanged,this, &AppItem::slotDockModeChanged); + initData(); } -AppItem::AppItem(QString title, QString iconPath, QWidget *parent) : - AbstractDockItem(parent) +void AppItem::destroyItem(const QString &id) { - m_itemTitle = title; - m_itemIconPath = iconPath; - setAcceptDrops(true); - resize(dockCons->getNormalItemWidth(), dockCons->getItemHeight()); - initBackground(); - setIcon(m_itemIconPath,dockCons->getAppIconSize()); - connect(dockCons, &DockModeData::dockModeChanged,this, &AppItem::slotDockModeChanged); } -void AppItem::setIcon(const QString &iconPath, int size) +QString AppItem::itemId() const { - m_appIcon = new AppIcon(iconPath, this); - m_appIcon->resize(size, size); - - reanchorIcon(); + return m_itemData.id; } -void AppItem::setActived(bool value) +AppItemData AppItem::itemData() const { - m_isActived = value; - if (!value) - resize(dockCons->getNormalItemWidth(), dockCons->getItemHeight()); - else - resize(dockCons->getActivedItemWidth(), dockCons->getItemHeight()); -} - -void AppItem::setCurrentOpened(bool value) -{ - m_isCurrentOpened = value; -} - -bool AppItem::currentOpened() -{ - return m_isCurrentOpened; + return m_itemData; } void AppItem::slotDockModeChanged(DockConstants::DockMode newMode, DockConstants::DockMode oldMode) @@ -96,6 +72,32 @@ void AppItem::resizeBackground() appBackground->resize(width(),height()); } +void AppItem::dbusDataChanged(const QString &key, const QString &value) +{ +// qWarning() << "key:" << key << "value:" << value; + if (key == "app-status") + qWarning() << "====+++++++++" << value; + + updateTitle(); + updateState(); + updateXids(); + updateMenuJsonString(); +} + +void AppItem::setCurrentOpened(uint value) +{ + if (m_itemData.xidsJsonString.indexOf(QString::number(value)) != -1) + { + m_itemData.currentOpened = true; + appBackground->setIsCurrentOpened(true); + } + else + { + m_itemData.currentOpened = false; + appBackground->setIsCurrentOpened(false); + } +} + void AppItem::resizeResources() { if (m_appIcon != NULL) @@ -118,13 +120,81 @@ void AppItem::initBackground() connect(this, SIGNAL(widthChanged()),this, SLOT(resizeBackground())); } +void AppItem::initClientManager() +{ + m_clientmanager = new DBusClientManager(this); + connect(m_clientmanager, SIGNAL(ActiveWindowChanged(uint)),this, SLOT(setCurrentOpened(uint))); +} + +void AppItem::setActived(bool value) +{ + m_isActived = value; + if (!value) + resize(dockCons->getNormalItemWidth(), dockCons->getItemHeight()); + else + resize(dockCons->getActivedItemWidth(), dockCons->getItemHeight()); + + appBackground->setIsActived(value); +} + +void AppItem::initData() +{ + StringMap dataMap = m_entryProxyer->data(); + m_itemData.title = dataMap.value("title"); + m_itemData.iconPath = dataMap.value("icon"); + m_itemData.menuJsonString = dataMap.value("menu"); + m_itemData.xidsJsonString = dataMap.value("app-xids"); + m_itemData.isActived = dataMap.value("app-status") == "active"; + m_itemData.currentOpened = m_itemData.xidsJsonString.indexOf(QString::number(m_clientmanager->CurrentActiveWindow())) != -1; + m_itemData.id = m_entryProxyer->id(); + + setActived(m_itemData.isActived); + setCurrentOpened(m_clientmanager->CurrentActiveWindow()); + updateIcon(); +} + +void AppItem::updateIcon() +{ + if (m_appIcon == NULL) + { + m_appIcon = new AppIcon(this); + m_appIcon->resize(height(), height()); + m_appIcon->setIcon(m_itemData.iconPath,dockCons->getAppIconSize()); + } + + reanchorIcon(); +} + +void AppItem::updateTitle() +{ + m_itemData.title = m_entryProxyer->data().value("title"); + //TODO,update view label +} + +void AppItem::updateState() +{ + m_itemData.isActived = m_entryProxyer->data().value("app-status") == "active"; + setActived(m_itemData.isActived); + appBackground->setIsActived(m_itemData.isActived); +} + +void AppItem::updateXids() +{ + m_itemData.xidsJsonString = m_entryProxyer->data().value("app-xids"); +} + +void AppItem::updateMenuJsonString() +{ + m_itemData.menuJsonString = m_entryProxyer->data().value("menu"); +} + void AppItem::mousePressEvent(QMouseEvent * event) { //qWarning() << "mouse press..."; emit mousePress(event->globalX(), event->globalY()); - ////////////FOR TEST ONLY///////////////////// - appBackground->setIsActived(!appBackground->getIsActived()); - setActived(!actived()); + + if (event->button() == Qt::LeftButton) + m_entryProxyer->Activate(0,0); } void AppItem::mouseReleaseEvent(QMouseEvent * event) @@ -150,11 +220,11 @@ void AppItem::mouseMoveEvent(QMouseEvent *event) { QDrag* drag = new QDrag(this); QMimeData* data = new QMimeData(); - QImage dataImg(m_itemIconPath); + QImage dataImg(m_itemData.iconPath); data->setImageData(QVariant(dataImg)); drag->setMimeData(data); - QPixmap pixmap(m_itemIconPath); + QPixmap pixmap(m_itemData.iconPath); drag->setPixmap(pixmap); drag->setHotSpot(QPoint(15,15)); diff --git a/dde-dock/src/Widgets/appitem.h b/dde-dock/src/Widgets/appitem.h index df29b8906..ee5a65150 100644 --- a/dde-dock/src/Widgets/appitem.h +++ b/dde-dock/src/Widgets/appitem.h @@ -11,26 +11,39 @@ #include #include #include +#include +#include #include -#include "abstractdockitem.h" +#include "DBus/dbusentryproxyer.h" +#include "DBus/dbusclientmanager.h" #include "Controller/dockmodedata.h" +#include "abstractdockitem.h" #include "appicon.h" #include "appbackground.h" +struct AppItemData { + QString id; + QString iconPath; + QString title; + QString xidsJsonString; + QString menuJsonString; + bool isActived; + bool currentOpened; + bool isDocked; +}; + class AppItem : public AbstractDockItem { Q_OBJECT Q_PROPERTY(QPoint pos READ pos WRITE move) public: AppItem(QWidget *parent = 0); - AppItem(QString title, QWidget *parent = 0); - AppItem(QString title, QString iconPath, QWidget *parent = 0); ~AppItem(); - void setIcon(const QString &iconPath, int size = 42); - void setActived(bool value); - void setCurrentOpened(bool value); - bool currentOpened(); + void setEntryProxyer(DBusEntryProxyer *entryProxyer); + void destroyItem(const QString &id); + QString itemId() const; + AppItemData itemData() const; protected: void mousePressEvent(QMouseEvent *); @@ -47,19 +60,30 @@ private slots: void slotDockModeChanged(DockConstants::DockMode newMode,DockConstants::DockMode oldMode); void reanchorIcon(); void resizeBackground(); + void dbusDataChanged(const QString &key, const QString &value); + void setCurrentOpened(uint); private: void resizeResources(); void initBackground(); + void initClientManager(); + void setActived(bool value); + + void initData(); + void updateIcon(); + void updateTitle(); + void updateState(); + void updateXids(); + void updateMenuJsonString(); private: + AppItemData m_itemData; DockModeData *dockCons = DockModeData::getInstants(); + DBusEntryProxyer *m_entryProxyer = NULL; + DBusClientManager *m_clientmanager = NULL; AppBackground * appBackground = NULL; + AppIcon * m_appIcon = NULL; - QLabel * m_appIcon = NULL; - bool m_isCurrentOpened = false; - QString m_itemTitle = ""; - QString m_itemIconPath = ""; }; #endif // APPITEM_H diff --git a/dde-dock/src/Widgets/docklayout.cpp b/dde-dock/src/Widgets/docklayout.cpp index 1b1a3feb0..55978ca1f 100644 --- a/dde-dock/src/Widgets/docklayout.cpp +++ b/dde-dock/src/Widgets/docklayout.cpp @@ -176,6 +176,11 @@ int DockLayout::getItemCount() return appList.count(); } +QList DockLayout::getItemList() const +{ + return appList; +} + void DockLayout::dragEnterEvent(QDragEnterEvent *event) { event->setDropAction(Qt::MoveAction); diff --git a/dde-dock/src/Widgets/docklayout.h b/dde-dock/src/Widgets/docklayout.h index a07729132..3fa353369 100644 --- a/dde-dock/src/Widgets/docklayout.h +++ b/dde-dock/src/Widgets/docklayout.h @@ -29,6 +29,7 @@ public: int indexOf(int x,int y); int getContentsWidth(); int getItemCount(); + QList getItemList() const; public slots: void relayout();