Merge branch 'dev-15.3'

Merge the newly designed and implemented dock into master

Change-Id: Ic35fb819ac91d9b28b61e422e26fdbd565202be1
This commit is contained in:
Hualet Wang 2016-08-02 09:28:41 +08:00
commit 7e6e6954ab
418 changed files with 9767 additions and 20613 deletions

3
.gitignore vendored
View File

@ -16,3 +16,6 @@ build*/
*.pro.user*
*.DS_Store
*.qm
# binary file
dde-dock

View File

@ -1,204 +0,0 @@
# HACKING guide for Dock
## Project layout
### Coding layout
Dock developed by Qt(QWidget).
It has five packages
- src/controller
This package control most of the non-visible data communication.
- src/dbus
This package include all of the DBus backend header that programs use.
- src/interfaces
This package include the header which export for plugins development. Those header should be packaged in a single software package in the future.
- src/panel
Panel was not the top level window. This package contains the most relevant widget of panel.
- src/widgets
The rest of the all other visible widgets.
### Others
- ~/.cache/deepin/dde-dock/
Store log files.
- ~/.config/deepin/dde-dock/style/ & /usr/share/dde-dock/style/
- Store style files.
## Core Design
### 布局管理
- 布局动画的实现
> - MovableLayout
>
>> 可拖拽排序的布局是App布局DockAppLayout和插件布局DockPluginLayout的基类。
>
> - MovableSpacingItem
>
>> 此类继承于QFrame不含有可视内容。在MovableLayout的某个位置插入此类的对象这样就相当于插入一段空白项。并且此类在size改变时会使用动画处理这样就能达到空白是有过渡动画的插入效果。当需要在新的位置插入空白项时发出信号使之前的所有空白项都开始销毁销毁过程也由动画控制以达到过度效果。当鼠标拖拽着快速移动时因为不断的插入和销毁就能实现布局内控件的挤压移动动画。
>
- 布局鼠标事件处理
> - 鼠标移动时开始检测是否达到拖拽阈值(为防止轻微点击误操作),如果达到则开始拖拽处理。
> - 在dragEnter或者dragMove时根据鼠标的位置计算出当前悬停在哪个布局中的控件之上根据需要插入空白项或者移除空白项在dragLeave时通知所有空白项销毁
> - 在drop事件发生时根据drop之前布局的布局方式以及移动方向确定新项目的位置。并且drop事件传递的QDropEvent对象会通过信号向外发送外部类或子类可根据该对象做进一步处理。
### App管理
- 把App固定到任务栏
> - 从Launcher拖拽项目到Dock的App布局中drag的mime数据中有特殊标志值
> - 从Launcher使用右键菜单发送到Dock
> - 从桌面或文件管理器中拖拽.desktop文件到Dock的App布局中有特殊标志值的就调用后端提供的DBus方法请求固定到Dock上如果没有特殊标志值则当成普通文件处理
- 把App从任务栏移除
> - 使用右键菜单的“移除驻留”选项移除,调用后端移除函数进行移除
> - 拖拽到Dock显示区域外丢弃移除
当检测到鼠标位置离开布局的有效区域后生成DropMask的一个对象跟随鼠标移动该对象可以接受drop事件并且大小正好就是拖拽时图像的大小始终位于鼠标正下方。一旦鼠标在布局区域以外释放则该对象接受相应数据作销毁动画后发出销毁信号完成项目的移除操作。
- App排序
>排序完成后调用后端的排序函数进行位置记录
- App的激活与窗口切换
> - 直接调用后端的Activate函数实现App的激活与窗口切换如果有多个窗口
> - 每个预览窗口都有对应的Xid当点击某个预览窗口时调用后端的ActiveWindow方法实现窗口切换。
- 文件拖拽
> - 有效的.desktop文件尝试固定到Dock的App布局中
> - 普通文件调用对应App的后端的HandleDragDrop方法尝试打开
### 插件系统
- 插件预检测
> - 检测插件文件是否有效
> - 检测插件版本是否有效
> - 检测插件是否为系统级别插件
- 插件通信
> - 插件主动向Dock传递数据
插件内部通过在init函数中保存DockPluginProxyInterface对象以随时调用该类提供的方法向Dock传递数据
> - Dock主动向插件传递数据
目前在插件接口类DockPluginInterface中实现的三个方法可以主动向插件传递数据分别是changeMode、setEnabled和invokeMenuItem
- 插件设置
>在每个插件初始化前调用init函数前插件设置窗口对象已经与传递到插件内的DockPluginProxyInterface子类DockPluginProxy的对应对象做好相应信号的连接。当插件初始化完成后即可调用DockPluginProxy的infoChangedEvent方法参数为InfoTypeConfigurable、InfoTypeEnable或者InfoTypeTitle这样设置窗口就会读取插件的信息并显示到设置窗口中。
### 显示模式管理
- 不同显示模式的常量值特别是size
> - 常量值在dockconstants.h中定义
> - DockModeData提供的单例对象控制在不同显示模式下常量的使用
- 显示模式改变的通知
> 每个与显示模式相关的模块或者类都应该连接DockModeData类的dockModeChanged信号在收到该信号后重新调用该对象的方法getDockHeight即可获取不同显示模式下合适的常量值。
### 隐藏模式管理
- 移动鼠标切换Dock的隐藏与显示状态
>实际上Dock隐藏时只是把主窗口高度降低到了 1 像素一个像素依然足够接受鼠标的移入事件。鼠标移入后即显示Dock主窗口当鼠标移出到Dock的区域以外后使用后端提供的方法使主窗口隐藏。
- 移动窗口切换Dock的隐藏与显示状态
>由后端检测只需要根据状态改变显示或者隐藏Dock主窗口即可
- 使用快捷键(Super+H)切换Dock的隐藏与显示状态
>由后端检测只需要根据状态改变显示或者隐藏Dock主窗口即可。但是需要注意在按下快捷键时鼠标是否停留在Dock主窗口区域的处理。
### 预览窗口
- 预览窗口的移动
> - 所有App的预览窗口内容与所有插件提供的Applet内容都是共用一个PreviewWindow对象的
> - 当鼠标从某个有预览内容的项移动到另一个同样有预览内容的项时用当前鼠标所在的项的预览内容填充预览窗口填充过程会加入延时以达到流畅过度的效果即可填充完成后请主动调用预览窗口的resizeWithContent函数和showPreview函数以更新预览窗的大小和位置。
- 每项的标题窗口
>每个DockItem都会有一个PreviewWindow对象用于显示标题。当没有预览内容时将使用该对象显示标题。
### 样式管理
- 样式表文件说明
目前样式表控制还有不完善的问题,部分控件的显示不是由样式表控制(如:预览窗口的外边框)。以后会针对样式表的内容整理出一份文档。
- 第三方样式表
> - 第三方样式安装目录
>
>> - /usr/share/dde-dock/style/
>> - ~/.config/deepin/dde-dock/style/
>
> - 第三方样式文件结构
>
>> - 必须在第三方样式安装目录下新建一个以样式名称命名的目录
>> - 以样式名称命名的目录下必须包含一个主要的样式表文件style.qss
>> - 以样式名称命名的目录下可以拥有任意数量的其他资源
>
- 运行过程中切换样式表(如果未来系统统一了样式切换)
样式表的切换接口以DBus接口的方式给出
> - DBus接口
>> com.deepin.dde.dock
>
> - 相关方法
>
>> - currentStyleName(): 返回当前Dock正在使用的样式名称
>> - styleNameList(): 返回当前Dock默认样式和所有第三当样式名称的列表
>> - applyStyle(String styleName): 切换到styleNameList列表中某个有效的样式
>
### 特殊项
- Launcher启动项
使用QProcess启动dde-launcher进程。作为单独的项载入到DockPanel面板中。
- 未来可能加入的启动项
暂无
### 其他扩展
- 竖直方向布局
目前与布局相关的类是支持竖直方向布局的。只要根据需要改进DockPanel和MainWidget类即可。未来如果设计有这样的需求就可以这样做。
## UML & Diagram
### [UML File(Umbrello)](https://github.com/linuxdeepin/dde-dock/files/115295/dde-dock.xmi.zip)
### Diagram
- Use Case Diagram
![dde-dock](https://cloud.githubusercontent.com/assets/5242852/12776747/808aeee8-ca93-11e5-942a-c77ac08d5210.png)
- Class Diagram
1. mainwidget
![mainwidget](https://cloud.githubusercontent.com/assets/5242852/12776749/80a3cc1a-ca93-11e5-9431-1c06bacd828c.png)
2. layout
![layout](https://cloud.githubusercontent.com/assets/5242852/12776751/84e7b282-ca93-11e5-8838-fe9d1e5bca03.png)
3. appmanager
![appmanager](https://cloud.githubusercontent.com/assets/5242852/12776746/807ffd3a-ca93-11e5-8419-3fc2fb45371a.png)
4. pluginmanager
![pluginmanager](https://cloud.githubusercontent.com/assets/5242852/12776750/80b6d742-ca93-11e5-800f-a7c8e42a838e.png)
5. item
![item](https://cloud.githubusercontent.com/assets/5242852/12776748/8099af3c-ca93-11e5-8a17-0f036d18dd20.png)
## List of TODO (Its the good way for contributing)
None.
## List of Workaround
None.
## Others
- [DDE Dock Plugin Development](https://github.com/linuxdeepin/developer-center/wiki/DDE-Dock-Plugin-Development)

View File

@ -1,60 +0,0 @@
# DDE Dock
DDE Dock is Deepin Desktop Environment task bar.
## Dependencies
### Build dependencies
* qmake (>= 5.3)
* [deepin-tool-kit](https://github.com/linuxdeepin/deepin-tool-kit) (developer package)
### Runtime dependencies
* [deepin-tool-kit](https://github.com/linuxdeepin/deepin-tool-kit)
* [dde-daemon](https://github.com/linuxdeepin/dde-daemon)
* gtk+-2.0
* Qt5 (>= 5.3)
* Qt5-DBus
* Qt5-Svg
* Qt5-X11extras
## Installation
### Build from source code
1. Make sure you have installed all dependencies.
2. Build:
```
$ cd dde-dock
$ mkdir Build
$ cd Build
$ qmake ..
$ make
```
3. Install:
```
$ sudo make install
```
When install complete, the executable binary file is placed into `/usr/bin/dde-dock`.
## Getting help
Any usage issues can ask for help via
* [Gitter](https://gitter.im/orgs/linuxdeepin/rooms)
* [IRC Channel](https://webchat.freenode.net/?channels=deepin)
* [Official Forum](https://bbs.deepin.org/)
* [Wiki](http://wiki.deepin.org/)
## Getting involved
We encourage you to report issues and contribute changes
* [Contribution guide for users](http://wiki.deepin.org/index.php?title=Contribution_Guidelines_for_Users)
* [Contribution guide for developers](http://wiki.deepin.org/index.php?title=Contribution_Guidelines_for_Developers)
## License
DDE Dock is licensed under [GPLv3](https://github.com/linuxdeepin/developer-center/wiki/LICENSE).

View File

@ -1,15 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = dde-dock \
dde-dock-systray-plugin \
dde-dock-shutdown-plugin \
dde-dock-trash-plugin
DEFINES += QT_MESSAGELOGCONTEXT
# Automating generation .qm files from .ts files
system($$PWD/translate_generation.sh)
qm_files.files += translations/*.qm
qm_files.path = /usr/share/dde-dock/translations/
INSTALLS += qm_files

View File

@ -1,4 +0,0 @@
{
"api_version" : 1.0,
"sys_plugin" : true
}

View File

@ -1,22 +0,0 @@
QT += core gui widgets
TARGET = dde-dock-shutdown-plugin
TEMPLATE = lib
CONFIG += plugin c++11
SOURCES += \
shutdownplugin.cpp
HEADERS += \
shutdownplugin.h
INCLUDEPATH += ../dde-dock/src/
DISTFILES += dde-dock-shutdown-plugin.json
target.path = $${PREFIX}/lib/dde-dock/plugins/
INSTALLS += target
QMAKE_MOC_OPTIONS += -I/usr/include/
RESOURCES += \
resources.qrc

View File

@ -1,6 +0,0 @@
<RCC>
<qresource prefix="/icons">
<file>icons/normal.svg</file>
<file>icons/fashion.svg</file>
</qresource>
</RCC>

View File

@ -1,140 +0,0 @@
/**
* 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.
**/
#include "shutdownplugin.h"
#include "interfaces/dockconstants.h"
#include <QLabel>
#include <QDebug>
#include <QTimer>
#include <QCoreApplication>
using namespace Dock;
const QString PLUGIN_ID = "shutdown";
ShutdownPlugin::ShutdownPlugin(QObject *parent)
: QObject(parent)
{
m_mainWidget = new QLabel;
}
QString ShutdownPlugin::getPluginName()
{
return QString(QCoreApplication::translate("HomeScreen", "Shutdown"));
}
void ShutdownPlugin::init(DockPluginProxyInterface *proxy)
{
m_proxy = proxy;
m_proxy->itemAddedEvent(PLUGIN_ID);
changeMode(m_proxy->dockMode(), m_proxy->dockMode());
}
void ShutdownPlugin::changeMode(Dock::DockMode newMode, Dock::DockMode oldMode)
{
Q_UNUSED(oldMode)
switch (newMode)
{
case Dock::FashionMode:
m_mainWidget->setFixedSize(APP_ITEM_FASHION_ICON_SIZE, APP_ITEM_FASHION_ICON_SIZE);
m_mainWidget->setPixmap(QPixmap(":/icons/icons/fashion.svg"));
break;
case Dock::ClassicMode:
case Dock::EfficientMode:
m_mainWidget->setFixedSize(APPLET_CLASSIC_ICON_SIZE, APPLET_CLASSIC_ICON_SIZE);
m_mainWidget->setPixmap(QPixmap(":/icons/icons/normal.svg"));
break;
}
m_proxy->infoChangedEvent(DockPluginInterface::InfoTypeItemSize, PLUGIN_ID);
}
QStringList ShutdownPlugin::ids()
{
return QStringList();
}
QString ShutdownPlugin::getName(QString id)
{
Q_UNUSED(id)
return getPluginName();
}
QString ShutdownPlugin::getTitle(QString id)
{
Q_UNUSED(id)
return getPluginName();
}
QString ShutdownPlugin::getCommand(QString id)
{
Q_UNUSED(id)
return QString("dbus-send --print-reply --dest=com.deepin.dde.shutdownFront /com/deepin/dde/shutdownFront com.deepin.dde.shutdownFront.Show");
}
QWidget *ShutdownPlugin::getItem(QString id)
{
Q_UNUSED(id)
return m_mainWidget;
}
QWidget *ShutdownPlugin::getApplet(QString id)
{
Q_UNUSED(id)
return nullptr;
}
QString ShutdownPlugin::getMenuContent(QString id)
{
Q_UNUSED(id)
return QString();
}
void ShutdownPlugin::invokeMenuItem(QString id, QString itemId, bool checked)
{
Q_UNUSED(id)
Q_UNUSED(itemId)
Q_UNUSED(checked)
}
void ShutdownPlugin::setEnabled(const QString &id, bool enabled)
{
Q_UNUSED(id)
Q_UNUSED(enabled)
}
bool ShutdownPlugin::configurable(const QString &id)
{
Q_UNUSED(id)
return false;
}
bool ShutdownPlugin::enabled(const QString &id)
{
Q_UNUSED(id)
return true;
}
QPixmap ShutdownPlugin::getIcon(QString id)
{
Q_UNUSED(id);
return QPixmap();
}

View File

@ -1,50 +0,0 @@
/**
* 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.
**/
#ifndef SHUTDOWNPLUGIN_H
#define SHUTDOWNPLUGIN_H
#include <QObject>
#include <QLabel>
#include "interfaces/dockplugininterface.h"
#include "interfaces/dockpluginproxyinterface.h"
class ShutdownPlugin : public QObject, public DockPluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.deepin.Dock.PluginInterface" FILE "dde-dock-shutdown-plugin.json")
Q_INTERFACES(DockPluginInterface)
public:
explicit ShutdownPlugin(QObject *parent = 0);
void init(DockPluginProxyInterface *proxy) Q_DECL_OVERRIDE;
void changeMode(Dock::DockMode newMode, Dock::DockMode oldMode) Q_DECL_OVERRIDE;
void invokeMenuItem(QString id, QString itemId, bool checked) Q_DECL_OVERRIDE;
void setEnabled(const QString &id, bool enabled) Q_DECL_OVERRIDE;
bool configurable(const QString &id) Q_DECL_OVERRIDE;
bool enabled(const QString &id) Q_DECL_OVERRIDE;
QPixmap getIcon(QString id) Q_DECL_OVERRIDE;
QString getPluginName() Q_DECL_OVERRIDE;
QString getName(QString id) Q_DECL_OVERRIDE;
QString getTitle(QString id) Q_DECL_OVERRIDE;
QString getCommand(QString id) Q_DECL_OVERRIDE;
QString getMenuContent(QString id) Q_DECL_OVERRIDE;
QStringList ids() Q_DECL_OVERRIDE;
QWidget *getItem(QString id) Q_DECL_OVERRIDE;
QWidget *getApplet(QString id) Q_DECL_OVERRIDE;
private:
DockPluginProxyInterface *m_proxy;
QLabel *m_mainWidget;
};
#endif // SHUTDOWNPLUGIN_H

View File

@ -1,30 +0,0 @@
<interface name="com.deepin.dde.TrayManager">
<method name="EnableNotification">
<arg type="u" direction="in"></arg>
<arg type="b" direction="in"></arg>
</method>
<method name="GetName">
<arg type="u" direction="in"></arg>
<arg type="s" direction="out"></arg>
</method>
<method name="Manage">
<arg type="b" direction="out"></arg>
</method>
<method name="RequireManageTrayIcons"></method>
<method name="RetryManager"></method>
<method name="Unmanage">
<arg type="b" direction="out"></arg>
</method>
<signal name="Removed">
<arg type="u"></arg>
</signal>
<signal name="Added">
<arg type="u"></arg>
</signal>
<signal name="Changed">
<arg type="u"></arg>
</signal>
<property name="TrayIcons" type="au" access="read">
<annotation name="org.qtproject.QtDBus.QtTypeName" value="QUintList"/>
</property>
</interface>

View File

@ -1,310 +0,0 @@
/**
* 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.
**/
#include <QLabel>
#include <QPixmap>
#include <QEvent>
#include <QTimer>
#include <QDebug>
#include "trayicon.h"
#include "compositetrayitem.h"
// these two variables are decided by the picture background.
static const int Margins = 4;
static const int ColumnWidth = 20;
CompositeTrayItem::CompositeTrayItem(QWidget *parent) :
QFrame(parent),
m_isCovered(true),
m_isFolded(false)
{
setFixedSize(1, 1);
setObjectName("CompositeItem");
m_cover = new QLabel(this);
m_cover->setFixedSize(48, 48);
m_cover->setPixmap(QPixmap(":/images/darea_cover.svg"));
m_cover->move(QPoint(0, 0));
m_coverTimer = new QTimer(this);
m_coverTimer->setInterval(500);
m_coverTimer->setSingleShot(true);
m_updateTimer = new QTimer(this);
m_updateTimer->setInterval(500);
m_updateTimer->setSingleShot(false);
m_updateTimer->start();
m_foldButton = new DImageButton(":/images/fold-button-normal.svg",
":/images/fold-button-hover.svg",
":/images/fold-button-press.svg",
this);
m_foldButton->setFixedSize(18, 18);
m_foldButton->hide();
m_unfoldButton = new DImageButton(":/images/unfold-button-normal.svg",
":/images/unfold-button-hover.svg",
":/images/unfold-button-press.svg",
this);
m_unfoldButton->setFixedSize(18, 18);
m_unfoldButton->hide();
connect(m_coverTimer, &QTimer::timeout, this, &CompositeTrayItem::tryCoverOn);
connect(m_updateTimer, &QTimer::timeout, this, &CompositeTrayItem::handleUpdateTimer);
connect(m_foldButton, &DImageButton::clicked, this, &CompositeTrayItem::fold);
connect(m_unfoldButton, &DImageButton::clicked, this, &CompositeTrayItem::unfold);
}
CompositeTrayItem::~CompositeTrayItem()
{
qDebug() << "CompositeTrayItem destroyed.";
}
void CompositeTrayItem::addTrayIcon(QString key, TrayIcon * icon)
{
m_icons[key] = icon;
icon->setParent(this);
this->relayout();
}
void CompositeTrayItem::remove(QString key)
{
TrayIcon * icon = m_icons.take(key);
if (icon) {
icon->setParent(NULL);
icon->deleteLater();
this->relayout();
}
}
Dock::DockMode CompositeTrayItem::mode() const
{
return m_mode;
}
void CompositeTrayItem::setMode(const Dock::DockMode &mode)
{
if (m_mode != mode) {
m_mode = mode;
this->relayout();
}
}
void CompositeTrayItem::clear()
{
foreach (TrayIcon * icon, m_icons.values()) {
icon->deleteLater();
}
m_icons.clear();
}
bool CompositeTrayItem::exist(const QString &key)
{
return m_icons.keys().indexOf(key) != -1;
}
QStringList CompositeTrayItem::trayIds() const
{
return m_icons.keys();
}
void CompositeTrayItem::coverOn()
{
m_coverTimer->stop();
m_cover->raise();
m_cover->setVisible(true);
m_isCovered = true;
}
void CompositeTrayItem::coverOff()
{
m_cover->lower();
m_cover->setVisible(false);
m_isCovered = false;
}
void CompositeTrayItem::tryCoverOn()
{
QPoint globalPos = mapToGlobal(QPoint(0, 0));
QRect globalGeometry(globalPos, size());
if (!globalGeometry.contains(QCursor::pos()) &&
(m_icons.keys().length() <= 4 || m_isFolded) &&
m_mode == Dock::FashionMode)
{
coverOn();
}
}
void CompositeTrayItem::handleTrayiconDamage()
{
m_coverTimer->stop();
unfold();
QList<TrayIcon*> items = m_icons.values();
for (int i = 0; i < items.length(); i++) {
TrayIcon * icon = items.at(i);
icon->updateIcon();
}
}
void CompositeTrayItem::handleUpdateTimer()
{
QList<TrayIcon*> items = m_icons.values();
for (int i = 0; i < items.length(); i++) {
TrayIcon * icon = items.at(i);
icon->updateIcon();
}
}
bool CompositeTrayItem::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Enter) {
//disable parent's hover event
return true;
}
return QFrame::eventFilter(obj, event);
}
void CompositeTrayItem::resizeEvent(QResizeEvent * event)
{
emit sizeChanged();
QFrame::resizeEvent(event);
}
void CompositeTrayItem::enterEvent(QEvent * event)
{
coverOff();
QFrame::enterEvent(event);
}
void CompositeTrayItem::leaveEvent(QEvent * event)
{
m_coverTimer->start();
QFrame::leaveEvent(event);
}
void CompositeTrayItem::fold()
{
m_isFolded = true;
relayout();
}
void CompositeTrayItem::unfold()
{
m_isFolded = false;
coverOff();
relayout();
}
void CompositeTrayItem::relayout()
{
uint childrenCount = m_icons.keys().length();
uint columnCount = 2;
if (childrenCount <= 4) {
columnCount = 2;
} else if (childrenCount <= 6) {
columnCount = 3;
} else if (childrenCount <= 8) {
columnCount = 4;
} else if (childrenCount <= 10) {
columnCount = 5;
} else if (childrenCount <= 12) {
columnCount = 6;
}
if (m_mode == Dock::FashionMode) {
QList<TrayIcon*> items = m_icons.values();
if (m_isFolded) {
columnCount = 2;
} else if (columnCount > 2 && childrenCount % 2 == 0) {
columnCount += 1;
}
QString style = QString("QFrame#CompositeItem { background-image: url(':/images/darea_container_%1.svg') }").arg(columnCount * 2);
setStyleSheet(style);
setFixedSize(Margins * 2 + ColumnWidth * columnCount, 48);
int placesCount = items.length();
if (m_isFolded && placesCount > 3) { placesCount = 3;}
for (int i = 0; i < items.length(); i++) {
TrayIcon * icon = items.at(i);
if (i < placesCount) {
icon->maskOn();
int x = i % columnCount * ColumnWidth + Margins + (ColumnWidth - 16) / 2;
int y = i / columnCount * ColumnWidth + Margins + (ColumnWidth - 16) / 2;
icon->move(x, y);
icon->show();
icon->updateIcon();
} else {
icon->hideIcon();
}
}
if (columnCount > 2) {
m_foldButton->move((columnCount - 1) * ColumnWidth + Margins + (ColumnWidth - 16) / 2,
ColumnWidth + Margins + (ColumnWidth - 16) / 2);
m_foldButton->show();
m_unfoldButton->hide();
} else if (m_isFolded) {
m_unfoldButton->move((columnCount - 1) * ColumnWidth + Margins + (ColumnWidth - 16) / 2,
ColumnWidth + Margins + (ColumnWidth - 16) / 2);
m_unfoldButton->show();
m_foldButton->hide();
} else {
m_foldButton->hide();
m_unfoldButton->hide();
}
if (m_isCovered) {
m_cover->raise();
m_cover->show();
} else {
m_cover->hide();
}
} else {
m_cover->hide();
setStyleSheet("");
setFixedSize(childrenCount * Dock::APPLET_CLASSIC_ICON_SIZE + (childrenCount - 1) * Dock::APPLET_CLASSIC_ITEM_SPACING,
Dock::APPLET_CLASSIC_ICON_SIZE);
QList<TrayIcon*> items = m_icons.values();
for (int i = 0; i < items.length(); i++) {
TrayIcon * icon = items.at(i);
icon->maskOff();
icon->move(i * (Dock::APPLET_CLASSIC_ICON_SIZE + Dock::APPLET_CLASSIC_ITEM_SPACING), 0);
icon->show();
icon->updateIcon();
}
}
}

View File

@ -1,76 +0,0 @@
/**
* 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.
**/
#ifndef COMPOSITETRAYITEM_H
#define COMPOSITETRAYITEM_H
#include <QFrame>
#include <QMap>
#include <dimagebutton.h>
#include "interfaces/dockconstants.h"
DWIDGET_USE_NAMESPACE;
class TrayIcon;
class QLabel;
class CompositeTrayItem : public QFrame
{
Q_OBJECT
public:
explicit CompositeTrayItem(QWidget *parent = 0);
virtual ~CompositeTrayItem();
void addTrayIcon(QString key, TrayIcon * item);
void remove(QString key);
void setMode(const Dock::DockMode &mode);
void clear();
bool exist(const QString &key);
QStringList trayIds() const;
Dock::DockMode mode() const;
void coverOn();
void coverOff();
signals:
void sizeChanged();
public slots:
void handleTrayiconDamage();
void handleUpdateTimer();
protected:
bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE;
void enterEvent(QEvent *) Q_DECL_OVERRIDE;
void leaveEvent(QEvent *) Q_DECL_OVERRIDE;
private:
Dock::DockMode m_mode;
QMap<QString, TrayIcon*> m_icons;
QPixmap m_itemMask;
QLabel * m_cover;
QTimer * m_coverTimer;
QTimer * m_updateTimer;
DImageButton * m_foldButton;
DImageButton * m_unfoldButton;
bool m_isCovered;
bool m_isFolded;
void relayout();
private slots:
void tryCoverOn();
void fold();
void unfold();
};
#endif // COMPOSITETRAYITEM_H

View File

@ -1,37 +0,0 @@
/**
* 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 TrayManager -p dbustraymanager ./com.deepin.dde.TrayManager.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 "dbustraymanager.h"
/*
* Implementation of interface class TrayManager
*/
TrayManager::TrayManager(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent)
: QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent)
{
QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage)));
}
TrayManager::~TrayManager()
{
QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage)));
}

View File

@ -1,4 +0,0 @@
{
"api_version" : 1.0,
"sys_plugin" : true
}

View File

@ -1,34 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2015-06-29T20:08:12
#
#-------------------------------------------------
QT += core gui dbus x11extras
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
PKGCONFIG += xcb xcb-image xcb-composite dtkbase dtkwidget
CONFIG += plugin c++11 link_pkgconfig
TARGET = $$qtLibraryTarget(dde-dock-systray-plugin)
TEMPLATE = lib
INCLUDEPATH += ../dde-dock/src/
SOURCES += systrayplugin.cpp \
dbustraymanager.cpp \
compositetrayitem.cpp \
trayicon.cpp \
../dde-dock/src/dbus/dbusentrymanager.cpp
HEADERS += systrayplugin.h \
dbustraymanager.h \
compositetrayitem.h \
trayicon.h \
../dde-dock/src/dbus/dbusentrymanager.h
RESOURCES += images.qrc
DISTFILES += dde-dock-systray-plugin.json
target.path = /usr/lib/dde-dock/plugins/
INSTALLS += target

View File

@ -1,16 +0,0 @@
<RCC>
<qresource prefix="/">
<file>images/darea_container_4.svg</file>
<file>images/darea_container_6.svg</file>
<file>images/darea_container_8.svg</file>
<file>images/darea_container_10.svg</file>
<file>images/darea_container_12.svg</file>
<file>images/darea_cover.svg</file>
<file>images/fold-button-normal.svg</file>
<file>images/fold-button-hover.svg</file>
<file>images/fold-button-press.svg</file>
<file>images/unfold-button-normal.svg</file>
<file>images/unfold-button-hover.svg</file>
<file>images/unfold-button-press.svg</file>
</qresource>
</RCC>

View File

@ -1,249 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 108 48" style="enable-background:new 0 0 108 48;" xml:space="preserve">
<g style="display:none;opacity:0.5;">
<rect x="0.033" y="-0.014" style="display:inline;" width="106" height="48"/>
</g>
<g>
<image style="overflow:visible;opacity:0.3;" width="442" height="192" xlink:href="data:image/png;base64,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" transform="matrix(0.24 0 0 0.24 1.0335 2.9978)">
</image>
<g>
<g>
<path style="fill:#068CED;" d="M78.186,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L78.186,25.004z"/>
<path style="fill:#068CED;" d="M98.186,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L98.186,25.004z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="73.984" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="94.004" cy="35.004" r="9"/>
<path style="fill:#068CED;" d="M58.186,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L58.186,25.004z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="94.004" cy="15.031" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="74.015" cy="34.941" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.984" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="54.015" cy="34.941" r="9"/>
<path style="fill:#068CED;" d="M38.186,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L38.186,25.004z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="13.984" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="14.015" cy="34.941" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="33.984" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="34.015" cy="34.941" r="9"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1,263 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 128 48" style="enable-background:new 0 0 128 48;" xml:space="preserve">
<g style="display:none;opacity:0.5;">
<rect x="-5.016" y="-0.014" style="display:inline;" width="124" height="48"/>
</g>
<g>
<image style="overflow:visible;opacity:0.3;" width="525" height="192" xlink:href="data:image/png;base64,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" transform="matrix(0.24 0 0 0.24 0.9939 2.9978)">
</image>
<g>
<g>
<path style="fill:#068CED;" d="M98.146,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L98.146,25.004z"/>
<path style="fill:#068CED;" d="M118.146,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L118.146,25.004z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="93.944" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="113.964" cy="35.004" r="9"/>
<path style="fill:#068CED;" d="M78.146,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L78.146,25.004z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="113.965" cy="15.031" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="93.975" cy="34.941" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="73.944" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="73.975" cy="34.941" r="9"/>
<path style="fill:#068CED;" d="M58.146,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L58.146,25.004z"/>
<path style="fill:#068CED;" d="M38.146,25.004l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L38.146,25.004z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="13.944" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="13.975" cy="34.941" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="33.944" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="33.975" cy="34.941" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.944" cy="14.984" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.975" cy="34.941" r="9"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,177 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
<g style="display:none;opacity:0.5;">
<rect y="-0.014" style="display:inline;" width="48" height="48"/>
</g>
<g>
<image style="overflow:visible;opacity:0.3;" width="192" height="192" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMQAAADECAYAAADApo5rAAAACXBIWXMAAC4jAAAuIwF4pT92AAAA
GXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAHxNJREFUeNrsXQtXGzuvlWcGEqBA
e/7/byxtKa+QZL7DuuN7xEaSNa88pbW8kgIlg+StLcm2TBQSEvL/ks7ob2nD3JPpsw1AHMfzpoEG
bGPSu79/0rpMR/h8qcf3NQO1Pb5/6gDoo8+T12VzBEZLPV9Lnqv0emrgSIX3Q/R5srpsDtho/DUp
/04OQ6IHa8Fw0khH7u00fXp0aOlTmviWLvFnDl6XzYEZTjJYJbyvFKNaOYQ2tvDaGsY9ZGNaIJCG
R5dpB7o8KH02ezaeZrgKDMZHLXw/v1oMgQbzDDTuIYYBklOxJn9p8J+3GKKPLksgSYcCjHQgQECD
1cKrNCRDkqBgNOBGeJWGZlgpXDgkIHB9lHQp/QyCAh1AH11KP6MBZO9Optmz8STvX3fPlV/5qOF9
LTBGAkC0gifjBlvD2Aj/5gZNAIx9sEWJWeue+rScTBLCJUuXlk4lkGx75HAnAYhUAEItGOuiG/z9
BXzdAoXm0TQgvCtjzV7X8P+TwBhzG9IDBGnia/qUAJIHMm7+u0q6XCs6fFeAslEYeC9M0ewADNmI
SOPceNxIl8bI32+YQdGIkldDb4bGWzkGNy4CY7sD2pfCTA0IF6AvTY8SMGoInTSGsBzLytDrO+gT
gZEE9m2PHRBajsAnL4JgIYxl93rJXi8VppBovi0AAo32BuMV/r0qGHMutvAwQkmXfFwWdKkxbkmX
JX2+Cfrk7JF/JzL7zkKoZmYwSEBoFMNddQBYwvulYUgNENTDiGi8VzZe4PVVMWbV/T6JLdqZWAHD
IXQkkh6X8HMXii6HAiLr5E3Rp6TLV2aD/HsSAGNnxYtmBjCgJ7OAkA123b3Pr/k9GlLyarWDIdqC
V0MDZqM9d+/xlRu0BiNyLzeG8i3HIgFhyXR3Jei0pMsLISfzhEwbyBm4g0EgSPq87N433f+rQJ/b
XYZQzYxgwLgWgZCN9TFu4JUDIxvRww4aQ6Bnk3IIBEQeT53hnrrneQJDZmBwQ9JIQ1qOhYdGnAks
XWrO5cLhXDCp1lgCQYGAeGbjqRvL7vWC6ZJ//hqYd/YQqpkBDDy+ReNxIHwY7Bu83jBDXhkGbBzs
QAWW2AixL4KCG/AvMyI3pJbDrAfGwpZj4Qy7BF1q+uTOBcMlTKgrgR1SQZdbJbHmrPvC9Jl1ed29
LsC+koNbC88wC1M0M4EBKT0bhBvuY9yy998EhliyCXChVJas1dVWYAmtZCh5Nm7EbED+XNIz4RaU
DZQrLVCUHAtn2GtFl7cACM60iwLL1vR1OwcZjNvCuoKWm3Fd3jBdcocnObtX0MlU4ehsgLDAcCl4
sVs27th79GgaM9RKrVzb6NcqK9ZbJYTihuRUf6142stCuPGuTCbJkF7Hkp/lG+gz6xSdy5XBsl7H
Ik1AacXaYl4OiisDqB7mnw0UzUxg4JR+w4z3YbD77vXOMCCfcA2AoVJWpkub+zwr19yQy86QV0I+
sxC8rZSMVgXvJukT8wV0LFlfdzA4MCwwaLmXFiZp5yE0XW4N5uV6vBJ0KYVwGltt5ihxNyPAgEZE
MHBWyEDggwMCmUHyZNa+pdIefs2QrWHIRWfIJayJLJTQoy4kpZJ3axUwSCx7A0xwD68cDDeKY8Fc
QdvtSg6G0HTZCrmFd13kopCXkQCKdGgMIRmQU/qHwb6zwQFhgUGjzj5AsJhC83JNp2hcOV8oK759
9lZplK+BIXvUb4ZjuQemRZaVws1SqJlG6rLuXhvGjKVdCNZ6SCqAcztV6NSMAEIFRuTeLBswg+AH
e+UejYNBislLW5LTQGaTjFkxY25h4UvaF3RB+haSyhHGbdnnVwbLcsciORcNDJh7WaEmDdBnMhij
Yq9Zn7WhR2lflbYwqB1CmiSfaAaCQfJoCwDDPQPBPwwUOVSSwNA4vKx2xJR6sISUfLfgrUsb5rRN
cSWvRkJtn1eTEAx3AIQfwLS3Qv516WAFTXdpoC6l9YqKAV/aw6btvK16AKKlCbd5NAM8gpVE3zAj
Ihh+gEe7hpKblkiN8WLkMHjLPoPTvXagpi4MDzvksCkbjrPsFTADB8IPYIdbQZeXgi4tIKQZdIkO
tCV5D1bpnAsZ1UE8pzJJcj2UIaRQSfJoP8CQPG9AMJRi77kOM2m/N1O9BYyqEI5oMW9ebNqyPCzn
KajHH4IeEQxXRtnyEHTpPcGnsat2/mLyQ0ZNTyAkoPdLobx6B9T+HfIGTu2eisIuT/XhZ1XAIIn0
45alQzXci+X9TxkQnB0kZvgHwGCxrHaeYd+6JAGglaLTBMwgHULCE3rbKUKnpscfJiXSPFTCKogE
hhtWTUIwlHIF2rExMZSyvJ22j4oEMFQCIHLYmZ1K1t8/wA4IhiulKndoutT0mkg/rmrtmcKDW5OF
Tn0ZAtlhIbDDvVJevTbAUB2I8bQqilWm9Han4E7lolvj4IDIesRQ6R/mXG4Zy2oh5yGBQXMy5Cg8
8DBJO9konUkZFTo1PdhBWoCTwHAvsMKNI0w6JOOVDJl1Z/WCkgBRsfCIA4KHS3dKEn1n5AzVEelS
qkg1ZJ+7kA4faYe1WihpzxIyWWVW3Joh7VFaKklfOnADlrwb9QBEYuy67Iy56X4XB8Q9Y4jvSphk
McOh65KEypOmN2tflHSKMbNENZQlmh65Q03l7RkcEN+MdYZjM6D2jLWzRp6AHa4YQ1QCQ0jbW04F
DBYoGiWZXpN8xuKVPp9eXNPXpgWTMkQqhEvSrstvhQrIMVB7H2DUhfwBc4cPfbwAIHgOgUx7UyhT
pyPXJYIis+i2+3utrfkSKDaMeXuzhBcQ/AzvJel78nFvEu6lOXYwlEAh1cOTEC69sCpTxb5+7dDl
qYBByiWwcLNVGIIfQ80jg0KqPI1mCOv4orS1WzMgnoLa1/rCLkBRFfTJw6VXZrSKlbD5eYc8FicM
BkmXfE/ZRQeIrJu3bo7x04x5cKaogSXcpVgPQ2gHf7jRpKOfl+RbgT4lQ2ohFNffknmyFsDCnY21
4fGUwCDpk28KzE74nb4emf0Y+TRjDqEuWD7B59vokAnP9UqHf65JPgNdMiKdoBEJKiboVLL+VpD8
4TYY3GbenBEY2kJVc8kmP4IiO5BXpi/e/GwwIJICBswfOL1f0dezxudgRM27WYDgiR/PQbB5W+lc
wKk6lxbm3tZwxjj/cjeUNyNMb8cwBB50R1qXzsaeKxikxTvpiO0l81wEIQI2J9b2eJ2qHkvRidS9
5Yr0MzW5iZybJUpJtXSKCwGhdU449VDJAwoEhLZlWTqD4T0Pcsp65Al2Q59PL2pn3XHxd91HZ00h
XLIAoTW+as7Uq0mgQGDwwyxUAFA6QzBYwMA8S3LMpXk4iiEqAxALKreKObWK0tA4GMt+/BAS5h9W
F5F0xjqsSO8CiZ1QcB5q94b0SqqpwBBax4RzSgA9CTYeV9VWTj23g56jeKIVaS5a57JnySGkB+hz
nvgcPZ0GFIsBUuhOzK/4fNQ6d0hnyXsBwrqDoPQApT355w4KZIXk/PmQr2G8dieG1skc5+Ogsmty
PIDnw8PAMdmn0JfmpEvtbKxjySIwKgcYKrL7EnnaDoaETJ1L1KTfQWh1UDTnZlVAZDI+3LrOKkAR
MhcopFY2Vq+sXvOxcqBR66PjaTkYoAiZGxQaEKohUUs1ApEWMwQQQuYAgpbf1uS7STV5AWFdrG5t
KxiEwpCQgYUIaZsLAqOaiiG0urjWZS3YIWSfybUFDmtuDk6qtSQ7yqoh+2YKoq/dEgeDwJtDWPGb
9T4kZFcsYc3RQXOyCv2GhPQDhNYasDV+JiRkLmmV+SbdZNSOBURrvFojJGQXQNCAIR28GjRHq8IH
Euk3TQZAQvbJDt5LVNo+UUylhD8SENrCB4eE7IIZLHbgXcC3NOAilaqARO1ibvzgLdmXkoeETMkM
1py0bhgalFRrtGR9cEsT9OYPCXECQ2KFtcNZt30BIYVLeJ0RDs99XyEhU4kGhrUCisFJtQQK/sFr
ByC2AYSQmZmhFebk+1SO2pNDbIQPl6406k1PISE9EmptTr4L81ILm4qhfOXI3jkYpOuMShdVBDBC
pkqoNQe9cjjp3iFTayQveK2RFxQBhpCpQIG5A17AiHfO8YLP4KSaDIbgH/pGn+/4QlBIiyIhIUPC
JWQI6c45bS72ds7eHEK71ki742tQhh8SYoRLG2UuIiBWyjykuQDxSuWL72KxLmRKdsDQnYMB56B0
AePgKhNOYAQEfwh+v1d+ILxdPsAQMpYdcA5qkQrOwclWqj0MkYHwbIBCyvIDGCFD2AGdMjrkFyGP
GHTxYtUDoRyZeOndi4DSjZJgh4QMZQc+/15g/uFNpIOqTE0BobzuizlEfpgn+u/iO7xWi7cC0bpd
h4SQUlGSLm5/MRwyRii9nXHTE6X4UE9s3NDXq7W0K6HaAEVIwRFbkQmfdxwQo8IlIvkKWe7BtRuF
tObHvDe/1MyMKDp2hPjzhgyGDITHf8eff8cvNn53X/vbAeSVPm/h6MUStfE9q0FUqdks756mdVAL
UIRYzLBmIfpzN+EfAQwZEI/d93n5tfcahAcQUvvARF9bCGodwTkYrFb5AYoAg5RE52pSBsNvBoSH
7vVP971nFjZNHjJZAJH6avJ+r6Wms1WAIoR85dWcp+ZQ6YENzg5P3c+uABC9y/21EwRaPmEBQ+uv
mYIpAgwKGDb0ea3hqWOH34wVHoTcgbPDqLM5dc+f12508TScLfWCDVAEM/AVaEyiH+AV2eGNJtgl
UTtB4On1WkGOITVJTsEUAQYq74TISfQfyBl+KmDIlSVcf+gt9YD/k5ScovQ+BSgCDI6cgYPhN+QN
D93XfguhUmaHURtK6wEg0L6WCqNy/EyAIsDwyMDAmUECQw6V3mmic/19q0zkmKjWJE8BigBDgRke
hSRayhueSd5MSkPZYWjINEQZQ4ARoDjPMOmXECbhApyVN4zaSNoM/CP5H1e6QKU0mbXv8+u+Yu/T
+YABwyQLDFKoNGpXdTPgj+Q7V/MpJiun8AKjBIqQ4wSFdaZBAsNPBga+Gs3BsCL5iMFoqWfwCER6
W32rQhVbPE6THUr7k3gC/VOoKD1CEo07Wic9plzPrAztIaWFPQsUsRnwNEIlfuKSJ9AcBHytQVqJ
1sKkSRiimeAPJ8juvRUr6wZJ3DbeBhiONlTa0tdV6CeBHXiIxMOkvKV79HnpfVeZtO59pW0fcSn8
8bMDD5dwFfpJqChhAr0XMIxliL5MUTpgxEfeRo5/eFScjjeZ5uES38H6GwZfZ9gpGKYCRAkU0s7Y
DIJlN67YyHHiJUWzs1MIl7akl1pzHvHIkucnIWfYCRimBIQEigTeoaavLUTwgLjUdW3LQrtgh+MC
htSkQjuTL3XP2CkYpgYEAoODQmo0hQ2Ttb7+BCFTyHHkD9xuVhtK3r7IA4RZo4VqRqUQ+W+MxIsd
8f+HHB8wtHaU3tuo9tJFfmpASNs2tBKrdnioEv5/SMhRAoLI16FDqyrh8dMUwDg60bbwSPMBh3X0
eCfSzAAE/OMbNvEXUFXi3f4W9F9fJ1SMxkAhhwUEbYsOOsU8F/J8WLJ/r0juDZyM0PzgACF15MA/
/mPif3T3+wbjhgFjQXIbzADCcQJEKrUvmEO8Ib3KKOUP27lBUc8MhgVjgttufO/Gj258vL/vvpfB
saTPDc+qAMfRhUxEX28Ote483yoVpZ0WVeqZwbBkrHAngCED4o6xBe8N2whMEYA4vqoTVhula3a1
n6FdgqKeEAwV5AucGTgY/mFDYgfMJaTesCGHzw44kT0300rMsFNQ1CP/cN52RgqTODP86EDAX+8d
7MBLsQGG4wRGn8NiuH6xU1A0I//oRPL+pCsBDD8YGL4zMFjMEOcgjrfalMCZtcbwMooElkkT7WYE
EHhpNa8vcDDcdpMe2eH7gLwh5HhBUbFoxLqu2XrfKiyyht+VaMdnqvFcghQq3Qhg0JLoaycYAhTH
HTpVhfBoSILO//9mCjD0BQSfnFhfXghJNAKCJ9AZDFcBhrNgCQsUJaC0jnALw6edtaHBEitfbLlW
QqXvkDPcBhgCFAMYoVSqnWQ1u+kJBCyxalWlewaE71BNCjAEKIaAgC/qaTulc/hEQ0OoxvkHkQKG
XFVCMNwzIGCYxG8pDTAEKErA6LPCve1+9+D+rn0ZAlejl5BI3wEotJwhyqsBCs8d6VJfJ/6qASMN
rTo1jj9Cyx0WwA63AIa7YIaQnqBoC2DI4x3G2gDFLCGTtXHvBgBxR5/XGKScoQowBCgMppD6OvHj
p9bxY61Ty2hAeNkhh0t8fAtmCBkAirabJ1IbmzUDwRt9PoONvV55EWjykKm0rfsbS6hvnTlDbNYL
kUBRCwyxEdjBak7QjGGJIYDAAz83DAS3JB/44afgghlCPExh3UGX29W8AjB4+DSIJeoBQMASK27L
uBfCpYblDnGuIcQKza2qE3bswMRau1prUkDkdQdMoq2tGd5EOiSEChGDlWC/s1BpZSTXbqlG5A9X
LKnGMCkDQeqgEBJSAgXupL6EvPVGmHdYvBk05yoDCLijlYdNucJ0zR6Id8+4oK+NAijyhhBnzio1
xr4UnPE1fe3cgofLekUkJYawkHqlgIF3zYjz0CFjgGF1cLkSHLJVxHHNv2rgA2HHbgkMAYSQKZJs
rXnFFYwFzMFBYVNVCJcsQPCBDxLrDSFzsURpHo7q1lI5wyVPxzWp616AIGQqlqgc8/CS7F0RRWBU
jmxfA4REUY0StwUwQsYm2bVzLo5yzENziEUBkcEOIVOzRAKW0ObjBY1Y+6oK+YMECKlzd3TZC5kb
HHhJ5wUMyTnPVmWSkhr+MFaJNUARMlXYJLXTvxAc8+BopXKAoaLPPfwvhA+PrRkhc4ZNJSfdCJGK
1SQ7eQGRHMlMCYkRLoXMxRKVkNs2gnPG8N0dxpe2bkgXqyNlSeFSEYkhIQOlUualdBPRZFUmKoCi
xAwBhJBd5BMVzMfayGd7JdXJ+FApw9cuTAwghMwNBFLmX03yHXWjyq5SPiGBogp2CNlDYl0K6bX5
2Sse05JqLcmOsmrIIQAkCQlz5Sjw9E6qNbryvg8JmTNs0hx0qco5amEuJOSYWcPFBkMBod3yUrrU
IiRkV9IW5upgQLTGq+dKpJCQOSe9NR+3hXnpmquVgSb8cKn9eAAkZN9ssFXmqOceOxUQrQMIEii2
AYKQHQGABHbANvnWvRGjcgjpthZsPb4xgBEACZkjXOJXZ+HYGMBwO+2q8OGt8oHYn79VPjiAETIX
MKR7IxAUvcP5yhGfIRDW8ABbBorIJULmlq3hpNcCOHqFTVUhadEurMitBPP7wTFbSEgPZsAQXpqL
UjvLrddRN44HsBrMvgtsEewwLFmMlX5bR9qcfId5uSb5mi1XKN84YjSrwax0ewt/AGx3HsYNgIzN
GyQH7ZmPLmngg5MDjSvlIbREJoVBTa+Hkz8Z3ztnHWLugJEKXrG1UXJbNyAkarJucFkpoPgYNcU+
KczHiOzStLZp8lydSqswBEYqeL0Wn4+9y67eHMJ6iDdAppbApDM0JpG+xQBZAM+fICjOkS243qRI
RZqHKyWvpTGAINKvNMofzq8ywtsgB/fnP2HPJm0t4CIdxMLtzOfCFtpuCc88XDnCeDcgrAdZ09cL
714Vlshh05bOq+mAtf9LW7fhDMFPfuEJMDpDUJSilFfS75nbUI9yqzdk4lSlPcgLIHQhPMw5ezVp
DYcnfERf2/3wwRnkHEDRFgDxRp8vXsxDC98nD5kkqsoP9Eyfb4R8o6/XaZ1Da5q2UJ2TKnPZaeTJ
zm9pyt3o8u9rBFCcIzvk+ffC5t8zgGI1R5WJlGSGA+IZxscDafdS8yN+p+bdLI+2FuJdbjQOCGze
i9URBMUpAqMtOBUJDM/gkHnI1HsbUTMApfhQT/R/l989FwBxbmDg9yq/Cp4sswR1esLroiS6b+h0
S7LaliFkhjzn8uCAGBUulQCBhpYY4uOB/tLXi++0Hv2nFDr1iXUlA64AEBkMb/S5fE1Cabam09oJ
4NXlswGIN3A0kyfV5DT0dQcKvPhOuw3yFEKnPgb8243HbvxlBlx3Osj3gF+zr29IXqfgzuTUdLl1
gOEvG8gQuOG09766PgyBsdxzxwh/6b9L8Dz3zaUj924eMLww432A4M+/43f3mg2ZJz51ulp2oedK
AAOyRILq0ynosgSGJwBDdi7PQkLdmxnGAOK9e8jL7iG1++ZKl6gcoyH7giED4WP86l4fO729spAp
A+JFqEB5uiKegi5bBxj+sMEZ4pWBAdcgaMqkOgnGz0nOC/13Tar3mq1KqJgciyGHguGhA8MDAEJi
iDeoPlkdEwlKsseUo/UJOZ8Yy+bxyADB2eF9DDt4GMIKm5ruYXjdnA/t4goSKJ8O3JAStfNCw0oA
wy8GhAcAxLOQQywZO7Q92IFAx4degUJdtoX8C0POP0q4JCXT1BcUteNnSv1drS7MuA2h1Bf20PrF
olJLcW5OnDMYfjIw5K9xuuelQly9JvK1avS+HkvOYDmWn0LoiQn1hkYcUusDCC3B46GP1Da/Jv0W
l1QAQzoQ42ksuTLCpAcGCG5EDoa3giFLAOgz+Q9ZlwiGR0GXnGV/M4bA/GFU95fa+XPJAQzpPonk
AEPqCcRdGQ/DRS8YfgEYHoQKk7YRrbSQ5NHJITkZjy4llvWCAcOl0ef66wH/J/UMp0otydsBn7cr
43lWTSUwPChgeAYwWAtI7UDbtEeiSy1nkMDwSwiVnhWnQiP0NwgQFnP0ofLW+FrpcEyawXBoPC1E
youSuR7+WwFDNuKjkjNo59C1/KX0OtSpTaXPPrp8B10+FZgBQ04rbxjV5KIeqMg0kdfQDDuFkT0A
9Ma30gr9IyR9PwUDeplBmkTSpPI2ne6jyzQw32gH6FJyLE+QQPcBw3vBqewtZPJOtJb0ZrTbgqEt
j5hGgFI6yLNWPJkUIv2CJBoN+OxIoD1A2JJ8+q6vHqkwcdJIJ1fSpbSSL+nyl+BYXozK3CStj2qa
T0qGlPrDbh1GtYDSGs/Rkt2mc6sYD/fR8NXnB4UZeJz7QvqxRk8otDWeV9KbBzCa3loHYCw9enQp
bWvxMIOky8l7CtcTA4CcE0/qwyk1q5XanVve0+Nd8UjnumC8J2GB6JdRAeFgeCX7jK9n3YNIbu67
NXSpgUY7291HlxrwPLrkQHiEfIGHnb+FMOkFmGFLI1elJWkmYoFNgSE8Z2I/NrZddyPvjeKr3tLK
d2mxSvN82BJRasbGn+9ZAAaunvIdmBq1ewy4KZQqpTBkJej0pnvNO5DzScYLpk88u+25UbYv02Zd
8lCJ71r9owxNl4PPS88NiBaqQJsCILSDM/x87A39d/KOGxL3RklbQqoCIKyD/xv62vCKPxffaZkB
8cgMh6xgne3VbrdBUJQmnuZg+Dnja6ZL7mAyMGoBGFgu94TCHAgeXT4BIB5haAd/NnOCYSqG8Hg3
adIhlT53gLgBQ0qg8LAFOWJdq+cUngqUzjX8ZQaWjjGue1B7C46GnItayAz8uUu6tJxMpZS/Lafi
1SVn27+KLvmi23tPXe4NEB7vJvWIlYyIgMBTeBYo0Lvh8/FNZKV4F4H6xCj+CQzHgSDRet/6OGfd
bWFha1OI1b26tJyMtLu2FMJZusTTblyX2LBiVSitztJQu5no92jeTdrRaBnxSfBq0sEjpHxpizkJ
Hk3zZu/0tfEVHmR/oq8H27H9yZoGNsgyQJEctX2pKvbEwMAB0QcU2CTN0xV+5dDlc09dTrbwtitA
SIbEP2CjrPzyZOu6M+QVS64REF4jklChkdqorwxAcKp/oa8td7jx3km+ZmxIORB/fluYkJqDuRIc
CwICWdc65eipKq0Kunwp6NK6YmH2qxaaiX+fZUhvQrgE42kGLBmRCgtFVr/aV2Xwn3kHStdWTNuJ
mbe0HYKzxFJwKuhcPA4G2dZiB6x4cdu+wte09pPSVW1EO7h3JO3gd0vnJniHOjxctFDGpRAyaYAg
gSE2TkNqTXSl7tJrI75td6jLmukj62hh6POyoE8tBLVWoTVQaLp8F9jVurNwJ5fwpB39/uQARsMM
cykYDT0Zr5Dw0qFUZZIWsKTbZ7i3wnb/eG3TPm5h1c6g5Aks6fLC0KUULg0NmbT7Q1YOXW7p6xVY
RHu4jSrt+HNSwcuhQRvBeyEQaiOH8NykuhbAsVYAIBmv3bEn03SZABgefUosqx37LRUo1qRfcVXS
pXYP3M6vZkt7+CyL/hEctTL5Mc7VSoVSvC2xBQJkQ/JNq9sDMZ7ngFbt0CeCwFqLKK1BIDjG6HIv
YNg1IDzAsI6hVoLBxi7MaXustoL3snKEfV0yqQEDTy3WgsOpyG6/z9d0+MKctUlzc8S63BsgSsCw
AKL929pu4Nnop/27z7mDQ7Fj6fRiJYyk6FRbmNO2oVubCY9Cl+lAjUnkO5Ja6luEpcs+ZweskOhQ
rx3uc7zXq1MqOJi++jxoXaYDfpZUAAkZ76kAij7vDx0EQ8Bh6VJrTNAWnIz176PRZTqS5/J2kigB
ghwGOmYQ9AHHUF2WdHjUukxHaNC+X9MM0jp/7tRkDl32+VoA4oCf+9Qn/67nQOgzJCQkJCQkJCQk
JCQkJCQkJCSE/ifAAI5y9xlkGk3oAAAAAElFTkSuQmCC" transform="matrix(0.24 0 0 0.24 1 3.0134)">
</image>
<g>
<g>
<g>
<path style="fill:#068CED;" d="M38.152,25.02l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914
c3.908,3.908,10.244,3.908,14.152,0s3.908-10.244,0-14.152L38.152,25.02z"/>
</g>
<g style="opacity:0.35;">
<circle style="fill:#FFFFFF;" cx="13.95" cy="14.999" r="9"/>
</g>
<g style="opacity:0.35;">
<circle style="fill:#FFFFFF;" cx="33.97" cy="35.019" r="9"/>
</g>
<g style="opacity:0.35;">
<circle style="fill:#FFFFFF;" cx="33.971" cy="15.047" r="9"/>
</g>
<g style="opacity:0.35;">
<circle style="fill:#FFFFFF;" cx="13.981" cy="34.957" r="9"/>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,215 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 68 48" style="enable-background:new 0 0 68 48;" xml:space="preserve">
<g style="display:none;opacity:0.5;">
<rect x="0.023" y="-0.014" style="display:inline;" width="68" height="48"/>
</g>
<g>
<image style="overflow:visible;opacity:0.3;" width="275" height="192" xlink:href="data:image/png;base64,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" transform="matrix(0.24 0 0 0.24 1.0229 2.9833)">
</image>
<g>
<g>
<g>
<path style="fill:#068CED;" d="M38.175,24.989l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914
c3.908,3.908,10.244,3.908,14.152,0s3.908-10.244,0-14.152L38.175,24.989z"/>
</g>
<g>
<path style="fill:#068CED;" d="M58.175,24.989l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914
c3.908,3.908,10.244,3.908,14.152,0s3.908-10.244,0-14.152L58.175,24.989z"/>
</g>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="33.973" cy="14.969" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.993" cy="34.989" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.994" cy="15.017" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="34.004" cy="34.927" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="13.973" cy="14.969" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="14.004" cy="34.927" r="9"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,232 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 88 48" style="enable-background:new 0 0 88 48;" xml:space="preserve">
<g style="display:none;opacity:0.5;">
<rect x="0.006" y="-0.014" style="display:inline;" width="88" height="48"/>
</g>
<g>
<image style="overflow:visible;opacity:0.3;" width="359" height="192" xlink:href="data:image/png;base64,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
rkJggg==" transform="matrix(0.24 0 0 0.24 0.9946 3.0025)">
</image>
<g>
<g>
<path style="fill:#068CED;" d="M58.147,25.009l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L58.147,25.009z"/>
<path style="fill:#068CED;" d="M78.147,25.009l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L78.147,25.009z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.945" cy="14.988" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="73.965" cy="35.009" r="9"/>
<path style="fill:#068CED;" d="M38.147,25.009l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L38.147,25.009z"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="73.965" cy="15.036" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="53.976" cy="34.946" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="33.945" cy="14.988" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="33.976" cy="34.946" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="13.945" cy="14.988" r="9"/>
<circle style="opacity:0.35;fill:#FFFFFF;" cx="13.976" cy="34.946" r="9"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,190 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 48 48" style="enable-background:new 0 0 48 48;" xml:space="preserve">
<g style="display:none;opacity:0.5;">
<polyline style="display:inline;" points="47.996,-0.014 47.996,47.986 -0.004,47.986 -0.004,-0.014 "/>
</g>
<g>
<g>
<image style="overflow:visible;opacity:0.3;" width="192" height="192" xlink:href="data:image/png;base64,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" transform="matrix(0.24 0 0 0.24 1.0175 3.0134)">
</image>
<g>
<path style="fill:#068CED;" d="M38.17,25.02l2.917-2.916c3.908-3.91,3.908-10.249,0-14.158c-3.908-3.91-10.244-3.91-14.152,0
l-2.914,2.912l-2.911-2.914c-3.908-3.908-10.244-3.908-14.152,0c-3.908,3.908-3.908,10.244,0,14.152l2.908,2.911l-2.917,2.916
c-3.908,3.91-3.908,10.249,0,14.158c3.908,3.91,10.244,3.91,14.152,0l2.914-2.912l2.911,2.914c3.908,3.908,10.244,3.908,14.152,0
s3.908-10.244,0-14.152L38.17,25.02z"/>
</g>
</g>
<g>
<path style="fill:#FFFFFF;" d="M41.22,8.082c3.651,3.923-3.183,9.788-3.183,9.788l-4.197,4.197
c-0.464-1.711-1.363-3.269-2.628-4.534c-3.98-3.98-10.456-3.98-14.436,0c-3.98,3.98-3.98,10.456,0,14.436
c3.954,3.954,10.368,3.976,14.354,0.074c0.033-0.016,0.066-0.035,0.094-0.062l10.087-10.087c3.213-3.703,3.076-7.508,2.166-10.123
C42.663,9.436,41.22,8.082,41.22,8.082z M33.07,22.658l-3.625,3.625c0.611-1.966,0.127-3.992-1.427-5.545
c-1.162-1.162-2.892-1.715-4.418-1.666c2.879-1.027,6.172-0.561,8.704,1.465C32.64,21.21,32.902,21.918,33.07,22.658z
M27.563,28.32c-0.002,0.002-0.004,0.003-0.006,0.005c-0.001,0.001-0.002,0.001-0.003,0.002c-0.123,0.123-0.254,0.233-0.383,0.345
c-1.981,1.607-4.905,1.49-6.747-0.352c-1.968-1.968-1.968-5.171,0-7.139s5.171-1.968,7.139,0S29.531,26.352,27.563,28.32z
M16.746,18.569l0.001-0.001c0.162-0.19,0.325-0.379,0.505-0.559c3.717-3.717,9.767-3.717,13.484,0
c0.353,0.353,0.67,0.734,0.96,1.132c-3.618-2.086-8.197-1.637-11.381,1.234c-0.125,0.105-0.249,0.214-0.367,0.331
c-0.003,0.003-0.005,0.006-0.008,0.009l0,0l0,0c-2.222,2.232-2.22,5.854,0.008,8.082c0.91,0.91,2.053,1.442,3.239,1.61
c-2.118,0.226-4.317-0.467-5.936-2.086C14.599,25.667,14.381,21.475,16.746,18.569z M40.624,21.629l-9.818,9.818
c-0.024,0.014-0.049,0.026-0.07,0.046c-3.717,3.717-9.767,3.717-13.484,0c-2.026-2.026-2.939-4.743-2.757-7.399
c0.203,1.721,0.964,3.385,2.281,4.702c2.957,2.957,7.682,3.088,10.807,0.408c0.049-0.039,0.095-0.084,0.142-0.125
c0.075-0.067,0.154-0.128,0.226-0.199c0.033-0.016,0.064-0.038,0.091-0.065l10.47-10.47l0.007,0.007c0,0,3.721-3.485,4.252-6.348
c1.576,3.616-0.104,7.153-1.571,9.029l0.009,0.009l-0.17,0.17C40.803,21.468,40.624,21.629,40.624,21.629z"/>
</g>
<path style="opacity:0.3;fill:#FFFFFF;" d="M33.07,22.658l-3.625,3.625c0.611-1.966,0.127-3.992-1.427-5.545
c-1.162-1.162-2.892-1.715-4.418-1.666c2.879-1.027,6.172-0.561,8.704,1.465C32.64,21.21,32.902,21.918,33.07,22.658z
M16.746,18.569l0.001-0.001c0.162-0.19,0.325-0.379,0.505-0.559c3.717-3.717,9.767-3.717,13.484,0
c0.353,0.353,0.67,0.734,0.96,1.132c-3.618-2.086-8.197-1.637-11.381,1.234c-0.125,0.105-0.249,0.214-0.367,0.331
c-0.003,0.003-0.005,0.006-0.008,0.009l0,0l0,0c-2.222,2.232-2.22,5.854,0.008,8.082c0.91,0.91,2.053,1.442,3.239,1.61
c-2.118,0.226-4.317-0.467-5.936-2.086C14.599,25.667,14.381,21.475,16.746,18.569z M40.624,21.629l-9.818,9.818
c-0.024,0.014-0.049,0.026-0.07,0.046c-3.717,3.717-9.767,3.717-13.484,0c-2.026-2.026-2.939-4.743-2.757-7.399
c0.203,1.721,0.964,3.385,2.281,4.702c2.957,2.957,7.682,3.088,10.807,0.408c0.049-0.039,0.095-0.084,0.142-0.125
c0.075-0.067,0.154-0.128,0.226-0.199c0.033-0.016,0.064-0.038,0.091-0.065l10.47-10.47l0.007,0.007c0,0,3.721-3.485,4.252-6.348
c1.576,3.616-0.104,7.153-1.571,9.029l0.009,0.009l-0.17,0.17C40.803,21.468,40.624,21.629,40.624,21.629z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
<g>
<path style="fill:#FFFFFF;" d="M10.517,5.101l0.41,0.41c0.135,0.135,0.135,0.353,0,0.488L8.171,8.756
c-0.135,0.135-0.135,0.353,0,0.488L10.927,12c0.135,0.135,0.135,0.353,0,0.488l-0.41,0.41c-0.135,0.135-0.353,0.135-0.488,0
L6.374,9.244c-0.135-0.135-0.135-0.353,0-0.488l3.655-3.655C10.164,4.966,10.382,4.966,10.517,5.101z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 812 B

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
<g style="opacity:0.6;">
<path style="fill:#FFFFFF;" d="M10.517,5.101l0.41,0.41c0.135,0.135,0.135,0.353,0,0.488L8.171,8.756
c-0.135,0.135-0.135,0.353,0,0.488L10.927,12c0.135,0.135,0.135,0.353,0,0.488l-0.41,0.41c-0.135,0.135-0.353,0.135-0.488,0
L6.374,9.244c-0.135-0.135-0.135-0.353,0-0.488l3.655-3.655C10.164,4.966,10.382,4.966,10.517,5.101z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 833 B

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
<g>
<g>
<path style="fill:#0278C2;" d="M10.517,5.101l0.41,0.41c0.135,0.135,0.135,0.353,0,0.488L8.171,8.756
c-0.135,0.135-0.135,0.353,0,0.488L10.927,12c0.135,0.135,0.135,0.353,0,0.488l-0.41,0.41c-0.135,0.135-0.353,0.135-0.488,0
L6.374,9.244c-0.135-0.135-0.135-0.353,0-0.488l3.655-3.655C10.164,4.966,10.382,4.966,10.517,5.101z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 828 B

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
<g>
<path style="fill:#FFFFFF;" d="M7.483,5.101l-0.41,0.41C6.938,5.646,6.938,5.865,7.073,6l2.756,2.756
c0.135,0.135,0.135,0.353,0,0.488L7.073,12c-0.135,0.135-0.135,0.353,0,0.488l0.41,0.41c0.135,0.135,0.353,0.135,0.488,0
l3.655-3.655c0.135-0.135,0.135-0.353,0-0.488L7.971,5.101C7.836,4.966,7.618,4.966,7.483,5.101z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 805 B

View File

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
<g style="opacity:0.6;">
<path style="fill:#FFFFFF;" d="M7.483,5.101l-0.41,0.41C6.938,5.646,6.938,5.865,7.073,6l2.756,2.756
c0.135,0.135,0.135,0.353,0,0.488L7.073,12c-0.135,0.135-0.135,0.353,0,0.488l0.41,0.41c0.135,0.135,0.353,0.135,0.488,0
l3.655-3.655c0.135-0.135,0.135-0.353,0-0.488L7.971,5.101C7.836,4.966,7.618,4.966,7.483,5.101z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 826 B

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="&#x56FE;&#x5C42;_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
<g>
<g>
<path style="fill:#0278C2;" d="M7.483,5.101l-0.41,0.41C6.938,5.646,6.938,5.865,7.073,6l2.756,2.756
c0.135,0.135,0.135,0.353,0,0.488L7.073,12c-0.135,0.135-0.135,0.353,0,0.488l0.41,0.41c0.135,0.135,0.353,0.135,0.488,0
l3.655-3.655c0.135-0.135,0.135-0.353,0-0.488L7.971,5.101C7.836,4.966,7.618,4.966,7.483,5.101z"/>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 821 B

View File

@ -1,20 +0,0 @@
/**
* 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.
**/
#include "systrayplugin.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SystrayPlugin w;
w.show();
return a.exec();
}

View File

@ -1,189 +0,0 @@
/**
* 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.
**/
#include <QDBusConnection>
#include <QWidget>
#include "systrayplugin.h"
#include "compositetrayitem.h"
#include "trayicon.h"
#include "../dde-dock/src/dbus/dbusentrymanager.h"
static const QString CompositeItemKey = "composite_item_key";
SystrayPlugin::SystrayPlugin()
{
m_compositeItem = new CompositeTrayItem;
connect(m_compositeItem, &CompositeTrayItem::sizeChanged,
this, &SystrayPlugin::onCompositeItemSizeChanged);
}
SystrayPlugin::~SystrayPlugin()
{
m_compositeItem->deleteLater();
}
void SystrayPlugin::init(DockPluginProxyInterface * proxy)
{
m_proxy = proxy;
m_compositeItem->setMode(proxy->dockMode());
if (!m_dbusTrayManager) {
m_dbusTrayManager = new com::deepin::dde::TrayManager("com.deepin.dde.TrayManager",
"/com/deepin/dde/TrayManager",
QDBusConnection::sessionBus(),
this);
connect(m_dbusTrayManager, &TrayManager::TrayIconsChanged, this, &SystrayPlugin::onTrayIconsChanged);
connect(m_dbusTrayManager, &TrayManager::Changed, m_compositeItem, &CompositeTrayItem::handleTrayiconDamage);
}
DBusEntryManager *entryManager = new DBusEntryManager(this);
connect(entryManager, &DBusEntryManager::TrayInited, this, &SystrayPlugin::onTrayInit);
initTrayIcons();
if (m_compositeItem->parentWidget()) {
//wait for parentWidget() is valuable to set eventFilter
m_compositeItem->parentWidget()->installEventFilter(m_compositeItem);
}
}
QString SystrayPlugin::getPluginName()
{
return "System Tray";
}
QStringList SystrayPlugin::ids()
{
return QStringList(CompositeItemKey);
}
QString SystrayPlugin::getTitle(QString)
{
return "";
}
QString SystrayPlugin::getName(QString)
{
return getPluginName();
}
QString SystrayPlugin::getCommand(QString)
{
return "";
}
bool SystrayPlugin::configurable(const QString &)
{
return false;
}
bool SystrayPlugin::enabled(const QString &)
{
return true;
}
void SystrayPlugin::setEnabled(const QString &, bool)
{
}
QWidget * SystrayPlugin::getItem(QString)
{
return m_compositeItem;
}
QWidget * SystrayPlugin::getApplet(QString)
{
return NULL;
}
void SystrayPlugin::changeMode(Dock::DockMode newMode, Dock::DockMode)
{
m_compositeItem->setMode(newMode);
m_proxy->infoChangedEvent(DockPluginInterface::InfoTypeItemSize, CompositeItemKey);
}
QString SystrayPlugin::getMenuContent(QString)
{
return "";
}
void SystrayPlugin::invokeMenuItem(QString, QString, bool)
{
}
void SystrayPlugin::initTrayIcons()
{
m_compositeItem->clear();
m_dbusTrayManager->RetryManager();
QList<uint> trayIcons = m_dbusTrayManager->trayIcons();
qDebug() << "Init trayicons, Found trayicons: " <<m_dbusTrayManager->isValid() << trayIcons << m_dbusTrayManager->property("TrayIcons");
foreach (uint trayIcon, trayIcons) {
addTrayIcon(trayIcon);
}
m_proxy->itemAddedEvent(CompositeItemKey);
}
// private slots
void SystrayPlugin::addTrayIcon(WId winId)
{
QString key = QString::number(winId);
if (m_compositeItem->exist(key))
return;
qWarning() << "Systray add:" << winId;
TrayIcon * icon = new TrayIcon(winId);
m_compositeItem->addTrayIcon(key, icon);
m_proxy->infoChangedEvent(DockPluginInterface::InfoTypeItemSize, CompositeItemKey);
}
void SystrayPlugin::removeTrayIcon(WId winId)
{
qWarning() << "Systray remove:" << winId;
QString key = QString::number(winId);
m_compositeItem->remove(key);
m_proxy->infoChangedEvent(DockPluginInterface::InfoTypeItemSize, CompositeItemKey);
}
void SystrayPlugin::onTrayIconsChanged()
{
QList<uint> icons = m_dbusTrayManager->trayIcons();
QStringList ids = m_compositeItem->trayIds();
qDebug() << "TrayIconsChanged:" << icons;
foreach (uint id, icons) { //add news
if (ids.indexOf(QString::number(id)) == -1) {
addTrayIcon(id);
}
}
foreach (QString id, ids) { //remove olds
if (icons.indexOf(id.toUInt()) == -1) {
removeTrayIcon(id.toUInt());
}
}
}
void SystrayPlugin::onTrayInit()
{
}
void SystrayPlugin::onCompositeItemSizeChanged()
{
m_proxy->infoChangedEvent(DockPluginInterface::InfoTypeItemSize, CompositeItemKey);
}

View File

@ -1,69 +0,0 @@
/**
* 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.
**/
#ifndef SYSTRAYPLUGIN_H
#define SYSTRAYPLUGIN_H
#include <QtPlugin>
#include <QStringList>
#include <QWindow>
#include <QWidget>
#include "interfaces/dockconstants.h"
#include "interfaces/dockplugininterface.h"
#include "interfaces/dockpluginproxyinterface.h"
#include "dbustraymanager.h"
class CompositeTrayItem;
class SystrayPlugin : public QObject, public DockPluginInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.deepin.Dock.PluginInterface" FILE "dde-dock-systray-plugin.json")
Q_INTERFACES(DockPluginInterface)
public:
SystrayPlugin();
~SystrayPlugin();
void init(DockPluginProxyInterface * proxy) Q_DECL_OVERRIDE;
QString getPluginName() Q_DECL_OVERRIDE;
QStringList ids() Q_DECL_OVERRIDE;
QString getTitle(QString id) Q_DECL_OVERRIDE;
QString getName(QString id) Q_DECL_OVERRIDE;
QString getCommand(QString id) Q_DECL_OVERRIDE;
bool configurable(const QString &id) Q_DECL_OVERRIDE;
bool enabled(const QString &id) Q_DECL_OVERRIDE;
void setEnabled(const QString &id, bool enable) Q_DECL_OVERRIDE;
QWidget * getItem(QString id) Q_DECL_OVERRIDE;
QWidget * getApplet(QString id) Q_DECL_OVERRIDE;
void changeMode(Dock::DockMode newMode, Dock::DockMode oldMode) Q_DECL_OVERRIDE;
QString getMenuContent(QString id) Q_DECL_OVERRIDE;
void invokeMenuItem(QString id, QString itemId, bool checked) Q_DECL_OVERRIDE;
private slots:
void onTrayIconsChanged();
void onTrayInit();
void onCompositeItemSizeChanged();
private:
void initTrayIcons();
void addTrayIcon(WId winId);
void removeTrayIcon(WId winId);
private:
CompositeTrayItem * m_compositeItem = 0;
DockPluginProxyInterface * m_proxy = 0;
com::deepin::dde::TrayManager *m_dbusTrayManager = 0;
};
#endif // SYSTRAYPLUGIN_H

View File

@ -1,49 +0,0 @@
/**
* 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.
**/
#ifndef TRAYICON_H
#define TRAYICON_H
#include <QWindow>
#include <QFrame>
#include <QImage>
class QPaintEvent;
class QMouseEvent;
class TrayIcon : public QFrame
{
Q_OBJECT
public:
explicit TrayIcon(WId winId, QWidget *parent = 0);
~TrayIcon();
void maskOn();
void maskOff();
void hideIcon();
void updateIcon();
protected:
void paintEvent(QPaintEvent *);
// void mousePressEvent(QMouseEvent *);
private:
WId m_windowId;
WId m_containerWid;
bool m_masked;
bool m_hided;
QTimer * m_timer;
QImage m_image;
void wrapWindow();
QImage getImageNonComposite();
void sendClick(uint8_t, int, int);
};
#endif // TRAYICON_H

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

View File

@ -1,54 +0,0 @@
QFrame#ContentFrame{
background-color: rgba(0, 0, 0, 0.7);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 4px;
}
QPushButton#CloseButton{
border-image: url(":/images/Resource/dark/images/dark_close_small_normal.png")
}
QPushButton#CloseButton:hover{
border-image: url(":/images/Resource/dark/images/dark_close_small_hover.png")
}
QPushButton#CloseButton:pressed{
border-image: url(":/images/Resource/dark/images/dark_close_small_press.png")
}
QPushButton#ActionButton{
background-color: transparent;
border: 1px solid rgba(255, 255, 255, 0.3);
border-right: none;
border-left: none;
border-bottom: none;
color: white;
text-align: center;
}
QPushButton#ActionButton:hover{
background-color: transparent;
color: rgba(255, 255, 255, 0.5);
}
QPushButton#ActionButton:pressed{
background-color: transparent;
color: #01bdff;
}
QLabel#VLine{
background-color:rgba(255, 255, 255, 0.3);
}
QLabel#MessageLabel{
padding-top: 2px;
padding-bottom: 2px;
color: white;
}
QLabel#TipMessageLabel{
padding-top: 2px;
padding-bottom: 2px;
color: #ffa530;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

