dde-dock initial commit

This commit is contained in:
杨万青 2015-06-25 10:46:04 +08:00
parent 39dbbe20b9
commit 6d1f869fd8
24 changed files with 1042 additions and 0 deletions

34
dde-dock/Panel/panel.cpp Normal file
View File

@ -0,0 +1,34 @@
#include "panel.h"
Panel::Panel(QWidget *parent) : QWidget(parent)
{
leftLayout = new DockLayout(this);
leftLayout->resize(1024,50);
leftLayout->move(0,0);
for (int i = 0; i < 5; i ++)
{
AppItem * tmpButton = new AppItem("App" + QString::number(i),":/test/Resources/images/google-chrome.png");
tmpButton->resize(50,50);
leftLayout->addItem(tmpButton);
}
}
void Panel::resize(const QSize &size)
{
QWidget::resize(size);
leftLayout->resize(this->width() * 2 / 3,this->height());
}
void Panel::resize(int width, int height)
{
QWidget::resize(width,height);
leftLayout->resize(this->width() * 2 / 3,this->height());
}
Panel::~Panel()
{
}

27
dde-dock/Panel/panel.h Normal file
View File

@ -0,0 +1,27 @@
#ifndef PANEL_H
#define PANEL_H
#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include "Widgets/appitem.h"
#include "Widgets/docklayout.h"
class Panel : public QWidget
{
Q_OBJECT
public:
explicit Panel(QWidget *parent = 0);
~Panel();
void resize(const QSize &size);
void resize(int width,int height);
signals:
public slots:
private:
DockLayout * leftLayout;
};
#endif // PANEL_H

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,7 @@
#include "appbackground.h"
AppBackground::AppBackground(QWidget *parent) :
QLabel(parent)
{
this->setStyleSheet("background:#121922;border-radius: 4px;");
}

View File

@ -0,0 +1,21 @@
#ifndef APPBACKGROUND_H
#define APPBACKGROUND_H
#include <QObject>
#include <QLabel>
#include <QDebug>
#include "dockconstants.h"
class AppBackground : public QLabel
{
Q_OBJECT
public:
explicit AppBackground(QWidget *parent = 0);
signals:
public slots:
};
#endif // APPBACKGROUND_H

View File

@ -0,0 +1,85 @@
#include "appicon.h"
#undef signals
extern "C" {
#include <gtk/gtk.h>
}
#define signals public
AppIcon::AppIcon(QWidget *parent,Qt::WindowFlags f) :
QLabel(parent)
{
this->setParent(parent);
this->setWindowFlags(f);
}
AppIcon::AppIcon(QString iconPath, QWidget *parent, Qt::WindowFlags f) :
QLabel(parent)
{
this->setParent(parent);
this->setWindowFlags(f);
QString sysIconPath = getSysIcon(iconPath);
QPixmap iconPixmap(this->width(),this->height());
if (sysIconPath != "")
{
iconPixmap.load(sysIconPath);
}
else
{
iconPixmap.load(iconPath);
}
this->setPixmap(iconPixmap);
}
void AppIcon::setIcon(const QString &iconPath)
{
QString sysIconPath = getSysIcon(iconPath);
QPixmap iconPixmap(this->width(),this->height());
if (sysIconPath != "")
{
iconPixmap.load(sysIconPath);
}
else
{
iconPixmap.load(iconPath);
}
this->setPixmap(iconPixmap);
}
QString AppIcon::getSysIcon(const QString &iconName, int size)
{
return "";
// char *name = iconName.toUtf8().data();
// GtkIconTheme* theme;
// 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");
// }
// }
// 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;
// }
}

View File

@ -0,0 +1,24 @@
#ifndef APPICON_H
#define APPICON_H
#include <QObject>
#include <QWidget>
#include <QLabel>
#include <QPixmap>
class AppIcon : public QLabel
{
Q_OBJECT
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);
signals:
public slots:
QString getSysIcon(const QString &iconName, int size = 42);
};
#endif // APPICON_H

View File

