diff --git a/resources/images/axis_toggle.svg b/resources/images/axis_toggle.svg
deleted file mode 100644
index 679c34e5ca..0000000000
--- a/resources/images/axis_toggle.svg
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
diff --git a/resources/images/axis_toggle_dark.svg b/resources/images/axis_toggle_dark.svg
deleted file mode 100644
index 08c52a8398..0000000000
--- a/resources/images/axis_toggle_dark.svg
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
diff --git a/resources/images/axis_toggle_hover.svg b/resources/images/axis_toggle_hover.svg
deleted file mode 100644
index 1d462ffb1d..0000000000
--- a/resources/images/axis_toggle_hover.svg
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
diff --git a/resources/images/axis_toggle_hover_dark.svg b/resources/images/axis_toggle_hover_dark.svg
deleted file mode 100644
index 14f9bd2767..0000000000
--- a/resources/images/axis_toggle_hover_dark.svg
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
diff --git a/resources/images/canvas_menu.svg b/resources/images/canvas_menu.svg
new file mode 100644
index 0000000000..b94a4952f0
--- /dev/null
+++ b/resources/images/canvas_menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_menu_dark.svg b/resources/images/canvas_menu_dark.svg
new file mode 100644
index 0000000000..6578d79a9c
--- /dev/null
+++ b/resources/images/canvas_menu_dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_menu_dark_hover.svg b/resources/images/canvas_menu_dark_hover.svg
new file mode 100644
index 0000000000..e71a5c9787
--- /dev/null
+++ b/resources/images/canvas_menu_dark_hover.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_menu_hover.svg b/resources/images/canvas_menu_hover.svg
new file mode 100644
index 0000000000..83fbddee17
--- /dev/null
+++ b/resources/images/canvas_menu_hover.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_zoom.svg b/resources/images/canvas_zoom.svg
new file mode 100644
index 0000000000..5448cd7cee
--- /dev/null
+++ b/resources/images/canvas_zoom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_zoom_dark.svg b/resources/images/canvas_zoom_dark.svg
new file mode 100644
index 0000000000..9e598f8cba
--- /dev/null
+++ b/resources/images/canvas_zoom_dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_zoom_dark_hover.svg b/resources/images/canvas_zoom_dark_hover.svg
new file mode 100644
index 0000000000..6d7e4e5fcb
--- /dev/null
+++ b/resources/images/canvas_zoom_dark_hover.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/images/canvas_zoom_hover.svg b/resources/images/canvas_zoom_hover.svg
new file mode 100644
index 0000000000..53f272d28d
--- /dev/null
+++ b/resources/images/canvas_zoom_hover.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp
index f91c83ad82..6c1b8622e4 100644
--- a/src/libslic3r/AppConfig.cpp
+++ b/src/libslic3r/AppConfig.cpp
@@ -314,6 +314,10 @@ void AppConfig::set_defaults()
set("auto_calculate_flush","all");
}
+ if (get("show_canvas_zoom_button").empty()) {
+ set_bool("show_canvas_zoom_button", true);
+ }
+
if (get("remember_printer_config").empty()) {
set_bool("remember_printer_config", true);
}
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 00d15ddadd..ce859e1a7b 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -6044,6 +6044,7 @@ static const float cameraProjection[16] = {1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0.
void GLCanvas3D::_render_3d_navigator()
{
if (!wxGetApp().show_3d_navigator()) {
+ m_canvas_toolbar_pos[0] = 0;
return;
}
@@ -6090,7 +6091,7 @@ void GLCanvas3D::_render_3d_navigator()
}
const float size = 128 * sc;
- m_axis_button_pos[0] = size - 10;
+ m_canvas_toolbar_pos[0] = size;
const auto result = ImGuizmo::ViewManipulate(cameraView, cameraProjection, ImGuizmo::OPERATION::ROTATE, ImGuizmo::MODE::WORLD, nullptr,
camDistance, ImVec2(viewManipulateLeft, viewManipulateTop - size), ImVec2(size, size),
0x00101010);
@@ -6126,7 +6127,6 @@ void GLCanvas3D::_render_3d_navigator()
request_extra_frame();
}
- _render_camera_toolbar();
}
#define ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT 0
@@ -7989,6 +7989,8 @@ void GLCanvas3D::_render_overlays()
m_labels.render(sorted_instances);
_render_3d_navigator();
+
+ _render_canvas_toolbar();
}
void GLCanvas3D::_render_style_editor()
@@ -8627,47 +8629,169 @@ void GLCanvas3D::_render_return_toolbar() const
imgui.end();
}
-void GLCanvas3D::_render_camera_toolbar()
+void GLCanvas3D::_render_canvas_toolbar()
{
- float font_size = ImGui::GetFontSize();
- float sc = get_scale();
- ImVec2 button_icon_size = ImVec2(font_size * 2.5, font_size * 2.5);
+ ImGuiWrapper &imgui = *wxGetApp().imgui();
+ float sc = get_scale();
- ImGuiWrapper &imgui = *wxGetApp().imgui();
- float window_width = button_icon_size.x + imgui.scaled(2.0f);
- float window_height = button_icon_size.y + imgui.scaled(2.0f);
+ #ifdef WIN32
+ const int dpi = get_dpi_for_window(wxGetApp().GetTopWindow());
+ sc *= (float) dpi / (float) DPI_DEFAULT;
+ #endif // WIN32
- Size cnv_size = get_canvas_size();
- m_axis_button_pos[1] = cnv_size.get_height() - button_icon_size[1] - 20 * sc;
- imgui.set_next_window_pos(m_axis_button_pos[0], m_axis_button_pos[1], ImGuiCond_Always, 0, 0);
-#ifdef __WINDOWS__
- imgui.set_next_window_size(window_width, window_height, ImGuiCond_Always);
-#endif
+ ImVec2 btn_size = ImVec2(36.f, 36.f) * sc;
+ ImVec2 margin = ImVec2(m_canvas_toolbar_pos[0] > 0 ? 0.f : (10.f * sc), 10.f * sc);
+ ImVec2 spacing = ImVec2(6.f, 6.f) * sc;
+ ImVec2 padding = ImVec2(2.f, 2.f) * sc;
+ Vec2i32 pos = {
+ m_canvas_toolbar_pos[0] + margin.x,
+ get_canvas_size().get_height() - margin.y
+ };
+ bool zoom_btn = wxGetApp().show_canvas_zoom_button();
- imgui.begin(_L("Toggle Axis"), ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove |
+ imgui.set_next_window_pos(pos[0], pos[1], ImGuiCond_Always, 0, 1); // pivot bottom-left
+
+ ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0 );
+ ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , {0,0});
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing , {0,0});
+ ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding , padding); // without padding images clipping
+
+ imgui.begin(_L("Canvas Toolbar"), ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse);//
- ImTextureID normal_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE_DARK : GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE);
- ImTextureID hover_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE_DARK_HOVER : GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE_HOVER);
+ ImTextureID m_normal_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU_DARK : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU);
+ ImTextureID m_hover_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU_DARK_HOVER : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU_HOVER);
- ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f);
- ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, 0});
-
- if (ImGui::ImageButton3(normal_id, hover_id, button_icon_size, ImVec2(0, 0), ImVec2(1, 1), -1,
- ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1), ImVec2(10, 0))) {
- //select_view("plate");
-
- if (m_canvas_type == ECanvasType::CanvasView3D || m_canvas_type == ECanvasType::CanvasPreview) {
- toggle_world_axes_visibility(false);
+ if (ImGui::ImageButton3(m_normal_id, m_hover_id, btn_size)) {
+ if(!ImGui::IsPopupOpen("CanvasToolbarMenu")){
+ ImGui::SetNextWindowPos(ImVec2(pos[0] + padding.x, pos[1] - padding.y - (zoom_btn ? (btn_size.y + spacing.y) : 0.f)), ImGuiCond_Always, ImVec2(0, 1)); // pivot bottom-left
+ ImGui::OpenPopup("CanvasToolbarMenu");
}
+ }
+ if(zoom_btn){
+ ImGui::Dummy({ 0, spacing.y});
+
+ ImTextureID z_normal_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM_DARK : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM);
+ ImTextureID z_hover_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM_DARK_HOVER : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM_HOVER);
+
+ if (ImGui::ImageButton3(z_normal_id, z_hover_id, btn_size)) {
+ select_view("plate");
+ if (m_selection.is_empty()) {
+ if (m_canvas_type == ECanvasType::CanvasAssembleView)
+ zoom_to_volumes();
+ else
+ zoom_to_bed();
+ } else {
+ zoom_to_selection();
+ }
+ } else if (ImGui::IsItemHovered()) {
+ auto tooltip = _L("Fit camera to scene or selected object.");
+ auto width = ImGui::CalcTextSize(tooltip.c_str()).x + imgui.scaled(2.0f);
+ imgui.tooltip(tooltip, width);
+ }
}
- if (ImGui::IsItemHovered()) {
- auto temp_tooltip = _L("Toggle Axis");
- auto width = ImGui::CalcTextSize(temp_tooltip.c_str()).x + imgui.scaled(2.0f);
- imgui.tooltip(temp_tooltip, width);
+
+ ImGui::PopStyleVar(4); // Window
+
+ ImGui::PushStyleColor(ImGuiCol_PopupBg , m_is_dark ? ImGuiWrapper::COL_TOOLBAR_BG_DARK : ImGuiWrapper::COL_TOOLBAR_BG);
+ ImGui::PushStyleColor(ImGuiCol_Separator , m_is_dark ? ImVec4(1, 1, 1, .20f) : ImVec4(0, 0, 0, .2f));
+ ImGui::PushStyleColor(ImGuiCol_Text , m_is_dark ? ImVec4(1, 1, 1, .88f) : ImVec4(50 / 255.f, 58 / 255.f, 61 / 255.f, 1.f));
+ ImGui::PushStyleColor(ImGuiCol_TextDisabled , m_is_dark ? ImVec4(1, 1, 1, .44f) : ImVec4(50 / 255.f, 58 / 255.f, 61 / 255.f, .5f));
+ ImGui::PushStyleColor(ImGuiCol_HeaderHovered , ImVec4(0, 0, 0, 0.f)); // bg color for menu item
+ ImGui::PushStyleColor(ImGuiCol_BorderActive , ImGuiWrapper::COL_ORCA);
+ ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 0.f );
+ ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding , 8.f * sc);
+ ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f * sc);
+ ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 2.f * sc);
+ ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding , ImVec2(4.f, 10.f) * sc);
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing , ImVec2(0.f, 8.f ) * sc);
+
+ if (ImGui::BeginPopup("CanvasToolbarMenu")) {
+ ImGui::PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true);
+
+ Plater* p = wxGetApp().plater();
+ AppConfig* cfg = wxGetApp().app_config;
+
+ auto create_menu_item = [this, sc](
+ const std::string& name,
+ bool enable,
+ bool condition,
+ const std::function& action
+ ) {
+ ImGui::Dummy({2.f * sc,0});
+ ImGui::SameLine();
+ if (ImGui::BBLMenuItem((" " + _u8L(name)).c_str(), nullptr, false, enable, ImGui::CalcTextSize(_u8L(name).c_str()).y))
+ action();
+ ImGui::SameLine(12.f * sc);
+ ImGui::TextColored(enable ? ImVec4(1,1,1,1) : ImGui::GetStyleColorVec4(ImGuiCol_TextDisabled), "%s", into_u8(condition ? ImGui::VisibleIcon : ImGui::HiddenIcon).c_str());
+ };
+
+ create_menu_item( "3D Navigator",
+ m_canvas_type != ECanvasType::CanvasAssembleView, // not work on assembly
+ wxGetApp().show_3d_navigator(),
+ [this]{
+ wxGetApp().toggle_show_3d_navigator();
+ ImGui::CloseCurrentPopup(); // Close popup to show changes on UI
+ }
+ );
+
+ create_menu_item( "Zoom button",
+ true, // work on all
+ wxGetApp().show_canvas_zoom_button(),
+ [this]{
+ wxGetApp().toggle_canvas_zoom_button();
+ ImGui::CloseCurrentPopup(); // Close popup to show changes on UI
+ }
+ );
+
+ ImGui::Separator();
+
+ create_menu_item( "Overhangs",
+ m_canvas_type == ECanvasType::CanvasView3D, // work only on prepare
+ p->is_view3D_overhang_shown(),
+ [this, p]{p->show_view3D_overhang(!p->is_view3D_overhang_shown());}
+ );
+
+ create_menu_item( "Outline",
+ m_canvas_type != ECanvasType::CanvasPreview, // not work on preview
+ wxGetApp().show_outline(),
+ [this]{wxGetApp().toggle_show_outline();}
+ );
+
+ ImGui::Separator();
+
+ create_menu_item( "Perspective",
+ true, // work on all
+ cfg->get_bool("use_perspective_camera"),
+ [this, &cfg]{
+ cfg->set_bool("use_perspective_camera", !(cfg->get_bool("use_perspective_camera")));
+ wxGetApp().update_ui_from_settings();
+ }
+ );
+
+ ImGui::Separator();
+
+ create_menu_item( "Axes",
+ m_canvas_type != ECanvasType::CanvasAssembleView, // not work on assembly
+ m_show_world_axes,
+ [this]{toggle_world_axes_visibility(false);}
+ );
+
+ // will add an option for gridlines in here
+
+ create_menu_item( "Labels",
+ m_canvas_type == ECanvasType::CanvasView3D, // work only on prepare
+ p->are_view3D_labels_shown(),
+ [this, p]{p->show_view3D_labels(!p->are_view3D_labels_shown());}
+ );
+
+ ImGui::PopItemFlag();
+ ImGui::EndPopup();
}
- ImGui::PopStyleVar(2);
+
+ ImGui::PopStyleColor(6);
+ ImGui::PopStyleVar(6);
imgui.end();
}
diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp
index aab67615d9..6931b305d6 100644
--- a/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/src/slic3r/GUI/GLCanvas3D.hpp
@@ -543,7 +543,7 @@ private:
mutable IMToolbar m_sel_plate_toolbar;
mutable GLToolbar m_assemble_view_toolbar;
mutable IMReturnToolbar m_return_toolbar;
- mutable Vec2i32 m_axis_button_pos = {128, 5};
+ mutable Vec2i32 m_canvas_toolbar_pos = {140, 5};
mutable float m_sc{1};
mutable float m_paint_toolbar_width;
@@ -1246,7 +1246,7 @@ private:
void _render_imgui_select_plate_toolbar();
void _render_assemble_view_toolbar() const;
void _render_return_toolbar() const;
- void _render_camera_toolbar();
+ void _render_canvas_toolbar();
void _render_separator_toolbar_right() const;
void _render_separator_toolbar_left() const;
void _render_collapse_toolbar() const;
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index f3900f6128..fbf61a5084 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -355,6 +355,9 @@ public:
bool show_3d_navigator() const { return app_config->get_bool("show_3d_navigator"); }
void toggle_show_3d_navigator() const { app_config->set_bool("show_3d_navigator", !show_3d_navigator()); }
+ bool show_canvas_zoom_button() const { return app_config->get_bool("show_canvas_zoom_button"); }
+ void toggle_canvas_zoom_button() const { app_config->set_bool("show_canvas_zoom_button", !show_canvas_zoom_button()); }
+
bool show_outline() const { return app_config->get_bool("show_outline"); }
void toggle_show_outline() const { app_config->set_bool("show_outline", !show_outline()); }
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
index 04e65fc88a..0ca62d849a 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
@@ -281,23 +281,43 @@ bool GLGizmosManager::init_icon_textures()
else
return false;
- if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle.svg", 64, 64, texture_id))
- icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE, texture_id));
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_MENU, texture_id));
else
return false;
- if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle_hover.svg", 64, 64, texture_id))
- icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE_HOVER, texture_id));
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu_hover.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_MENU_HOVER, texture_id));
else
return false;
- if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle_dark.svg", 64, 64, texture_id))
- icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE_DARK, texture_id));
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu_dark.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_MENU_DARK, texture_id));
else
return false;
- if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle_hover_dark.svg", 64, 64, texture_id))
- icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE_DARK_HOVER, texture_id));
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu_dark_hover.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_MENU_DARK_HOVER, texture_id));
+ else
+ return false;
+
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM, texture_id));
+ else
+ return false;
+
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom_hover.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM_HOVER, texture_id));
+ else
+ return false;
+
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom_dark.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM_DARK, texture_id));
+ else
+ return false;
+
+ if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom_dark_hover.svg", 72, 72, texture_id))
+ icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM_DARK_HOVER, texture_id));
else
return false;
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
index ba7d5afdb9..5897c2a512 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
@@ -170,10 +170,14 @@ public:
IC_TOOLBAR_TOOLTIP,
IC_TOOLBAR_TOOLTIP_HOVER,
IC_NAME_COUNT,
- IC_AXIS_TOGGLE,
- IC_AXIS_TOGGLE_HOVER,
- IC_AXIS_TOGGLE_DARK,
- IC_AXIS_TOGGLE_DARK_HOVER,
+ IC_CANVAS_MENU,
+ IC_CANVAS_MENU_HOVER,
+ IC_CANVAS_MENU_DARK,
+ IC_CANVAS_MENU_DARK_HOVER,
+ IC_CANVAS_ZOOM,
+ IC_CANVAS_ZOOM_HOVER,
+ IC_CANVAS_ZOOM_DARK,
+ IC_CANVAS_ZOOM_DARK_HOVER,
};
explicit GLGizmosManager(GLCanvas3D& parent);