From 6a8c34dad9adfb29bf6198df289cd07f8d85065b Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Thu, 2 Jan 2020 13:41:49 +0100
Subject: [PATCH 1/2] Checking of icons for dark mode is removed to BitmapCache

---
 src/slic3r/GUI/BitmapCache.cpp  | 29 +++++++++++++++++++++++------
 src/slic3r/GUI/BitmapCache.hpp  |  2 +-
 src/slic3r/GUI/wxExtensions.cpp | 14 +++++++-------
 3 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp
index f7cefe72b..ae4c21ccb 100644
--- a/src/slic3r/GUI/BitmapCache.cpp
+++ b/src/slic3r/GUI/BitmapCache.cpp
@@ -1,6 +1,7 @@
 #include "BitmapCache.hpp"
 
 #include "libslic3r/Utils.hpp"
+#include <boost/filesystem.hpp>
 
 #if ! defined(WIN32) && ! defined(__APPLE__)
 #define BROKEN_ALPHA
@@ -15,7 +16,7 @@
 #include "nanosvg/nanosvg.h"
 #define NANOSVGRAST_IMPLEMENTATION
 #include "nanosvg/nanosvgrast.h"
-#include "GUI_App.hpp"
+//#include "GUI_App.hpp"
 
 namespace Slic3r { namespace GUI {
 
@@ -226,24 +227,40 @@ wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned width,
 }
 
 wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, 
-    float scale /* = 1.0f */, const bool grayscale/* = false*/)
+    float scale /* = 1.0f */, const bool grayscale/* = false*/, const bool dark_mode/* = false*/)
 {
-    std::string bitmap_key = bitmap_name + ( target_height !=0 ? 
+    /* For the Dark mode of any platform, we should draw icons in respect to OS background
+     * Note: All standard(regular) icons are collected in "icons" folder,
+     *       SVG-icons, which have "Dark mode" variant, are collected in "icons/white" folder
+     */
+    std::string folder;
+    if (dark_mode)
+    {
+#ifdef __WXMSW__
+        folder = "white\\";
+#else
+        folder = "white/";
+#endif
+        if (!boost::filesystem::exists(Slic3r::var(folder + bitmap_name + ".svg")))
+            folder.clear();
+    }
+
+    std::string bitmap_key = folder + bitmap_name + ( target_height !=0 ? 
                                            "-h" + std::to_string(target_height) : 
                                            "-w" + std::to_string(target_width))
                                          + (scale != 1.0f ? "-s" + std::to_string(scale) : "")
                                          + (grayscale ? "-gs" : "");
 
-    target_height != 0 ? target_height *= scale : target_width *= scale;
-
     auto it = m_map.find(bitmap_key);
     if (it != m_map.end())
         return it->second;
 
-    NSVGimage *image = ::nsvgParseFromFile(Slic3r::var(bitmap_name + ".svg").c_str(), "px", 96.0f);
+    NSVGimage *image = ::nsvgParseFromFile(Slic3r::var(folder + bitmap_name + ".svg").c_str(), "px", 96.0f);
     if (image == nullptr)
         return nullptr;
 
+    target_height != 0 ? target_height *= scale : target_width *= scale;
+
     float svg_scale = target_height != 0 ? 
                   (float)target_height / image->height  : target_width != 0 ?
                   (float)target_width / image->width    : 1;
diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp
index ce77057c8..041e7d892 100644
--- a/src/slic3r/GUI/BitmapCache.hpp
+++ b/src/slic3r/GUI/BitmapCache.hpp
@@ -34,7 +34,7 @@ public:
 	// Load png from resources/icons. bitmap_key is given without the .png suffix. Bitmap will be rescaled to provided height/width if nonzero.
     wxBitmap* 		load_png(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false);
 	// Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width.
-    wxBitmap* 		load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, float scale = 1.0f, const bool grayscale = false);
+    wxBitmap* 		load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, float scale = 1.0f, const bool grayscale = false, const bool dark_mode = false);
 
 	static wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency);
 	static wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3]) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); }
diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp
index 7b36207f5..78950e029 100644
--- a/src/slic3r/GUI/wxExtensions.cpp
+++ b/src/slic3r/GUI/wxExtensions.cpp
@@ -13,9 +13,8 @@
 #include <wx/numformatter.h>
 #include <wx/colordlg.h>
 
-#include <boost/filesystem.hpp>
+//#include <boost/filesystem.hpp>
 #include <boost/algorithm/string/replace.hpp>
-#include <boost/nowide/cstdio.hpp>
 
 #include "BitmapCache.hpp"
 #include "GUI.hpp"
@@ -427,6 +426,7 @@ static float get_svg_scale_factor(wxWindow *win)
 }
 
 // in the Dark mode of any platform, we should draw icons in respect to OS background
+/*
 static std::string icon_name_respected_to_mode(const std::string& bmp_name_in)
 {
 #ifdef __WXMSW__
@@ -447,7 +447,7 @@ static std::string icon_name_respected_to_mode(const std::string& bmp_name_in)
 	}
     return bmp_name;
 }
-
+*/
 // If an icon has horizontal orientation (width > height) call this function with is_horizontal = true
 wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, 
     const int px_cnt/* = 16*/, const bool is_horizontal /* = false*/, const bool grayscale/* = false*/)
@@ -474,13 +474,13 @@ wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in,
 
     scale_base = (unsigned int)(em_unit(win) * px_cnt * 0.1f + 0.5f);
 