@ -0,0 +1,123 @@
#include "appitem.h"
AppItem::AppItem(QWidget *parent) :
QFrame(parent)
{
this->setParent(parent);
this->initBackground();
}
AppItem::AppItem(QString title, QWidget *parent):
QFrame(parent)
{
this->setParent(parent);
this->itemTitle = title;
this->initBackground();
}
AppItem::AppItem(QString title, QString iconPath, QWidget *parent) :
QFrame(parent)
{
this->setParent(parent);
this->itemTitle = title;
this->itemIconPath = iconPath;
this->initBackground();
this->setIcon(itemIconPath);
}
void AppItem::setTitle(const QString &title)
{
this->itemTitle = title;
}
void AppItem::setIcon(const QString &iconPath, int size)
{
appIcon = new AppIcon(iconPath,this);
appIcon->resize(size,size);
// appIcon->setIcon(iconPath);
appIcon->move(this->width() / 2, this->height() / 2);
}
void AppItem::resize(const QSize &size)
{
QFrame::resize(size);
resizeResources();
}
void AppItem::resize(int width, int height)
{
QFrame::resize(width,height);
resizeResources();
}
void AppItem::setMoveable(bool value)
{
this->itemMoveable = value;
}
bool AppItem::getMoveable()
{
return this->itemMoveable;
}
void AppItem::setIndex(int value)
{
this->itemIndex = value;
}
int AppItem::getIndex()
{
return this->itemIndex;
}
void AppItem::resizeResources()
{
if (appIcon != NULL)
{
appIcon->resize(DockConstants::getInstants()->getIconSize(),DockConstants::getInstants()->getIconSize());
appIcon->move(this->width() / 2 - appIcon->width() / 2, this->height() / 2 - appIcon->height() / 2);
}
if (appBackground != NULL)
{
appBackground->resize(this->width(),this->height());
appBackground->move(0,0);
}
}
void AppItem::initBackground()
{
appBackground = new AppBackground(this);
appBackground->resize(this->width(),this->height());
appBackground->move(0,0);
}
void AppItem::mousePressEvent(QMouseEvent * event)
{
qWarning() << "press...";
emit mousePress(event->globalX(), event->globalY(),this);
}
void AppItem::mouseReleaseEvent(QMouseEvent * event)
{
emit mouseRelease(event->globalX(), event->globalY(),this);
}
void AppItem::mouseMoveEvent(QMouseEvent * event)
{
emit mouseMove(event->globalX(), event->globalY(),this);
}
void AppItem::mouseDoubleClickEvent(QMouseEvent * event)
{
emit mouseDoubleClick(this);
}
AppItem::~AppItem()
{
}

View File

@ -0,0 +1,63 @@
#ifndef APPITEM_H
#define APPITEM_H
#include <QObject>
#include <QWidget>
#include <QPushButton>
#include <QMouseEvent>
#include <QDrag>
#include <QRectF>
#include "dockconstants.h"
#include "appicon.h"
#include "appbackground.h"
#include "QDebug"
class AppItem : public QFrame
{
Q_OBJECT
public:
AppItem(QWidget *parent = 0);
AppItem(QString title, QWidget *parent = 0);
AppItem(QString title, QString iconPath, QWidget *parent = 0);
~AppItem();
void setTitle(const QString &title);
void setIcon(const QString &iconPath, int size = 42);
void resize(const QSize &size);
void resize(int width, int height);
void setMoveable(bool value);
bool getMoveable();
void setIndex(int value);
int getIndex();
protected:
void mousePressEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void mouseDoubleClickEvent(QMouseEvent *);
signals:
void mousePress(int x, int y, AppItem *item);
void mouseRelease(int x, int y, AppItem *item);
void mouseMove(int x, int y, AppItem *item);
void mouseDoubleClick( AppItem *item);
private:
void resizeResources();
void initBackground();
private:
AppBackground * appBackground = NULL;
AppIcon * appIcon = NULL;
int itemIndex;
bool itemMoveable = true;
bool itemHover = false;
bool itemActived = false;
bool itemDraged = false;
QString itemTitle = "";
QString itemIconPath = "";
};
#endif // APPITEM_H

View File

@ -0,0 +1,25 @@
#include "dockconstants.h"
DockConstants::DockConstants(QObject *parent) :
QObject(parent)
{
}
DockConstants * DockConstants::dockConstants = NULL;
DockConstants * DockConstants::getInstants()
{
if (dockConstants == NULL)
dockConstants = new DockConstants();
return dockConstants;
}
int DockConstants::getIconSize()
{
return this->iconSize;
}
void DockConstants::setIconSize(int value)
{
this->iconSize = value;
}

View File