View File

@ -1,54 +0,0 @@
QFrame#ContentFrame{
background-color: rgba(0, 0, 0, 0.7);
border: 1px solid rgba(255, 255, 255, 0.3);
border-radius: 4px;
}
QPushButton#CloseButton{
border-image: url(":/images/Resource/dark/images/dark_close_small_normal.png")
}
QPushButton#CloseButton:hover{
border-image: url(":/images/Resource/dark/images/dark_close_small_hover.png")
}
QPushButton#CloseButton:pressed{
border-image: url(":/images/Resource/dark/images/dark_close_small_press.png")
}
QPushButton#ActionButton{
background-color: transparent;
border: 1px solid rgba(255, 255, 255, 0.3);
border-right: none;
border-left: none;
border-bottom: none;
color: white;
text-align: center;
}
QPushButton#ActionButton:hover{
background-color: transparent;
color: rgba(255, 255, 255, 0.5);
}
QPushButton#ActionButton:pressed{
background-color: transparent;
color: #01bdff;
}
QLabel#VLine{
background-color:rgba(255, 255, 255, 0.3);
}
QLabel#MessageLabel{
padding-top: 2px;
padding-bottom: 2px;
color: white;
}
QLabel#TipMessageLabel{
padding-top: 2px;
padding-bottom: 2px;
color: #ffa530;
}

