ENH:adjust assembly view toolbar UI (STUDIO-1213)

https://jira.bambooolab.com/browse/STUDIO-1213

Change-Id: I3b17b37a229348d347f56d0672f2c258fbeb91e1
This commit is contained in:
liz.li 2023-02-24 12:19:18 +08:00 committed by Lane.Wei
parent ffc4e7080c
commit 9b47255bc1
5 changed files with 98 additions and 38 deletions

View file

@ -3815,7 +3815,7 @@ void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir d
draw_list->AddTriangleFilled(center + a, center + b, center + c, col);
}
void ImGui::BBLRenderArrow(ImDrawList *draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale)
void ImGui::BBLRenderArrow(ImDrawList *draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float thickness, float scale)
{
const float h = draw_list->_Data->FontSize * 1.00f;
float r = h * 0.40f * scale;
@ -3841,8 +3841,8 @@ void ImGui::BBLRenderArrow(ImDrawList *draw_list, ImVec2 pos, ImU32 col, ImGuiDi
case ImGuiDir_COUNT: IM_ASSERT(0); break;
}
//draw_list->AddTriangleFilled(center + a, center + b, center + c, col);
draw_list->AddLine(center + a, center + c,col);
draw_list->AddLine(center + a, center + b,col);
draw_list->AddLine(center + a, center + c, col, thickness);
draw_list->AddLine(center + a, center + b, col, thickness);
}
void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col)

View file

@ -2528,7 +2528,7 @@ namespace ImGui
// Render helpers (those functions don't access any ImGui state!)
IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
IMGUI_API void BBLRenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
IMGUI_API void BBLRenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float thickness = 1.0f, float scale = 1.0f);
IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz);
IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);

View file

