Merge "Update icon with gtk theme change"

This commit is contained in:
mr.asianwang 2015-10-28 10:48:54 +08:00 committed by Deepin Code Review
commit 4bb9a8d0bd
9 changed files with 127 additions and 8 deletions

View File

@ -6,6 +6,29 @@ 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);
@ -16,6 +39,10 @@ MainItem::MainItem(QWidget *parent) : QLabel(parent)
updateIcon(false);
});
updateIcon(false);
initGtkThemeWatcher();
//can't use lambda here
connect(SignalManager::instance(), SIGNAL(requestAppIconUpdate()), this, SLOT(onRequestUpdateIcon()));
}
MainItem::~MainItem()
@ -126,6 +153,11 @@ void MainItem::dropEvent(QDropEvent *event)
}
}
void MainItem::onRequestUpdateIcon()
{
updateIcon(false);
}
void MainItem::updateIcon(bool isOpen)
{
QString iconName = "";
@ -144,8 +176,8 @@ void MainItem::updateIcon(bool isOpen)
iconName = "user-trash-empty";
}
QPixmap pixmap = QIcon::fromTheme(iconName).pixmap(Dock::APPLET_FASHION_ICON_SIZE,Dock::APPLET_FASHION_ICON_SIZE);
setPixmap(pixmap);
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.

View File

@ -17,6 +17,19 @@
#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
{
@ -33,6 +46,9 @@ protected:
void dragLeaveEvent(QDragLeaveEvent *);
void dropEvent(QDropEvent * event);
private slots:
void onRequestUpdateIcon();
private:
QString getThemeIconPath(QString iconName);
void updateIcon(bool isOpen);

View File

@ -67,7 +67,8 @@ HEADERS += \
src/widgets/screenmask.h \
src/widgets/windowpreview.h \
src/mainwidget.h \
src/widgets/previewframe.h
src/widgets/previewframe.h \
src/controller/signalmanager.h
SOURCES += \
libs/xcb_misc.cpp \
@ -103,4 +104,5 @@ SOURCES += \
src/widgets/windowpreview.cpp \
src/main.cpp \
src/mainwidget.cpp \
src/widgets/previewframe.cpp
src/widgets/previewframe.cpp \
src/controller/signalmanager.cpp

View File

@ -0,0 +1,15 @@
#include "signalmanager.h"
SignalManager *SignalManager::m_signalManager = NULL;
SignalManager *SignalManager::instance()
{
if (!m_signalManager)
m_signalManager = new SignalManager;
return m_signalManager;
}
SignalManager::SignalManager(QObject *parent) : QObject(parent)
{
}

View File

@ -0,0 +1,20 @@
#ifndef SIGNALMANAGER_H
#define SIGNALMANAGER_H
#include <QObject>
class SignalManager : public QObject
{
Q_OBJECT
public:
static SignalManager *instance();
signals:
void requestAppIconUpdate();
private:
explicit SignalManager(QObject *parent = 0);
static SignalManager *m_signalManager;
};
#endif // SIGNALMANAGER_H

View File

@ -7,6 +7,26 @@
#include "mainwidget.h"
#include "logmanager.h"
#include "Logger.h"
#include "controller/signalmanager.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);
}
// let startdde know that we've already started.
void RegisterDdeSession()
@ -56,7 +76,6 @@ int main(int argc, char *argv[])
qWarning() << "[Error:] Open style file errr!";
}
MainWidget w;
w.show();
qWarning() << "The main window has been shown!";
@ -64,6 +83,7 @@ int main(int argc, char *argv[])
RegisterDdeSession();
initGtkThemeWatcher();
return a.exec();
} else {
qWarning() << "dde dock is running...";

View File

@ -2,14 +2,15 @@
#include <QPainter>
#include <QSvgRenderer>
#include "appicon.h"
#include "controller/signalmanager.h"
#undef signals
extern "C" {
#include <gtk/gtk.h>
}
#define signals public
#include "appicon.h"
AppIcon::AppIcon(QWidget *parent, Qt::WindowFlags f) :
QLabel(parent, f)
{
@ -20,10 +21,14 @@ AppIcon::AppIcon(QWidget *parent, Qt::WindowFlags f) :
this->setAttribute(Qt::WA_TranslucentBackground);
this->setAlignment(Qt::AlignCenter);
connect(SignalManager::instance(), &SignalManager::requestAppIconUpdate, this, &AppIcon::updateIcon);
}
void AppIcon::setIcon(const QString &iconPath)
{
m_iconPath = iconPath;
QPixmap pixmap(48, 48);
// iconPath is an absolute path of the system.
@ -114,3 +119,9 @@ QString AppIcon::getThemeIconPath(QString iconName)
return "";
}
}
void AppIcon::updateIcon()
{
if (!m_iconPath.isEmpty())
setIcon(m_iconPath);
}

View File

@ -32,9 +32,10 @@ protected:
private:
DockModeData *m_modeData = DockModeData::instance();
QString m_iconPath;
QString m_iconPath = "";
QString getThemeIconPath(QString iconName);
void updateIcon();
};
#endif // APPICON_H

View File

@ -1,4 +1,5 @@
#include "launcheritem.h"
#include "controller/signalmanager.h"
LauncherItem::LauncherItem(QWidget *parent) : AbstractDockItem(parent)
{
@ -14,6 +15,7 @@ LauncherItem::LauncherItem(QWidget *parent) : AbstractDockItem(parent)
//TODO icon not show on init
QTimer::singleShot(20, this, SLOT(updateIcon()));
connect(SignalManager::instance(), &SignalManager::requestAppIconUpdate, this, &LauncherItem::updateIcon);
}
void LauncherItem::enterEvent(QEvent *)