@ -0,0 +1,41 @@
#ifndef DOCKCONSTANTS_H
#define DOCKCONSTANTS_H
#include <QObject>
#include <QStringList>
struct DockItemData {
QString appTitle;
QString appIconPath;
QString appExePath;
bool appActived;
QStringList appPreviews;
};
class DockConstants : public QObject
{
Q_OBJECT
Q_PROPERTY(int iconSize READ getIconSize WRITE setIconSize)
public:
static DockConstants * getInstants();
enum DockMode {
FashionMode,
EfficientMode,
ClassicMode
};
int getIconSize();
void setIconSize(int value);
private:
explicit DockConstants(QObject *parent = 0);
private:
static DockConstants * dockConstants;
DockMode currentMode = DockConstants::FashionMode;
int iconSize = 42;
};
#endif // DOCKCONSTANTS_H

View File

@ -0,0 +1,51 @@
#include "dockitemdelegate.h"
DockItemDelegate::DockItemDelegate(QObject *parent) : QItemDelegate(parent)
{
}
QWidget * DockItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
AppItem * editor = new AppItem(parent);
editor->resize(50,50);
return editor;
}
void DockItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QJsonObject dataObj = index.model()->data(index, Qt::DisplayRole).toJsonValue().toObject();
if (dataObj.isEmpty())
{
return;
}
AppItem *appItem = static_cast<AppItem*>(editor);
if (dataObj.contains("itemIconPath"))
appItem->setIcon(dataObj.value("itemIconPath").toString());
if (dataObj.contains("itemTitle"))
appItem->setTitle(dataObj.value("itemTitle").toString());
}
void DockItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
AppItem *appItem = static_cast<AppItem*>(editor);
// appItem->interpretText();
// int value = appItem->value();
// model->setData(index, value);
}
void DockItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
DockItemDelegate::~DockItemDelegate()
{
}

View File

@ -0,0 +1,30 @@
#ifndef DOCKITEMDELEGATE_H
#define DOCKITEMDELEGATE_H
#include <QObject>
#include <QJsonObject>
#include <QItemDelegate>
#include <QStyleOptionViewItem>
#include <QModelIndex>
#include <QAbstractItemModel>
#include <QDebug>
#include "appitem.h"
class DockItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit DockItemDelegate(QObject *parent = 0);
~DockItemDelegate();
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
void setEditorData(QWidget * editor, const QModelIndex & index) const;
void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
signals:
public slots:
};
#endif // DOCKITEMDELEGATE_H

View File

@ -0,0 +1,149 @@
#include "docklayout.h"
DockLayout::DockLayout(QWidget *parent) :
QWidget(parent)
{
}
void DockLayout::setParent(QWidget *parent)
{
this->setParent(parent);
}
void DockLayout::addItem(AppItem *item)
{
insertItem(item,appList.count());
}
void DockLayout::insertItem(AppItem *item, int index)
{
item->setParent(this);
int appCount = appList.count();
index = index > appCount ? appCount : (index < 0 ? 0 : index);
appList.insert(index,item);
connect(item, SIGNAL(mouseMove(int,int,AppItem*)),this,SLOT(slotItemDrag(int,int,AppItem*)));
relayout();
}
void DockLayout::removeItem(int index)
{
delete appList.takeAt(index);
}
void DockLayout::moveItem(int from, int to)
{
appList.move(from,to);
relayout();
}
void DockLayout::setItemMoveable(int index, bool moveable)
{
appList.at(index)->setMoveable(moveable);
}
void DockLayout::setMargin(qreal margin)
{
this->leftMargin = margin;
this->rightMargin = margin;
this->topMargin = margin;
this->bottomMargin = margin;
}
void DockLayout::setMargin(DockLayout::MarginEdge edge, qreal margin)
{
switch(edge)
{
case DockLayout::LeftMargin:
this->leftMargin = margin;
break;
case DockLayout::RightMargin:
this->rightMargin = margin;
break;
case DockLayout::TopMargin:
this->topMargin = margin;
break;
case DockLayout::BottomMargin:
this->bottomMargin = margin;
break;
default:
break;
}
}
void DockLayout::setSpacing(qreal spacing)
{
this->itemSpacing = spacing;
}
void DockLayout::setSortDirection(DockLayout::Direction value)
{
this->sortDirection = value;
}
void DockLayout::relayout()
{
switch (sortDirection)
{
case LeftToRight:
sortLeftToRight();
break;
case RightToLeft:
sortRightToLeft();
break;
case TopToBottom:
sortTopToBottom();
break;
case BottomToTop:
sortBottomToTop();
break;
default:
break;
}
}
void DockLayout::sortLeftToRight()
{
if (appList.count() <= 0)
return;
appList.at(0)->move(0,0);
for (int i = 1; i < appList.count(); i ++)
{
AppItem * frontItem = appList.at(i - 1);
appList.at(i)->move(frontItem->pos().x() + frontItem->width() + itemSpacing,0);
}
}
void DockLayout::sortRightToLeft()
{
}
void DockLayout::sortTopToBottom()
{
}
void DockLayout::sortBottomToTop()
{
}
int DockLayout::indexOf(AppItem *item)
{
return appList.indexOf(item);
}
int DockLayout::indexOf(int x, int y)
{
//TODO
return 0;
}
void DockLayout::slotItemDrag(int x, int y, AppItem *item)
{
qWarning() << "Item draging..."<<x<<y<<item;
}