@ -68,6 +68,9 @@
#include <algorithm>
#include <cmath>
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
#include <imgui/imgui_internal.h>
static constexpr const float TRACKBALLSIZE = 0.8f;
@ -7648,11 +7651,12 @@ void GLCanvas3D::_render_paint_toolbar() const
#if ENABLE_RETINA_GL
float f_scale = m_retina_helper->get_scale_factor();
#else
float f_scale = 1.0;
float f_scale = 1.0f;
#endif
int em_unit = wxGetApp().em_unit() / 10;
std::vector<std::string> colors = wxGetApp().plater()->get_extruder_colors_from_plater_config();
int extruder_num = colors.size();
std::vector<std::string> filament_text_first_line;
std::vector<std::string> filament_text_second_line;
{
@ -7677,65 +7681,108 @@ void GLCanvas3D::_render_paint_toolbar() const
}
ImGuiWrapper& imgui = *wxGetApp().imgui();
float canvas_w = float(get_canvas_size().get_width());
int item_spacing = 8 * wxGetApp().toolbar_icon_scale() * f_scale;
float button_size = GLToolbar::Default_Icons_Size * f_scale * wxGetApp().toolbar_icon_scale() + item_spacing;
const float canvas_w = float(get_canvas_size().get_width());
const ImVec2 button_size = ImVec2(64.0f, 48.0f) * f_scale * em_unit;
const float spacing = 4.0f * em_unit * f_scale;
const float return_button_margin = 130.0f * em_unit * f_scale;
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(spacing, spacing));
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0);
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, 0));
ImGui::PushStyleColor(ImGuiCol_WindowBg, { 0.f, 0.f, 0.f, 0.4f });
imgui.set_next_window_pos(0.5f * canvas_w, 0, ImGuiCond_Always, 0.5f, 0.0f);
imgui.begin(_L("Paint Toolbar"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar);
float constraint_window_width = canvas_w - 2 * return_button_margin;
ImGui::SetNextWindowSizeConstraints({ 0, 0 }, { constraint_window_width, FLT_MAX });
imgui.begin(_L("Paint Toolbar"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse);
const float cursor_y = ImGui::GetCursorPosY();
const ImVec2 arrow_button_size = ImVec2(0.375f * button_size.x, ImGui::GetWindowHeight());
const ImRect left_arrow_button = ImRect(ImGui::GetCurrentWindow()->Pos, ImGui::GetCurrentWindow()->Pos + arrow_button_size);
const ImRect right_arrow_button = ImRect(ImGui::GetCurrentWindow()->Pos + ImGui::GetWindowSize() - arrow_button_size, ImGui::GetCurrentWindow()->Pos + ImGui::GetWindowSize());
ImU32 left_arrow_button_color = IM_COL32(0, 0, 0, 0.4f * 255);
ImU32 right_arrow_button_color = IM_COL32(0, 0, 0, 0.4f * 255);
ImU32 arrow_color = IM_COL32(255, 255, 255, 255);
ImDrawList* draw_list = ImGui::GetWindowDrawList();
ImGuiContext& context = *GImGui;
bool disabled = !wxGetApp().plater()->can_fillcolor();
unsigned char rgb[3];
float cursor_y = ImGui::GetCursorPosY();
for (int i = 0; i < extruder_num; i++) {
if (i > 0)
ImGui::SameLine(0.0f, item_spacing);
ImGui::SameLine();
Slic3r::GUI::BitmapCache::parse_color(colors[i], rgb);
ImGui::PushStyleColor(ImGuiCol_Button, ImColor(rgb[0], rgb[1], rgb[2]).Value);
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImColor(rgb[0], rgb[1], rgb[2]).Value);
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImColor(rgb[0], rgb[1], rgb[2]).Value);
if (disabled)
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
if (ImGui::Button(("##filament_button" + std::to_string(i)).c_str(), ImVec2(button_size, button_size))) {
wxPostEvent(m_canvas, IntEvent(EVT_GLTOOLBAR_FILLCOLOR, i + 1));
if (ImGui::Button(("##filament_button" + std::to_string(i)).c_str(), button_size)) {
if (!ImGui::IsMouseHoveringRect(left_arrow_button.Min, left_arrow_button.Max) && !ImGui::IsMouseHoveringRect(right_arrow_button.Min, right_arrow_button.Max))
wxPostEvent(m_canvas, IntEvent(EVT_GLTOOLBAR_FILLCOLOR, i + 1));
}
if (ImGui::IsItemHovered()) {
ImGui::BeginTooltip();
ImGui::PushTextWrapPos(ImGui::GetFontSize() * 20.0f);
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.00f, 1.00f, 1.00f, 1.00f));
ImGui::TextUnformatted((boost::format(_u8L("Shortcut key %1%")) % (i + 1)).str().c_str());
ImGui::PopStyleColor(1);
ImGui::PopTextWrapPos();
ImGui::EndTooltip();
if (!ImGui::IsMouseHoveringRect(left_arrow_button.Min, left_arrow_button.Max) && !ImGui::IsMouseHoveringRect(right_arrow_button.Min, right_arrow_button.Max)) {
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, { 20.0f * f_scale, 10.0f * f_scale });
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 3.0f * f_scale);
imgui.tooltip(_L("Shortcut Key ") + std::to_string(i + 1), ImGui::GetFontSize() * 20.0f);
ImGui::PopStyleVar(2);
}
}
ImGui::PopStyleColor(3);
if (disabled)
ImGui::PopItemFlag();
}
float text_offset_y = 3.0f * f_scale;
const float text_offset_y = 4.0f * em_unit * f_scale;
for (int i = 0; i < extruder_num; i++){
Slic3r::GUI::BitmapCache::parse_color(colors[i], rgb);
float gray = 0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2];
ImVec4 text_color = gray < 80 ? ImVec4(255, 255, 255, 255) : ImVec4(0, 0, 0, 255);
ImVec4 text_color = gray < 80 ? ImVec4(1.0f, 1.0f, 1.0f, 1.0f) : ImVec4(0, 0, 0, 1.0f);
imgui.push_bold_font();
ImVec2 number_label_size = ImGui::CalcTextSize(std::to_string(i + 1).c_str());
ImGui::SetCursorPosY(cursor_y + text_offset_y);
ImGui::SetCursorPosX(item_spacing + i * (item_spacing + button_size) + (button_size - number_label_size.x) / 2);
ImGui::SetCursorPosX(spacing + i * (spacing + button_size.x) + (button_size.x - number_label_size.x) / 2);
ImGui::TextColored(text_color, std::to_string(i + 1).c_str());
imgui.pop_bold_font();
ImVec2 filament_first_line_label_size = ImGui::CalcTextSize(filament_text_first_line[i].c_str());
ImGui::SetCursorPosY(cursor_y + text_offset_y + number_label_size.y);
ImGui::SetCursorPosX(item_spacing + i * (item_spacing + button_size) + (button_size - filament_first_line_label_size.x) / 2);
ImGui::SetCursorPosX(spacing + i * (spacing + button_size.x) + (button_size.x - filament_first_line_label_size.x) / 2);
ImGui::TextColored(text_color, filament_text_first_line[i].c_str());
ImVec2 filament_second_line_label_size = ImGui::CalcTextSize(filament_text_second_line[i].c_str());
ImGui::SetCursorPosY(cursor_y + text_offset_y + number_label_size.y + filament_first_line_label_size.y);
ImGui::SetCursorPosX(item_spacing + i * (item_spacing + button_size) + (button_size - filament_second_line_label_size.x) / 2);
ImGui::SetCursorPosX(spacing + i * (spacing + button_size.x) + (button_size.x - filament_second_line_label_size.x) / 2);
ImGui::TextColored(text_color, filament_text_second_line[i].c_str());
}
if (ImGui::GetWindowWidth() == constraint_window_width) {
if (ImGui::IsMouseHoveringRect(left_arrow_button.Min, left_arrow_button.Max)) {
left_arrow_button_color = IM_COL32(0, 0, 0, 0.64f * 255);
if (context.IO.MouseClicked[ImGuiMouseButton_Left]) {
ImGui::SetScrollX(ImGui::GetScrollX() - button_size.x);
imgui.set_requires_extra_frame();
}
}
draw_list->AddRectFilled(left_arrow_button.Min, left_arrow_button.Max, left_arrow_button_color);
ImGui::BBLRenderArrow(draw_list, left_arrow_button.GetCenter() - ImVec2(draw_list->_Data->FontSize, draw_list->_Data->FontSize) * 0.5f, arrow_color, ImGuiDir_Left, 2.0f);
if (ImGui::IsMouseHoveringRect(right_arrow_button.Min, right_arrow_button.Max)) {
right_arrow_button_color = IM_COL32(0, 0, 0, 0.64f * 255);
if (context.IO.MouseClicked[ImGuiMouseButton_Left]) {
ImGui::SetScrollX(ImGui::GetScrollX() + button_size.x);
imgui.set_requires_extra_frame();
}
}
draw_list->AddRectFilled(right_arrow_button.Min, right_arrow_button.Max, right_arrow_button_color);
ImGui::BBLRenderArrow(draw_list, right_arrow_button.GetCenter() - ImVec2(draw_list->_Data->FontSize, draw_list->_Data->FontSize) * 0.5f, arrow_color, ImGuiDir_Right, 2.0f);
}
imgui.end();
ImGui::PopStyleVar(3);
ImGui::PopStyleColor();
}
//BBS
@ -7761,7 +7808,7 @@ void GLCanvas3D::_render_assemble_control() const
const float item_spacing = imgui->get_item_spacing().x;
ImVec2 window_padding = ImGui::GetStyle().WindowPadding;
imgui->set_next_window_pos(canvas_w / 2, canvas_h - 13.0f * get_scale(), ImGuiCond_Always, 0.5f, 1.0f);
imgui->set_next_window_pos(canvas_w / 2, canvas_h - 10.0f * get_scale(), ImGuiCond_Always, 0.5f, 1.0f);
imgui->begin(_L("Assemble Control"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar);
ImGui::AlignTextToFramePadding();
@ -7830,24 +7877,18 @@ void GLCanvas3D::_render_assemble_info() const
ImGuiWrapper* imgui = wxGetApp().imgui();
auto canvas_w = float(get_canvas_size().get_width());
auto canvas_h = float(get_canvas_size().get_height());
float window_height = 130.0f;
float space_size = imgui->get_style_scaling() * 8.0f;
float caption_max = imgui->calc_text_size(_L("Total Volume:")).x + 3 * space_size;
char buf[3][64];
float merged_max = 0.0;
for (int i = 0; i < 3; i++) {
ImGui::DataTypeFormatString(buf[i], IM_ARRAYSIZE(buf[i]), ImGuiDataType_Double, (void *) &volumes_bounding_box().size()(i), "%.2f");
merged_max += ImGui::CalcTextSize(buf[i]).x;
if (i < 2) merged_max += ImGui::CalcTextSize(" x ").x;
}
float window_width = merged_max + caption_max + ImGui::GetFrameHeight();
ImGuiIO& io = ImGui::GetIO();
ImFont* font = io.Fonts->Fonts[0];
float origScale = font->Scale;
font->Scale = 1.2;
ImGui::PushFont(font);
ImGui::PopFont();
imgui->set_next_window_pos(canvas_w - window_width, 0.0f, ImGuiCond_Always, 0, 0);
float margin = 10.0f * get_scale();
imgui->set_next_window_pos(canvas_w - margin, canvas_h - margin, ImGuiCond_Always, 1.0f, 1.0f);
ImGuiWrapper::push_toolbar_style(get_scale());
imgui->begin(_L("Assembly Info"), ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse);
font->Scale = origScale;

View file

@ -1669,7 +1669,24 @@ void ImGuiWrapper::bold_text(const std::string& str)
text(str);
}
}
bool ImGuiWrapper::push_bold_font() {
if (bold_font) {
ImGui::PushFont(bold_font);
return true;
}
else {
return false;
}
}
bool ImGuiWrapper::pop_bold_font() {
if (bold_font) {
ImGui::PopFont();
return true;
}
else {
return false;
}
}
bool ImGuiWrapper::push_font_by_name(std::string font_name)
{
auto sys_font = im_fonts_map.find(font_name);

View file

@ -160,6 +160,8 @@ public:
// set font
const std::vector<std::string> get_fonts_names() const { return m_fonts_names; }
bool push_bold_font();
bool pop_bold_font();
bool push_font_by_name(std::string font_name);
bool pop_font_by_name(std::string font_name);
void load_fonts_texture();