Load dbus data to app item

This commit is contained in:
杨万青 2015-07-03 13:16:18 +08:00
parent 020f97334f
commit 58902d6274
12 changed files with 304 additions and 125 deletions

View File

@ -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 += \

View File

@ -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<QDBusObjectPath> 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);
}

View File

@ -2,18 +2,33 @@
#define APPMANAGER_H
#include <QObject>
#include <QJsonObject>
#include <QJsonArray>
#include <QDebug>
#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

View File

@ -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()

View File

@ -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<AbstractDockItem *> tmpList = leftLayout->getItemList();
for (int i = 0; i < tmpList.count(); i ++)
{
AppItem *tmpItem = qobject_cast<AppItem *>(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()
{

View File

@ -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();

View File

@ -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 "";
}
}

View File

@ -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:

View File

@ -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));

View File

@ -11,26 +11,39 @@
#include <QMimeData>
#include <QPixmap>
#include <QImage>
#include <QList>
#include <QMap>
#include <QDebug>
#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

View File

@ -176,6 +176,11 @@ int DockLayout::getItemCount()
return appList.count();
}
QList<AbstractDockItem *> DockLayout::getItemList() const
{
return appList;
}
void DockLayout::dragEnterEvent(QDragEnterEvent *event)
{
event->setDropAction(Qt::MoveAction);

View File

@ -29,6 +29,7 @@ public:
int indexOf(int x,int y);
int getContentsWidth();
int getItemCount();
QList<AbstractDockItem *> getItemList() const;
public slots:
void relayout();