View File

@ -0,0 +1,66 @@
#ifndef DOCKLAYOUT_H
#define DOCKLAYOUT_H
#include <QWidget>
#include <QList>
#include "appitem.h"
class DockLayout : public QWidget
{
Q_OBJECT
public:
enum Direction{
LeftToRight,
RightToLeft,
TopToBottom,
BottomToTop
};
enum MarginEdge{
LeftMargin,
RightMargin,
TopMargin,
BottomMargin
};
explicit DockLayout(QWidget *parent = 0);
void setParent(QWidget *parent);
void addItem(AppItem * item);
void insertItem(AppItem *item, int index);
void removeItem(int index);
void moveItem(int from, int to);
void setItemMoveable(int index, bool moveable);
void setMargin(qreal margin);
void setMargin(DockLayout::MarginEdge edge, qreal margin);
void setSpacing(qreal spacing);
void setSortDirection(DockLayout::Direction value);
void relayout();
int indexOf(AppItem * item);
int indexOf(int x,int y);
signals:
public slots:
private slots:
void slotItemDrag(int x,int y,AppItem *item);
private:
void sortLeftToRight();
void sortRightToLeft();
void sortTopToBottom();
void sortBottomToTop();
private:
QList<AppItem *> appList;
DockLayout::Direction sortDirection = DockLayout::LeftToRight;
qreal itemSpacing = 10;
qreal leftMargin = 0;
qreal rightMargin = 0;
qreal topMargin = 0;
qreal bottomMargin = 0;
};
#endif // DOCKLAYOUT_H

View File

@ -0,0 +1,135 @@
#include "dockmodel.h"
DockModel::DockModel(QObject *parent) :
QAbstractItemModel(parent)
{
}
int DockModel::count()
{
return this->rowCount(QModelIndex());
}
void DockModel::append(const QJsonObject &dataObj)
{
insert(count(),dataObj);
}
void DockModel::clear()
{
this->removeRows(0,count());
}
QJsonObject DockModel::get(int index)
{
QModelIndex tmpIndex = getIndex(index);
QJsonObject tmpObj = this->data(tmpIndex,0).toJsonValue().toObject();
return tmpObj;
}
bool DockModel::insert(int index, const QJsonObject &dataObj)
{
if (insertRow(index))
{
if (setData(getIndex(index),QVariant(dataObj)))
{
return true;
}
else
qWarning() << "setData error";
}
qWarning() << "insertRow error" ;
return false;
}
void DockModel::move(int from, int to, int count)
{
Q_UNUSED(from)
Q_UNUSED(to)
Q_UNUSED(count)
}
void DockModel::remove(int index, int count)
{
this->removeRows(index,count);
}
void DockModel::set(int index, const QJsonObject &dataObj)
{
}
void DockModel::setProperty(int index, const QString &property, const QVariant &value)
{
}
int DockModel::indexOf(const QString &property)
{
}
QModelIndex DockModel::getIndex(int row)
{
return this->index(row,0,QModelIndex());
}
bool DockModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.isValid() && role == Qt::EditRole)
{
dataArray.replace(index.row(),QJsonValue(value.toJsonObject()));
emit dataChanged(index, index);
return true;
}
return false;
}
QModelIndex DockModel::index(int row, int column, const QModelIndex &parent) const
{
Q_UNUSED(column)
Q_UNUSED(parent)
return this->createIndex(row,0);
}
QModelIndex DockModel::parent(const QModelIndex &child) const
{
return QModelIndex();
}
int DockModel::rowCount(const QModelIndex &parent) const
{
return dataArray.count();
}
int DockModel::columnCount(const QModelIndex &parent) const
{
return 1;
}
QVariant DockModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= dataArray.count())
return QVariant();
if (role == Qt::DisplayRole || role == Qt::EditRole)
{
return QVariant(dataArray.at(index.row()));
}
else
return QVariant();
}
bool DockModel::insertRows(int row, int count, const QModelIndex &parent)
{
beginInsertRows(QModelIndex(), row, row + count-1);
for (int i = row; i < row + count; i++)
{
dataArray.insert(i,QJsonValue());
}
endInsertRows();
return true;
}

