ENH: Display material consumption for sub items
JIRA: STUDIO-6412 Signed-off-by: Kunlong Ma <kunlong.ma@bambulab.com> Change-Id: I320aaa841b2fab07160a87deddcee7e698d15514
This commit is contained in:
parent
65d4dcc861
commit
1330b1b959
|
@ -4464,12 +4464,13 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
||||||
ImVec2 pos_rect = ImGui::GetCursorScreenPos();
|
ImVec2 pos_rect = ImGui::GetCursorScreenPos();
|
||||||
float window_padding = 4.0f * m_scale;
|
float window_padding = 4.0f * m_scale;
|
||||||
|
float checkbox_offset = 0.0f;
|
||||||
|
|
||||||
draw_list->AddRectFilled(ImVec2(pos_rect.x,pos_rect.y - ImGui::GetStyle().WindowPadding.y),
|
draw_list->AddRectFilled(ImVec2(pos_rect.x,pos_rect.y - ImGui::GetStyle().WindowPadding.y),
|
||||||
ImVec2(pos_rect.x + ImGui::GetWindowWidth() + ImGui::GetFrameHeight(),pos_rect.y + ImGui::GetFrameHeight() + window_padding * 2.5),
|
ImVec2(pos_rect.x + ImGui::GetWindowWidth() + ImGui::GetFrameHeight(),pos_rect.y + ImGui::GetFrameHeight() + window_padding * 2.5),
|
||||||
ImGui::GetColorU32(ImVec4(0,0,0,0.3)));
|
ImGui::GetColorU32(ImVec4(0,0,0,0.3)));
|
||||||
|
|
||||||
auto append_item = [icon_size, &imgui, imperial_units, &window_padding, &draw_list, this](
|
auto append_item = [icon_size, &imgui, imperial_units, &window_padding, &draw_list, &checkbox_offset, this](
|
||||||
EItemType type,
|
EItemType type,
|
||||||
const Color& color,
|
const Color& color,
|
||||||
const std::vector<std::pair<std::string, float>>& columns_offsets,
|
const std::vector<std::pair<std::string, float>>& columns_offsets,
|
||||||
|
@ -4526,7 +4527,7 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
if (b_menu_item)
|
if (b_menu_item)
|
||||||
callback();
|
callback();
|
||||||
if (checkbox) {
|
if (checkbox) {
|
||||||
ImGui::SameLine(ImGui::GetWindowWidth() - imgui.calc_text_size(_u8L("Display")).x / 2 - ImGui::GetFrameHeight() / 2 - 2 * window_padding);
|
ImGui::SameLine(checkbox_offset);
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0, 0.0));
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0.0, 0.0));
|
||||||
ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.00f, 0.68f, 0.26f, 1.00f));
|
ImGui::PushStyleColor(ImGuiCol_CheckMark, ImVec4(0.00f, 0.68f, 0.26f, 1.00f));
|
||||||
ImGui::Checkbox(("##" + columns_offsets[0].first).c_str(), &visible);
|
ImGui::Checkbox(("##" + columns_offsets[0].first).c_str(), &visible);
|
||||||
|
@ -4577,11 +4578,13 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto append_headers = [&imgui](const std::vector<std::pair<std::string, float>>& title_offsets) {
|
auto append_headers = [&imgui, &window_padding](const std::vector<std::pair<std::string, float>>& title_offsets) {
|
||||||
for (size_t i = 0; i < title_offsets.size(); i++) {
|
for (size_t i = 0; i < title_offsets.size(); i++) {
|
||||||
ImGui::SameLine(title_offsets[i].second);
|
ImGui::SameLine(title_offsets[i].second);
|
||||||
imgui.bold_text(title_offsets[i].first);
|
imgui.bold_text(title_offsets[i].first);
|
||||||
}
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::Dummy({ window_padding, 0 });
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4593,14 +4596,18 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
auto calculate_offsets = [max_width, window_padding](const std::vector<std::pair<std::string, std::vector<::string>>>& title_columns, float extra_size = 0.0f) {
|
auto calculate_offsets = [max_width, window_padding, &checkbox_offset](const std::vector<std::pair<std::string, std::vector<::string>>>& title_columns, float extra_size = 0.0f) {
|
||||||
const ImGuiStyle& style = ImGui::GetStyle();
|
const ImGuiStyle& style = ImGui::GetStyle();
|
||||||
std::vector<float> offsets;
|
std::vector<float> offsets;
|
||||||
offsets.push_back(max_width(title_columns[0].second, title_columns[0].first, extra_size) + 3.0f * style.ItemSpacing.x);
|
offsets.push_back(max_width(title_columns[0].second, title_columns[0].first, extra_size) + 3.0f * style.ItemSpacing.x);
|
||||||
for (size_t i = 1; i < title_columns.size() - 1; i++)
|
for (size_t i = 2; i < title_columns.size(); i++) {
|
||||||
offsets.push_back(offsets.back() + max_width(title_columns[i].second, title_columns[i].first) + style.ItemSpacing.x);
|
if (title_columns[i].first == "") {
|
||||||
if (title_columns.back().first == _u8L("Display"))
|
offsets.push_back(offsets.back() + max_width(title_columns[i - 1].second, "") + style.ItemSpacing.x);
|
||||||
offsets.back() = ImGui::GetWindowWidth() - ImGui::CalcTextSize(_u8L("Display").c_str()).x - ImGui::GetFrameHeight() / 2 - 2 * window_padding;
|
}
|
||||||
|
else {
|
||||||
|
offsets.push_back(offsets.back() + max_width(title_columns[i - 1].second, title_columns[i - 1].first) + style.ItemSpacing.x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
float average_col_width = ImGui::GetWindowWidth() / static_cast<float>(title_columns.size());
|
float average_col_width = ImGui::GetWindowWidth() / static_cast<float>(title_columns.size());
|
||||||
std::vector<float> ret;
|
std::vector<float> ret;
|
||||||
|
@ -4609,6 +4616,10 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
ret.push_back(std::max(offsets[i - 1], i * average_col_width));
|
ret.push_back(std::max(offsets[i - 1], i * average_col_width));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (title_columns.back().first == _u8L("Display")) {
|
||||||
|
checkbox_offset = ret.back() + window_padding;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4756,6 +4767,8 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
std::string travel_percent;
|
std::string travel_percent;
|
||||||
std::vector<double> model_used_filaments_m;
|
std::vector<double> model_used_filaments_m;
|
||||||
std::vector<double> model_used_filaments_g;
|
std::vector<double> model_used_filaments_g;
|
||||||
|
std::vector<std::string> used_filaments_m;
|
||||||
|
std::vector<std::string> used_filaments_g;
|
||||||
double total_model_used_filament_m = 0, total_model_used_filament_g = 0;
|
double total_model_used_filament_m = 0, total_model_used_filament_g = 0;
|
||||||
std::vector<double> flushed_filaments_m;
|
std::vector<double> flushed_filaments_m;
|
||||||
std::vector<double> flushed_filaments_g;
|
std::vector<double> flushed_filaments_g;
|
||||||
|
@ -4796,9 +4809,16 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
else
|
else
|
||||||
percent > 0.001 ? ::sprintf(buffer, "%.1f%%", percent * 100) : ::sprintf(buffer, "<0.1%%");
|
percent > 0.001 ? ::sprintf(buffer, "%.1f%%", percent * 100) : ::sprintf(buffer, "<0.1%%");
|
||||||
percents.push_back(buffer);
|
percents.push_back(buffer);
|
||||||
//auto [model_used_filament_m, model_used_filament_g] = used_filament_per_role(role);
|
auto [model_used_filament_m, model_used_filament_g] = used_filament_per_role(role);
|
||||||
//model_used_filaments_m.push_back(model_used_filament_m);
|
//model_used_filaments_m.push_back(model_used_filament_m);
|
||||||
//model_used_filaments_g.push_back(model_used_filament_g);
|
//model_used_filaments_g.push_back(model_used_filament_g);
|
||||||
|
memset(&buffer, 0, sizeof(buffer));
|
||||||
|
::sprintf(buffer, imperial_units ? "%.2f in" : "%.2f m", model_used_filament_m);
|
||||||
|
used_filaments_m.push_back(buffer);
|
||||||
|
|
||||||
|
memset(&buffer, 0, sizeof(buffer));
|
||||||
|
::sprintf(buffer, "%.2f g", model_used_filament_g);
|
||||||
|
used_filaments_g.push_back(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4813,8 +4833,8 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
travel_percent = buffer;
|
travel_percent = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
offsets = calculate_offsets({ {_u8L("Line Type"), labels}, {_u8L("Time"), times}, {_u8L("Percent"), percents}, {_u8L("Display"), {""}}}, icon_size);
|
offsets = calculate_offsets({ {_u8L("Line Type"), labels}, {_u8L("Time"), times}, {_u8L("Percent"), percents}, {_u8L("Used filament"), used_filaments_m}, {"", used_filaments_g}, {_u8L("Display"), {""}}}, icon_size);
|
||||||
append_headers({{_u8L("Line Type"), offsets[0]}, {_u8L("Time"), offsets[1]}, {_u8L("Percent"), offsets[2]}, {_u8L("Display"), offsets[3]}});
|
append_headers({{_u8L("Line Type"), offsets[0]}, {_u8L("Time"), offsets[1]}, {_u8L("Percent"), offsets[2]}, {_u8L("Used filament"), offsets[3]}, {"", offsets[4]}, {_u8L("Display"), offsets[5]}});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EViewType::Height: { imgui.title(_u8L("Layer Height (mm)")); break; }
|
case EViewType::Height: { imgui.title(_u8L("Layer Height (mm)")); break; }
|
||||||
|
@ -4966,6 +4986,8 @@ void GCodeViewer::render_legend(float &legend_height, int canvas_width, int canv
|
||||||
columns_offsets.push_back({ labels[i], offsets[0] });
|
columns_offsets.push_back({ labels[i], offsets[0] });
|
||||||
columns_offsets.push_back({ times[i], offsets[1] });
|
columns_offsets.push_back({ times[i], offsets[1] });
|
||||||
columns_offsets.push_back({ percents[i], offsets[2] });
|
columns_offsets.push_back({ percents[i], offsets[2] });
|
||||||
|
columns_offsets.push_back({ used_filaments_m[i], offsets[3] });
|
||||||
|
columns_offsets.push_back({ used_filaments_g[i], offsets[4] });
|
||||||
append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast<unsigned int>(role)], columns_offsets,
|
append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast<unsigned int>(role)], columns_offsets,
|
||||||
true, visible, [this, role, visible]() {
|
true, visible, [this, role, visible]() {
|
||||||
m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << role) : m_extrusions.role_visibility_flags | (1 << role);
|
m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << role) : m_extrusions.role_visibility_flags | (1 << role);
|
||||||
|
|
Loading…
Reference in New Issue