diff --git a/src/Gui/BitmapFactory.cpp b/src/Gui/BitmapFactory.cpp
index e3d9300235..b46243753d 100644
--- a/src/Gui/BitmapFactory.cpp
+++ b/src/Gui/BitmapFactory.cpp
@@ -188,6 +188,19 @@ bool BitmapFactoryInst::findPixmapInCache(const char* name, QPixmap& px) const
return false;
}
+QIcon BitmapFactoryInst::iconFromTheme(const char* name, const QIcon& fallback)
+{
+ QString iconName = QString::fromLatin1(name);
+ QIcon icon = QIcon::fromTheme(iconName, fallback);
+ if (icon.isNull()) {
+ QPixmap px = pixmap(name);
+ if (!px.isNull())
+ icon.addPixmap(px);
+ }
+
+ return icon;
+}
+
bool BitmapFactoryInst::loadPixmap(const QString& filename, QPixmap& icon) const
{
QFileInfo fi(filename);
diff --git a/src/Gui/BitmapFactory.h b/src/Gui/BitmapFactory.h
index 478585d309..f506e07c0a 100644
--- a/src/Gui/BitmapFactory.h
+++ b/src/Gui/BitmapFactory.h
@@ -26,6 +26,7 @@
#include
#include
+#include
// forward declaration
class SoSFImage;
@@ -68,6 +69,10 @@ public:
void addPixmapToCache(const char* name, const QPixmap& icon);
/// Checks whether the pixmap is already registered.
bool findPixmapInCache(const char* name, QPixmap& icon) const;
+ /** Returns the QIcon corresponding to name in the current icon theme.
+ * If no such icon is found in the current theme fallback is returned instead.
+ */
+ QIcon iconFromTheme(const char* name, const QIcon& fallback = QIcon());
/// Retrieves a pixmap by name
QPixmap pixmap(const char* name) const;
/** Retrieves a pixmap by name and size created by an
diff --git a/src/Gui/Command.cpp b/src/Gui/Command.cpp
index d3717e6388..384af52ec1 100644
--- a/src/Gui/Command.cpp
+++ b/src/Gui/Command.cpp
@@ -660,7 +660,7 @@ Action * Command::createAction(void)
pcAction->setShortcut(QString::fromAscii(sAccel));
applyCommandData(this->className(), pcAction);
if (sPixmap)
- pcAction->setIcon(Gui::BitmapFactory().pixmap(sPixmap));
+ pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(sPixmap));
return pcAction;
}
@@ -907,7 +907,7 @@ Action * PythonCommand::createAction(void)
pcAction->setShortcut(QString::fromAscii(getAccel()));
applyCommandData(this->getName(), pcAction);
if (strcmp(getResource("Pixmap"),"") != 0)
- pcAction->setIcon(Gui::BitmapFactory().pixmap(getResource("Pixmap")));
+ pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(getResource("Pixmap")));
return pcAction;
}
@@ -1083,7 +1083,7 @@ Action * PythonGroupCommand::createAction(void)
languageChange();
if (strcmp(getResource("Pixmap"),"") != 0) {
- pcAction->setIcon(Gui::BitmapFactory().pixmap(getResource("Pixmap")));
+ pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(getResource("Pixmap")));
}
else {
QList a = pcAction->actions();
@@ -1113,13 +1113,13 @@ void PythonGroupCommand::languageChange()
Gui::Command* cmd = rcCmdMgr.getCommandByName((*it)->property("CommandName").toByteArray());
// Python command use getName as context
if (dynamic_cast(cmd)) {
- (*it)->setIcon(Gui::BitmapFactory().pixmap(cmd->getPixmap()));
+ (*it)->setIcon(Gui::BitmapFactory().iconFromTheme(cmd->getPixmap()));
(*it)->setText(QApplication::translate(cmd->getName(), cmd->getMenuText()));
(*it)->setToolTip(QApplication::translate(cmd->getName(), cmd->getToolTipText()));
(*it)->setStatusTip(QApplication::translate(cmd->getName(), cmd->getStatusTip()));
}
else if (cmd) {
- (*it)->setIcon(Gui::BitmapFactory().pixmap(cmd->getPixmap()));
+ (*it)->setIcon(Gui::BitmapFactory().iconFromTheme(cmd->getPixmap()));
(*it)->setText(QApplication::translate(cmd->className(), cmd->getMenuText()));
(*it)->setToolTip(QApplication::translate(cmd->className(), cmd->getToolTipText()));
(*it)->setStatusTip(QApplication::translate(cmd->className(), cmd->getStatusTip()));
diff --git a/src/Gui/CommandDoc.cpp b/src/Gui/CommandDoc.cpp
index 0bc3d085aa..5aa1e63680 100644
--- a/src/Gui/CommandDoc.cpp
+++ b/src/Gui/CommandDoc.cpp
@@ -717,7 +717,7 @@ Action * StdCmdUndo::createAction(void)
pcAction->setShortcut(QString::fromAscii(sAccel));
applyCommandData(this->className(), pcAction);
if (sPixmap)
- pcAction->setIcon(Gui::BitmapFactory().pixmap(sPixmap));
+ pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(sPixmap));
return pcAction;
}
@@ -760,7 +760,7 @@ Action * StdCmdRedo::createAction(void)
pcAction->setShortcut(QString::fromAscii(sAccel));
applyCommandData(this->className(), pcAction);
if (sPixmap)
- pcAction->setIcon(Gui::BitmapFactory().pixmap(sPixmap));
+ pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(sPixmap));
return pcAction;
}
diff --git a/src/Gui/CommandStd.cpp b/src/Gui/CommandStd.cpp
index 06a19a463c..11473373f0 100644
--- a/src/Gui/CommandStd.cpp
+++ b/src/Gui/CommandStd.cpp
@@ -127,7 +127,7 @@ Action * StdCmdWorkbench::createAction(void)
pcAction->setShortcut(QString::fromAscii(sAccel));
applyCommandData(this->className(), pcAction);
if (sPixmap)
- pcAction->setIcon(Gui::BitmapFactory().pixmap(sPixmap));
+ pcAction->setIcon(Gui::BitmapFactory().iconFromTheme(sPixmap));
return pcAction;
}
diff --git a/src/Gui/CommandView.cpp b/src/Gui/CommandView.cpp
index 254261028f..a72bebd9ff 100644
--- a/src/Gui/CommandView.cpp
+++ b/src/Gui/CommandView.cpp
@@ -563,20 +563,20 @@ Gui::Action * StdCmdDrawStyle::createAction(void)
QAction* a0 = pcAction->addAction(QString());
a0->setCheckable(true);
- a0->setIcon(BitmapFactory().pixmap("DrawStyleAsIs"));
+ a0->setIcon(BitmapFactory().iconFromTheme("DrawStyleAsIs"));
a0->setChecked(true);
QAction* a1 = pcAction->addAction(QString());
a1->setCheckable(true);
- a1->setIcon(BitmapFactory().pixmap("DrawStyleFlatLines"));
+ a1->setIcon(BitmapFactory().iconFromTheme("DrawStyleFlatLines"));
QAction* a2 = pcAction->addAction(QString());
a2->setCheckable(true);
- a2->setIcon(BitmapFactory().pixmap("DrawStyleShaded"));
+ a2->setIcon(BitmapFactory().iconFromTheme("DrawStyleShaded"));
QAction* a3 = pcAction->addAction(QString());
a3->setCheckable(true);
- a3->setIcon(BitmapFactory().pixmap("DrawStyleWireFrame"));
+ a3->setIcon(BitmapFactory().iconFromTheme("DrawStyleWireFrame"));
QAction* a4 = pcAction->addAction(QString());
a4->setCheckable(true);
- a4->setIcon(BitmapFactory().pixmap("DrawStylePoints"));
+ a4->setIcon(BitmapFactory().iconFromTheme("DrawStylePoints"));
pcAction->setIcon(a0->icon());
_pcAction = pcAction;
@@ -1364,7 +1364,7 @@ Action * StdViewDockUndockFullscreen::createAction(void)
QCoreApplication::CodecForTr));
fullscr->setShortcut(Qt::Key_F11);
fullscr->setCheckable(true);
- fullscr->setIcon(Gui::BitmapFactory().pixmap("view-fullscreen"));
+ fullscr->setIcon(Gui::BitmapFactory().iconFromTheme("view-fullscreen"));
return pcAction;
}