dde-dock/frame/controller/dockitemcontroller.cpp
石博文 dcca4fcad4 change entry added dbus interface
Change-Id: Ifc42fb7c4233cbb4e29900cbb19206710c14e3b4
2016-08-02 09:28:06 +08:00

92 lines
2.4 KiB
C++

#include "dockitemcontroller.h"
#include "dbus/dbusdockentry.h"
#include "item/appitem.h"
#include "item/placeholderitem.h"
#include "item/launcheritem.h"
#include "item/pluginsitem.h"
#include <QDebug>
DockItemController *DockItemController::INSTANCE = nullptr;
DockItemController *DockItemController::instance(QObject *parent)
{
if (!INSTANCE)
INSTANCE = new DockItemController(parent);
return INSTANCE;
}
DockItemController::~DockItemController()
{
qDeleteAll(m_itemList);
}
const QList<DockItem *> DockItemController::itemList() const
{
return m_itemList;
}
DockItemController::DockItemController(QObject *parent)
: QObject(parent),
m_appInter(new DBusDock(this)),
m_pluginsInter(new DockPluginsController(this))
{
m_itemList.append(new LauncherItem);
for (auto entry : m_appInter->entries())
m_itemList.append(new AppItem(entry));
m_itemList.append(new PlaceholderItem);
connect(m_appInter, &DBusDock::EntryAdded, this, &DockItemController::appItemAdded);
connect(m_appInter, &DBusDock::EntryRemoved, this, &DockItemController::appItemRemoved);
connect(m_pluginsInter, &DockPluginsController::pluginsInserted, this, &DockItemController::pluginsItemAdded);
}
void DockItemController::appItemAdded(const QDBusObjectPath &path, const int index)
{
// the first index is launcher item
int insertIndex = 1;
// -1 for append to app list end
if (index != -1)
{
insertIndex += index;
} else {
for (auto item : m_itemList)
if (item->itemType() == DockItem::App)
++insertIndex;
}
AppItem *item = new AppItem(path);
m_itemList.insert(insertIndex, item);
emit itemInserted(insertIndex, item);
}
void DockItemController::appItemRemoved(const QString &appId)
{
for (int i(0); i != m_itemList.size(); ++i)
{
if (m_itemList[i]->itemType() != DockItem::App)
continue;
AppItem *app = static_cast<AppItem *>(m_itemList[i]);
if (app->appId() != appId)
continue;
emit itemRemoved(m_itemList[i]);
m_itemList[i]->deleteLater();
m_itemList.removeAt(i);
break;
}
}
void DockItemController::pluginsItemAdded(PluginsItemInterface *interface)
{
PluginsItem *item = new PluginsItem(interface);
m_itemList.append(item);
emit itemInserted(m_itemList.size(), item);
}