View File

@ -0,0 +1,44 @@
#ifndef DOCKMODEL_H
#define DOCKMODEL_H
#include <QObject>
#include <QVariant>
#include <QJsonObject>
#include <QJsonArray>
#include <QAbstractItemModel>
#include <QDebug>
class DockModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit DockModel(QObject *parent = 0);
int count();
void append(const QJsonObject &dataObj);
void clear();
QJsonObject get(int index);
bool insert(int index, const QJsonObject &dataObj);
void move(int from, int to, int count);
void remove(int index, int count = 1);
void set(int index, const QJsonObject &dataObj);
void setProperty(int index, const QString &property, const QVariant &value);
int indexOf(const QString &property);
QModelIndex getIndex(int row);
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const;
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role = Qt::EditRole) const;
bool insertRows(int row, int count, const QModelIndex &parent);
signals:
public slots:
private:
QJsonArray dataArray;
};
#endif // DOCKMODEL_H

View File

@ -0,0 +1,6 @@
#include "dockview.h"
DockView::DockView(QWidget *parent) :
QAbstractItemView(parent)
{
}

View File

@ -0,0 +1,16 @@
#ifndef DOCKVIEW_H
#define DOCKVIEW_H
#include <QObject>
#include <QWidget>
#include <QAbstractItemView>
class DockView : public QAbstractItemView
{
Q_OBJECT
public:
explicit DockView(QWidget *parent = 0);
};
#endif // DOCKVIEW_H

42
dde-dock/dde-dock.pro Normal file
View File

@ -0,0 +1,42 @@
#-------------------------------------------------
#
# Project created by QtCreator 2015-06-20T10:09:57
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = dde-dock
TEMPLATE = app
SOURCES += main.cpp\
mainwidget.cpp \
Panel/panel.cpp \
Widgets/appicon.cpp \
Widgets/appbackground.cpp \
Widgets/dockconstants.cpp \
Widgets/dockmodel.cpp \
Widgets/dockview.cpp \
Widgets/dockitemdelegate.cpp \
Widgets/appitem.cpp \
Widgets/docklayout.cpp
HEADERS += mainwidget.h \
Panel/panel.h \
Widgets/appicon.h \
Widgets/appbackground.h \
Widgets/dockconstants.h \
Widgets/dockmodel.h \
Widgets/dockview.h \
Widgets/dockitemdelegate.h \
Widgets/appitem.h \
Widgets/docklayout.h
RESOURCES += \
images.qrc
PKGCONFIG += gtk+-2.0
CONFIG += c++11 link_pkgconfig

5
dde-dock/images.qrc Normal file
View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/test">
<file>Resources/images/google-chrome.png</file>
</qresource>
</RCC>

11
dde-dock/main.cpp Normal file
View File

@ -0,0 +1,11 @@
#include <QApplication>
#include "mainwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWidget w;
w.show();
return a.exec();
}

17
dde-dock/mainwidget.cpp Normal file
View File

@ -0,0 +1,17 @@
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
QRect rec = QApplication::desktop()->screenGeometry();
this->resize(rec.width(),50);
Panel * mainPanel = new Panel(this);
mainPanel->setMinimumSize(this->width(),this->height());
mainPanel->move(0,0);
this->setWindowFlags(Qt::ToolTip);
}
MainWidget::~MainWidget()
{
}

20
dde-dock/mainwidget.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QApplication>
#include <QDesktopWidget>
#include <QWidget>
#include <QScreen>
#include <QDebug>
#include <Panel/panel.h>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
};
#endif // MAINWIDGET_H