DoubleSliderForLayers improvements:

1. Fixed tooltips on ticks
2. Implemented posibility to edit colored band and ticks
This commit is contained in:
YuSanka 2024-05-10 16:57:36 +02:00 committed by Lukas Matena
parent e405d75a52
commit 70d7911ee3
2 changed files with 101 additions and 17 deletions

View File

@ -203,6 +203,10 @@ void DSForLayers::draw_ticks(const ImRect& slideable_region)
if (ImGui::IsMouseHoveringRect(tick_hover_box.Min, tick_hover_box.Max)) { if (ImGui::IsMouseHoveringRect(tick_hover_box.Min, tick_hover_box.Max)) {
ImGui::RenderFrame(tick_hover_box.Min, tick_hover_box.Max, tick_hovered_clr, false); ImGui::RenderFrame(tick_hover_box.Min, tick_hover_box.Max, tick_hovered_clr, false);
if (tick_it->type == ColorChange || tick_it->type == ToolChange) {
m_focus = fiTick;
ImGuiPureWrap::tooltip(get_tooltip(tick_it->tick), ImGui::GetFontSize() * 20.f);
}
break; break;
} }
++tick_it; ++tick_it;
@ -228,22 +232,22 @@ void DSForLayers::draw_ticks(const ImRect& slideable_region)
bool activate_this_tick = false; bool activate_this_tick = false;
if (tick_it == active_tick_it && m_allow_editing) { if (tick_it == active_tick_it && m_allow_editing) {
// delete tick // delete tick
if (render_button(ImGui::RemoveTick, ImGui::RemoveTickHovered, btn_label, icon_pos, m_ctrl.IsActiveHigherThumb() ? fiHigherThumb : fiLowerThumb, tick_it->tick)) { if (render_button(ImGui::RemoveTick, ImGui::RemoveTickHovered, btn_label, icon_pos, fiActionIcon, tick_it->tick)) {
m_ticks.ticks.erase(tick_it); m_ticks.ticks.erase(tick_it);
process_ticks_changed(); process_ticks_changed();
break; break;
} }
} }
else if (m_draw_mode != dmRegular)// if we have non-regular draw mode, all ticks should be marked with error icon else if (m_draw_mode != dmRegular)// if we have non-regular draw mode, all ticks should be marked with error icon
activate_this_tick = render_button(ImGui::ErrorTick, ImGui::ErrorTickHovered, btn_label, icon_pos, fiActionIcon, tick_it->tick); activate_this_tick = render_button(ImGui::ErrorTick, ImGui::ErrorTickHovered, btn_label, icon_pos, fiTick, tick_it->tick);
else if (tick_it->type == ColorChange || tick_it->type == ToolChange) { else if (tick_it->type == ColorChange || tick_it->type == ToolChange) {
if (m_ticks.is_conflict_tick(*tick_it, m_mode, m_values[tick_it->tick])) if (m_ticks.is_conflict_tick(*tick_it, m_mode, m_values[tick_it->tick]))
activate_this_tick = render_button(ImGui::ErrorTick, ImGui::ErrorTickHovered, btn_label, icon_pos, fiActionIcon, tick_it->tick); activate_this_tick = render_button(ImGui::ErrorTick, ImGui::ErrorTickHovered, btn_label, icon_pos, fiTick, tick_it->tick);
} }
else if (tick_it->type == CustomGCode::PausePrint) else if (tick_it->type == CustomGCode::PausePrint)
activate_this_tick = render_button(ImGui::PausePrint, ImGui::PausePrintHovered, btn_label, icon_pos, fiActionIcon, tick_it->tick); activate_this_tick = render_button(ImGui::PausePrint, ImGui::PausePrintHovered, btn_label, icon_pos, fiTick, tick_it->tick);
else else
activate_this_tick = render_button(ImGui::EditGCode, ImGui::EditGCodeHovered, btn_label, icon_pos, fiActionIcon, tick_it->tick); activate_this_tick = render_button(ImGui::EditGCode, ImGui::EditGCodeHovered, btn_label, icon_pos, fiTick, tick_it->tick);
if (activate_this_tick) { if (activate_this_tick) {
m_ctrl.IsActiveHigherThumb() ? SetHigherPos(tick_it->tick) : SetLowerPos(tick_it->tick); m_ctrl.IsActiveHigherThumb() ? SetHigherPos(tick_it->tick) : SetLowerPos(tick_it->tick);
@ -297,10 +301,14 @@ void DSForLayers::draw_colored_band(const ImRect& groove, const ImRect& slideabl
ImRect main_band = ImRect(blank_rect); ImRect main_band = ImRect(blank_rect);
main_band.Expand(blank_padding); main_band.Expand(blank_padding);
auto draw_band = [](const ImU32& clr, const ImRect& band_rc) { auto draw_band = [this](const ImU32& clr, const ImRect& band_rc) {
ImGui::RenderFrame(band_rc.Min, band_rc.Max, clr, false, band_rc.GetWidth() * 0.5); ImGui::RenderFrame(band_rc.Min, band_rc.Max, clr, false, band_rc.GetWidth() * 0.5);
//cover round corner //cover round corner
ImGui::RenderFrame(ImVec2(band_rc.Min.x, band_rc.Max.y - band_rc.GetWidth() * 0.5), band_rc.Max, clr, false); ImGui::RenderFrame(ImVec2(band_rc.Min.x, band_rc.Max.y - band_rc.GetWidth() * 0.5), band_rc.Max, clr, false);
// add tooltip
if (ImGui::IsMouseHoveringRect(band_rc.Min, band_rc.Max))
m_focus = fiColorBand;
}; };
auto draw_main_band = [&main_band](const ImU32& clr) { auto draw_main_band = [&main_band](const ImU32& clr) {
@ -315,6 +323,8 @@ void DSForLayers::draw_colored_band(const ImRect& groove, const ImRect& slideabl
static float tick_pos; static float tick_pos;
std::set<TickCode>::const_iterator tick_it = m_ticks.ticks.begin(); std::set<TickCode>::const_iterator tick_it = m_ticks.ticks.begin();
int rclicked_tick = -1;
while (tick_it != m_ticks.ticks.end()) while (tick_it != m_ticks.ticks.end())
{ {
//get position from tick //get position from tick
@ -337,13 +347,27 @@ void DSForLayers::draw_colored_band(const ImRect& groove, const ImRect& slideabl
ImU32 band_clr = IM_COL32(rgba[0] * 255.0f, rgba[1] * 255.0f, rgba[2] * 255.0f, rgba[3] * 255.0f); ImU32 band_clr = IM_COL32(rgba[0] * 255.0f, rgba[1] * 255.0f, rgba[2] * 255.0f, rgba[3] * 255.0f);
if (tick_it->tick == 0) if (tick_it->tick == 0)
draw_main_band(band_clr); draw_main_band(band_clr);
else else {
draw_band(band_clr, band_rect); draw_band(band_clr, band_rect);
ImGuiContext& g = *GImGui;
if (ImGui::IsMouseHoveringRect(band_rect.Min, band_rect.Max) &&
g.IO.MouseClicked[1] && !m_ctrl.IsRClickOnThumb()) {
rclicked_tick = tick_it->tick;
}
}
} }
} }
} }
tick_it++; tick_it++;
} }
if (m_focus == fiColorBand) {
if (rclicked_tick > 0)
edit_tick(rclicked_tick);
else if (auto tip = get_tooltip(); !tip.empty())
ImGuiPureWrap::tooltip(tip, ImGui::GetFontSize() * 20.f);
}
} }
void DSForLayers::render_menu() void DSForLayers::render_menu()
@ -361,10 +385,13 @@ void DSForLayers::render_menu()
ImGui::OpenPopup("slider_add_tick_menu_popup"); ImGui::OpenPopup("slider_add_tick_menu_popup");
else if (m_show_cog_menu) else if (m_show_cog_menu)
ImGui::OpenPopup("cog_menu_popup"); ImGui::OpenPopup("cog_menu_popup");
else if (m_show_edit_menu)
ImGui::OpenPopup("edit_menu_popup");
if (can_edit()) if (can_edit())
render_add_tick_menu(); render_add_tick_menu();
render_cog_menu(); render_cog_menu();
render_edit_menu();
ImGui::PopStyleColor(1); ImGui::PopStyleColor(1);
ImGui::PopStyleVar(4); ImGui::PopStyleVar(4);
@ -373,6 +400,7 @@ void DSForLayers::render_menu()
if (context.IO.MouseReleased[0]) { if (context.IO.MouseReleased[0]) {
m_show_just_color_change_menu = false; m_show_just_color_change_menu = false;
m_show_cog_menu = false; m_show_cog_menu = false;
m_show_edit_menu = false;
} }
} }
@ -416,8 +444,10 @@ void DSForLayers::render_add_tick_menu()
} }
} }
void DSForLayers::render_multi_extruders_menu() bool DSForLayers::render_multi_extruders_menu(bool switch_current_code/* = false*/)
{ {
bool ret = false;
std::vector<std::string> colors; std::vector<std::string> colors;
if (m_cb_get_extruder_colors) if (m_cb_get_extruder_colors)
colors = m_cb_get_extruder_colors(); colors = m_cb_get_extruder_colors();
@ -428,7 +458,7 @@ void DSForLayers::render_multi_extruders_menu()
const int tick = m_ctrl.GetActivePos(); const int tick = m_ctrl.GetActivePos();
if (m_mode == MultiAsSingle) { if (m_mode == MultiAsSingle) {
const std::string menu_name = _u8L("Change extruder"); const std::string menu_name = switch_current_code ? _u8L("Switch code to Change extruder") : _u8L("Change extruder");
if (ImGuiPureWrap::begin_menu(menu_name.c_str())) { if (ImGuiPureWrap::begin_menu(menu_name.c_str())) {
std::array<int, 2> active_extruders = m_ticks.get_active_extruders_for_tick(tick, m_mode); std::array<int, 2> active_extruders = m_ticks.get_active_extruders_for_tick(tick, m_mode);
for (int i = 1; i <= extruders_cnt; i++) { for (int i = 1; i <= extruders_cnt; i++) {
@ -439,14 +469,18 @@ void DSForLayers::render_multi_extruders_menu()
std::array<float, 4> rgba = decode_color_to_float_array(colors[i - 1]); std::array<float, 4> rgba = decode_color_to_float_array(colors[i - 1]);
ImU32 icon_clr = IM_COL32(rgba[0] * 255.0f, rgba[1] * 255.0f, rgba[2] * 255.0f, rgba[3] * 255.0f); ImU32 icon_clr = IM_COL32(rgba[0] * 255.0f, rgba[1] * 255.0f, rgba[2] * 255.0f, rgba[3] * 255.0f);
if (ImGuiPureWrap::menu_item_with_icon(item_name.c_str(), "", ImVec2(14, 14) * m_scale, icon_clr, false, !is_active_extruder)) if (ImGuiPureWrap::menu_item_with_icon(item_name.c_str(), "", ImVec2(14, 14) * m_scale, icon_clr, false, !is_active_extruder)) {
add_code_as_tick(ToolChange, i); add_code_as_tick(ToolChange, i);
ret = true;
}
} }
ImGuiPureWrap::end_menu(); ImGuiPureWrap::end_menu();
} }
} }
const std::string menu_name = format(_u8L("Add color change (%1%) for:"), gcode(ColorChange)); const std::string menu_name = switch_current_code ?
format(_u8L("Switch code to Color change (%1%) for:"), gcode(ColorChange)) :
format(_u8L("Add color change (%1%) for:"), gcode(ColorChange));
if (ImGuiPureWrap::begin_menu(menu_name.c_str())) { if (ImGuiPureWrap::begin_menu(menu_name.c_str())) {
std::set<int> used_extruders_for_tick = m_ticks.get_used_extruders_for_tick(tick, m_values[tick]); std::set<int> used_extruders_for_tick = m_ticks.get_used_extruders_for_tick(tick, m_values[tick]);
@ -457,12 +491,15 @@ void DSForLayers::render_multi_extruders_menu()
if (is_used_extruder) if (is_used_extruder)
item_name += " (" + _u8L("used") + ")"; item_name += " (" + _u8L("used") + ")";
if (ImGuiPureWrap::menu_item_with_icon(item_name.c_str(), "")) if (ImGuiPureWrap::menu_item_with_icon(item_name.c_str(), "")) {
add_code_as_tick(ColorChange, i); add_code_as_tick(ColorChange, i);
ret = true;
}
} }
ImGuiPureWrap::end_menu(); ImGuiPureWrap::end_menu();
} }
} }
return ret;
} }
void DSForLayers::render_color_picker() void DSForLayers::render_color_picker()
@ -519,6 +556,50 @@ void DSForLayers::render_cog_menu()
} }
} }
void DSForLayers::render_edit_menu()
{
if (!m_show_edit_menu)
return;
const ImVec2 icon_sz = ImVec2(14, 14);
if (m_ticks.has_tick(m_ctrl.GetActivePos()) && ImGui::BeginPopup("edit_menu_popup")) {
std::set<TickCode>::iterator it = m_ticks.ticks.find(TickCode{ m_ctrl.GetActivePos()});
if (it->type == ToolChange) {
if (render_multi_extruders_menu(true)) {
ImGui::EndPopup();
return;
}
}
else {
std::string edit_item_name = it->type == CustomGCode::ColorChange ? _u8L("Edit color") :
it->type == CustomGCode::PausePrint ? _u8L("Edit pause print message") :
_u8L("Edit custom G-code");
if (ImGuiPureWrap::menu_item_with_icon(edit_item_name.c_str(), "")) {
edit_tick();
ImGui::EndPopup();
return;
}
}
if (it->type == ColorChange && m_mode == MultiAsSingle) {
if (render_multi_extruders_menu(true)) {
ImGui::EndPopup();
return;
}
}
std::string delete_item_name = it->type == CustomGCode::ColorChange ? _u8L("Delete color change") :
it->type == CustomGCode::ToolChange ? _u8L("Delete tool change") :
it->type == CustomGCode::PausePrint ? _u8L("Delete pause print") :
_u8L("Delete custom G-code");
if (ImGuiPureWrap::menu_item_with_icon(delete_item_name.c_str(), ""))
delete_current_tick();
ImGui::EndPopup();
}
}
bool DSForLayers::render_button(const wchar_t btn_icon, const wchar_t btn_icon_hovered, const std::string& label_id, const ImVec2& pos, FocusedItem focus, int tick /*= -1*/) bool DSForLayers::render_button(const wchar_t btn_icon, const wchar_t btn_icon_hovered, const std::string& label_id, const ImVec2& pos, FocusedItem focus, int tick /*= -1*/)
{ {
ImGui::PushStyleVar(ImGuiStyleVar_::ImGuiStyleVar_WindowBorderSize, 0); ImGui::PushStyleVar(ImGuiStyleVar_::ImGuiStyleVar_WindowBorderSize, 0);
@ -547,6 +628,9 @@ bool DSForLayers::render_button(const wchar_t btn_icon, const wchar_t btn_icon_h
ImGui::SetCursorPos(ImVec2(0, 0)); ImGui::SetCursorPos(ImVec2(0, 0));
const bool ret = m_imgui->image_button(g.HoveredWindow == g.CurrentWindow ? btn_icon_hovered : btn_icon, tooltip, false); const bool ret = m_imgui->image_button(g.HoveredWindow == g.CurrentWindow ? btn_icon_hovered : btn_icon, tooltip, false);
if (tick > 0 && tick == m_ctrl.GetActivePos() && g.HoveredWindow == g.CurrentWindow && g.IO.MouseClicked[1])
m_show_edit_menu = true;
ImGuiPureWrap::end(); ImGuiPureWrap::end();
ImGui::PopStyleColor(2); ImGui::PopStyleColor(2);
@ -814,7 +898,7 @@ std::string DSForLayers::get_tooltip(int tick/*=-1*/)
"or Set ruler mode")) % "(Shift + G)").str(); "or Set ruler mode")) % "(Shift + G)").str();
} }
if (m_focus == fiColorBand) if (m_focus == fiColorBand)
return m_mode != SingleExtruder ? "" : return m_mode != SingleExtruder || !can_edit() ? "" :
_u8L("Edit current color - Right click the colored slider segment"); _u8L("Edit current color - Right click the colored slider segment");
if (m_focus == fiSmartWipeTower) if (m_focus == fiSmartWipeTower)
return _u8L("This is wipe tower layer"); return _u8L("This is wipe tower layer");
@ -884,7 +968,7 @@ std::string DSForLayers::get_tooltip(int tick/*=-1*/)
}; };
tooltip += tooltip +=
tick_code_it->type == ColorChange ? tick_code_it->type == ColorChange ?
(m_mode == SingleExtruder ? (m_mode == SingleExtruder && tick_code_it->extruder==1 ?
format(_u8L("Color change (\"%1%\")"), gcode(ColorChange)) : format(_u8L("Color change (\"%1%\")"), gcode(ColorChange)) :
format(_u8L("Color change (\"%1%\") for Extruder %2%"), gcode(ColorChange), tick_code_it->extruder)) : format(_u8L("Color change (\"%1%\") for Extruder %2%"), gcode(ColorChange), tick_code_it->extruder)) :
tick_code_it->type == CustomGCode::PausePrint ? tick_code_it->type == CustomGCode::PausePrint ?