View File

@ -1,37 +0,0 @@
/**
* 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 DBusEmptyTrashJob -p dbusemptytrashjob com.deepin.filemanager.Backend.Operations.EmptyTrashJob.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 "dbusemptytrashjob.h"
/*
* Implementation of interface class DBusEmptyTrashJob
*/
DBusEmptyTrashJob::DBusEmptyTrashJob(const QString &path, QObject *parent)
: QDBusAbstractInterface(staticServerPath(), path, staticInterfaceName(), QDBusConnection::sessionBus(), parent)
{
QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage)));
}
DBusEmptyTrashJob::~DBusEmptyTrashJob()
{
QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage)));
}

View File

@ -1,92 +0,0 @@
/**
* 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 DBusEmptyTrashJob -p dbusemptytrashjob com.deepin.filemanager.Backend.Operations.EmptyTrashJob.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 DBUSEMPTYTRASHJOB_H_1437723880
#define DBUSEMPTYTRASHJOB_H_1437723880
#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
/*
* Proxy class for interface com.deepin.filemanager.Backend.Operations.EmptyTrashJob
*/
class DBusEmptyTrashJob: public QDBusAbstractInterface
{
Q_OBJECT
Q_SLOT void __propertyChanged__(const QDBusMessage& msg)
{
QList<QVariant> arguments = msg.arguments();
if (3 != arguments.count())
return;
QString interfaceName = msg.arguments().at(0).toString();
if (interfaceName !="com.deepin.filemanager.Backend.Operations.EmptyTrashJob")
return;
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
foreach(const QString &prop, changedProps.keys()) {
const QMetaObject* self = metaObject();
for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) {
QMetaProperty p = self->property(i);
if (p.name() == prop) {
Q_EMIT p.notifySignal().invoke(this);
}
}
}
}
public:
static inline const char *staticServerPath()
{ return "com.deepin.filemanager.Backend.Operations"; }
static inline const char *staticInterfaceName()
{ return "com.deepin.filemanager.Backend.Operations.EmptyTrashJob"; }
public:
DBusEmptyTrashJob(const QString &path, QObject *parent = 0);
~DBusEmptyTrashJob();
public Q_SLOTS: // METHODS
inline QDBusPendingReply<> Execute()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("Execute"), argumentList);
}
Q_SIGNALS: // SIGNALS
void Done();
// begin property changed signals
};
namespace com {
namespace deepin {
namespace filemanager {
namespace Backend {
namespace Operations {
typedef ::DBusEmptyTrashJob EmptyTrashJob;
}
}
}
}
}
#endif

