diff --git a/src/slic3r/GUI/IMSlider.cpp b/src/slic3r/GUI/IMSlider.cpp index ab36613d2f..c435ab8667 100644 --- a/src/slic3r/GUI/IMSlider.cpp +++ b/src/slic3r/GUI/IMSlider.cpp @@ -708,35 +708,39 @@ void IMSlider::draw_ticks(const ImRect& slideable_region) { } } -void IMSlider::show_tooltip(const TickCode& tick){ +void IMSlider::show_tooltip(const std::string tooltip) { ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 6 * m_scale, 3 * m_scale }); ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, { 3 * m_scale }); ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND); ImGui::PushStyleColor(ImGuiCol_Border, { 0,0,0,0 }); ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.00f, 1.00f, 1.00f, 1.00f)); ImGui::BeginTooltip(); + ImGui::TextUnformatted(tooltip.c_str()); + ImGui::EndTooltip(); + ImGui::PopStyleColor(3); + ImGui::PopStyleVar(2); +} + +void IMSlider::show_tooltip(const TickCode& tick){ switch (tick.type) { case CustomGCode::ColorChange: break; case CustomGCode::PausePrint: - ImGui::TextUnformatted((_u8L("Pause:") + " \"" + gcode(PausePrint) + "\"").c_str()); + show_tooltip(_u8L("Pause:") + " \"" + gcode(PausePrint) + "\""); break; case CustomGCode::ToolChange: - ImGui::TextUnformatted(_u8L("Change Filament").c_str()); + show_tooltip(_u8L("Change Filament")); break; case CustomGCode::Template: - ImGui::TextUnformatted((_u8L("Custom Template:") + " \"" + gcode(Template) + "\"").c_str()); + show_tooltip(_u8L("Custom Template:") + " \"" + gcode(Template) + "\""); break; case CustomGCode::Custom: - ImGui::TextUnformatted((_u8L("Custom G-code:") + " \"" + tick.extra + "\"").c_str()); + show_tooltip(_u8L("Custom G-code:") + " \"" + tick.extra + "\""); break; default: break; } - ImGui::EndTooltip(); - ImGui::PopStyleColor(3); - ImGui::PopStyleVar(2); } bool IMSlider::vertical_slider(const char* str_id, int* higher_value, int* lower_value, std::string& higher_label, std::string& lower_label,int v_min, int v_max, const ImVec2& size, SelectedSlider& selection, bool one_layer_flag, float scale) @@ -1224,18 +1228,26 @@ void IMSlider::render_add_menu() ImGui::OpenPopup("slider_add_menu_popup"); if (ImGui::BeginPopup("slider_add_menu_popup")) { bool menu_item_enable = m_draw_mode != dmSequentialFffPrint; + bool hovered = false; { - if (menu_item_with_icon(_u8L("Add Pause").c_str(), "", ImVec2(0, 0), 0, false, menu_item_enable)) { + if (menu_item_with_icon(_u8L("Add Pause").c_str(), "", ImVec2(0, 0), 0, false, menu_item_enable, &hovered)) { add_code_as_tick(PausePrint); } - if (menu_item_with_icon(_u8L("Add Custom G-code").c_str(), "", ImVec2(0, 0), 0, false, menu_item_enable)) { + if (hovered) { show_tooltip(_u8L("Insert a pause command at the beginning of this layer.")); } + + + if (menu_item_with_icon(_u8L("Add Custom G-code").c_str(), "", ImVec2(0, 0), 0, false, menu_item_enable, &hovered)) { m_show_custom_gcode_window = true; } + if (hovered) { show_tooltip(_u8L("Insert custom G-code at the beginning of this layer.")); } + if (!gcode(Template).empty()) { - if (menu_item_with_icon(_u8L("Add Custom Template").c_str(), "", ImVec2(0, 0), 0, false, menu_item_enable)) { + if (menu_item_with_icon(_u8L("Add Custom Template").c_str(), "", ImVec2(0, 0), 0, false, menu_item_enable, &hovered)) { add_code_as_tick(Template); } } + if (hovered) { show_tooltip(_u8L("Insert template custom G-code at the beginning of this layer.")); } + if (menu_item_with_icon(_u8L("Jump to Layer").c_str(), "")) { m_show_go_to_layer_dialog = true; } @@ -1250,11 +1262,13 @@ void IMSlider::render_add_menu() for (int i = 0; i < extruder_num; i++) { std::array rgba = decode_color_to_float_array(m_extruder_colors[i]); ImU32 icon_clr = IM_COL32(rgba[0] * 255.0f, rgba[1] * 255.0f, rgba[2] * 255.0f, rgba[3] * 255.0f); - if (menu_item_with_icon((_u8L("Filament ") + std::to_string(i + 1)).c_str(), "", ImVec2(14, 14) * m_scale, icon_clr)) add_code_as_tick(ToolChange, i + 1); + if (menu_item_with_icon((_u8L("Filament ") + std::to_string(i + 1)).c_str(), "", ImVec2(14, 14) * m_scale, icon_clr, false, true, &hovered)) add_code_as_tick(ToolChange, i + 1); + if (hovered) { show_tooltip(_u8L("Change filament at the beginning of this layer.")); } } end_menu(); } } + ImGui::EndPopup(); } } diff --git a/src/slic3r/GUI/IMSlider.hpp b/src/slic3r/GUI/IMSlider.hpp index e4126a2148..a2fe6c0798 100644 --- a/src/slic3r/GUI/IMSlider.hpp +++ b/src/slic3r/GUI/IMSlider.hpp @@ -147,6 +147,7 @@ protected: void draw_colored_band(const ImRect& groove, const ImRect& slideable_region); void draw_ticks(const ImRect& slideable_region); void show_tooltip(const TickCode& tick); //menu + void show_tooltip(const std::string tooltip); //menu bool vertical_slider(const char* str_id, int* higher_value, int* lower_value, std::string& higher_label, std::string& lower_label, int v_min, int v_max, const ImVec2& size, diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 7d623e4892..9cc4b70d70 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -1119,7 +1119,7 @@ bool ImGuiWrapper::undo_redo_list(const ImVec2& size, const bool is_undo, bool ( // To do that we push a ColorMarkerHovered symbol at the very beginning of the label // This symbol will be used to a color selection for the highlighted letters. // see imgui_draw.cpp, void ImFont::RenderText() -static bool selectable(const char* label, bool selected, ImGuiSelectableFlags flags = 0, const ImVec2& size_arg = ImVec2(0, 0)) +static bool selectable(const char* label, bool selected, ImGuiSelectableFlags flags = 0, const ImVec2& size_arg = ImVec2(0, 0), bool* out_hovered = nullptr) { ImGuiWindow* window = ImGui::GetCurrentWindow(); if (window->SkipItems) @@ -1265,10 +1265,11 @@ static bool selectable(const char* label, bool selected, ImGuiSelectableFlags fl if (flags & ImGuiSelectableFlags_Disabled) ImGui::PopStyleColor(); if (hovered || selected) ImGui::PopStyleColor(); + if (out_hovered) *out_hovered = hovered; + // Automatically close popups if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.CurrentItemFlags & ImGuiItemFlags_SelectableDontClosePopup)) ImGui::CloseCurrentPopup(); - IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.LastItemStatusFlags); return pressed; } @@ -1437,7 +1438,7 @@ void end_menu() ImGui::EndMenu(); } -bool menu_item_with_icon(const char *label, const char *shortcut, ImVec2 icon_size /* = ImVec2(0, 0)*/, ImU32 icon_color /* = 0*/, bool selected /* = false*/, bool enabled /* = true*/) +bool menu_item_with_icon(const char *label, const char *shortcut, ImVec2 icon_size /* = ImVec2(0, 0)*/, ImU32 icon_color /* = 0*/, bool selected /* = false*/, bool enabled /* = true*/, bool* hovered/* = nullptr*/) { ImGuiWindow *window = ImGui::GetCurrentWindow(); if (window->SkipItems) return false; @@ -1470,7 +1471,7 @@ bool menu_item_with_icon(const char *label, const char *shortcut, ImVec2 icon_si float shortcut_w = shortcut ? ImGui::CalcTextSize(shortcut, NULL).x : 0.0f; float min_w = window->DC.MenuColumns.DeclColumns(label_size.x, shortcut_w, IM_FLOOR(g.FontSize * 1.20f)); // Feedback for next frame float extra_w = std::max(0.0f, ImGui::GetContentRegionAvail().x - min_w); - pressed = selectable(label, false, flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f)); + pressed = selectable(label, false, flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, 0.0f), hovered); if (icon_size.x != 0 && icon_size.y != 0) { float selectable_pos_y = pos.y + -0.5f * style.ItemSpacing.y; diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp index acd72dab22..052ea00e5e 100644 --- a/src/slic3r/GUI/ImGuiWrapper.hpp +++ b/src/slic3r/GUI/ImGuiWrapper.hpp @@ -39,7 +39,7 @@ bool button_with_pos(ImTextureID user_texture_id, const ImVec2 &margin = ImVec2(0, 0)); bool begin_menu(const char *label, bool enabled = true); void end_menu(); -bool menu_item_with_icon(const char *label, const char *shortcut, ImVec2 icon_size = ImVec2(0, 0), ImU32 icon_color = 0, bool selected = false, bool enabled = true); +bool menu_item_with_icon(const char *label, const char *shortcut, ImVec2 icon_size = ImVec2(0, 0), ImU32 icon_color = 0, bool selected = false, bool enabled = true, bool* hovered = nullptr); class ImGuiWrapper