Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Matena <lukasmatena@seznam.cz>2021-12-08 15:07:56 +0300
committerLukas Matena <lukasmatena@seznam.cz>2021-12-08 18:19:08 +0300
commit06fd732b5720070795195d4a880ba0ba0c8804fe (patch)
treea82ffd567dd211c35739d6c92c920ba6f7a277c4
parente9b9c48caebcd3f3a93554cf5eeb25a600cf1b06 (diff)
Fixed behaviour of float sliders in SLA gizmos,
which was broken after the 'Edit' button was added. This is a bit hacky fix, it might be worth improving later.
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp36
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp18
-rw-r--r--src/slic3r/GUI/ImGuiWrapper.cpp6
-rw-r--r--src/slic3r/GUI/ImGuiWrapper.hpp10
4 files changed, 43 insertions, 27 deletions
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index 614e83811..691a86706 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -550,24 +550,24 @@ RENDER_AGAIN:
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
ImGui::PushItemWidth(window_width - settings_sliders_left);
m_imgui->slider_float("##offset", &offset, offset_min, offset_max, "%.1f mm");
- if (ImGui::IsItemHovered())
+ if (m_imgui->get_last_slider_status().hovered)
m_imgui->tooltip((_utf8(opts[0].second->tooltip)).c_str(), max_tooltip_width);
- bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider
- bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider
- bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider
+ bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider
+ bool slider_edited =m_imgui->get_last_slider_status().edited; // someone is dragging the slider
+ bool slider_released =m_imgui->get_last_slider_status().deactivated_after_edit; // someone has just released the slider
if (current_mode >= quality_mode) {
ImGui::AlignTextToFramePadding();
m_imgui->text(m_desc.at("quality"));
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
m_imgui->slider_float("##quality", &quality, quality_min, quality_max, "%.1f");
- if (ImGui::IsItemHovered())
+ if (m_imgui->get_last_slider_status().hovered)
m_imgui->tooltip((_utf8(opts[1].second->tooltip)).c_str(), max_tooltip_width);
- slider_clicked |= ImGui::IsItemClicked();
- slider_edited |= ImGui::IsItemEdited();
- slider_released |= ImGui::IsItemDeactivatedAfterEdit();
+ slider_clicked |= m_imgui->get_last_slider_status().clicked;
+ slider_edited |= m_imgui->get_last_slider_status().edited;
+ slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit;
}
if (current_mode >= closing_d_mode) {
@@ -575,12 +575,12 @@ RENDER_AGAIN:
m_imgui->text(m_desc.at("closing_distance"));
ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x);
m_imgui->slider_float("##closing_distance", &closing_d, closing_d_min, closing_d_max, "%.1f mm");
- if (ImGui::IsItemHovered())
+ if (m_imgui->get_last_slider_status().hovered)
m_imgui->tooltip((_utf8(opts[2].second->tooltip)).c_str(), max_tooltip_width);
- slider_clicked |= ImGui::IsItemClicked();
- slider_edited |= ImGui::IsItemEdited();
- slider_released |= ImGui::IsItemDeactivatedAfterEdit();
+ slider_clicked |= m_imgui->get_last_slider_status().clicked;
+ slider_edited |= m_imgui->get_last_slider_status().edited;
+ slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit;
}
if (slider_clicked) {
@@ -627,9 +627,9 @@ RENDER_AGAIN:
//complete non-sense.
diam = std::clamp(diam, 0.1f, diameter_upper_cap);
m_new_hole_radius = diam / 2.f;
- bool clicked = ImGui::IsItemClicked();
- bool edited = ImGui::IsItemEdited();
- bool deactivated = ImGui::IsItemDeactivatedAfterEdit();
+ bool clicked = m_imgui->get_last_slider_status().clicked;
+ bool edited = m_imgui->get_last_slider_status().edited;
+ bool deactivated = m_imgui->get_last_slider_status().deactivated_after_edit;
ImGui::AlignTextToFramePadding();
m_imgui->text(m_desc["hole_depth"]);
@@ -638,9 +638,9 @@ RENDER_AGAIN:
// Same as above:
m_new_hole_height = std::clamp(m_new_hole_height, 0.f, 100.f);
- clicked |= ImGui::IsItemClicked();
- edited |= ImGui::IsItemEdited();
- deactivated |= ImGui::IsItemDeactivatedAfterEdit();
+ clicked |= m_imgui->get_last_slider_status().clicked;
+ edited |= m_imgui->get_last_slider_status().edited;
+ deactivated |= m_imgui->get_last_slider_status().deactivated_after_edit;;
// Following is a nasty way to:
// - save the initial value of the slider before one starts messing with it
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 9170db603..29e1fd2f3 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -687,16 +687,16 @@ RENDER_AGAIN:
// - take correct undo/redo snapshot after the user is done with moving the slider
float initial_value = m_new_point_head_diameter;
m_imgui->slider_float("##head_diameter", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f");
- if (ImGui::IsItemClicked()) {
+ if (m_imgui->get_last_slider_status().clicked) {
if (m_old_point_head_diameter == 0.f)
m_old_point_head_diameter = initial_value;
}
- if (ImGui::IsItemEdited()) {
+ if (m_imgui->get_last_slider_status().edited) {
for (auto& cache_entry : m_editing_cache)
if (cache_entry.selected)
cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f;
}
- if (ImGui::IsItemDeactivatedAfterEdit()) {
+ if (m_imgui->get_last_slider_status().deactivated_after_edit) {
// momentarily restore the old value to take snapshot
for (auto& cache_entry : m_editing_cache)
if (cache_entry.selected)
@@ -747,18 +747,18 @@ RENDER_AGAIN:
float minimal_point_distance = static_cast<const ConfigOptionFloat*>(opts[1])->value;
m_imgui->slider_float("##minimal_point_distance", &minimal_point_distance, 0.f, 20.f, "%.f mm");
- bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider
- bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider
- bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider
+ bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider
+ bool slider_edited = m_imgui->get_last_slider_status().edited; // someone is dragging the slider
+ bool slider_released = m_imgui->get_last_slider_status().deactivated_after_edit; // someone has just released the slider
ImGui::AlignTextToFramePadding();
m_imgui->text(m_desc.at("points_density"));
ImGui::SameLine(settings_sliders_left);
m_imgui->slider_float("##points_density", &density, 0.f, 200.f, "%.f %%");
- slider_clicked |= ImGui::IsItemClicked();
- slider_edited |= ImGui::IsItemEdited();
- slider_released |= ImGui::IsItemDeactivatedAfterEdit();
+ slider_clicked |= m_imgui->get_last_slider_status().clicked;
+ slider_edited |= m_imgui->get_last_slider_status().edited;
+ slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit;
if (slider_clicked) { // stash the values of the settings so we know what to revert to after undo
m_minimal_point_distance_stash = minimal_point_distance;
diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp
index 325067aea..a01e2ed69 100644
--- a/src/slic3r/GUI/ImGuiWrapper.cpp
+++ b/src/slic3r/GUI/ImGuiWrapper.cpp
@@ -503,6 +503,12 @@ bool ImGuiWrapper::slider_float(const char* label, float* v, float v_min, float
str_label = str_label.substr(0, pos) + str_label.substr(pos + 2);
bool ret = ImGui::SliderFloat(str_label.c_str(), v, v_min, v_max, format, power);
+
+ m_last_slider_status.hovered = ImGui::IsItemHovered();
+ m_last_slider_status.edited = ImGui::IsItemEdited();
+ m_last_slider_status.clicked = ImGui::IsItemClicked();
+ m_last_slider_status.deactivated_after_edit = ImGui::IsItemDeactivatedAfterEdit();
+
if (!tooltip.empty() && ImGui::IsItemHovered())
this->tooltip(into_u8(tooltip).c_str(), max_tooltip_width);
diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp
index 590ef95b0..255c4171b 100644
--- a/src/slic3r/GUI/ImGuiWrapper.hpp
+++ b/src/slic3r/GUI/ImGuiWrapper.hpp
@@ -39,6 +39,13 @@ class ImGuiWrapper
std::string m_clipboard_text;
public:
+ struct LastSliderStatus {
+ bool hovered { false };
+ bool edited { false };
+ bool clicked { false };
+ bool deactivated_after_edit { false };
+ };
+
ImGuiWrapper();
~ImGuiWrapper();
@@ -63,6 +70,7 @@ public:
ImVec2 get_item_spacing() const;
float get_slider_float_height() const;
+ const LastSliderStatus& get_last_slider_status() const { return m_last_slider_status; }
void set_next_window_pos(float x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f);
void set_next_window_bg_alpha(float alpha);
@@ -146,6 +154,8 @@ private:
static const char* clipboard_get(void* user_data);
static void clipboard_set(void* user_data, const char* text);
+
+ LastSliderStatus m_last_slider_status;
};