View File

@ -1,37 +0,0 @@
/**
* 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 DBusFileOperations -p dbusfileoperations com.deepin.filemanager.Backend.Operations.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 "dbusfileoperations.h"
/*
* Implementation of interface class DBusFileOperations
*/
DBusFileOperations::DBusFileOperations(QObject *parent)
: QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent)
{
QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage)));
}
DBusFileOperations::~DBusFileOperations()
{
QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage)));
}

View File

@ -1,423 +0,0 @@
/**
* 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 DBusFileOperations -p dbusfileoperations com.deepin.filemanager.Backend.Operations.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 DBUSFILEOPERATIONS_H_1437701966
#define DBUSFILEOPERATIONS_H_1437701966
#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
/*
* Proxy class for interface com.deepin.filemanager.Backend.Operations
*/
class DBusFileOperations: public QDBusAbstractInterface
{
Q_OBJECT
Q_SLOT void __propertyChanged__(const QDBusMessage& msg)
{
QList<QVariant> arguments = msg.arguments();
if (3 != arguments.count())
return;
QString interfaceName = msg.arguments().at(0).toString();
if (interfaceName !="com.deepin.filemanager.Backend.Operations")
return;
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
foreach(const QString &prop, changedProps.keys()) {
const QMetaObject* self = metaObject();
for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) {
QMetaProperty p = self->property(i);
if (p.name() == prop) {
Q_EMIT p.notifySignal().invoke(this);
}
}
}
}
public:
static inline const char *staticServerPath()
{ return "com.deepin.filemanager.Backend.Operations"; }
static inline const char *staticInterfacePath()
{ return "/com/deepin/filemanager/Backend/Operations"; }
static inline const char *staticInterfaceName()
{ return "com.deepin.filemanager.Backend.Operations"; }
public:
DBusFileOperations(QObject *parent = 0);
~DBusFileOperations();
public Q_SLOTS: // METHODS
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewChmodJob(const QString &in0, uint in1)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
return asyncCallWithArgumentList(QStringLiteral("NewChmodJob"), argumentList);
}
inline QDBusReply<QString> NewChmodJob(const QString &in0, uint in1, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewChmodJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewChownJob(const QString &in0, const QString &in1, const QString &in2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2);
return asyncCallWithArgumentList(QStringLiteral("NewChownJob"), argumentList);
}
inline QDBusReply<QString> NewChownJob(const QString &in0, const QString &in1, const QString &in2, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewChownJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewCopyJob(const QStringList &in0, const QString &in1, const QString &in2, uint in3, const QString &in4, const QString &in5, const QString &in6)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4) << QVariant::fromValue(in5) << QVariant::fromValue(in6);
return asyncCallWithArgumentList(QStringLiteral("NewCopyJob"), argumentList);
}
inline QDBusReply<QString> NewCopyJob(const QStringList &in0, const QString &in1, const QString &in2, uint in3, const QString &in4, const QString &in5, const QString &in6, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4) << QVariant::fromValue(in5) << QVariant::fromValue(in6);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewCopyJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewCreateDirectoryJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
return asyncCallWithArgumentList(QStringLiteral("NewCreateDirectoryJob"), argumentList);
}
inline QDBusReply<QString> NewCreateDirectoryJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewCreateDirectoryJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewCreateFileFromTemplateJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
return asyncCallWithArgumentList(QStringLiteral("NewCreateFileFromTemplateJob"), argumentList);
}
inline QDBusReply<QString> NewCreateFileFromTemplateJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewCreateFileFromTemplateJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewCreateFileJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4, const QString &in5)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4) << QVariant::fromValue(in5);
return asyncCallWithArgumentList(QStringLiteral("NewCreateFileJob"), argumentList);
}
inline QDBusReply<QString> NewCreateFileJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4, const QString &in5, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4) << QVariant::fromValue(in5);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewCreateFileJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewDeleteJob(const QStringList &in0, bool in1, const QString &in2, const QString &in3, const QString &in4)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
return asyncCallWithArgumentList(QStringLiteral("NewDeleteJob"), argumentList);
}
inline QDBusReply<QString> NewDeleteJob(const QStringList &in0, bool in1, const QString &in2, const QString &in3, const QString &in4, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewDeleteJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewEmptyTrashJob(bool in0, const QString &in1, const QString &in2, const QString &in3)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3);
return asyncCallWithArgumentList(QStringLiteral("NewEmptyTrashJob"), argumentList);
}
inline QDBusReply<QString> NewEmptyTrashJob(bool in0, const QString &in1, const QString &in2, const QString &in3, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewEmptyTrashJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewGetAllLaunchAppsJob()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("NewGetAllLaunchAppsJob"), argumentList);
}
inline QDBusReply<QString> NewGetAllLaunchAppsJob(QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewGetAllLaunchAppsJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewGetDefaultLaunchAppJob(const QString &in0, bool in1)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
return asyncCallWithArgumentList(QStringLiteral("NewGetDefaultLaunchAppJob"), argumentList);
}
inline QDBusReply<QString> NewGetDefaultLaunchAppJob(const QString &in0, bool in1, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewGetDefaultLaunchAppJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewGetRecommendedLaunchAppsJob(const QString &in0)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0);
return asyncCallWithArgumentList(QStringLiteral("NewGetRecommendedLaunchAppsJob"), argumentList);
}
inline QDBusReply<QString> NewGetRecommendedLaunchAppsJob(const QString &in0, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewGetRecommendedLaunchAppsJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewGetTemplateJob()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("NewGetTemplateJob"), argumentList);
}
inline QDBusReply<QString> NewGetTemplateJob(QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewGetTemplateJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewLinkJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
return asyncCallWithArgumentList(QStringLiteral("NewLinkJob"), argumentList);
}
inline QDBusReply<QString> NewLinkJob(const QString &in0, const QString &in1, const QString &in2, const QString &in3, const QString &in4, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewLinkJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewListJob(const QString &in0, int in1)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
return asyncCallWithArgumentList(QStringLiteral("NewListJob"), argumentList);
}
inline QDBusReply<QString> NewListJob(const QString &in0, int in1, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewListJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewMoveJob(const QStringList &in0, const QString &in1, const QString &in2, uint in3, const QString &in4, const QString &in5, const QString &in6)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4) << QVariant::fromValue(in5) << QVariant::fromValue(in6);
return asyncCallWithArgumentList(QStringLiteral("NewMoveJob"), argumentList);
}
inline QDBusReply<QString> NewMoveJob(const QStringList &in0, const QString &in1, const QString &in2, uint in3, const QString &in4, const QString &in5, const QString &in6, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4) << QVariant::fromValue(in5) << QVariant::fromValue(in6);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewMoveJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewRenameJob(const QString &in0, const QString &in1)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
return asyncCallWithArgumentList(QStringLiteral("NewRenameJob"), argumentList);
}
inline QDBusReply<QString> NewRenameJob(const QString &in0, const QString &in1, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewRenameJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewSetDefaultLaunchAppJob(const QString &in0, const QString &in1)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
return asyncCallWithArgumentList(QStringLiteral("NewSetDefaultLaunchAppJob"), argumentList);
}
inline QDBusReply<QString> NewSetDefaultLaunchAppJob(const QString &in0, const QString &in1, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewSetDefaultLaunchAppJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewStatJob(const QString &in0)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0);
return asyncCallWithArgumentList(QStringLiteral("NewStatJob"), argumentList);
}
inline QDBusReply<QString> NewStatJob(const QString &in0, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewStatJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
inline QDBusPendingReply<QString, QDBusObjectPath, QString> NewTrashJob(const QStringList &in0, bool in1, const QString &in2, const QString &in3, const QString &in4)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
return asyncCallWithArgumentList(QStringLiteral("NewTrashJob"), argumentList);
}
inline QDBusReply<QString> NewTrashJob(const QStringList &in0, bool in1, const QString &in2, const QString &in3, const QString &in4, QDBusObjectPath &out1, QString &out2)
{
QList<QVariant> argumentList;
argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3) << QVariant::fromValue(in4);
QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("NewTrashJob"), argumentList);
if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 3) {
out1 = qdbus_cast<QDBusObjectPath>(reply.arguments().at(1));
out2 = qdbus_cast<QString>(reply.arguments().at(2));
}
return reply;
}
Q_SIGNALS: // SIGNALS
// begin property changed signals
};
namespace com {
namespace deepin {
namespace filemanager {
// namespace Backend {
// typedef ::DBusFileOperations Operations;
// }
}
}
}
#endif

