mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 01:45:54 +08:00
Add default value to optional input
Remove unnecessary addiction to canvas3d in imgui wrapper
This commit is contained in:
parent
a000d12361
commit
a0dde4651b
@ -90,7 +90,9 @@ void GLGizmoEmboss::set_fine_position()
|
||||
Polygon hull = CameraUtils::create_hull2d(camera, *volume);
|
||||
|
||||
const ImVec2 &windows_size = get_minimal_window_size();
|
||||
ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull);
|
||||
Size c_size = m_parent.get_canvas_size();
|
||||
ImVec2 canvas_size(c_size.get_width(), c_size.get_height());
|
||||
ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull, canvas_size);
|
||||
m_set_window_offset = offset;
|
||||
return;
|
||||
|
||||
@ -116,7 +118,9 @@ static void draw_fine_position(const Selection &selection)
|
||||
Slic3r::Polygon hull = CameraUtils::create_hull2d(camera, *volume);
|
||||
|
||||
ImVec2 windows_size(174, 202);
|
||||
ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull);
|
||||
Size c_size = m_parent.get_canvas_size();
|
||||
ImVec2 canvas_size(c_size.get_width(), c_size.get_height());
|
||||
ImVec2 offset = ImGuiWrapper::suggest_location(windows_size, hull,canvas_size);
|
||||
Slic3r::Polygon rect(
|
||||
{Point(offset.x, offset.y), Point(offset.x + windows_size.x, offset.y),
|
||||
Point(offset.x + windows_size.x, offset.y + windows_size.y),
|
||||
|
@ -37,10 +37,7 @@
|
||||
#include "nanosvg/nanosvgrast.h"
|
||||
|
||||
// suggest location
|
||||
#include "slic3r/GUI/GLCanvas3D.hpp"
|
||||
#include "slic3r/GUI/Plater.hpp"
|
||||
#include "slic3r/GUI/GUI_App.hpp"
|
||||
#include "libslic3r/ClipperUtils.hpp"
|
||||
#include "libslic3r/ClipperUtils.hpp" // Slic3r::intersection
|
||||
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
@ -1185,7 +1182,7 @@ ColorRGBA ImGuiWrapper::from_ImVec4(const ImVec4& color)
|
||||
}
|
||||
|
||||
template <typename T, typename Func>
|
||||
static bool input_optional(std::optional<T> &v, Func& f, std::function<bool(const T&)> is_default)
|
||||
static bool input_optional(std::optional<T> &v, Func& f, std::function<bool(const T&)> is_default, const T& def_val)
|
||||
{
|
||||
if (v.has_value()) {
|
||||
if (f(*v)) {
|
||||
@ -1193,7 +1190,7 @@ static bool input_optional(std::optional<T> &v, Func& f, std::function<bool(cons
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
T val = 0;
|
||||
T val = def_val;
|
||||
if (f(val)) {
|
||||
if (!is_default(val)) v = val;
|
||||
return true;
|
||||
@ -1206,14 +1203,15 @@ bool ImGuiWrapper::input_optional_int(const char * label,
|
||||
std::optional<int>& v,
|
||||
int step,
|
||||
int step_fast,
|
||||
ImGuiInputTextFlags flags)
|
||||
ImGuiInputTextFlags flags,
|
||||
int def_val)
|
||||
{
|
||||
auto func = [&](int &value) {
|
||||
return ImGui::InputInt(label, &value, step, step_fast, flags);
|
||||
};
|
||||
std::function<bool(const int &)> is_default =
|
||||
[](const int &value) -> bool { return value == 0; };
|
||||
return input_optional(v, func, is_default);
|
||||
[def_val](const int &value) -> bool { return value == def_val; };
|
||||
return input_optional(v, func, is_default, def_val);
|
||||
}
|
||||
|
||||
bool ImGuiWrapper::input_optional_float(const char * label,
|
||||
@ -1221,16 +1219,17 @@ bool ImGuiWrapper::input_optional_float(const char * label,
|
||||
float step,
|
||||
float step_fast,
|
||||
const char * format,
|
||||
ImGuiInputTextFlags flags)
|
||||
ImGuiInputTextFlags flags,
|
||||
float def_val)
|
||||
{
|
||||
auto func = [&](float &value) {
|
||||
return ImGui::InputFloat(label, &value, step, step_fast, format, flags);
|
||||
};
|
||||
std::function<bool(const float &)> is_default =
|
||||
[](const float &value) -> bool {
|
||||
return std::fabs(value) < std::numeric_limits<float>::epsilon();
|
||||
[def_val](const float &value) -> bool {
|
||||
return std::fabs(value-def_val) <= std::numeric_limits<float>::epsilon();
|
||||
};
|
||||
return input_optional(v, func, is_default);
|
||||
return input_optional(v, func, is_default, def_val);
|
||||
}
|
||||
|
||||
bool ImGuiWrapper::drag_optional_float(const char * label,
|
||||
@ -1239,47 +1238,50 @@ bool ImGuiWrapper::drag_optional_float(const char * label,
|
||||
float v_min,
|
||||
float v_max,
|
||||
const char * format,
|
||||
float power)
|
||||
float power,
|
||||
float def_val)
|
||||
{
|
||||
auto func = [&](float &value) {
|
||||
return ImGui::DragFloat(label, &value, v_speed, v_min, v_max, format, power);
|
||||
};
|
||||
std::function<bool(const float &)> is_default =
|
||||
[](const float &value) -> bool {
|
||||
return std::fabs(value) < std::numeric_limits<float>::epsilon();
|
||||
[def_val](const float &value) -> bool {
|
||||
return std::fabs(value-def_val) <= std::numeric_limits<float>::epsilon();
|
||||
};
|
||||
return input_optional(v, func, is_default);
|
||||
return input_optional(v, func, is_default, def_val);
|
||||
}
|
||||
|
||||
bool ImGuiWrapper::slider_optional_float(const char * label,
|
||||
bool ImGuiWrapper::slider_optional_float(const char *label,
|
||||
std::optional<float> &v,
|
||||
float v_min,
|
||||
float v_max,
|
||||
const char * format,
|
||||
const char *format,
|
||||
float power,
|
||||
bool clamp,
|
||||
const wxString & tooltip,
|
||||
bool show_edit_btn)
|
||||
const wxString &tooltip,
|
||||
bool show_edit_btn,
|
||||
float def_val)
|
||||
{
|
||||
auto func = [&](float &value) {
|
||||
return slider_float(label, &value, v_min, v_max, format, power, clamp, tooltip, show_edit_btn);
|
||||
};
|
||||
std::function<bool(const float &)> is_default =
|
||||
[](const float &value) -> bool {
|
||||
return std::fabs(value) < std::numeric_limits<float>::epsilon();
|
||||
[def_val](const float &value) -> bool {
|
||||
return std::fabs(value - def_val) <= std::numeric_limits<float>::epsilon();
|
||||
};
|
||||
return input_optional(v, func, is_default);
|
||||
return input_optional(v, func, is_default, def_val);
|
||||
}
|
||||
|
||||
bool ImGuiWrapper::slider_optional_int(const char * label,
|
||||
bool ImGuiWrapper::slider_optional_int(const char *label,
|
||||
std::optional<int> &v,
|
||||
int v_min,
|
||||
int v_max,
|
||||
const char * format,
|
||||
const char *format,
|
||||
float power,
|
||||
bool clamp,
|
||||
const wxString & tooltip,
|
||||
bool show_edit_btn)
|
||||
const wxString &tooltip,
|
||||
bool show_edit_btn,
|
||||
int def_val)
|
||||
{
|
||||
std::optional<float> val;
|
||||
if (v.has_value()) val = static_cast<float>(*v);
|
||||
@ -1287,11 +1289,12 @@ bool ImGuiWrapper::slider_optional_int(const char * label,
|
||||
return slider_float(label, &value, v_min, v_max, format, power, clamp, tooltip, show_edit_btn);
|
||||
};
|
||||
std::function<bool(const float &)> is_default =
|
||||
[](const float &value) -> bool {
|
||||
return std::fabs(value) < 0.9f;
|
||||
[def_val](const float &value) -> bool {
|
||||
return std::fabs(value - def_val) < 0.9f;
|
||||
};
|
||||
|
||||
if (input_optional(val, func, is_default)) {
|
||||
float default_value = static_cast<float>(def_val);
|
||||
if (input_optional(val, func, is_default, default_value)) {
|
||||
if (val.has_value())
|
||||
v = static_cast<int>(std::round(*val));
|
||||
else
|
||||
@ -1339,11 +1342,9 @@ std::string ImGuiWrapper::trunc(const std::string &text,
|
||||
}
|
||||
|
||||
ImVec2 ImGuiWrapper::suggest_location(const ImVec2 &dialog_size,
|
||||
const Slic3r::Polygon &interest)
|
||||
{
|
||||
Plater * plater = wxGetApp().plater();
|
||||
GLCanvas3D *canvas = plater->get_current_canvas3D();
|
||||
|
||||
const Slic3r::Polygon &interest,
|
||||
const ImVec2 &canvas_size)
|
||||
{
|
||||
// IMPROVE 1: do not select place over menu
|
||||
// BoundingBox top_menu;
|
||||
// GLGizmosManager &gizmo_mng = canvas->get_gizmos_manager();
|
||||
@ -1358,8 +1359,7 @@ ImVec2 ImGuiWrapper::suggest_location(const ImVec2 &dialog_size,
|
||||
Point center = bb.center(); // interest.centroid();
|
||||
|
||||
// area size
|
||||
Size size = canvas->get_canvas_size();
|
||||
Point window_center(size.get_width() / 2, size.get_height() / 2);
|
||||
Point window_center(canvas_size.x / 2, canvas_size.y / 2);
|
||||
|
||||
// mov on side
|
||||
Point bb_half_size = (bb.max - bb.min) / 2 + Point(1,1);
|
||||
|
@ -135,14 +135,19 @@ public:
|
||||
bool want_text_input() const;
|
||||
bool want_any_input() const;
|
||||
|
||||
// Input [optional] int for nonzero value more info in ImGui::InputInt
|
||||
static bool input_optional_int(const char *label, std::optional<int>& v, int step=1, int step_fast=100, ImGuiInputTextFlags flags=0);
|
||||
// Input [optional] float for nonzero value more info in ImGui::InputFloat
|
||||
static bool input_optional_float(const char* label, std::optional<float> &v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
|
||||
static bool drag_optional_float(const char* label, std::optional<float> &v, float v_speed, float v_min, float v_max, const char* format, float power);
|
||||
|
||||
bool slider_optional_float(const char* label, std::optional<float> &v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true);
|
||||
bool slider_optional_int(const char* label, std::optional<int> &v, int v_min, int v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true);
|
||||
// Optional inputs are used for set up value inside of an optional, with default value
|
||||
//
|
||||
// Extended function ImGui::InputInt to work with std::optional<int>, when value == def_val optional is released.
|
||||
static bool input_optional_int(const char *label, std::optional<int>& v, int step=1, int step_fast=100, ImGuiInputTextFlags flags=0, int def_val = 0);
|
||||
// Extended function ImGui::InputFloat to work with std::optional<float> value near def_val cause release of optional
|
||||
static bool input_optional_float(const char* label, std::optional<float> &v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0, float def_val = .0f);
|
||||
// Extended function ImGui::DragFloat to work with std::optional<float> value near def_val cause release of optional
|
||||
static bool drag_optional_float(const char* label, std::optional<float> &v, float v_speed, float v_min, float v_max, const char* format, float power, float def_val = .0f);
|
||||
// Extended function ImGuiWrapper::slider_float to work with std::optional<float> value near def_val cause release of optional
|
||||
bool slider_optional_float(const char* label, std::optional<float> &v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true, float def_val = .0f);
|
||||
// Extended function ImGuiWrapper::slider_float to work with std::optional<int>, when value == def_val than optional release its value
|
||||
bool slider_optional_int(const char* label, std::optional<int> &v, int v_min, int v_max, const char* format = "%.3f", float power = 1.0f, bool clamp = true, const wxString& tooltip = {}, bool show_edit_btn = true, int def_val = 0);
|
||||
|
||||
/// <summary>
|
||||
/// Truncate text by ImGui draw function to specific width
|
||||
/// NOTE 1: ImGui must be initialized
|
||||
@ -164,10 +169,12 @@ public:
|
||||
/// And also not out of visible area.
|
||||
/// </summary>
|
||||
/// <param name="dialog_size">Define width and height of diaog window</param>
|
||||
/// <param name="interest">Area of interest. Result should be close to it</param>
|
||||
/// <param name="interest">Area of interest. Result should be close to it</param>
|
||||
/// <param name="canvas_size">Available space a.k.a GLCanvas3D::get_current_canvas3D()</param>
|
||||
/// <returns>Suggestion for dialog offest</returns>
|
||||
static ImVec2 suggest_location(const ImVec2 & dialog_size,
|
||||
const Slic3r::Polygon &interest);
|
||||
static ImVec2 suggest_location(const ImVec2 &dialog_size,
|
||||
const Slic3r::Polygon &interest,
|
||||
const ImVec2 &canvas_size);
|
||||
|
||||
/// <summary>
|
||||
/// Visualization of polygon
|
||||
|
Loading…
x
Reference in New Issue
Block a user