From 297225bb96092b87c7452983faf509c8bf711d8f Mon Sep 17 00:00:00 2001 From: Knut Morten Okstad Date: Sat, 29 Jun 2024 20:57:13 +0200 Subject: [PATCH 1/3] Replace unused big icon feature by scaled vector graphics (svg) icons --- src/FFuLib/FFuAuxClasses/FFuaCmdItem.C | 89 ++++++++------------ src/FFuLib/FFuAuxClasses/FFuaCmdItem.H | 45 ++++------ src/FFuLib/FFuQtComponents/FFuQtPopUpMenu.C | 7 +- src/FFuLib/FFuQtComponents/FFuQtToolButton.C | 18 +--- 4 files changed, 58 insertions(+), 101 deletions(-) diff --git a/src/FFuLib/FFuAuxClasses/FFuaCmdItem.C b/src/FFuLib/FFuAuxClasses/FFuaCmdItem.C index 7e319c3..7d96317 100644 --- a/src/FFuLib/FFuAuxClasses/FFuaCmdItem.C +++ b/src/FFuLib/FFuAuxClasses/FFuaCmdItem.C @@ -11,7 +11,7 @@ #include -FFuaCmdItem::CommandMap* FFuaCmdItem::cmdItemMap = 0; +std::map* FFuaCmdItem::cmdItemMap = NULL; bool FFuaCmdItem::weAreLoggingCmds = false; //-------------------------------------------------------------------- @@ -21,11 +21,10 @@ void FFuaCmdItem::printCmdListToFile() if (!cmdItemMap) return; std::ofstream liste("FedemCmdList.txt"); - CommandMap::const_iterator it; - for (it = cmdItemMap->begin(); it != cmdItemMap->end(); it++) - liste << "@" << it->first - << "$" << it->second->getText() - << "$" << it->second->getToolTip() << std::endl; + for (const std::pair& cmd : *cmdItemMap) + liste <<"@"<< cmd.first + <<"$"<< cmd.second->getText() + <<"$"<< cmd.second->getToolTip() << std::endl; } //-------------------------------------------------------------------- @@ -50,82 +49,66 @@ void FFuaCmdItem::invokeToggledCB(bool toggle) void FFuaCmdItem::init() { if (!cmdItemMap) - cmdItemMap = new CommandMap(); + cmdItemMap = new std::map(); } //---------------------------------------------------------------------------- -FFuaCmdItem* FFuaCmdItem::getCmdItem(const std::string& itemId) +FFuaCmdItem* FFuaCmdItem::getCmdItem(const std::string& id) { - if (itemId.empty() || !cmdItemMap) return 0; + if (!cmdItemMap || id.empty()) + return NULL; - CommandMap::iterator it = cmdItemMap->find(itemId); - if (it != FFuaCmdItem::cmdItemMap->end()) + std::map::iterator it = cmdItemMap->find(id); + if (it != cmdItemMap->end()) return it->second; - std::cerr <<"ERROR FFuaCmdItem: \""<< itemId <<"\" does not exist" - << std::endl; - return 0; + std::cerr <<" *** FFuaCmdItem: \""<< id <<"\" does not exist"<< std::endl; + return NULL; } //---------------------------------------------------------------------------- -FFuaCmdItem::FFuaCmdItem(const std::string& itemId) +FFuaCmdItem::FFuaCmdItem(const std::string& id) : cmdItemId(id) { - this->initVars(); - this->cmdItemId = itemId; - if (itemId.empty() || !cmdItemMap) return; - - CommandMap::iterator it = FFuaCmdItem::cmdItemMap->find(itemId); - if (it != FFuaCmdItem::cmdItemMap->end()) { - std::cerr <<"ERROR FFuaCmdItem: \""<< itemId <<"\" already exists" - << std::endl; - *(char*)0 = 'd'; // To make core + this->svgIcon = NULL; + this->smallIcon = NULL; + this->pixmap = NULL; + this->accelKey = 0; + this->toggleAble = false; + this->behaveAsRadio = false; + this->toggled = false; + this->menuButtonPopupMode = false; + if (!cmdItemMap || id.empty()) return; + + if (cmdItemMap->find(id) == cmdItemMap->end()) + (*cmdItemMap)[id] = this; // unique id + else + { + std::cerr <<" *** FFuaCmdItem: \""<< id <<"\" already exists"<< std::endl; + abort(); } - else // unique id - (*cmdItemMap)[itemId] = this; } //---------------------------------------------------------------------------- FFuaCmdItem::~FFuaCmdItem() { - if (!this->cmdItemId.empty() && cmdItemMap) // subject to static management - cmdItemMap->erase(this->cmdItemId); -} -//---------------------------------------------------------------------------- - -void FFuaCmdItem::initVars() -{ - this->bigIcon = 0; - this->smallIcon = 0; - this->pixmap = 0; - this->accelKey = 0; - this->toggleAble = false; - this->behaveAsRadio = false; - this->toggled = false; - this->menuButtonPopupMode = false; + if (cmdItemMap && !cmdItemId.empty()) // subject to static management + cmdItemMap->erase(cmdItemId); } //---------------------------------------------------------------------------- bool FFuaCmdItem::getSensitivity() { bool sensitivity = true; - this->invokeGetSensitivityCB(sensitivity); + this->getSensitivityCB.invoke(sensitivity); return sensitivity; } //---------------------------------------------------------------------------- bool FFuaCmdItem::getToggled() { - if (this->getToggledCB.empty()) - return this->toggled; - - bool toggle; - this->invokeGetToggledCB(toggle); + bool toggle = this->toggled; + if (!this->getToggledCB.empty()) + this->getToggledCB.invoke(toggle); return toggle; } //---------------------------------------------------------------------------- - -FFuaCmdHeaderItem::FFuaCmdHeaderItem(const std::string& txt) : FFuaCmdItem() -{ - this->setText(txt); -} -//---------------------------------------------------------------------------- diff --git a/src/FFuLib/FFuAuxClasses/FFuaCmdItem.H b/src/FFuLib/FFuAuxClasses/FFuaCmdItem.H index cf2eb45..fac76c5 100644 --- a/src/FFuLib/FFuAuxClasses/FFuaCmdItem.H +++ b/src/FFuLib/FFuAuxClasses/FFuaCmdItem.H @@ -18,7 +18,15 @@ class FFuaCmdItem { + static void printCmdListToFile(); + public: + // FFaInitializer init - used for the cmdItemMap; + static void init(); + + static void enableCmdLogging(bool doEnable) { weAreLoggingCmds = doEnable; } + static FFuaCmdItem* getCmdItem(const std::string& cmdItemId); + // A FFuaCmdItem subject to static management must have a cmdItemId string // otherwise it escapes the static management FFuaCmdItem(const std::string& cmdItemId = ""); @@ -26,9 +34,6 @@ public: // A FFuaCmdItem must not be deleted as long as it is in use virtual ~FFuaCmdItem(); - static FFuaCmdItem* getCmdItem(const std::string& cmdItemId); - static void enableCmdLogging(bool doEnable) { weAreLoggingCmds = doEnable; } - const std::string& getCmdItemId() const { return this->cmdItemId; } // callbacks @@ -38,7 +43,7 @@ public: this->setToggleAble(false); this->activatedCB = dynCB; } - void invokeActivatedCB() ; + void invokeActivatedCB(); void setToggledCB(const FFaDynCB1& dynCB) { this->setToggleAble(true); this->toggledCB = dynCB; @@ -50,28 +55,14 @@ public: // You should set this cb if possible, ie if the db stores the toggle statuses void setGetToggledCB(const FFaDynCB1& dynCB) {this->getToggledCB = dynCB;} -private: - void invokeGetSensitivityCB(bool& sensitivity) - {this->getSensitivityCB.invoke(sensitivity);} - void invokeGetToggledCB(bool& toggle) - {this->getToggledCB.invoke(toggle);} - - static void printCmdListToFile(); - - void initVars(); - -public: - // item attributes // icons are used in front of popupmenu text entries and on toolbuttons - // small should be < 23 pix - // popupmenues do always require a small icon, if not it a bigone is scaled - void setBigIcon(const char** pixMap) { this->bigIcon = pixMap; } - const char** getBigIcon() const { return this->bigIcon; } + void setSvgIcon(const char* svgFile) { this->svgIcon = svgFile; } + const char* getSvgIcon() const { return this->svgIcon; } void setSmallIcon(const char** pixMap) { this->smallIcon = pixMap; } const char** getSmallIcon() const { return this->smallIcon; } - bool hasIcon() const { return this->bigIcon || this->smallIcon; } + bool hasIcon() const { return this->svgIcon || this->smallIcon; } // pixmaps are used as a substitute for the text on popupmenu entries void setPixmap(const char** pixMap) { this->pixmap = pixMap; } @@ -88,6 +79,7 @@ public: int getAccelKey() const { return this->accelKey; } bool getSensitivity(); + // toggle void setToggleAble(bool toggleable) { this->toggleAble = toggleable; } bool getToggleAble() const { return this->toggleAble; } @@ -107,13 +99,8 @@ public: void setMenuButtonPopupMode(bool val) { this->menuButtonPopupMode = val; } bool getMenuButtonPopupMode() const { return this->menuButtonPopupMode; } - // FFaInitializer init - used for the cmdItemMap; - static void init(); - private: - typedef std::map CommandMap; - - static CommandMap* cmdItemMap; + static std::map* cmdItemMap; static bool weAreLoggingCmds; std::string cmdItemId; @@ -123,7 +110,7 @@ private: FFaDynCB1 getSensitivityCB; FFaDynCB1 getToggledCB; - const char** bigIcon; + const char* svgIcon; const char** smallIcon; const char** pixmap; std::string text; @@ -140,7 +127,7 @@ class FFuaCmdHeaderItem : public FFuaCmdItem { public: // A FFuaCmdHeaderItem is NOT book-kept (in static management) - FFuaCmdHeaderItem(const std::string& text = ""); + FFuaCmdHeaderItem(const std::string& text = "") { this->setText(text); } // A FFuaCmdHeaderItem can be deleted even if it is used virtual ~FFuaCmdHeaderItem() {} diff --git a/src/FFuLib/FFuQtComponents/FFuQtPopUpMenu.C b/src/FFuLib/FFuQtComponents/FFuQtPopUpMenu.C index d50c516..beadacb 100644 --- a/src/FFuLib/FFuQtComponents/FFuQtPopUpMenu.C +++ b/src/FFuLib/FFuQtComponents/FFuQtPopUpMenu.C @@ -65,11 +65,8 @@ int FFuQtPopUpMenu::basicNewItem(FFuaCmdItem* item, FFuPopUpMenu* menu) { // px + text QIcon* ic; - if (item->getBigIcon()) { - ic = new QIcon(FFuaQtPixmapCache::getPixmap(item->getBigIcon())); - if (item->getSmallIcon()) - ic->addPixmap(FFuaQtPixmapCache::getPixmap(item->getSmallIcon())); - } + if (item->getSvgIcon()) + ic = new QIcon(item->getSvgIcon()); else if (item->getSmallIcon()) ic = new QIcon(FFuaQtPixmapCache::getPixmap(item->getSmallIcon())); else diff --git a/src/FFuLib/FFuQtComponents/FFuQtToolButton.C b/src/FFuLib/FFuQtComponents/FFuQtToolButton.C index 7378639..379704b 100644 --- a/src/FFuLib/FFuQtComponents/FFuQtToolButton.C +++ b/src/FFuLib/FFuQtComponents/FFuQtToolButton.C @@ -5,8 +5,6 @@ // This file is part of FEDEM - https://openfedem.org //////////////////////////////////////////////////////////////////////////////// -#include - #include "FFuLib/FFuAuxClasses/FFuQtAuxClasses/FFuaQtPixmapCache.H" #include "FFuLib/FFuAuxClasses/FFuaCmdItem.H" #include "FFaLib/FFaDynCalls/FFaDynCB.H" @@ -76,18 +74,10 @@ void FFuQtToolButton::setActiveCmdItem(FFuaCmdItem* cmd) { this->activeCmdItem = cmd; - if (cmd->getBigIcon()) { - QIcon ic(FFuaQtPixmapCache::getPixmap(cmd->getBigIcon())); - if (cmd->getSmallIcon()) - ic.addPixmap(FFuaQtPixmapCache::getPixmap(cmd->getSmallIcon())); - this->setIcon(ic); - } - else if (cmd->getSmallIcon()) { - QIcon ic(FFuaQtPixmapCache::getPixmap(cmd->getSmallIcon())); - if (cmd->getBigIcon()) - ic.addPixmap(FFuaQtPixmapCache::getPixmap(cmd->getBigIcon())); - this->setIcon(ic); - } + if (cmd->getSvgIcon()) + this->setIcon(QIcon(cmd->getSvgIcon())); + else if (cmd->getSmallIcon()) + this->setIcon(QIcon(FFuaQtPixmapCache::getPixmap(cmd->getSmallIcon()))); else this->setIcon(QIcon()); From f0a7314fcaf37d5ec01c5742d2a56e9f19b7004b Mon Sep 17 00:00:00 2001 From: Knut Morten Okstad Date: Sun, 30 Jun 2024 13:12:27 +0200 Subject: [PATCH 2/3] Add resource file for the svg-icons and installation of QtSvg4.dll --- BUILD.md | 1 + CMakeLists.txt | 2 +- resources/fedem_icons.qrc | 5 +++++ src/CMakeLists.txt | 16 ++++++++++++++-- .../vpmUIQtTopLevels/CMakeLists.txt | 2 +- 5 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 resources/fedem_icons.qrc diff --git a/BUILD.md b/BUILD.md index ec4d137..a88e418 100644 --- a/BUILD.md +++ b/BUILD.md @@ -92,6 +92,7 @@ proceed as follows: copy lib\QtNetwork4.* C:\Qt-4.8.7\lib copy lib\QtOpenGL4.* C:\Qt-4.8.7\lib copy lib\QtSql4.* C:\Qt-4.8.7\lib + copy lib\QtSvg4.* C:\Qt-4.8.7\lib copy lib\QtXml4.* C:\Qt-4.8.7\lib - Install the Qt header files required for building FEDEM. diff --git a/CMakeLists.txt b/CMakeLists.txt index d7c24f0..7cc0fa1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ add_subdirectory ( src ) # Install some resource files -file ( GLOB RESOURCES resources/*.* ) +file ( GLOB RESOURCES resources/*.f* ) if ( FTENV_VERBOSE ) message ( STATUS "Installing ${RESOURCES} to ${CMAKE_INSTALL_PREFIX}" ) endif ( FTENV_VERBOSE ) diff --git a/resources/fedem_icons.qrc b/resources/fedem_icons.qrc new file mode 100644 index 0000000..f678c61 --- /dev/null +++ b/resources/fedem_icons.qrc @@ -0,0 +1,5 @@ + + + + + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 27ccf77..b26d071 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -96,7 +96,7 @@ if ( WIN ) endif ( USE_COMAPI ) # Resource file for the executable - set ( APP_ICON "vpmUI/Icons/win32AppIcon/fedem_app_icon.rc" ) + set ( RESOURCES vpmUI/Icons/win32AppIcon/fedem_app_icon.rc ) endif ( WIN ) set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS}" CACHE STRING "Flags needed by the C++ compiler" FORCE ) @@ -132,9 +132,21 @@ if ( Coin_library ) endif ( Coin_library ) list ( APPEND DEPENDENCY_LIST vpmDB FiUserElmPlugin FFaOperation ) +# Main program source file(s) +file ( GLOB CPP_SOURCE_FILES *.C ) + +# Target Qt4::rcc is defined in FindQt4.cmake but is not propagated to here +if ( NOT TARGET Qt4::rcc AND QT_RCC_EXECUTABLE ) + add_executable ( Qt4::rcc IMPORTED ) + set_property ( TARGET Qt4::rcc PROPERTY IMPORTED_LOCATION ${QT_RCC_EXECUTABLE} ) +endif ( NOT TARGET Qt4::rcc AND QT_RCC_EXECUTABLE ) + +# Add resource file for toolbar and menu icons +qt4_add_resources ( RESOURCES ../resources/fedem_icons.qrc ) + message ( STATUS "Building executable Fedem" ) string ( APPEND CMAKE_CXX_FLAGS " -DFT_USE_CONNECTORS" ) -add_executable ( Fedem WIN32 vpm_main.C vpm_main_init.C ${COM_FILES} ${APP_ICON} ) +add_executable ( Fedem WIN32 ${CPP_SOURCE_FILES} ${COM_FILES} ${RESOURCES} ) target_link_libraries ( Fedem ${DEPENDENCY_LIST} ) # diff --git a/src/vpmUI/vpmUITopLevels/vpmUIQtTopLevels/CMakeLists.txt b/src/vpmUI/vpmUITopLevels/vpmUIQtTopLevels/CMakeLists.txt index 6af9164..06bde07 100644 --- a/src/vpmUI/vpmUITopLevels/vpmUIQtTopLevels/CMakeLists.txt +++ b/src/vpmUI/vpmUITopLevels/vpmUIQtTopLevels/CMakeLists.txt @@ -104,7 +104,7 @@ target_link_libraries ( ${LIB_ID} ${DEPENDENCY_LIST} ) # Install the dependent shared object libraries -set ( QT_LIBS Qt3Support QtCore QtGui QtNetwork QtOpenGL QtSql QtXml ) +set ( QT_LIBS Qt3Support QtCore QtGui QtNetwork QtOpenGL QtSql QtSvg QtXml ) foreach ( LIB ${QT_LIBS} ) get_target_property ( LIB_PATH Qt4::${LIB} LOCATION ) if ( WIN ) From 0f1c66320e7237aca1dad3468a1b7029466aba73 Mon Sep 17 00:00:00 2001 From: Knut Morten Okstad Date: Sun, 30 Jun 2024 13:17:19 +0200 Subject: [PATCH 3/3] WIP: Test svg icons from resources --- resources/fedem_icons.qrc | 2 ++ resources/icons/open-open-a-file-svgrepo-com.svg | 3 +++ resources/icons/save-save-the-document-svgrepo-com.svg | 3 +++ src/vpmApp/vpmAppCmds/FapFileCmds.C | 4 ++-- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 resources/icons/open-open-a-file-svgrepo-com.svg create mode 100644 resources/icons/save-save-the-document-svgrepo-com.svg diff --git a/resources/fedem_icons.qrc b/resources/fedem_icons.qrc index f678c61..996e125 100644 --- a/resources/fedem_icons.qrc +++ b/resources/fedem_icons.qrc @@ -1,5 +1,7 @@ + icons/open-open-a-file-svgrepo-com.svg + icons/save-save-the-document-svgrepo-com.svg diff --git a/resources/icons/open-open-a-file-svgrepo-com.svg b/resources/icons/open-open-a-file-svgrepo-com.svg new file mode 100644 index 0000000..02831f9 --- /dev/null +++ b/resources/icons/open-open-a-file-svgrepo-com.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/resources/icons/save-save-the-document-svgrepo-com.svg b/resources/icons/save-save-the-document-svgrepo-com.svg new file mode 100644 index 0000000..27cb32f --- /dev/null +++ b/resources/icons/save-save-the-document-svgrepo-com.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/vpmApp/vpmAppCmds/FapFileCmds.C b/src/vpmApp/vpmAppCmds/FapFileCmds.C index 6643a03..5fbbb1a 100644 --- a/src/vpmApp/vpmAppCmds/FapFileCmds.C +++ b/src/vpmApp/vpmAppCmds/FapFileCmds.C @@ -70,7 +70,7 @@ void FapFileCmds::init() cmdItem->setGetSensitivityCB(FFaDynCB1S(FapFileCmds::getChangeModelSensitivity,bool&)); cmdItem = new FFuaCmdItem("cmdId_file_open"); - cmdItem->setSmallIcon(open_xpm); + cmdItem->setSvgIcon(":/open.svg"); cmdItem->setText("Open..."); cmdItem->setToolTip("Open"); cmdItem->setAccelKey(FFuaKeyCode::CtrlAccel+FFuaKeyCode::O); @@ -78,7 +78,7 @@ void FapFileCmds::init() cmdItem->setGetSensitivityCB(FFaDynCB1S(FapFileCmds::getChangeModelSensitivity,bool&)); cmdItem = new FFuaCmdItem("cmdId_file_save"); - cmdItem->setSmallIcon(save_xpm); + cmdItem->setSvgIcon(":/save.svg"); cmdItem->setText("Save"); cmdItem->setToolTip("Save"); cmdItem->setAccelKey(FFuaKeyCode::CtrlAccel+FFuaKeyCode::S);