View File

@ -1,37 +0,0 @@
/**
* 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 DBusFileTrashMonitor -p dbusfiletrashmonitor com.deepin.filemanager.Backend.Monitor.TrashMonitor.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 "dbusfiletrashmonitor.h"
/*
* Implementation of interface class DBusFileTrashMonitor
*/
DBusFileTrashMonitor::DBusFileTrashMonitor(QObject *parent)
: QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent)
{
QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage)));
}
DBusFileTrashMonitor::~DBusFileTrashMonitor()
{
QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage)));
}

View File

@ -1,94 +0,0 @@
/**
* 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 DBusFileTrashMonitor -p dbusfiletrashmonitor com.deepin.filemanager.Backend.Monitor.TrashMonitor.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 DBUSFILETRASHMONITOR_H_1437702221
#define DBUSFILETRASHMONITOR_H_1437702221
#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
/*
* Proxy class for interface com.deepin.filemanager.Backend.Monitor.TrashMonitor
*/
class DBusFileTrashMonitor: public QDBusAbstractInterface
{
Q_OBJECT
Q_SLOT void __propertyChanged__(const QDBusMessage& msg)
{
QList<QVariant> arguments = msg.arguments();
if (3 != arguments.count())
return;
QString interfaceName = msg.arguments().at(0).toString();
if (interfaceName !="com.deepin.filemanager.Backend.Monitor.TrashMonitor")
return;
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
foreach(const QString &prop, changedProps.keys()) {
const QMetaObject* self = metaObject();
for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) {
QMetaProperty p = self->property(i);
if (p.name() == prop) {
Q_EMIT p.notifySignal().invoke(this);
}
}
}
}
public:
static inline const char *staticServerPath()
{ return "com.deepin.filemanager.Backend.Monitor"; }
static inline const char *staticInterfacePath()
{ return "/com/deepin/filemanager/Backend/Monitor/TrashMonitor"; }
static inline const char *staticInterfaceName()
{ return "com.deepin.filemanager.Backend.Monitor.TrashMonitor"; }
public:
DBusFileTrashMonitor(QObject *parent = 0);
~DBusFileTrashMonitor();
public Q_SLOTS: // METHODS
inline QDBusPendingReply<uint> ItemCount()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("ItemCount"), argumentList);
}
Q_SIGNALS: // SIGNALS
void ItemCountChanged(uint in0);
// begin property changed signals
};
namespace com {
namespace deepin {
namespace filemanager {
namespace Backend {
namespace Monitor {
typedef ::DBusFileTrashMonitor TrashMonitor;
}
}
}
}
}
#endif

View File

@ -1,37 +0,0 @@
/**
* 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 DBusLauncher -p dbuslauncher com.deepin.daemon.Launcher.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 "dbuslauncher.h"
/*
* Implementation of interface class DBusLauncher
*/
DBusLauncher::DBusLauncher(QObject *parent)
: QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent)
{
QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage)));
}
DBusLauncher::~DBusLauncher()
{
QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage)));
}

View File

@ -1,102 +0,0 @@
/**
* 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 DBusTrashJob -p dbustrashjob com.deepin.filemanager.Backend.Operations.TrashJob.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 DBUSTRASHJOB_H_1437722517
#define DBUSTRASHJOB_H_1437722517
#include <QtCore/QObject>
#include <QtCore/QByteArray>
#include <QtCore/QList>
#include <QtCore/QMap>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QVariant>
#include <QtDBus/QtDBus>
/*
* Proxy class for interface com.deepin.filemanager.Backend.Operations.TrashJob
*/
class DBusTrashJob: public QDBusAbstractInterface
{
Q_OBJECT
Q_SLOT void __propertyChanged__(const QDBusMessage& msg)
{
QList<QVariant> arguments = msg.arguments();
if (3 != arguments.count())
return;
QString interfaceName = msg.arguments().at(0).toString();
if (interfaceName !="com.deepin.filemanager.Backend.Operations.TrashJob")
return;
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
foreach(const QString &prop, changedProps.keys()) {
const QMetaObject* self = metaObject();
for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) {
QMetaProperty p = self->property(i);
if (p.name() == prop) {
Q_EMIT p.notifySignal().invoke(this);
}
}
}
}
public:
static inline const char *staticServerPath()
{ return "com.deepin.filemanager.Backend.Operations"; }
static inline const char *staticInterfaceName()
{ return "com.deepin.filemanager.Backend.Operations.TrashJob"; }
public:
DBusTrashJob(const QString &path, QObject *parent = 0);
~DBusTrashJob();
public Q_SLOTS: // METHODS
inline QDBusPendingReply<> Abort()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("Abort"), argumentList);
}
inline QDBusPendingReply<> Execute()
{
QList<QVariant> argumentList;
return asyncCallWithArgumentList(QStringLiteral("Execute"), argumentList);
}
Q_SIGNALS: // SIGNALS
void Aborted();
void Deleting(const QString &in0);
void Done();
void ProcessedAmount(qlonglong in0, ushort in1);
void Trashing(const QString &in0);
// begin property changed signals
};
namespace com {
namespace deepin {
namespace filemanager {
namespace Backend {
namespace Operations {
typedef ::DBusTrashJob TrashJob;
}
}
}
}
}
#endif

View File

@ -1,4 +0,0 @@
{
"api_version" : 1.0,
"sys_plugin" : true
}

View File

@ -1,44 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2015-07-20T14:06:01
#
#-------------------------------------------------
QT += core gui widgets dbus svg
TARGET = dde-dock-trash-plugin
TEMPLATE = lib
CONFIG += plugin c++11 link_pkgconfig
PKGCONFIG += gtk+-2.0
INCLUDEPATH += ../dde-dock/src
include(./dialogs/dialogs.pri)
SOURCES += \
mainitem.cpp \
trashplugin.cpp \
dbus/dbusfileoperations.cpp \
dbus/dbusfiletrashmonitor.cpp \
dbus/dbustrashjob.cpp \
dbus/dbusemptytrashjob.cpp \
dbus/dbuslauncher.cpp
HEADERS += \
mainitem.h \
trashplugin.h \
dbus/dbusfileoperations.h \
dbus/dbusfiletrashmonitor.h \
dbus/dbustrashjob.h \
dbus/dbusemptytrashjob.h \
dbus/dbuslauncher.h
DISTFILES += dde-dock-trash-plugin.json
unix {
target.path = /usr/lib/dde-dock/plugins/
INSTALLS += target
}
RESOURCES += \
trash-plugin-light.qrc \
trash-plugin-dark.qrc

View File

@ -1,40 +0,0 @@
/**
* 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.
**/
#include "cleartrashdialog.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QButtonGroup>
#include <QPushButton>
ClearTrashDialog::ClearTrashDialog(QWidget *parent):
DBaseDialog(parent)
{
QString icon = ":/images/skin/dialogs/images/user-trash-full.png";
QString message = tr("Are you sure to empty trash?");
QString tipMessage = tr("This action cannot be restored");
QStringList buttons, buttonTexts;
buttons << "Cancel" << "Empty";
buttonTexts << tr("Cancel") << tr("Empty");
initUI(icon, message, tipMessage, buttons, buttons);
moveCenter();
getButtonsGroup()->button(1)->setFocus();
setButtonTexts(buttonTexts);
}
void ClearTrashDialog::handleKeyEnter(){
handleButtonsClicked(1);
}
ClearTrashDialog::~ClearTrashDialog()
{
}

View File

@ -1,28 +0,0 @@
/**
* 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.
**/
#ifndef CLEARTRASHDIALOG_H
#define CLEARTRASHDIALOG_H
#include "dbasedialog.h"
class ClearTrashDialog : public DBaseDialog
{
Q_OBJECT
public:
explicit ClearTrashDialog(QWidget *parent = 0);
~ClearTrashDialog();
signals:
public slots:
void handleKeyEnter();
};
#endif // CLEARTRASHDIALOG_H

View File

@ -1,37 +0,0 @@
/**
* 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.
**/
#include "confirmuninstalldialog.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QButtonGroup>
#include <QPushButton>
ConfirmUninstallDialog::ConfirmUninstallDialog(QWidget *parent) : DBaseDialog(parent)
{
QString icon = ":/images/skin/dialogs/images/user-trash-full.png";
QString message = "Are you sure to uninstall this application?";
QString tipMessage = tr("All dependencies will be removed together");
QStringList buttons, buttonTexts;
buttons << "Cancel" << "Confirm";
buttonTexts << tr("Cancel") << tr("Confirm");
initUI(icon, message, tipMessage, buttons, buttons);
moveCenter();
getButtonsGroup()->button(1)->setFocus();
setButtonTexts(buttonTexts);
}
void ConfirmUninstallDialog::handleKeyEnter(){
handleButtonsClicked(1);
}
ConfirmUninstallDialog::~ConfirmUninstallDialog()
{
}

View File

@ -1,28 +0,0 @@
/**
* 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.
**/
#ifndef CONFIRMUNINSTALLDIALOG_H
#define CONFIRMUNINSTALLDIALOG_H
#include "dbasedialog.h"
class ConfirmUninstallDialog : public DBaseDialog
{
Q_OBJECT
public:
explicit ConfirmUninstallDialog(QWidget *parent = 0);
~ConfirmUninstallDialog();
signals:
public slots:
void handleKeyEnter();
};
#endif // CONFIRMUNINSTALLDIALOG_H

View File