View File

@ -31,8 +31,6 @@ enum FocusedItem {
fiCogIcon, fiCogIcon,
fiColorBand, fiColorBand,
fiActionIcon, fiActionIcon,
fiLowerThumb,
fiHigherThumb,
fiSmartWipeTower, fiSmartWipeTower,
fiTick fiTick
}; };
@ -138,6 +136,7 @@ private:
bool m_allow_editing { true }; bool m_allow_editing { true };
bool m_show_estimated_times { false }; bool m_show_estimated_times { false };
bool m_show_cog_menu { false }; bool m_show_cog_menu { false };
bool m_show_edit_menu { false };
DrawMode m_draw_mode { dmRegular }; DrawMode m_draw_mode { dmRegular };
Mode m_mode { SingleExtruder }; Mode m_mode { SingleExtruder };
@ -163,6 +162,7 @@ private:
void draw_ticks(const ImRect& slideable_region); void draw_ticks(const ImRect& slideable_region);
void render_menu(); void render_menu();
void render_cog_menu(); void render_cog_menu();
void render_edit_menu();
bool render_button(const wchar_t btn_icon, const wchar_t btn_icon_hovered, const std::string& label_id, const ImVec2& pos, FocusedItem focus, int tick = -1); bool render_button(const wchar_t btn_icon, const wchar_t btn_icon_hovered, const std::string& label_id, const ImVec2& pos, FocusedItem focus, int tick = -1);
void add_code_as_tick(Type type, int selected_extruder = -1); void add_code_as_tick(Type type, int selected_extruder = -1);
@ -188,7 +188,7 @@ private:
std::string m_selectable_color; std::string m_selectable_color;
void render_add_tick_menu(); void render_add_tick_menu();
void render_multi_extruders_menu(); bool render_multi_extruders_menu(bool switch_current_code = false);
bool render_jump_to_window(const ImVec2& pos, double* active_value, double min_z, double max_z); bool render_jump_to_window(const ImVec2& pos, double* active_value, double min_z, double max_z);
void render_color_picker(); void render_color_picker();