-//    std::string bmp_name = bmp_name_in;
-//    boost::replace_last(bmp_name, ".png", "");
+    std::string bmp_name = bmp_name_in;
+    boost::replace_last(bmp_name, ".png", "");
 
-    std::string bmp_name = icon_name_respected_to_mode(bmp_name_in);
+//    std::string bmp_name = icon_name_respected_to_mode(bmp_name_in);
 
     // Try loading an SVG first, then PNG if SVG is not found:
-    wxBitmap *bmp = cache.load_svg(bmp_name, width, height, scale_factor, grayscale);
+    wxBitmap *bmp = cache.load_svg(bmp_name, width, height, scale_factor, grayscale, Slic3r::GUI::wxGetApp().dark_mode());
     if (bmp == nullptr) {
         bmp = cache.load_png(bmp_name, width, height, grayscale);
     }

From e531b0319f8425f56a9360d71e25ad25b803b369 Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Tue, 7 Jan 2020 16:17:20 +0100
Subject: [PATCH 2/2] Code cleaning and refactoring for
 https://github.com/prusa3d/PrusaSlicer/commit/6a8c34dad9adfb29bf6198df289cd07f8d85065b

---
 src/slic3r/GUI/BitmapCache.cpp  | 33 +++++++++++++++++++++++----------
 src/slic3r/GUI/wxExtensions.cpp | 24 ------------------------
 2 files changed, 23 insertions(+), 34 deletions(-)

diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp
index ae4c21ccb..7322a88d1 100644
--- a/src/slic3r/GUI/BitmapCache.cpp
+++ b/src/slic3r/GUI/BitmapCache.cpp
@@ -229,6 +229,12 @@ wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned width,
 wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, 
     float scale /* = 1.0f */, const bool grayscale/* = false*/, const bool dark_mode/* = false*/)
 {
+    std::string bitmap_key = bitmap_name + ( target_height !=0 ? 
+                                           "-h" + std::to_string(target_height) : 
+                                           "-w" + std::to_string(target_width))
+                                         + (scale != 1.0f ? "-s" + std::to_string(scale) : "")
+                                         + (grayscale ? "-gs" : "");
+
     /* For the Dark mode of any platform, we should draw icons in respect to OS background
      * Note: All standard(regular) icons are collected in "icons" folder,
      *       SVG-icons, which have "Dark mode" variant, are collected in "icons/white" folder
@@ -241,19 +247,26 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_
 #else
         folder = "white/";
 #endif
+        auto it = m_map.find(folder + bitmap_key);
+        if (it != m_map.end())
+            return it->second;
+        else {
+            it = m_map.find(bitmap_key);
+            if (it != m_map.end())
+                return it->second;
+        }
+
         if (!boost::filesystem::exists(Slic3r::var(folder + bitmap_name + ".svg")))
             folder.clear();
+        else
+            bitmap_key = folder + bitmap_key;
+    }
+    else 
+    {
+        auto it = m_map.find(bitmap_key);
+        if (it != m_map.end())
+            return it->second;
     }
-
-    std::string bitmap_key = folder + bitmap_name + ( target_height !=0 ? 
-                                           "-h" + std::to_string(target_height) : 
-                                           "-w" + std::to_string(target_width))
-                                         + (scale != 1.0f ? "-s" + std::to_string(scale) : "")
-                                         + (grayscale ? "-gs" : "");
-
-    auto it = m_map.find(bitmap_key);
-    if (it != m_map.end())
-        return it->second;
 
     NSVGimage *image = ::nsvgParseFromFile(Slic3r::var(folder + bitmap_name + ".svg").c_str(), "px", 96.0f);
     if (image == nullptr)
diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp
index 78950e029..ae27f6d03 100644
--- a/src/slic3r/GUI/wxExtensions.cpp
+++ b/src/slic3r/GUI/wxExtensions.cpp
@@ -13,7 +13,6 @@
 #include <wx/numformatter.h>
 #include <wx/colordlg.h>
 
-//#include <boost/filesystem.hpp>
 #include <boost/algorithm/string/replace.hpp>
 
 #include "BitmapCache.hpp"
@@ -425,29 +424,6 @@ static float get_svg_scale_factor(wxWindow *win)
 #endif
 }
 
-// in the Dark mode of any platform, we should draw icons in respect to OS background
-/*
-static std::string icon_name_respected_to_mode(const std::string& bmp_name_in)
-{
-#ifdef __WXMSW__
-    const std::string folder = "white\\";
-#else
-    const std::string folder = "white/";
-#endif
-    std::string bmp_name;
-    if (Slic3r::GUI::wxGetApp().dark_mode()) {
-     	bmp_name = folder + bmp_name_in;
-	    boost::replace_last(bmp_name, ".png", "");
-        if (! boost::filesystem::exists(Slic3r::var(bmp_name + ".svg")))
-            bmp_name.clear();
-	}
-	if (bmp_name.empty()) {
-		bmp_name = bmp_name_in;
-		boost::replace_last(bmp_name, ".png", "");
-	}
-    return bmp_name;
-}
-*/
 // If an icon has horizontal orientation (width > height) call this function with is_horizontal = true
 wxBitmap create_scaled_bitmap(wxWindow *win, const std::string& bmp_name_in, 
     const int px_cnt/* = 16*/, const bool is_horizontal /* = false*/, const bool grayscale/* = false*/)