@ -1,230 +0,0 @@
/**
* 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.
**/
#include "dbasedialog.h"
#include <QPushButton>
#include <QLabel>
#include <QPixmap>
#include <QButtonGroup>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QDebug>
#include <QCloseEvent>
#include <QApplication>
#include <QDesktopWidget>
DBaseDialog::DBaseDialog(QWidget *parent):DMovabelDialog(parent)
{
m_messageLabelMaxWidth = qApp->desktop()->availableGeometry().width() / 2 -
100 - 2 * getCloseButton()->width();
}
void DBaseDialog::initUI(const QString &icon,
const QString &message,
const QString &tipMessage,
const QStringList &buttonKeys,
const QStringList &buttonTexts){
m_icon = icon;
m_message = message;
m_tipMessage = tipMessage;
m_buttonKeys = buttonKeys;
m_buttonTexts = buttonTexts;
QFrame* contentFrame = new QFrame;
contentFrame->setObjectName("ContentFrame");
m_iconLabel = new QLabel;
m_iconLabel->setFixedSize(48, 48);
setIcon(m_icon);
m_messageLabel = new QLabel;
m_messageLabel->setObjectName("MessageLabel");
setMessage(m_message);
m_tipMessageLabel = new QLabel;
m_tipMessageLabel->setObjectName("TipMessageLabel");
setTipMessage(m_tipMessage);
m_buttonGroup = new QButtonGroup;
QHBoxLayout* buttonLayout = new QHBoxLayout;
foreach (QString label, m_buttonKeys) {
int index = m_buttonKeys.indexOf(label);
QPushButton* button = new QPushButton(label);
button->setObjectName("ActionButton");
button->setAttribute(Qt::WA_NoMousePropagation);
button->setFixedHeight(28);
m_buttonGroup->addButton(button, index);
buttonLayout->addWidget(button);
if (index < m_buttonKeys.length() - 1){
QLabel* label = new QLabel;
label->setObjectName("VLine");
label->setFixedWidth(1);
buttonLayout->addWidget(label);
}
}
setButtonTexts(m_buttonTexts);
buttonLayout->setSpacing(0);
buttonLayout->setContentsMargins(0, 0, 0, 0);
QVBoxLayout* iconLayout = new QVBoxLayout;
iconLayout->addWidget(m_iconLabel, Qt::AlignCenter);
iconLayout->setContentsMargins(26, 22, 26, 22);
m_messageLayout = new QVBoxLayout;
m_messageLayout->addWidget(m_messageLabel);
m_messageLayout->addWidget(m_tipMessageLabel);
m_messageLayout->addStretch();
m_messageLayout->setContentsMargins(5, getCloseButton()->height(), getCloseButton()->width(), 0);
QHBoxLayout* topLayout = new QHBoxLayout;
topLayout->addLayout(iconLayout);
topLayout->addLayout(m_messageLayout);
QVBoxLayout* mainLayout = new QVBoxLayout;
mainLayout->addLayout(topLayout);
mainLayout->addLayout(buttonLayout);
mainLayout->setSpacing(0);
mainLayout->setContentsMargins(0, 0, 0, 0);
contentFrame->setLayout(mainLayout);
QHBoxLayout* contentlayout = new QHBoxLayout;
contentlayout->addWidget(contentFrame);
contentlayout->setContentsMargins(5, 5, 5, 5);
setLayout(contentlayout);
resize(m_defaultWidth, m_defaultHeight);
setStyleSheet(getQssFromFile(":/qss/Resource/dark/qss/trash.qss"));
initConnect();
}
void DBaseDialog::initConnect(){
connect(m_buttonGroup, SIGNAL(buttonClicked(int)), this, SLOT(handleButtonsClicked(int)));
}
QButtonGroup* DBaseDialog::getButtonsGroup(){
return m_buttonGroup;
}
QVBoxLayout* DBaseDialog::getMessageLayout(){
return m_messageLayout;
}
QString DBaseDialog::getIcon(){
return m_icon;
}
void DBaseDialog::setIcon(const QString &icon){
m_icon = icon;
m_iconLabel->setPixmap(QPixmap(m_icon).scaled(m_iconLabel->size()));
}
QString DBaseDialog::getMessage(){
return m_message;
}
void DBaseDialog::setMessage(const QString &message){
m_message = message;
QFontMetrics fm = fontMetrics();
if (fm.width(m_message) > m_messageLabelMaxWidth){
QString text = fm.elidedText(m_message, Qt::ElideRight, m_messageLabelMaxWidth);
m_messageLabel->setText(text);
}else{
m_messageLabel->setText(m_message);
}
m_messageLabel->resize(fm.width(m_messageLabel->text()), height());
}
QString DBaseDialog::getTipMessage(){
return m_tipMessage;
}
void DBaseDialog::setTipMessage(const QString &tipMessage){
m_tipMessage = tipMessage;
QFontMetrics fm = fontMetrics();
if (fm.width(m_tipMessage) > m_messageLabelMaxWidth){
QString text = fm.elidedText(m_tipMessage, Qt::ElideRight, m_messageLabelMaxWidth);
m_tipMessageLabel->setText(text);
}else{
m_tipMessageLabel->setText(m_tipMessage);
}
m_tipMessageLabel->resize(fm.width(m_messageLabel->text()), height());
}
QStringList DBaseDialog::getButtons(){
return m_buttonKeys;
}
void DBaseDialog::setButtons(const QStringList &buttons){
m_buttonKeys = buttons;
}
QStringList DBaseDialog::getButtonTexts(){
return m_buttonTexts;
}
void DBaseDialog::setButtonTexts(const QStringList& buttonTexts){
if (buttonTexts.length() != m_buttonKeys.length()){
return;
}
m_buttonTexts = buttonTexts;
for (int i = 0; i < m_buttonGroup->buttons().length(); i++) {
QPushButton* button = reinterpret_cast<QPushButton*>(m_buttonGroup->buttons().at(i));
button->setText(m_buttonTexts.at(i));
}
}
void DBaseDialog::handleButtonsClicked(int id){
close();
int index = m_buttonGroup->buttons().indexOf(m_buttonGroup->button(id));
if (m_buttonKeys.length() > index){
emit buttonClicked(index);
}
}
void DBaseDialog::handleKeyEnter(){
}
void DBaseDialog::closeEvent(QCloseEvent *event){
emit aboutToClose();
DMovabelDialog::closeEvent(event);
emit closed();
}
void DBaseDialog::resizeEvent(QResizeEvent *event){
DMovabelDialog::resizeEvent(event);
}
QString DBaseDialog::getQssFromFile(const QString &name)
{
QFile file(name);
QString styleSheet = "";
if (file.open(QFile::ReadOnly))
{
styleSheet = QString(file.readAll());
file.close();
}
else
qWarning() << "[Error:] Open style file errr!";
return styleSheet;
}
DBaseDialog::~DBaseDialog()
{
}

View File

@ -1,80 +0,0 @@
/**
* 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.
**/
#ifndef DBASEDIALOG_H
#define DBASEDIALOG_H
#include "dmovabledialog.h"
class QPushButton;
class QButtonGroup;
class QLabel;
class QCloseEvent;
class QVBoxLayout;
class DBaseDialog : public DMovabelDialog
{
Q_OBJECT
public:
explicit DBaseDialog(QWidget *parent = 0);
~DBaseDialog();
void initUI(const QString& icon,
const QString& message,
const QString& tipMessage,
const QStringList& buttonKeys,
const QStringList& buttonTexts);
void initConnect();
QString getIcon();
QString getMessage();
QString getTipMessage();
QStringList getButtons();
QStringList getButtonTexts();
QButtonGroup* getButtonsGroup();
signals:
void aboutToClose();
void closed();
void buttonClicked(int index);
public slots:
void setIcon(const QString& icon);
void setMessage(const QString& message);
void setTipMessage(const QString& tipMessage);
void setButtons(const QStringList& buttons);
void setButtonTexts(const QStringList& buttonTexts);
void handleButtonsClicked(int id);
void handleKeyEnter();
QVBoxLayout* getMessageLayout();
protected:
void closeEvent(QCloseEvent* event);
void resizeEvent(QResizeEvent* event);
private:
QString getQssFromFile(const QString &name);
QString m_icon;
QString m_message;
QString m_tipMessage;
QStringList m_buttonKeys;
QStringList m_buttonTexts;
int m_defaultWidth = 380;
int m_defaultHeight = 120;
QLabel* m_iconLabel;
QLabel* m_messageLabel;
QLabel* m_tipMessageLabel;
QButtonGroup* m_buttonGroup;
QVBoxLayout* m_messageLayout;
int m_messageLabelMaxWidth;
};
#endif // DBASEDIALOG_H

View File

@ -1,11 +0,0 @@
HEADERS += \
$$PWD/dbasedialog.h \
$$PWD/cleartrashdialog.h \
$$PWD/confirmuninstalldialog.h \
$$PWD/dmovabledialog.h
SOURCES += \
$$PWD/dbasedialog.cpp \
$$PWD/cleartrashdialog.cpp \
$$PWD/confirmuninstalldialog.cpp \
$$PWD/dmovabledialog.cpp

View File

@ -1,76 +0,0 @@
/**
* 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.
**/
#include "dmovabledialog.h"
#include <QMouseEvent>
#include <QApplication>
#include <QDesktopWidget>
#include <QPushButton>
#include <QResizeEvent>
DMovabelDialog::DMovabelDialog(QWidget *parent):QDialog(parent)
{
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
setAttribute(Qt::WA_TranslucentBackground);
m_closeButton = new QPushButton(this);
m_closeButton->setObjectName("CloseButton");
m_closeButton->setFixedSize(25, 25);
m_closeButton->setAttribute(Qt::WA_NoMousePropagation);
connect(m_closeButton, SIGNAL(clicked()), this, SLOT(close()));
}
void DMovabelDialog::setMovableHeight(int height){
m_movableHeight = height;
}
QPushButton* DMovabelDialog::getCloseButton(){
return m_closeButton;
}
void DMovabelDialog::moveCenter(){
QRect qr = frameGeometry();
QPoint cp = qApp->desktop()->availableGeometry().center();
qr.moveCenter(cp);
move(qr.topLeft());
}
void DMovabelDialog::mousePressEvent(QMouseEvent *event)
{
if(event->button() & Qt::LeftButton)
{
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
}
QDialog::mousePressEvent(event);
}
void DMovabelDialog::mouseReleaseEvent(QMouseEvent *event)
{
QDialog::mouseReleaseEvent(event);
}
void DMovabelDialog::mouseMoveEvent(QMouseEvent *event)
{
move(event->globalPos() - m_dragPosition);
QDialog::mouseMoveEvent(event);
}
void DMovabelDialog::resizeEvent(QResizeEvent *event){
m_closeButton->move(width() - m_closeButton->width() - 4, 4);
m_closeButton->raise();
moveCenter();
QDialog::resizeEvent(event);
}
DMovabelDialog::~DMovabelDialog()
{
}

View File

@ -1,44 +0,0 @@
/**
* 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.
**/
#ifndef DMOVABLEDIALOG_H
#define DMOVABLEDIALOG_H
#include <QDialog>
#include <QPoint>
class QMouseEvent;
class QPushButton;
class QResizeEvent;
class DMovabelDialog:public QDialog
{
public:
DMovabelDialog(QWidget *parent = 0);
~DMovabelDialog();
QPushButton* getCloseButton();
public slots:
void setMovableHeight(int height);
void moveCenter();
protected:
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void resizeEvent(QResizeEvent* event);
private:
QPoint m_dragPosition;
int m_movableHeight = 30;
QPushButton* m_closeButton;
};
#endif // DMOVABLEDIALOG_H

View File

