Added needed Symbolsubuntu/cosmic debian/0.11.1-3
parent
5b9cc02532
commit
057bb75ee9
@ -0,0 +1,344 @@
|
||||
Description: Fixed behaviour with icon emblems
|
||||
Backported a upstream fix for Icon Emblem Support. Only applies to
|
||||
pcmanfm-qt - no changes in released version needed.
|
||||
Author: Alf Gaida <agaida@siduction.org>
|
||||
|
||||
Last-Update: 2016-10-20
|
||||
|
||||
--- libfm-qt-0.11.1.orig/src/folderitemdelegate.cpp
|
||||
+++ libfm-qt-0.11.1/src/folderitemdelegate.cpp
|
||||
@@ -35,7 +35,9 @@ namespace Fm {
|
||||
FolderItemDelegate::FolderItemDelegate(QAbstractItemView* view, QObject* parent):
|
||||
QStyledItemDelegate(parent ? parent : view),
|
||||
view_(view),
|
||||
- symlinkIcon_(QIcon::fromTheme("emblem-symbolic-link")) {
|
||||
+ symlinkIcon_(QIcon::fromTheme("emblem-symbolic-link")),
|
||||
+ fileInfoRole_(Fm::FolderModel::FileInfoRole),
|
||||
+ fmIconRole_(-1) {
|
||||
}
|
||||
|
||||
FolderItemDelegate::~FolderItemDelegate() {
|
||||
@@ -78,9 +80,13 @@ QIcon::Mode FolderItemDelegate::iconMode
|
||||
// special thanks to Razor-qt developer Alec Moskvin(amoskvin) for providing the fix!
|
||||
void FolderItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
|
||||
Q_ASSERT(index.isValid());
|
||||
- FmFileInfo* file = static_cast<FmFileInfo*>(index.data(FolderModel::FileInfoRole).value<void*>());
|
||||
+ FmFileInfo* file = static_cast<FmFileInfo*>(index.data(fileInfoRole_).value<void*>());
|
||||
+ FmIcon* fmicon = static_cast<FmIcon*>(index.data(fmIconRole_).value<void*>());
|
||||
+ if(fmicon == nullptr && file != nullptr) {
|
||||
+ fmicon = fm_file_info_get_icon(file);
|
||||
+ }
|
||||
+ QList<Icon> emblems = fmicon != nullptr ? IconTheme::emblems(fmicon) : QList<Icon>();
|
||||
bool isSymlink = file && fm_file_info_is_symlink(file);
|
||||
-
|
||||
if(option.decorationPosition == QStyleOptionViewItem::Top ||
|
||||
option.decorationPosition == QStyleOptionViewItem::Bottom) {
|
||||
painter->save();
|
||||
@@ -100,9 +106,13 @@ void FolderItemDelegate::paint(QPainter*
|
||||
painter->drawPixmap(iconPos + QPoint(margin.width(), margin.height()), pixmap);
|
||||
|
||||
// draw some emblems for the item if needed
|
||||
- // we only support symlink emblem at the moment
|
||||
if(isSymlink)
|
||||
painter->drawPixmap(iconPos, symlinkIcon_.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ if(!emblems.isEmpty()) {
|
||||
+ QPoint emblemPos(opt.rect.x() + opt.rect.width() / 2, opt.rect.y() + option.decorationSize.height() / 2);
|
||||
+ QIcon emblem = IconTheme::icon(emblems.first().dataPtr());
|
||||
+ painter->drawPixmap(emblemPos, emblem.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ }
|
||||
|
||||
// draw the text
|
||||
// The text rect dimensions should be exactly as they were in sizeHint()
|
||||
@@ -118,14 +128,20 @@ void FolderItemDelegate::paint(QPainter*
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
|
||||
// draw emblems if needed
|
||||
- if(isSymlink) {
|
||||
+ if(isSymlink || !emblems.isEmpty()) {
|
||||
QStyleOptionViewItem opt = option;
|
||||
initStyleOption(&opt, index);
|
||||
QIcon::Mode iconMode = iconModeFromState(opt.state);
|
||||
- QPoint iconPos(opt.rect.x(), opt.rect.y() + (opt.rect.height() - option.decorationSize.height()) / 2);
|
||||
// draw some emblems for the item if needed
|
||||
- // we only support symlink emblem at the moment
|
||||
- painter->drawPixmap(iconPos, symlinkIcon_.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ if(isSymlink) {
|
||||
+ QPoint iconPos(opt.rect.x(), opt.rect.y() + (opt.rect.height() - option.decorationSize.height()) / 2);
|
||||
+ painter->drawPixmap(iconPos, symlinkIcon_.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ }
|
||||
+ else {
|
||||
+ QPoint iconPos(opt.rect.x() + option.decorationSize.width() / 2, opt.rect.y() + opt.rect.height() / 2);
|
||||
+ QIcon emblem = IconTheme::icon(emblems.first().dataPtr());
|
||||
+ painter->drawPixmap(iconPos, emblem.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
--- libfm-qt-0.11.1.orig/src/folderitemdelegate.h
|
||||
+++ libfm-qt-0.11.1/src/folderitemdelegate.h
|
||||
@@ -41,6 +41,22 @@ public:
|
||||
return gridSize_;
|
||||
}
|
||||
|
||||
+ int fileInfoRole() {
|
||||
+ return fileInfoRole_;
|
||||
+ }
|
||||
+
|
||||
+ void setFileInfoRole(int role) {
|
||||
+ fileInfoRole_ = role;
|
||||
+ }
|
||||
+
|
||||
+ int fmIconRole() {
|
||||
+ return fmIconRole_;
|
||||
+ }
|
||||
+
|
||||
+ void setFmIconRole(int role) {
|
||||
+ fmIconRole_ = role;
|
||||
+ }
|
||||
+
|
||||
virtual QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const;
|
||||
virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
||||
|
||||
@@ -52,6 +68,8 @@ private:
|
||||
QAbstractItemView* view_;
|
||||
QIcon symlinkIcon_;
|
||||
QSize gridSize_;
|
||||
+ int fileInfoRole_;
|
||||
+ int fmIconRole_;
|
||||
};
|
||||
|
||||
}
|
||||
--- libfm-qt-0.11.1.orig/src/icontheme.cpp
|
||||
+++ libfm-qt-0.11.1/src/icontheme.cpp
|
||||
@@ -28,12 +28,18 @@
|
||||
|
||||
namespace Fm {
|
||||
|
||||
+class IconCacheData {
|
||||
+public:
|
||||
+ QIcon qicon;
|
||||
+ QList<Icon> emblems;
|
||||
+};
|
||||
+
|
||||
static IconTheme* theIconTheme = NULL; // the global single instance of IconTheme.
|
||||
static const char* fallbackNames[] = {"unknown", "application-octet-stream", NULL};
|
||||
|
||||
-static void fmIconDataDestroy(gpointer data) {
|
||||
- QIcon* picon = reinterpret_cast<QIcon*>(data);
|
||||
- delete picon;
|
||||
+static void fmIconDataDestroy(gpointer user_data) {
|
||||
+ IconCacheData* data = reinterpret_cast<IconCacheData*>(user_data);
|
||||
+ delete data;
|
||||
}
|
||||
|
||||
IconTheme::IconTheme():
|
||||
@@ -88,7 +94,7 @@ QIcon IconTheme::iconFromNames(const cha
|
||||
return QIcon();
|
||||
}
|
||||
|
||||
-QIcon IconTheme::convertFromGIcon(GIcon* gicon) {
|
||||
+QIcon IconTheme::convertFromGIconWithoutEmblems(GIcon* gicon) {
|
||||
if(G_IS_THEMED_ICON(gicon)) {
|
||||
const gchar * const * names = g_themed_icon_get_names(G_THEMED_ICON(gicon));
|
||||
QIcon icon = iconFromNames(names);
|
||||
@@ -106,20 +112,36 @@ QIcon IconTheme::convertFromGIcon(GIcon*
|
||||
}
|
||||
|
||||
|
||||
+// static
|
||||
+IconCacheData* IconTheme::ensureCacheData(FmIcon* fmicon) {
|
||||
+ IconCacheData* data = reinterpret_cast<IconCacheData*>(fm_icon_get_user_data(fmicon));
|
||||
+ if(!data) { // we don't have a cache yet
|
||||
+ data = new IconCacheData();
|
||||
+ GIcon* gicon = G_ICON(fmicon);
|
||||
+ if(G_IS_EMBLEMED_ICON(gicon)) { // special handling for emblemed icon
|
||||
+ GList* emblems = g_emblemed_icon_get_emblems(G_EMBLEMED_ICON(gicon));
|
||||
+ for(GList* l = emblems; l; l = l->next) {
|
||||
+ GIcon* emblem_gicon = g_emblem_get_icon(G_EMBLEM(l->data));
|
||||
+ data->emblems.append(Icon::fromGicon(emblem_gicon));
|
||||
+ }
|
||||
+ gicon = g_emblemed_icon_get_icon(G_EMBLEMED_ICON(gicon)); // get an emblemless GIcon
|
||||
+ }
|
||||
+ data->qicon = convertFromGIconWithoutEmblems(gicon);
|
||||
+ fm_icon_set_user_data(fmicon, data); // store it in FmIcon
|
||||
+ }
|
||||
+ return data;
|
||||
+}
|
||||
+
|
||||
//static
|
||||
QIcon IconTheme::icon(FmIcon* fmicon) {
|
||||
- // check if we have a cached version
|
||||
- QIcon* picon = reinterpret_cast<QIcon*>(fm_icon_get_user_data(fmicon));
|
||||
- if(!picon) { // we don't have a cache yet
|
||||
- picon = new QIcon(); // what a waste!
|
||||
- *picon = convertFromGIcon(G_ICON(fmicon));
|
||||
- fm_icon_set_user_data(fmicon, picon); // store it in FmIcon
|
||||
- }
|
||||
- return *picon;
|
||||
+ IconCacheData* data = ensureCacheData(fmicon);
|
||||
+ return data->qicon;
|
||||
}
|
||||
|
||||
//static
|
||||
QIcon IconTheme::icon(GIcon* gicon) {
|
||||
+ if(G_IS_EMBLEMED_ICON(gicon)) // get an emblemless GIcon
|
||||
+ gicon = g_emblemed_icon_get_icon(G_EMBLEMED_ICON(gicon));
|
||||
if(G_IS_THEMED_ICON(gicon)) {
|
||||
FmIcon* fmicon = fm_icon_from_gicon(gicon);
|
||||
QIcon qicon = icon(fmicon);
|
||||
@@ -128,11 +150,26 @@ QIcon IconTheme::icon(GIcon* gicon) {
|
||||
}
|
||||
else if(G_IS_FILE_ICON(gicon)) {
|
||||
// we do not map GFileIcon to FmIcon deliberately.
|
||||
- return convertFromGIcon(gicon);
|
||||
+ return convertFromGIconWithoutEmblems(gicon);
|
||||
}
|
||||
return theIconTheme->fallbackIcon_;
|
||||
}
|
||||
|
||||
+// static
|
||||
+QList<Icon> IconTheme::emblems(FmIcon* fmicon) {
|
||||
+ IconCacheData* data = ensureCacheData(fmicon);
|
||||
+ return data->emblems;
|
||||
+}
|
||||
+
|
||||
+//static
|
||||
+QList<Icon> IconTheme::emblems(GIcon* gicon) {
|
||||
+ if(G_IS_EMBLEMED_ICON(gicon)) { // if this gicon contains emblems
|
||||
+ Icon fmicon = Icon::fromGicon(gicon);
|
||||
+ return emblems(fmicon.dataPtr());
|
||||
+ }
|
||||
+ return QList<Icon>();
|
||||
+}
|
||||
+
|
||||
// this method is called whenever there is an event on the QDesktopWidget object.
|
||||
bool IconTheme::eventFilter(QObject* obj, QEvent* event) {
|
||||
// we're only interested in the StyleChange event.
|
||||
--- libfm-qt-0.11.1.orig/src/icontheme.h
|
||||
+++ libfm-qt-0.11.1/src/icontheme.h
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <QIcon>
|
||||
#include <QString>
|
||||
#include "libfm/fm.h"
|
||||
+#include "icon.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
@@ -40,6 +41,8 @@ namespace Fm {
|
||||
|
||||
// Nice article about QPixmap from KDE: http://techbase.kde.org/Development/Tutorials/Graphics/Performance
|
||||
|
||||
+class IconCacheData;
|
||||
+
|
||||
class LIBFM_QT_API IconTheme: public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
@@ -49,6 +52,8 @@ public:
|
||||
static IconTheme* instance();
|
||||
static QIcon icon(FmIcon* fmicon);
|
||||
static QIcon icon(GIcon* gicon);
|
||||
+ static QList<Icon> emblems(FmIcon* fmicon);
|
||||
+ static QList<Icon> emblems(GIcon* gicon);
|
||||
|
||||
static void checkChanged(); // check if current icon theme name is changed
|
||||
Q_SIGNALS:
|
||||
@@ -56,8 +61,9 @@ Q_SIGNALS:
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *obj, QEvent *event);
|
||||
- static QIcon convertFromGIcon(GIcon* gicon);
|
||||
+ static QIcon convertFromGIconWithoutEmblems(GIcon* gicon);
|
||||
static QIcon iconFromNames(const char * const * names);
|
||||
+ static IconCacheData* ensureCacheData(FmIcon* fmicon);
|
||||
|
||||
protected:
|
||||
QIcon fallbackIcon_;
|
||||
--- libfm-qt-0.11.1.orig/src/placesmodel.cpp
|
||||
+++ libfm-qt-0.11.1/src/placesmodel.cpp
|
||||
@@ -35,7 +35,6 @@ PlacesModel::PlacesModel(QObject* parent
|
||||
showApplications_(true),
|
||||
showDesktop_(true),
|
||||
ejectIcon_(QIcon::fromTheme("media-eject")) {
|
||||
-
|
||||
setColumnCount(2);
|
||||
|
||||
placesRoot = new QStandardItem(tr("Places"));
|
||||
@@ -504,6 +503,23 @@ Qt::ItemFlags PlacesModel::flags(const Q
|
||||
return QStandardItemModel::flags(index);
|
||||
}
|
||||
|
||||
+
|
||||
+QVariant PlacesModel::data(const QModelIndex &index, int role) const {
|
||||
+ if(index.column() == 0 && index.parent().isValid()) {
|
||||
+ PlacesModelItem* item = static_cast<PlacesModelItem*>(QStandardItemModel::itemFromIndex(index));
|
||||
+ if(item != nullptr) {
|
||||
+ switch(role) {
|
||||
+ case FileInfoRole:
|
||||
+ return QVariant::fromValue<void*>(item->fileInfo());
|
||||
+ case FmIconRole:
|
||||
+ return QVariant::fromValue<void*>(item->icon());
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return QStandardItemModel::data(index, role);
|
||||
+}
|
||||
+
|
||||
+
|
||||
bool PlacesModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) {
|
||||
QStandardItem* item = itemFromIndex(parent);
|
||||
if(data->hasFormat("application/x-bookmark-row")) { // the data being dopped is a bookmark row
|
||||
--- libfm-qt-0.11.1.orig/src/placesmodel.h
|
||||
+++ libfm-qt-0.11.1/src/placesmodel.h
|
||||
@@ -40,6 +40,11 @@ Q_OBJECT
|
||||
friend class PlacesView;
|
||||
public:
|
||||
|
||||
+ enum {
|
||||
+ FileInfoRole = Qt::UserRole,
|
||||
+ FmIconRole
|
||||
+ };
|
||||
+
|
||||
// QAction used for popup menus
|
||||
class ItemAction : public QAction {
|
||||
public:
|
||||
@@ -74,6 +79,8 @@ public:
|
||||
}
|
||||
void setShowDesktop(bool show);
|
||||
|
||||
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||
+
|
||||
public Q_SLOTS:
|
||||
void updateIcons();
|
||||
void updateTrash();
|
||||
--- libfm-qt-0.11.1.orig/src/placesmodelitem.cpp
|
||||
+++ libfm-qt-0.11.1/src/placesmodelitem.cpp
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "placesmodelitem.h"
|
||||
#include "icontheme.h"
|
||||
#include <gio/gio.h>
|
||||
+#include <QPainter>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
--- libfm-qt-0.11.1.orig/src/placesview.cpp
|
||||
+++ libfm-qt-0.11.1/src/placesview.cpp
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <QHeaderView>
|
||||
#include <QDebug>
|
||||
#include <QGuiApplication>
|
||||
+#include "folderitemdelegate.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
@@ -43,6 +44,11 @@ PlacesView::PlacesView(QWidget* parent):
|
||||
|
||||
setIconSize(QSize(24, 24));
|
||||
|
||||
+ FolderItemDelegate* delegate = new FolderItemDelegate(this, this);
|
||||
+ delegate->setFileInfoRole(PlacesModel::FileInfoRole);
|
||||
+ delegate->setFmIconRole(PlacesModel::FmIconRole);
|
||||
+ setItemDelegateForColumn(0, delegate);
|
||||
+
|
||||
// FIXME: we may share this model amont all views
|
||||
model_ = new PlacesModel(this);
|
||||
setModel(model_);
|
@ -0,0 +1 @@
|
||||
model-places.patch
|
Loading…
Reference in new issue