@ -1,250 +0,0 @@
/**
* 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.
**/
#include <QSvgRenderer>
#include "mainitem.h"
#undef signals
extern "C" {
#include <gtk/gtk.h>
}
#define signals public
static void requrestUpdateIcons()
{
//can not passing QObject to the callback function,so use signal
emit SignalManager::instance()->requestAppIconUpdate();
}
void initGtkThemeWatcher()
{
GtkSettings* gs = gtk_settings_get_default();
g_signal_connect(gs, "notify::gtk-icon-theme-name",
G_CALLBACK(requrestUpdateIcons), NULL);
}
SignalManager *SignalManager::m_signalManager = NULL;
SignalManager *SignalManager::instance()
{
if (!m_signalManager)
m_signalManager = new SignalManager;
return m_signalManager;
}
MainItem::MainItem(QWidget *parent) : QLabel(parent)
{
setAcceptDrops(true);
setFixedSize(Dock::APPLET_FASHION_ITEM_WIDTH, Dock::APPLET_FASHION_ITEM_HEIGHT);
m_dftm = new DBusFileTrashMonitor(this);
connect(m_dftm, &DBusFileTrashMonitor::ItemCountChanged, [=]{
updateIcon(false);
});
updateIcon(false);
initGtkThemeWatcher();
//can't use lambda here
connect(SignalManager::instance(), SIGNAL(requestAppIconUpdate()), this, SLOT(onRequestUpdateIcon()));
}
MainItem::~MainItem()
{
}
void MainItem::emptyTrash()
{
ClearTrashDialog *dialog = new ClearTrashDialog;
dialog->setIcon(getThemeIconPath("user-trash-full"));
connect(dialog, &ClearTrashDialog::buttonClicked, [=](int key){
dialog->deleteLater();
if (key == 1){
qWarning() << "Clear trash...";
QDBusPendingReply<QString, QDBusObjectPath, QString> tmpReply = m_dfo->NewEmptyTrashJob(false, "", "", "");
QDBusObjectPath op = tmpReply.argumentAt(1).value<QDBusObjectPath>();
DBusEmptyTrashJob * detj = new DBusEmptyTrashJob(op.path(), this);
connect(detj, &DBusEmptyTrashJob::Done, detj, &DBusEmptyTrashJob::deleteLater);
connect(detj, &DBusEmptyTrashJob::Done, [=](){
updateIcon(false);
});
if (detj->isValid())
detj->Execute();
}
});
dialog->exec();
}
void MainItem::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
QProcess * tmpProcess = new QProcess();
connect(tmpProcess, SIGNAL(finished(int)), tmpProcess, SLOT(deleteLater()));
tmpProcess->start("gvfs-open trash://");
}
//Makesure it parent can accept the mouse event too
event->ignore();
}
void MainItem::dragEnterEvent(QDragEnterEvent * event)
{
if (event->source())
return;//just accept the object outside this app
updateIcon(true);
event->setDropAction(Qt::MoveAction);
event->accept();
}
void MainItem::dragLeaveEvent(QDragLeaveEvent *)
{
updateIcon(false);
}
void MainItem::dropEvent(QDropEvent *event)
{
updateIcon(false);
if (event->source())
return;
if (event->mimeData()->formats().indexOf("RequestDock") != -1) { //from desktop or launcher
QJsonObject dataObj = QJsonDocument::fromJson(event->mimeData()->data("RequestDock")).object();
if (!dataObj.isEmpty()){
QString appKey = dataObj.value("appKey").toString();
QString appName = dataObj.value("appName").toString();
QString appIcon = dataObj.value("appIcon").toString();
if (appKey.isEmpty())
return;
event->ignore();
execUninstall(appKey, appName, appIcon);
}
}
else {//File or Dirctory
trashFiles(event->mimeData()->urls());
}
}
void MainItem::onRequestUpdateIcon()
{
updateIcon(false);
}
void MainItem::execUninstall(const QString &appKey, const QString &appName, const QString &appIcon)
{
ConfirmUninstallDialog *dialog = new ConfirmUninstallDialog;
//TODO: need real icon name
dialog->setIcon(getThemeIconPath(appIcon));
QString message = tr("Are you sure to uninstall %1?").arg(appName);
dialog->setMessage(message);
connect(dialog, &ConfirmUninstallDialog::buttonClicked, [=](int key){
dialog->deleteLater();
if (key == 1){
qWarning() << "Uninstall application:" << appKey << appName;
m_launcher->RequestUninstall(appKey, true);
}
});
dialog->exec();
}
void MainItem::trashFiles(const QList<QUrl> &files)
{
QStringList normalFiles;
for (QUrl url : files) {
//try to uninstall app by .desktop file
if (url.fileName().endsWith(".desktop")) {
QSettings ds(url.path(), QSettings::IniFormat);
ds.setIniCodec(QTextCodec::codecForName("UTF-8"));
ds.beginGroup("Desktop Entry");
QString appKey = ds.value("X-Deepin-AppID").toString();
if (!appKey.isEmpty()) {
QString l(qgetenv(QString("LANGUAGE").toUtf8().data()));
QString appName = ds.value(QString("Name[%1]").arg(l)).toString();
appName = appName.isEmpty() ? ds.value("Name").toString() : appName;
execUninstall(appKey, appName, ds.value("Icon").toString());
}
else {
normalFiles << url.path();
}
ds.endGroup();
}
else {
normalFiles << url.path();
}
}
//remove normal files
QDBusPendingReply<QString, QDBusObjectPath, QString> tmpReply = m_dfo->NewTrashJob(normalFiles, false, "", "", "");
QDBusObjectPath op = tmpReply.argumentAt(1).value<QDBusObjectPath>();
DBusTrashJob * dtj = new DBusTrashJob(op.path(), this);
connect(dtj, &DBusTrashJob::Done, dtj, &DBusTrashJob::deleteLater);
connect(dtj, &DBusTrashJob::Done, [=](){
updateIcon(false);
});
if (dtj->isValid())
dtj->Execute();
qWarning()<< op.path() << "Move files to trash: "<< normalFiles;
}
void MainItem::updateIcon(bool isOpen)
{
QString iconName = "";
if (isOpen)
{
if (m_dftm->ItemCount() > 0)
iconName = "user-trash-full-opened";
else
iconName = "user-trash-empty-opened";
}
else
{
if (m_dftm->ItemCount() > 0)
iconName = "user-trash-full";
else
iconName = "user-trash-empty";
}
QPixmap pixmap(getThemeIconPath(iconName));
setPixmap(pixmap.scaled(Dock::APPLET_FASHION_ICON_SIZE,Dock::APPLET_FASHION_ICON_SIZE));
}
// iconName should be a icon name constraints to the freeedesktop standard.
QString MainItem::getThemeIconPath(QString iconName)
{
// iconPath is an absolute path of the system.
if (QFile::exists(iconName) && iconName.contains(QDir::separator())) {
return iconName;
}
else {
QByteArray bytes = iconName.toUtf8();
const char *name = bytes.constData();
GtkIconTheme* theme = gtk_icon_theme_get_default();
GtkIconInfo* info = gtk_icon_theme_lookup_icon(theme, name, 48, GTK_ICON_LOOKUP_GENERIC_FALLBACK);
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

@ -1,72 +0,0 @@
/**
* 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.
**/
#ifndef MAINITEM_H
#define MAINITEM_H
#include <QLabel>
#include <QIcon>
#include <QPixmap>
#include <QDragEnterEvent>
#include <QProcess>
#include <QDebug>
#include "dialogs/confirmuninstalldialog.h"
#include "dialogs/cleartrashdialog.h"
#include "interfaces/dockconstants.h"
#include "dbus/dbusfiletrashmonitor.h"
#include "dbus/dbusfileoperations.h"
#include "dbus/dbusemptytrashjob.h"
#include "dbus/dbustrashjob.h"
#include "dbus/dbuslauncher.h"
class SignalManager : public QObject
{
Q_OBJECT
public:
static SignalManager * instance();
signals:
void requestAppIconUpdate();
private:
static SignalManager *m_signalManager;
explicit SignalManager(QObject *parent = 0) : QObject(parent) {}
};
class MainItem : public QLabel
{
Q_OBJECT
public:
MainItem(QWidget *parent = 0);
~MainItem();
void emptyTrash();
protected:
void mousePressEvent(QMouseEvent * event);
void dragEnterEvent(QDragEnterEvent *);
void dragLeaveEvent(QDragLeaveEvent *);
void dropEvent(QDropEvent * event);
private slots:
void onRequestUpdateIcon();
private:
void execUninstall(const QString &appKey, const QString &appName, const QString &appIcon);
void trashFiles(const QList<QUrl> &files);
void updateIcon(bool isOpen);
QString getThemeIconPath(QString iconName);
DBusFileOperations * m_dfo = new DBusFileOperations(this);
DBusFileTrashMonitor * m_dftm = NULL;
DBusLauncher * m_launcher = new DBusLauncher(this);
};
#endif // MAINITEM_H

View File

@ -1,10 +0,0 @@
<RCC>
<qresource prefix="/images">
<file>Resource/dark/images/dark_close_small_hover.png</file>
<file>Resource/dark/images/dark_close_small_normal.png</file>
<file>Resource/dark/images/dark_close_small_press.png</file>
</qresource>
<qresource prefix="/qss">
<file>Resource/dark/qss/trash.qss</file>
</qresource>
</RCC>

View File

@ -1,10 +0,0 @@
<RCC>
<qresource prefix="/images">
<file>Resource/light/images/dark_close_small_hover.png</file>
<file>Resource/light/images/dark_close_small_normal.png</file>
<file>Resource/light/images/dark_close_small_press.png</file>
</qresource>
<qresource prefix="/qss">
<file>Resource/light/qss/trash.qss</file>
</qresource>
</RCC>

View File

@ -1,142 +0,0 @@
/**
* 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.
**/
#include <QIcon>
#include "trashplugin.h"
TrashPlugin::TrashPlugin()
{
QIcon::setThemeName("deepin");
m_item = new MainItem();
connect(this, &TrashPlugin::menuItemInvoked, m_item, &MainItem::emptyTrash);
}
void TrashPlugin::init(DockPluginProxyInterface *proxy)
{
m_proxy = proxy;
setMode(proxy->dockMode());
}
QString TrashPlugin::getPluginName()
{
return tr("Trash");
}
QStringList TrashPlugin::ids()
{
return QStringList(m_id);
}
QString TrashPlugin::getName(QString)
{
return getPluginName();
}
QString TrashPlugin::getTitle(QString)
{
return getPluginName();
}
QString TrashPlugin::getCommand(QString)
{
return "";
}
bool TrashPlugin::configurable(const QString &)
{
return false;
}
bool TrashPlugin::enabled(const QString &)
{
return true;
}
void TrashPlugin::setEnabled(const QString &, bool)
{
}
QWidget * TrashPlugin::getItem(QString)
{
return m_item;
}
QWidget * TrashPlugin::getApplet(QString)
{
return NULL;
}
void TrashPlugin::changeMode(Dock::DockMode newMode, Dock::DockMode oldMode)
{
if (newMode != oldMode)
setMode(newMode);
}
QString TrashPlugin::getMenuContent(QString)
{
QJsonObject contentObj;
QJsonArray items;
items.append(createMenuItem("clear_trash", tr("Empty")));
contentObj.insert("items", items);
return QString(QJsonDocument(contentObj).toJson());
}
void TrashPlugin::invokeMenuItem(QString, QString itemId, bool checked)
{
qWarning() << "Menu check:" << itemId << checked;
emit menuItemInvoked();
}
// private methods
void TrashPlugin::setMode(Dock::DockMode mode)
{
m_mode = mode;
if (mode == Dock::FashionMode)
m_proxy->itemAddedEvent(m_id);
else{
m_proxy->itemRemovedEvent(m_id);
m_item->setParent(NULL);
}
}
QJsonObject TrashPlugin::createMenuItem(QString itemId, QString itemName, bool checkable, bool checked)
{
QJsonObject itemObj;
itemObj.insert("itemId", itemId);
itemObj.insert("itemText", itemName);
itemObj.insert("itemIcon", "");
itemObj.insert("itemIconHover", "");
itemObj.insert("itemIconInactive", "");
itemObj.insert("itemExtra", "");
itemObj.insert("isActive", m_trashMonitor->ItemCount() > 0);
itemObj.insert("isCheckable", checkable);
itemObj.insert("checked", checked);
itemObj.insert("itemSubMenu", QJsonObject());
return itemObj;
}
TrashPlugin::~TrashPlugin()
{
}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(dde-dock-trash-plugin, TrashPlugin)
#endif // QT_VERSION < 0x050000

View File

@ -1,73 +0,0 @@
/**
* 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.
**/
#ifndef TRASHPLUGIN_H
#define TRASHPLUGIN_H
#include <QMap>
#include <QLabel>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QIcon>
#include <QDebug>
#include "mainitem.h"
#include "interfaces/dockconstants.h"
#include "interfaces/dockplugininterface.h"
#include "interfaces/dockpluginproxyinterface.h"
class TrashPlugin : public QObject, public DockPluginInterface
{
Q_OBJECT
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID "org.deepin.Dock.PluginInterface" FILE "dde-dock-trash-plugin.json")
#endif // QT_VERSION >= 0x050000
Q_INTERFACES(DockPluginInterface)
public:
TrashPlugin();
~TrashPlugin();
void init(DockPluginProxyInterface *proxy) Q_DECL_OVERRIDE;
void changeMode(Dock::DockMode newMode, Dock::DockMode oldMode) Q_DECL_OVERRIDE;
QString getPluginName() Q_DECL_OVERRIDE;
QStringList ids() Q_DECL_OVERRIDE;
QString getName(QString id) Q_DECL_OVERRIDE;
QString getTitle(QString id) Q_DECL_OVERRIDE;
QString getCommand(QString id) Q_DECL_OVERRIDE;
bool configurable(const QString &id) Q_DECL_OVERRIDE;
bool enabled(const QString &id) Q_DECL_OVERRIDE;
void setEnabled(const QString &id, bool enabled) Q_DECL_OVERRIDE;
QWidget * getItem(QString id) Q_DECL_OVERRIDE;
QWidget * getApplet(QString id) Q_DECL_OVERRIDE;
QString getMenuContent(QString id) Q_DECL_OVERRIDE;
void invokeMenuItem(QString id, QString itemId, bool checked) Q_DECL_OVERRIDE;
signals:
void menuItemInvoked();
private:
MainItem * m_item = NULL;
QString m_id = "trash_plugin";
DockPluginProxyInterface * m_proxy;
DBusFileTrashMonitor * m_trashMonitor = new DBusFileTrashMonitor(this);
Dock::DockMode m_mode = Dock::EfficientMode;
private:
void setMode(Dock::DockMode mode);
QJsonObject createMenuItem(QString itemId,
QString itemName,
bool checkable = false,
bool checked = false);
};
#endif // TRASHPLUGIN_H

4
dde-dock.pro Normal file
View File

@ -0,0 +1,4 @@
TEMPLATE = subdirs
SUBDIRS = frame \
plugins

View File

@ -1,18 +0,0 @@
<RCC>
<qresource prefix="/images">
<file>resources/dark/images/close_hover.png</file>
<file>resources/dark/images/close_normal.png</file>
<file>resources/dark/images/close_press.png</file>
<file>resources/dark/images/dark_dock.svg</file>
<file>resources/dark/images/open-indicator.png</file>
<file>resources/dark/images/opening-indicator.png</file>
<file>resources/dark/images/setting_close_small_hover.png</file>
<file>resources/dark/images/setting_close_small_normal.png</file>
<file>resources/dark/images/setting_close_small_press.png</file>
<file>resources/dark/images/preview_border_hover.png</file>
<file>resources/dark/images/preview_border_normal.png</file>
</qresource>
<qresource prefix="/qss">
<file>resources/dark/qss/dde-dock.qss</file>
</qresource>
</RCC>

View File

@ -1,123 +0,0 @@
QT += core gui x11extras dbus svg concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = dde-dock
TEMPLATE = app
INCLUDEPATH += ./src ./libs
DEFINES += PLUGIN_API_VERSION=1.0
ARCH = $$QMAKE_HOST.arch
isEqual(ARCH, mips64) | isEqual(ARCH, mips32) {
DEFINES += ARCH_MIPSEL
}
RESOURCES += \
dark.qrc \
light.qrc
CONFIG += c++11 link_pkgconfig
PKGCONFIG += gtk+-2.0 x11 cairo xcb xcb-ewmh xcb-damage dtkbase dtkutil dtkwidget
target.path = /usr/bin/
headers.files += src/interfaces/dockconstants.h \
src/interfaces/dockplugininterface.h \
src/interfaces/dockpluginproxyinterface.h
headers.path = /usr/include/dde-dock
dbus_service.files += com.deepin.dde.dock.service
dbus_service.path = /usr/share/dbus-1/services
INSTALLS += dbus_service headers target
HEADERS += \
src/interfaces/dockconstants.h \
src/interfaces/dockplugininterface.h \
src/interfaces/dockpluginproxyinterface.h \
libs/xcb_misc.h \
src/controller/dockmodedata.h \
src/dbus/dbusclientmanager.h \
src/dbus/dbusdockedappmanager.h \
src/dbus/dbusdocksetting.h \
src/dbus/dbusentrymanager.h \
src/dbus/dbushidestatemanager.h \
src/dbus/dbusmenu.h \
src/dbus/dbusmenumanager.h \
src/dbus/dbuspanelmanager.h \
src/panel/panelmenu.h \
src/widgets/highlighteffect.h \
src/widgets/reflectioneffect.h \
src/mainwidget.h \
src/controller/signalmanager.h \
src/widgets/previewwindow.h \
src/dbus/dbusdisplay.h \
src/dbus/dbuslauncher.h \
src/dbus/dbusdockentry.h \
src/panel/dockpanel.h \
src/widgets/app/dockappbg.h \
src/widgets/app/dockappicon.h \
src/widgets/app/dockappitem.h \
src/widgets/app/dockapplayout.h \
src/controller/apps/dockappmanager.h \
src/widgets/dockitem.h \
src/widgets/plugin/dockpluginitem.h \
src/widgets/plugin/dockpluginssettingwindow.h \
src/controller/plugins/dockpluginsmanager.h \
src/widgets/movablelayout.h \
src/widgets/plugin/dockpluginlayout.h \
src/controller/plugins/dockpluginitemwrapper.h \
src/controller/plugins/dockpluginproxy.h \
src/widgets/app/apppreview/apppreviewloader.h \
src/widgets/app/apppreview/apppreviewloaderframe.h \
src/widgets/app/apppreview/apppreviewscontainer.h \
src/widgets/launcher/docklauncheritem.h \
src/controller/stylemanager.h \
src/dbus/dbuslaunchercontroller.h \
src/dbus/dbusshutdownfront.h
SOURCES += \
libs/xcb_misc.cpp \
src/controller/dockmodedata.cpp \
src/dbus/dbusclientmanager.cpp \
src/dbus/dbusdockedappmanager.cpp \
src/dbus/dbusdocksetting.cpp \
src/dbus/dbusentrymanager.cpp \
src/dbus/dbushidestatemanager.cpp \
src/dbus/dbusmenu.cpp \
src/dbus/dbusmenumanager.cpp \
src/dbus/dbuspanelmanager.cpp \
src/panel/panelmenu.cpp \
src/widgets/highlighteffect.cpp \
src/widgets/reflectioneffect.cpp \
src/main.cpp \
src/mainwidget.cpp \
src/controller/signalmanager.cpp \
src/widgets/previewwindow.cpp \
src/dbus/dbusdisplay.cpp \
src/dbus/dbuslauncher.cpp \
src/dbus/dbusdockentry.cpp \
src/panel/dockpanel.cpp \
src/widgets/app/dockappbg.cpp \
src/widgets/app/dockappicon.cpp \
src/widgets/app/dockappitem.cpp \
src/widgets/app/dockapplayout.cpp \
src/controller/apps/dockappmanager.cpp \
src/widgets/dockitem.cpp \
src/widgets/plugin/dockpluginitem.cpp \
src/widgets/plugin/dockpluginssettingwindow.cpp \
src/controller/plugins/dockpluginsmanager.cpp \
src/widgets/movablelayout.cpp \
src/widgets/plugin/dockpluginlayout.cpp \
src/controller/plugins/dockpluginitemwrapper.cpp \
src/controller/plugins/dockpluginproxy.cpp \
src/widgets/app/apppreview/apppreviewloader.cpp \
src/widgets/app/apppreview/apppreviewloaderframe.cpp \
src/widgets/app/apppreview/apppreviewscontainer.cpp \
src/widgets/launcher/docklauncheritem.cpp \
src/controller/stylemanager.cpp \
src/dbus/dbuslaunchercontroller.cpp \
src/dbus/dbusshutdownfront.cpp

View File

@ -1,3 +0,0 @@
<RCC>
<qresource prefix="/"/>
</RCC>

View File

@ -1,18 +0,0 @@
<RCC>
<qresource prefix="/images">
<file>resources/light/images/close_hover.png</file>
<file>resources/light/images/close_normal.png</file>
<file>resources/light/images/close_press.png</file>
<file>resources/light/images/dark_dock.svg</file>
<file>resources/light/images/open-indicator.png</file>
<file>resources/light/images/opening-indicator.png</file>
<file>resources/light/images/setting_close_small_hover.png</file>
<file>resources/light/images/setting_close_small_normal.png</file>
<file>resources/light/images/setting_close_small_press.png</file>
<file>resources/light/images/preview_border_hover.png</file>
<file>resources/light/images/preview_border_normal.png</file>
</qresource>
<qresource prefix="/qss">
<file>resources/light/qss/dde-dock.qss</file>
</qresource>
</RCC>

View File

@ -1,3 +0,0 @@
<RCC>
<qresource prefix="/"/>
</RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="91px" height="49px" viewBox="0 0 91 49" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.3 (12072) - http://www.bohemiancoding.com/sketch -->
<title>dark_dock副本</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="50.0289068%" y1="0.191268191%" x2="50.0289068%" y2="99.983368%" id="linearGradient-1">
<stop stop-color="#000000" stop-opacity="0.4982" offset="0%"></stop>
<stop stop-color="#000000" stop-opacity="0.802" offset="91.41%"></stop>
<stop stop-color="#1E1E1E" stop-opacity="0.8772" offset="92.11%"></stop>
<stop stop-color="#343434" stop-opacity="0.9" offset="100%"></stop>
</linearGradient>
<radialGradient cx="50.0071591%" cy="-376.96%" fx="50.0071591%" fy="-376.96%" r="0.568181818%" id="radialGradient-2">
<stop stop-color="#FFFFFF" stop-opacity="0.25" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0.2" offset="100%"></stop>
</radialGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="dark_dock副本" sketch:type="MSLayerGroup">
<g id="Page-1" sketch:type="MSShapeGroup">
<g id="dark_dock">
<g id="Mask" fill="url(#linearGradient-1)">
<path d="M0.7,44.5 C0.3,46.9 1.6,48.9 3.7,48.9 L87.5,48.9 C89.6,48.9 90.9,46.9 90.5,44.5 L83.5,5.2 C83.1,2.8 81.1,0.8 79,0.8 L12.2,0.8 C10.2,0.8 8.1,2.8 7.7,5.2 L0.7,44.5 L0.7,44.5 Z" id="Shape"></path>
</g>
<path d="M1.5,44.4 L89.5,44.4" id="Line" stroke="url(#radialGradient-2)"></path>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 818 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

View File

@ -1,111 +0,0 @@
QLabel#Panel[isFashionMode="false"] {
background-color: rgba(0,0,0,0.7);
}
QLabel#Panel[isFashionMode="true"] {
border-width: 0px 21px 49px 21px;
border-image: url(:/images/resources/dark/images/dark_dock.svg) 0 21 49 21 stretch;
}
QLabel#DockAppTitle {
color: rgba(255,255,255,0.8);
}
QLabel#ClassicModeTitle {
color: rgba(255,255,255,1);
}
/*************************************App Background***********************************************/
/*item is current opened and is hovered*/
QLabel#AppBackground[isFashionMode="false"][isCurrentOpened="true"][isHovered="true"] {
background: rgba(0,188,255,0.80);
border: 1px solid rgba(79,174,249,0.50);
/*box-shadow: inset 0px -4px 0px 0px #01BDFF, inset 0px 0px 1px 2px rgba(25,210,255,0.20);*/
border-radius: 2px;
}
/*item is current opened but not hovered*/
QLabel#AppBackground[isFashionMode="false"][isCurrentOpened="true"][isHovered="false"] {
background: rgba(0,188,255,0.60);
border: 1px solid rgba(79,174,249,0.50);
/*box-shadow: inset 0px -4px 0px 0px #01BDFF, inset 0px 0px 1px 2px rgba(25,210,255,0.20);*/
border-radius: 2px;
}
/*item is actived and hovered*/
QLabel#AppBackground[isFashionMode="false"][isActived="true"][isHovered="true"][isCurrentOpened="false"] {
background: rgba(255,255,255,0.40);
border-radius: 2px;
}
/*item is actived but not hovered*/
QLabel#AppBackground[isFashionMode="false"][isActived="true"][isHovered="false"][isCurrentOpened="false"] {
background: rgba(255,255,255,0.20);
border-radius: 2px;
}
QLabel#AppBackgroundActiveLabel {
qproperty-openIndicatorIcon:url(:/images/resources/dark/images/open-indicator.png);
qproperty-openingIndicatorIcon:url(:/images/resources/dark/images/opening-indicator.png);
}
/******************************Item Preview***********************/
QPushButton#AppPreviewLoaderFrameCloseButton {
border-image: url(:/images/resources/dark/images/close_normal.png);
}
QPushButton#AppPreviewLoaderFrameCloseButton:hover {
border-image: url(:/images/resources/dark/images/close_hover.png);
}
QPushButton#AppPreviewLoaderFrameCloseButton:pressed {
border-image: url(:/images/resources/dark/images/close_press.png);
}
AppPreviewLoader {
/*radius is 4 and width is 2 so slice should be 4 + 2 = 6*/
border: 6px solid transparent;
border-image: url(:/images/resources/dark/images/preview_border_normal.png) 6 repeat;
}
AppPreviewLoader[isHover="true"] {
/*radius is 4 and width is 2 so slice should be 4 + 2 = 6*/
border: 6px solid transparent;
border-image: url(:/images/resources/dark/images/preview_border_hover.png) 6 repeat;
}
QLabel#AppPreviewLoaderFrameTitle {
border-top-left-radius: 0px;
border-bottom-left-radius: 3px;
border-top-right-radius: 0px;
border-bottom-right-radius: 3px;
border-width: 0;
font-size: 10px;
color: #FFFFFF;
background-color: rgba(0,0,0,0.7);
}
/********************************Plugin Setting********************/
QLabel#PluginSettingTitle {
color:#b4b4b4;
}
QLabel#PluginSettingLineTitle {
color:#b4b4b4;
}
QWidget#PluginsSettingFrame {
background-color: rgba(0,0,0,0.9);
border-radius: 3;
}
QPushButton#PluginSettingCloseButton{
border-image: url(:/images/resources/dark/images/setting_close_small_normal.png);
}
QPushButton#PluginSettingCloseButton:hover{
border-image: url(:/images/resources/dark/images/setting_close_small_hover.png);
}
QPushButton#PluginSettingCloseButton:pressed{
border-image: url(:/images/resources/dark/images/setting_close_small_press.png);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 962 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="91px" height="49px" viewBox="0 0 91 49" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.3 (12072) - http://www.bohemiancoding.com/sketch -->
<title>dark_dock副本</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="50.0289068%" y1="0.191268191%" x2="50.0289068%" y2="99.983368%" id="linearGradient-1">
<stop stop-color="#000000" stop-opacity="0.4982" offset="0%"></stop>
<stop stop-color="#000000" stop-opacity="0.802" offset="91.41%"></stop>
<stop stop-color="#1E1E1E" stop-opacity="0.8772" offset="92.11%"></stop>
<stop stop-color="#343434" stop-opacity="0.9" offset="100%"></stop>
</linearGradient>
<radialGradient cx="50.0071591%" cy="-376.96%" fx="50.0071591%" fy="-376.96%" r="0.568181818%" id="radialGradient-2">
<stop stop-color="#FFFFFF" stop-opacity="0.25" offset="0%"></stop>
<stop stop-color="#FFFFFF" stop-opacity="0.2" offset="100%"></stop>
</radialGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="dark_dock副本" sketch:type="MSLayerGroup">
<g id="Page-1" sketch:type="MSShapeGroup">
<g id="dark_dock">
<g id="Mask" fill="url(#linearGradient-1)">
<path d="M0.7,44.5 C0.3,46.9 1.6,48.9 3.7,48.9 L87.5,48.9 C89.6,48.9 90.9,46.9 90.5,44.5 L83.5,5.2 C83.1,2.8 81.1,0.8 79,0.8 L12.2,0.8 C10.2,0.8 8.1,2.8 7.7,5.2 L0.7,44.5 L0.7,44.5 Z" id="Shape"></path>
</g>
<path d="M1.5,44.4 L89.5,44.4" id="Line" stroke="url(#radialGradient-2)"></path>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 818 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

View File

@ -1,111 +0,0 @@
QLabel#Panel[isFashionMode="false"] {
background-color: rgba(0,0,0,0.7);
}
QLabel#Panel[isFashionMode="true"] {
border-width: 0px 21px 49px 21px;
border-image: url(:/images/resources/dark/images/dark_dock.svg) 0 21 49 21 stretch;
}
QLabel#DockAppTitle {
color: rgba(255,255,255,0.8);
}
QLabel#ClassicModeTitle {
color: rgba(255,255,255,1);
}
/*************************************App Background***********************************************/
/*item is current opened and is hovered*/
QLabel#AppBackground[isFashionMode="false"][isCurrentOpened="true"][isHovered="true"] {
background: rgba(0,188,255,0.80);
border: 1px solid rgba(79,174,249,0.50);
/*box-shadow: inset 0px -4px 0px 0px #01BDFF, inset 0px 0px 1px 2px rgba(25,210,255,0.20);*/
border-radius: 2px;
}
/*item is current opened but not hovered*/
QLabel#AppBackground[isFashionMode="false"][isCurrentOpened="true"][isHovered="false"] {
background: rgba(0,188,255,0.60);
border: 1px solid rgba(79,174,249,0.50);
/*box-shadow: inset 0px -4px 0px 0px #01BDFF, inset 0px 0px 1px 2px rgba(25,210,255,0.20);*/
border-radius: 2px;
}
/*item is actived and hovered*/
QLabel#AppBackground[isFashionMode="false"][isActived="true"][isHovered="true"][isCurrentOpened="false"] {
background: rgba(255,255,255,0.40);
border-radius: 2px;
}
/*item is actived but not hovered*/
QLabel#AppBackground[isFashionMode="false"][isActived="true"][isHovered="false"][isCurrentOpened="false"] {
background: rgba(255,255,255,0.20);
border-radius: 2px;
}
QLabel#AppBackgroundActiveLabel {
qproperty-openIndicatorIcon:url(:/images/resources/dark/images/open-indicator.png);
qproperty-openingIndicatorIcon:url(:/images/resources/dark/images/opening-indicator.png);
}
/******************************Item Preview***********************/
QPushButton#AppPreviewLoaderFrameCloseButton {
border-image: url(:/images/resources/dark/images/close_normal.png);
}
QPushButton#AppPreviewLoaderFrameCloseButton:hover {
border-image: url(:/images/resources/dark/images/close_hover.png);
}
QPushButton#AppPreviewLoaderFrameCloseButton:pressed {
border-image: url(:/images/resources/dark/images/close_press.png);
}
AppPreviewLoader {
/*radius is 4 and width is 2 so slice should be 4 + 2 = 6*/
border: 6px solid transparent;
border-image: url(:/images/resources/dark/images/preview_border_normal.png) 6 repeat;
}
AppPreviewLoader[isHover="true"] {
/*radius is 4 and width is 2 so slice should be 4 + 2 = 6*/
border: 6px solid transparent;
border-image: url(:/images/resources/dark/images/preview_border_hover.png) 6 repeat;
}
QLabel#AppPreviewLoaderFrameTitle {
border-top-left-radius: 0px;
border-bottom-left-radius: 3px;
border-top-right-radius: 0px;
border-bottom-right-radius: 3px;
border-width: 0;
font-size: 10px;
color: #FFFFFF;
background-color: rgba(0,0,0,0.7);
}
/********************************Plugin Setting********************/
QLabel#PluginSettingTitle {
color:#b4b4b4;
}
QLabel#PluginSettingLineTitle {
color:#b4b4b4;
}
QWidget#PluginsSettingFrame {
background-color: rgba(0,0,0,0.9);
border-radius: 3;
}
QPushButton#PluginSettingCloseButton{
border-image: url(:/images/resources/dark/images/setting_close_small_normal.png);
}
QPushButton#PluginSettingCloseButton:hover{
border-image: url(:/images/resources/dark/images/setting_close_small_hover.png);
}
QPushButton#PluginSettingCloseButton:pressed{
border-image: url(:/images/resources/dark/images/setting_close_small_press.png);
}

View File

@ -1,108 +0,0 @@
/**
* 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.
**/
#include "dockappmanager.h"
#include "dbus/dbuslauncher.h"
DockAppManager::DockAppManager(QObject *parent) : QObject(parent)
{
m_entryManager = new DBusEntryManager(this);
connect(m_entryManager, &DBusEntryManager::Added, this, &DockAppManager::onEntryAdded);
connect(m_entryManager, &DBusEntryManager::Removed, this, &DockAppManager::onEntryRemoved);
DBusLauncher *dbusLauncher = new DBusLauncher(this);
connect(dbusLauncher, &DBusLauncher::ItemChanged, [=](const QString &in0, ItemInfo in1){
if (in0 == "deleted") {
onEntryRemoved(in1.key);
m_dockAppManager->RequestUndock(in1.key);
}
});
}
void DockAppManager::initEntries()
{
QList<QDBusObjectPath> entryList = m_entryManager->entries();
for (QDBusObjectPath objPath : entryList)
{
DBusDockEntry *dep = new DBusDockEntry(objPath.path());
if (/*dep->isValid() && */dep->type() == "App") {
m_initEntries << dep;
}
}
initItemList();
}
void DockAppManager::onEntryAdded(const QDBusObjectPath &path)
{
DBusDockEntry *entryProxyer = new DBusDockEntry(path.path());
if (entryProxyer->isValid() && entryProxyer->type() == "App")
{
DockAppItem *item = new DockAppItem();
QString tmpId = entryProxyer->id();
item->setItemId(tmpId);
if (m_ids.indexOf(tmpId) != -1) {
item->deleteLater();
}else{
qDebug() << "app entry add:" << tmpId ;
bool isTheDropOne = m_dockingItemId == tmpId;
m_ids.append(tmpId);
if (isTheDropOne) {
emit entryAdded(item);
}
else {
emit entryAppend(item);
}
emit requestSort();
m_dockingItemId = "";
}
item->setEntryProxyer(entryProxyer);
}
}
void DockAppManager::setDockingItemId(const QString &dockingItemId)
{
m_dockingItemId = dockingItemId;
}
void DockAppManager::onEntryRemoved(const QString &id)
{
if (m_ids.indexOf(id) != -1) {
qDebug() << "app entry remove:" << id;
m_ids.removeAll(id);
emit entryRemoved(id);
}
}
void DockAppManager::initItemList()
{
QStringList dockedList = m_dockAppManager->DockedAppList().value();
m_ids = QStringList();
QList<DBusDockEntry*> undockedEntries;
for (DBusDockEntry *entry : m_initEntries) {
m_ids << entry->id();
if (dockedList.indexOf(entry->id()) != -1) {
DockAppItem *item = new DockAppItem;
emit entryAppend(item);
item->setEntryProxyer(entry);
} else {
undockedEntries << entry;
}
}
for (DBusDockEntry *entry : undockedEntries) {
DockAppItem *item = new DockAppItem;
emit entryAppend(item);
item->setEntryProxyer(entry);
}
}

View File

@ -1,46 +0,0 @@
/**
* 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.
**/
#ifndef DOCKAPPMANAGER_H
#define DOCKAPPMANAGER_H
#include "dbus/dbusentrymanager.h"
#include "dbus/dbusdockentry.h"
#include "dbus/dbusdockedappmanager.h"
#include "widgets/app/dockappitem.h"
class DockAppManager : public QObject
{
Q_OBJECT
public:
explicit DockAppManager(QObject *parent = 0);
void initEntries();
void setDockingItemId(const QString &dockingItemId);
signals:
void requestSort();
void entryAdded(DockAppItem *item);
void entryAppend(DockAppItem *item);
void entryRemoved(const QString &id);
private:
void initItemList(); //Sort and append item to dock
void onEntryRemoved(const QString &id);
void onEntryAdded(const QDBusObjectPath &path);
private:
QStringList m_ids;
QString m_dockingItemId = ""; //drop to the dock one
DBusEntryManager *m_entryManager = NULL;
DBusDockedAppManager *m_dockAppManager = new DBusDockedAppManager(this);
QList<DBusDockEntry*> m_initEntries;
};
#endif // DOCKAPPMANAGER_H

View File

@ -1,245 +0,0 @@
/**
* 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.
**/
#include "dockmodedata.h"
DockModeData::DockModeData(QObject *parent) :
QObject(parent)
{
initDDS();
}
DockModeData * DockModeData::m_dockModeData = NULL;
DockModeData * DockModeData::instance()
{
if (m_dockModeData == NULL)
m_dockModeData = new DockModeData();
return m_dockModeData;
}
Dock::DockMode DockModeData::getDockMode()
{
return m_currentMode;
}
void DockModeData::setDockMode(Dock::DockMode value)
{
m_dockSetting->SetDisplayMode(value);
}
Dock::HideMode DockModeData::getHideMode()
{
return m_hideMode;
}
void DockModeData::setHideMode(Dock::HideMode value)
{
m_dockSetting->SetHideMode(value);
if(value == Dock::KeepShowing) {
setHideState(Dock::HideStateShowing);
}
else if (value == Dock::SmartHide){
setHideState(Dock::HideStateHiding);
}
QTimer::singleShot(100, m_hideStateManager, SLOT(UpdateState()));
}
Dock::HideState DockModeData::getHideState()
{
return m_hideState;
}
void DockModeData::setHideState(Dock::HideState value)
{
m_hideState = value;
m_hideStateManager->SetState(value);
m_hideStateManager->UpdateState();
}
int DockModeData::getDockHeight()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::PANEL_FASHION_HEIGHT;
case Dock::EfficientMode:
return Dock::PANEL_EFFICIENT_HEIGHT;
case Dock::ClassicMode:
return Dock::PANEL_CLASSIC_HEIGHT;
default:
return Dock::PANEL_FASHION_HEIGHT;
}
}
int DockModeData::getItemHeight()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APP_ITEM_FASHION_HEIGHT;
case Dock::EfficientMode:
return Dock::APP_ITEM_EFFICIENT_HEIGHT;
case Dock::ClassicMode:
return Dock::APP_ITEM_CLASSIC_HEIGHT;
default:
return Dock::APP_ITEM_FASHION_HEIGHT;
}
}
int DockModeData::getNormalItemWidth()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APP_ITEM_FASHION_NORMAL_WIDTH;
case Dock::EfficientMode:
return Dock::APP_ITEM_EFFICIENT_NORMAL_WIDTH;
case Dock::ClassicMode:
return Dock::APP_ITEM_CLASSIC_NORMAL_WIDTH;
default:
return Dock::APP_ITEM_FASHION_NORMAL_WIDTH;
}
}
int DockModeData::getActivedItemWidth()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APP_ITEM_FASHION_ACTIVE_WIDTH;
case Dock::EfficientMode:
return Dock::APP_ITEM_EFFICIENT_ACTIVE_WIDTH;
case Dock::ClassicMode:
return Dock::APP_ITEM_CLASSIC_ACTIVE_WIDTH;
default:
return Dock::APP_ITEM_FASHION_ACTIVE_WIDTH;
}
}
int DockModeData::getAppItemSpacing()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APP_ITEM_FASHION_SPACING;
case Dock::EfficientMode:
return Dock::APP_ITEM_EFFICIENT_SPACING;
case Dock::ClassicMode:
return Dock::APP_ITEM_CLASSIC_SPACING;
default:
return Dock::APP_ITEM_FASHION_SPACING;
}
}
int DockModeData::getAppIconSize()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APP_ITEM_FASHION_ICON_SIZE;
case Dock::EfficientMode:
return Dock::APP_ITEM_EFFICIENT_ICON_SIZE;
case Dock::ClassicMode:
return Dock::APP_ITEM_CLASSIC_ICON_SIZE;
default:
return Dock::APP_ITEM_FASHION_ICON_SIZE;
}
}
int DockModeData::getAppletsItemHeight()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APPLET_FASHION_ITEM_HEIGHT;
case Dock::EfficientMode:
return Dock::APPLET_EFFICIENT_ITEM_HEIGHT;
case Dock::ClassicMode:
return Dock::APPLET_CLASSIC_ITEM_HEIGHT;
default:
return Dock::APPLET_FASHION_ITEM_HEIGHT;
}
}
int DockModeData::getAppletsItemWidth()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APPLET_FASHION_ITEM_WIDTH;
case Dock::EfficientMode:
return Dock::APPLET_EFFICIENT_ITEM_WIDTH;
case Dock::ClassicMode:
return Dock::APPLET_CLASSIC_ITEM_WIDTH;
default:
return Dock::APPLET_FASHION_ITEM_WIDTH;
}
}
int DockModeData::getAppletsItemSpacing()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APPLET_FASHION_ITEM_SPACING;
case Dock::EfficientMode:
return Dock::APPLET_EFFICIENT_ITEM_SPACING;
case Dock::ClassicMode:
return Dock::APPLET_CLASSIC_ITEM_SPACING;
default:
return Dock::APPLET_FASHION_ITEM_SPACING;
}
}
int DockModeData::getAppletsIconSize()
{
switch (m_currentMode)
{
case Dock::FashionMode:
return Dock::APPLET_FASHION_ICON_SIZE;
case Dock::EfficientMode:
return Dock::APPLET_EFFICIENT_ICON_SIZE;
case Dock::ClassicMode:
return Dock::APPLET_CLASSIC_ICON_SIZE;
default:
return Dock::APPLET_FASHION_ICON_SIZE;
}
}
void DockModeData::onDockModeChanged(int mode)
{
Dock::DockMode tmpMode = Dock::DockMode(mode);
Dock::DockMode oldmode = m_currentMode;
m_currentMode = tmpMode;
emit dockModeChanged(tmpMode,oldmode);
}
void DockModeData::onHideModeChanged(int mode)
{
Dock::HideMode tmpMode = Dock::HideMode(mode);
Dock::HideMode oldMode = m_hideMode;
m_hideMode = tmpMode;
emit hideModeChanged(tmpMode,oldMode);
}
void DockModeData::initDDS()
{
m_dockSetting = new DBusDockSetting(this);
connect(m_dockSetting,&DBusDockSetting::DisplayModeChanged,this,&DockModeData::onDockModeChanged);
connect(m_dockSetting,&DBusDockSetting::HideModeChanged,this,&DockModeData::onHideModeChanged);
m_currentMode = Dock::DockMode(m_dockSetting->GetDisplayMode().value());
m_hideMode = Dock::HideMode(m_dockSetting->GetHideMode().value());
emit dockModeChanged(m_currentMode,m_currentMode);
emit hideModeChanged(m_hideMode,m_hideMode);
}

View File

@ -1,68 +0,0 @@
/**
* 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.
**/
#ifndef DOCKMODEDATA_H
#define DOCKMODEDATA_H
#include <QObject>
#include <QStringList>
#include <QTimer>
#include <QDebug>
#include "dbus/dbusdocksetting.h"
#include "dbus/dbushidestatemanager.h"
#include "interfaces/dockconstants.h"
class DockModeData : public QObject
{
Q_OBJECT
public:
static DockModeData * instance();
Dock::DockMode getDockMode();
void setDockMode(Dock::DockMode value);
Dock::HideMode getHideMode();
void setHideMode(Dock::HideMode value);
Dock::HideState getHideState();
void setHideState(Dock::HideState value);
int getDockHeight();
int getItemHeight();
int getNormalItemWidth();
int getActivedItemWidth();
int getAppItemSpacing();
int getAppIconSize();
int getAppletsItemHeight();
int getAppletsItemWidth();
int getAppletsItemSpacing();
int getAppletsIconSize();
signals:
void dockModeChanged(Dock::DockMode newMode,Dock::DockMode oldMode);
void hideModeChanged(Dock::HideMode newMode,Dock::HideMode oldMode);
private:
explicit DockModeData(QObject *parent = 0);
void initDDS();
void onDockModeChanged(int mode);
void onHideModeChanged(int mode);
private:
static DockModeData * m_dockModeData;
Dock::DockMode m_currentMode = Dock::EfficientMode;
Dock::HideMode m_hideMode = Dock::KeepShowing;
Dock::HideState m_hideState = Dock::HideStateShown; //make sure the preview can be show
DBusDockSetting *m_dockSetting = NULL;
DBusHideStateManager *m_hideStateManager = new DBusHideStateManager(this);
};
#endif // DOCKMODEDATA_H

View File

@ -1,158 +0,0 @@
/**
* 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.
**/
#include <QMouseEvent>
#include <QJsonArray>
#include <QJsonDocument>
#include <QProcess>
#include "dockpluginitemwrapper.h"
#include "../dockmodedata.h"
static const QString MenuItemRun = "id_run";
static const QString MenuItemRemove = "id_remove";
DockPluginItemWrapper::DockPluginItemWrapper(DockPluginInterface *plugin,
QString id, QWidget * parent) :
DockItem(parent),
m_plugin(plugin),
m_id(id)
{
if (m_plugin) {
qDebug() << "PluginItemWrapper created " << m_plugin->getPluginName() << m_id;
QWidget * item = m_plugin->getItem(id);
m_pluginItemContents = m_plugin->getApplet(id);
if (item) {
QHBoxLayout *layout = new QHBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
layout->addWidget(item);
adjustSize();
m_display = new DBusDisplay(this);
}
}
}
DockPluginItemWrapper::~DockPluginItemWrapper()
{
qDebug() << "PluginItemWrapper destroyed " << m_plugin->getPluginName() << m_id;
}
QString DockPluginItemWrapper::getTitle()
{
return m_plugin->getTitle(m_id);
}
QWidget * DockPluginItemWrapper::getApplet()
{
return m_plugin->getApplet(m_id);
}
QString DockPluginItemWrapper::getItemId()
{
return m_id;
}
void DockPluginItemWrapper::enterEvent(QEvent *)
{
if (hoverable()) {
DisplayRect rec = m_display->primaryRect();
showPreview(QPoint(globalX() + width() / 2, rec.height- DockModeData::instance()->getDockHeight() - DOCK_PREVIEW_MARGIN));
emit mouseEnter();
}
}
void DockPluginItemWrapper::leaveEvent(QEvent *)
{
hidePreview();
emit mouseLeave();
}
void DockPluginItemWrapper::mousePressEvent(QMouseEvent * event)
{
hidePreview(true);
if (event->button() == Qt::RightButton) {
DisplayRect rec = m_display->primaryRect();
this->showMenu(QPoint(rec.x + globalX() + width() / 2,
rec.y + rec.height - DockModeData::instance()->getDockHeight()));
} else if (event->button() == Qt::LeftButton) {
QString command = m_plugin->getCommand(m_id);
if (!command.isEmpty()) QProcess::startDetached(command);
}
emit mousePress();
}
void DockPluginItemWrapper::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event)
emit mouseRelease();
}
QString DockPluginItemWrapper::getMenuContent()
{
QString menuContent = m_plugin->getMenuContent(m_id);
bool canRun = !m_plugin->getCommand(m_id).isEmpty();
bool configurable = m_plugin->configurable(m_id);
if (canRun || configurable) {
QJsonObject result = QJsonDocument::fromJson(menuContent.toUtf8()).object();
QJsonArray array = result["items"].toArray();
QJsonObject itemRun = createMenuItem(MenuItemRun, tr("_Run"), false, false);
QJsonObject itemRemove = createMenuItem(MenuItemRemove, tr("_Undock"), false, false);
if (canRun) array.insert(0, itemRun);
if (configurable) array.append(itemRemove);
result["items"] = array;
return QString(QJsonDocument(result).toJson());
} else {
return menuContent;
}
}
void DockPluginItemWrapper::invokeMenuItem(QString itemId, bool checked)
{
if (itemId == MenuItemRun) {
QString command = m_plugin->getCommand(m_id);
QProcess::startDetached(command);
} else if (itemId == MenuItemRemove){
m_plugin->setEnabled(m_id, false);
} else {
m_plugin->invokeMenuItem(m_id, itemId, checked);
}
}
QJsonObject DockPluginItemWrapper::createMenuItem(QString itemId, QString itemName, bool checkable, bool checked)
{
QJsonObject itemObj;
itemObj.insert("itemId", itemId);
itemObj.insert("itemText", itemName);
itemObj.insert("itemIcon", "");
itemObj.insert("itemIconHover", "");
itemObj.insert("itemIconInactive", "");
itemObj.insert("itemExtra", "");
itemObj.insert("isActive", true);
itemObj.insert("isCheckable", checkable);
itemObj.insert("checked", checked);
itemObj.insert("itemSubMenu", QJsonObject());
return itemObj;
}

Some files were not shown because too many files have changed in this diff Show More