2024-12-20 06:44:50 +00:00
|
|
|
#include "DailyTips.hpp"
|
|
|
|
|
|
|
|
#ifndef IMGUI_DEFINE_MATH_OPERATORS
|
|
|
|
#define IMGUI_DEFINE_MATH_OPERATORS
|
|
|
|
#endif
|
|
|
|
#include <imgui/imgui_internal.h>
|
|
|
|
|
|
|
|
namespace Slic3r { namespace GUI {
|
|
|
|
|
|
|
|
|
|
|
|
struct DailyTipsData {
|
|
|
|
std::string main_text;
|
|
|
|
std::string wiki_url;
|
|
|
|
std::string img_url;
|
|
|
|
std::string additional_text; // currently not used
|
|
|
|
std::string hyper_text; // currently not used
|
|
|
|
std::function<void(void)> hypertext_callback; // currently not used
|
|
|
|
};
|
|
|
|
|
|
|
|
class DailyTipsDataRenderer {
|
|
|
|
public:
|
|
|
|
DailyTipsDataRenderer(DailyTipsLayout layout);
|
|
|
|
~DailyTipsDataRenderer();
|
|
|
|
void update_data(const DailyTipsData& data);
|
|
|
|
void render(const ImVec2& pos, const ImVec2& size) const;
|
|
|
|
bool has_image() const;
|
|
|
|
void on_change_color_mode(bool is_dark);
|
|
|
|
void set_fade_opacity(float opacity);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void load_texture_from_img_url(const std::string url);
|
|
|
|
void open_wiki() const;
|
|
|
|
// relative to the window's upper-left position
|
|
|
|
void render_img(const ImVec2& start_pos, const ImVec2& size) const;
|
|
|
|
void render_text(const ImVec2& start_pos, const ImVec2& size) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
DailyTipsData m_data;
|
|
|
|
GLTexture* m_texture{ nullptr };
|
|
|
|
GLTexture* m_placeholder_texture{ nullptr };
|
|
|
|
bool m_is_dark{ false };
|
|
|
|
DailyTipsLayout m_layout;
|
|
|
|
float m_fade_opacity{ 1.0f };
|
|
|
|
};
|
|
|
|
|
|
|
|
DailyTipsDataRenderer::DailyTipsDataRenderer(DailyTipsLayout layout)
|
|
|
|
: m_layout(layout)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
DailyTipsDataRenderer::~DailyTipsDataRenderer() {
|
|
|
|
if (m_texture)
|
|
|
|
delete m_texture;
|
|
|
|
if (m_placeholder_texture)
|
|
|
|
delete m_placeholder_texture;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::update_data(const DailyTipsData& data)
|
|
|
|
{
|
|
|
|
m_data = data;
|
|
|
|
load_texture_from_img_url(m_data.img_url);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::load_texture_from_img_url(const std::string url)
|
|
|
|
{
|
|
|
|
if (m_texture) {
|
|
|
|
delete m_texture;
|
|
|
|
m_texture = nullptr;
|
|
|
|
}
|
|
|
|
if (!url.empty()) {
|
|
|
|
m_texture = new GLTexture();
|
|
|
|
m_texture->load_from_file(Slic3r::resources_dir() + "/" + url, true, GLTexture::None, false);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (!m_placeholder_texture) {
|
|
|
|
m_placeholder_texture = new GLTexture();
|
|
|
|
m_placeholder_texture->load_from_file(Slic3r::resources_dir() + "/images/dailytips_placeholder.png", true, GLTexture::None, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::open_wiki() const
|
|
|
|
{
|
|
|
|
if (!m_data.wiki_url.empty())
|
|
|
|
{
|
|
|
|
wxGetApp().open_browser_with_warning_dialog(m_data.wiki_url);
|
|
|
|
NetworkAgent* agent = wxGetApp().getAgent();
|
|
|
|
if (agent) {
|
|
|
|
json j;
|
|
|
|
j["dayil_tips"] = m_data.wiki_url;
|
|
|
|
agent->track_event("dayil_tips", j.dump());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::render(const ImVec2& pos, const ImVec2& size) const
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
ImGuiWindow* parent_window = ImGui::GetCurrentWindow();
|
|
|
|
int window_flags = parent_window->Flags;
|
|
|
|
window_flags &= ~ImGuiWindowFlags_NoScrollbar;
|
|
|
|
window_flags &= ~ImGuiWindowFlags_NoScrollWithMouse;
|
|
|
|
std::string name = "##DailyTipsDataRenderer" + std::to_string(parent_window->ID);
|
|
|
|
ImGui::SetNextWindowPos(pos);
|
|
|
|
if (ImGui::BeginChild(name.c_str(), size, false, window_flags)) {
|
|
|
|
if (m_layout == DailyTipsLayout::Vertical) {
|
|
|
|
ImVec2 img_size = ImVec2(size.x, 9.0f / 16.0f * size.x);
|
|
|
|
render_img({ 0, 0 }, img_size);
|
|
|
|
float img_text_gap = ImGui::CalcTextSize("A").y;
|
|
|
|
render_text({ 0, img_size.y + img_text_gap }, size);
|
|
|
|
}
|
|
|
|
if (m_layout == DailyTipsLayout::Horizontal) {
|
|
|
|
ImVec2 img_size = ImVec2(16.0f / 9.0f * size.y, size.y);
|
|
|
|
render_img({ 0, 0 }, img_size);
|
|
|
|
float img_text_gap = ImGui::CalcTextSize("A").y;
|
|
|
|
render_text({ img_size.x + img_text_gap, 0 }, { size.x - img_size.x - img_text_gap, size.y });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ImGui::EndChild();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DailyTipsDataRenderer::has_image() const
|
|
|
|
{
|
|
|
|
return !m_data.img_url.empty();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::on_change_color_mode(bool is_dark)
|
|
|
|
{
|
|
|
|
m_is_dark = is_dark;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::set_fade_opacity(float opacity)
|
|
|
|
{
|
|
|
|
m_fade_opacity = opacity;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::render_img(const ImVec2& start_pos, const ImVec2& size) const
|
|
|
|
{
|
|
|
|
if (has_image())
|
|
|
|
ImGui::Image((ImTextureID)(intptr_t)m_texture->get_id(), size, ImVec2(0, 0), ImVec2(1, 1), m_is_dark ? ImVec4(0.8, 0.8, 0.8, m_fade_opacity) : ImVec4(1, 1, 1, m_fade_opacity));
|
|
|
|
else {
|
|
|
|
ImGui::Image((ImTextureID)(intptr_t)m_placeholder_texture->get_id(), size, ImVec2(0, 0), ImVec2(1, 1), m_is_dark ? ImVec4(0.8, 0.8, 0.8, m_fade_opacity) : ImVec4(1, 1, 1, m_fade_opacity));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsDataRenderer::render_text(const ImVec2& start_pos, const ImVec2& size) const
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, m_is_dark ? ImVec4(1.0f, 1.0f, 1.0f, 0.88f * m_fade_opacity) : ImVec4(38 / 255.0f, 46 / 255.0f, 48 / 255.0f, m_fade_opacity));
|
|
|
|
// main text
|
|
|
|
// first line is headline (for hint notification it must be divided by \n)
|
|
|
|
std::string title_line;
|
|
|
|
std::string content_lines;
|
|
|
|
size_t end_pos = m_data.main_text.find_first_of('\n');
|
|
|
|
if (end_pos != std::string::npos) {
|
|
|
|
title_line = m_data.main_text.substr(0, end_pos);
|
|
|
|
title_line = ImGui::ColorMarkerStart + title_line + ImGui::ColorMarkerEnd;
|
|
|
|
content_lines = m_data.main_text.substr(end_pos + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::SetCursorPos(start_pos);
|
|
|
|
imgui.text(title_line);
|
|
|
|
|
|
|
|
bool is_zh = false;
|
|
|
|
for (int i = 0; i < content_lines.size() - 1; i += 2) {
|
|
|
|
if ((content_lines[i] & 0x80) && (content_lines[i + 1] & 0x80))
|
|
|
|
is_zh = true;
|
|
|
|
}
|
|
|
|
if (!is_zh) {
|
|
|
|
// problem in Chinese with spaces
|
|
|
|
ImGui::SetCursorPosX(start_pos.x);
|
|
|
|
imgui.text_wrapped(content_lines, size.x);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
Label* wrapped_text = new Label(wxGetApp().GetTopWindow());
|
|
|
|
wrapped_text->Hide();
|
|
|
|
wrapped_text->SetLabelText(wxString::FromUTF8(content_lines));
|
|
|
|
wrapped_text->Wrap(size.x + ImGui::CalcTextSize("A").x * 5.0f);
|
|
|
|
std::string wrapped_content_lines = wrapped_text->GetLabel().ToUTF8().data();
|
|
|
|
wrapped_text->Destroy();
|
|
|
|
ImGui::SetCursorPosX(start_pos.x);
|
|
|
|
imgui.text(wrapped_content_lines);
|
|
|
|
}
|
|
|
|
|
|
|
|
// wiki
|
|
|
|
if (!m_data.wiki_url.empty()) {
|
|
|
|
std::string tips_line = _u8L("For more information, please check out Wiki");
|
|
|
|
std::string wiki_part_text = _u8L("Wiki");
|
|
|
|
std::string first_part_text = tips_line.substr(0, tips_line.find(wiki_part_text));
|
|
|
|
ImVec2 wiki_part_size = ImGui::CalcTextSize(wiki_part_text.c_str());
|
|
|
|
ImVec2 first_part_size = ImGui::CalcTextSize(first_part_text.c_str());
|
|
|
|
|
|
|
|
//text
|
|
|
|
ImGui::SetCursorPosX(start_pos.x);
|
|
|
|
ImVec2 link_start_pos = ImGui::GetCursorScreenPos();
|
|
|
|
imgui.text(first_part_text);
|
|
|
|
|
|
|
|
ImColor HyperColor = ImColor(31, 142, 234, (int)(255 * m_fade_opacity)).Value;
|
|
|
|
ImVec2 wiki_part_rect_min = ImVec2(link_start_pos.x + first_part_size.x, link_start_pos.y);
|
|
|
|
ImVec2 wiki_part_rect_max = wiki_part_rect_min + wiki_part_size;
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, HyperColor.Value);
|
|
|
|
ImGui::SetCursorScreenPos(wiki_part_rect_min);
|
|
|
|
imgui.text(wiki_part_text.c_str());
|
|
|
|
ImGui::PopStyleColor();
|
|
|
|
|
|
|
|
//click behavior
|
|
|
|
if (ImGui::IsMouseHoveringRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), true))
|
|
|
|
{
|
|
|
|
//underline
|
|
|
|
ImVec2 lineEnd = ImGui::GetItemRectMax();
|
|
|
|
lineEnd.y -= 2.0f;
|
|
|
|
ImVec2 lineStart = lineEnd;
|
|
|
|
lineStart.x = ImGui::GetItemRectMin().x;
|
|
|
|
ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, HyperColor);
|
|
|
|
|
|
|
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
|
|
|
|
open_wiki();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ImGui::PopStyleColor();
|
|
|
|
}
|
|
|
|
|
|
|
|
int DailyTipsPanel::uid = 0;
|
|
|
|
|
|
|
|
DailyTipsPanel::DailyTipsPanel(bool can_expand, DailyTipsLayout layout)
|
|
|
|
: m_pos(ImVec2(0, 0)),
|
|
|
|
m_width(0),
|
|
|
|
m_height(0),
|
|
|
|
m_can_expand(can_expand),
|
|
|
|
m_layout(layout),
|
|
|
|
m_uid(DailyTipsPanel::uid++),
|
|
|
|
m_dailytips_renderer(std::make_unique<DailyTipsDataRenderer>(layout))
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
float scale = imgui.get_font_size() / 15.0f;
|
|
|
|
m_footer_height = 58.0f * scale;
|
|
|
|
m_is_expanded = wxGetApp().app_config->get("show_hints") == "true";
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::set_position(const ImVec2& pos)
|
|
|
|
{
|
|
|
|
m_pos = pos;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::set_size(const ImVec2& size)
|
|
|
|
{
|
|
|
|
m_width = size.x;
|
|
|
|
m_height = size.y;
|
|
|
|
m_content_height = m_height - m_footer_height;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::set_can_expand(bool can_expand)
|
|
|
|
{
|
|
|
|
m_can_expand = can_expand;
|
|
|
|
}
|
|
|
|
|
|
|
|
ImVec2 DailyTipsPanel::get_size()
|
|
|
|
{
|
|
|
|
return ImVec2(m_width, m_height);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::render()
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
float scale = imgui.get_font_size() / 15.0f;
|
|
|
|
|
|
|
|
if (!m_first_enter) {
|
|
|
|
retrieve_data_from_hint_database(HintDataNavigation::Curr);
|
|
|
|
m_first_enter = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
push_styles();
|
|
|
|
if (m_can_expand) {
|
|
|
|
if (m_is_expanded) {
|
|
|
|
m_height = m_content_height + m_footer_height;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
m_height = m_footer_height;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ImGui::SetNextWindowPos(m_pos);
|
|
|
|
ImGui::SetNextWindowSizeConstraints(ImVec2(m_width, m_height), ImVec2(m_width, m_height));
|
|
|
|
int window_flags = ImGuiWindowFlags_NoTitleBar
|
|
|
|
| ImGuiWindowFlags_NoCollapse
|
|
|
|
| ImGuiWindowFlags_NoMove
|
|
|
|
| ImGuiWindowFlags_NoResize
|
|
|
|
| ImGuiWindowFlags_NoScrollbar
|
|
|
|
| ImGuiWindowFlags_NoScrollWithMouse;
|
|
|
|
if (ImGui::BeginChild((std::string("##DailyTipsPanel") + std::to_string(m_uid)).c_str(), ImVec2(m_width, m_height), false, window_flags)) {
|
|
|
|
if (m_can_expand) {
|
|
|
|
if (m_is_expanded) {
|
|
|
|
m_dailytips_renderer->render({ m_pos.x, m_pos.y }, { m_width, m_content_height });
|
|
|
|
render_controller_buttons({ m_pos.x, m_pos.y + m_height - m_footer_height }, { m_width, m_footer_height });
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
render_controller_buttons({ m_pos.x, m_pos.y + m_height - m_footer_height }, { m_width, m_footer_height });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
m_dailytips_renderer->render({ m_pos.x, m_pos.y }, { m_width, m_content_height });
|
|
|
|
render_controller_buttons({ m_pos.x, m_pos.y + m_height - m_footer_height }, { m_width, m_footer_height });
|
|
|
|
}
|
|
|
|
|
|
|
|
//{// for debug
|
|
|
|
// ImVec2 vMin = ImGui::GetWindowContentRegionMin();
|
|
|
|
// ImVec2 vMax = ImGui::GetWindowContentRegionMax();
|
|
|
|
// vMin += ImGui::GetWindowPos();
|
|
|
|
// vMax += ImGui::GetWindowPos();
|
|
|
|
// ImGui::GetForegroundDrawList()->AddRect(vMin, vMax, IM_COL32(180, 180, 255, 255));
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
ImGui::EndChild();
|
|
|
|
pop_styles();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::retrieve_data_from_hint_database(HintDataNavigation nav)
|
|
|
|
{
|
|
|
|
HintData* hint_data = HintDatabase::get_instance().get_hint(nav);
|
|
|
|
if (hint_data != nullptr)
|
|
|
|
{
|
|
|
|
DailyTipsData data{ hint_data->text,
|
|
|
|
hint_data->documentation_link,
|
|
|
|
hint_data->image_url,
|
|
|
|
hint_data->follow_text,
|
|
|
|
hint_data->hypertext,
|
|
|
|
hint_data->callback
|
|
|
|
};
|
|
|
|
m_dailytips_renderer->update_data(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::expand(bool expand)
|
|
|
|
{
|
|
|
|
if (!m_can_expand)
|
|
|
|
return;
|
|
|
|
m_is_expanded = expand;
|
|
|
|
wxGetApp().app_config->set_bool("show_hints", expand);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::collapse()
|
|
|
|
{
|
|
|
|
if (!m_can_expand)
|
|
|
|
return;
|
|
|
|
m_is_expanded = false;
|
|
|
|
wxGetApp().app_config->set_bool("show_hints", false);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DailyTipsPanel::is_expanded()
|
|
|
|
{
|
|
|
|
return m_is_expanded;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::on_change_color_mode(bool is_dark)
|
|
|
|
{
|
|
|
|
m_is_dark = is_dark;
|
|
|
|
m_dailytips_renderer->on_change_color_mode(is_dark);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::set_fade_opacity(float opacity)
|
|
|
|
{
|
|
|
|
m_fade_opacity = opacity;
|
|
|
|
m_dailytips_renderer->set_fade_opacity(opacity);
|
|
|
|
}
|
|
|
|
|
|
|
|
//void DailyTipsPanel::render_header(const ImVec2& pos, const ImVec2& size)
|
|
|
|
//{
|
|
|
|
// ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
// ImGuiWindow* parent_window = ImGui::GetCurrentWindow();
|
|
|
|
// int window_flags = parent_window->Flags;
|
|
|
|
// std::string name = "##DailyTipsPanelHeader" + std::to_string(parent_window->ID);
|
|
|
|
// ImGui::SetNextWindowPos(pos);
|
|
|
|
// if (ImGui::BeginChild(name.c_str(), size, false, window_flags)) {
|
|
|
|
// ImVec2 text_pos = pos + ImVec2(0, (size.y - ImGui::CalcTextSize("A").y) / 2);
|
|
|
|
// ImGui::SetCursorScreenPos(text_pos);
|
|
|
|
// imgui.push_bold_font();
|
|
|
|
// imgui.text(_u8L("Daily Tips"));
|
|
|
|
// imgui.pop_bold_font();
|
|
|
|
// }
|
|
|
|
// ImGui::EndChild();
|
|
|
|
//}
|
|
|
|
|
|
|
|
void DailyTipsPanel::render_controller_buttons(const ImVec2& pos, const ImVec2& size)
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
float scale = imgui.get_font_size() / 15.0f;
|
|
|
|
ImGuiWindow* parent_window = ImGui::GetCurrentWindow();
|
|
|
|
int window_flags = parent_window->Flags;
|
|
|
|
std::string name = "##DailyTipsPanelControllers" + std::to_string(parent_window->ID);
|
|
|
|
ImGui::SetNextWindowPos(pos);
|
|
|
|
if (ImGui::BeginChild(name.c_str(), size, false, window_flags)) {
|
|
|
|
ImVec2 button_size = ImVec2(38.0f, 38.0f) * scale;
|
|
|
|
float button_margin_x = 8.0f * scale;
|
|
|
|
std::wstring button_text;
|
|
|
|
|
|
|
|
// collapse / expand
|
|
|
|
ImVec2 btn_pos = pos + ImVec2(0, (size.y - ImGui::CalcTextSize("A").y) / 2);
|
|
|
|
ImGui::SetCursorScreenPos(btn_pos);
|
|
|
|
if (m_can_expand) {
|
|
|
|
if (m_is_expanded) {
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, ImColor(144, 144, 144, (int)(255 * m_fade_opacity)).Value);
|
|
|
|
|
|
|
|
button_text = ImGui::CollapseArrowIcon;
|
|
|
|
imgui.button(_L("Collapse") + button_text);
|
|
|
|
ImVec2 collapse_btn_size = ImGui::CalcTextSize((_u8L("Collapse")).c_str());
|
|
|
|
collapse_btn_size.x += button_size.x / 2.0f;
|
|
|
|
if (ImGui::IsMouseHoveringRect(btn_pos, btn_pos + collapse_btn_size, true))
|
|
|
|
{
|
|
|
|
//underline
|
|
|
|
ImVec2 lineEnd = ImGui::GetItemRectMax();
|
|
|
|
lineEnd.x -= ImGui::CalcTextSize("A").x / 2;
|
|
|
|
lineEnd.y -= 2;
|
|
|
|
ImVec2 lineStart = lineEnd;
|
|
|
|
lineStart.x = ImGui::GetItemRectMin().x;
|
|
|
|
ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, ImColor(144, 144, 144));
|
|
|
|
|
|
|
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
|
|
|
|
collapse();
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::PopStyleColor(4);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, m_is_dark ? ImColor(230, 230, 230, (int)(255 * m_fade_opacity)).Value : ImColor(38, 46, 48, (int)(255 * m_fade_opacity)).Value);
|
|
|
|
|
|
|
|
// for bold font text, split text and icon-font button
|
|
|
|
imgui.push_bold_font();
|
|
|
|
imgui.button(_L("Daily Tips"));
|
|
|
|
imgui.pop_bold_font();
|
|
|
|
ImVec2 expand_btn_size = ImGui::CalcTextSize((_u8L("Daily Tips")).c_str());
|
|
|
|
ImGui::SetCursorScreenPos(ImVec2(btn_pos.x + expand_btn_size.x + ImGui::CalcTextSize(" ").x, btn_pos.y));
|
|
|
|
button_text = ImGui::ExpandArrowIcon;
|
|
|
|
imgui.button(button_text);
|
|
|
|
expand_btn_size.x += 19.0f * scale;
|
|
|
|
if (ImGui::IsMouseHoveringRect(btn_pos, btn_pos + expand_btn_size, true))
|
|
|
|
{
|
|
|
|
//underline
|
|
|
|
ImVec2 lineEnd = ImGui::GetItemRectMax();
|
|
|
|
lineEnd.x -= ImGui::CalcTextSize("A").x / 2;
|
|
|
|
lineEnd.y -= 2;
|
|
|
|
ImVec2 lineStart = lineEnd;
|
|
|
|
lineStart.x = ImGui::GetItemRectMin().x - expand_btn_size.x;
|
|
|
|
ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, m_is_dark ? ImColor(230, 230, 230, (int)(255 * m_fade_opacity)) : ImColor(38, 46, 48, (int)(255 * m_fade_opacity)));
|
|
|
|
|
|
|
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
|
|
|
|
expand();
|
|
|
|
}
|
|
|
|
|
|
|
|
ImGui::PopStyleColor(4);
|
|
|
|
|
|
|
|
ImGui::EndChild();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// page index
|
|
|
|
m_page_index = HintDatabase::get_instance().get_index() + 1;
|
|
|
|
m_pages_count = HintDatabase::get_instance().get_count();
|
|
|
|
std::string text_str = std::to_string(m_page_index) + "/" + std::to_string(m_pages_count);
|
|
|
|
float text_item_width = ImGui::CalcTextSize(text_str.c_str()).x;
|
|
|
|
ImGui::PushItemWidth(text_item_width);
|
|
|
|
float text_pos_x = (pos + size).x - button_margin_x * 2 - button_size.x * 2 - text_item_width;
|
|
|
|
float text_pos_y = pos.y + (size.y - ImGui::CalcTextSize("A").y) / 2;
|
|
|
|
ImGui::SetCursorScreenPos(ImVec2(text_pos_x, text_pos_y));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, m_is_dark ? ImColor(230, 230, 230, (int)(255 * m_fade_opacity)).Value : ImColor(38, 46, 48, (int)(255 * m_fade_opacity)).Value);
|
|
|
|
imgui.text(text_str);
|
|
|
|
ImGui::PopStyleColor();
|
|
|
|
ImGui::PopItemWidth();
|
|
|
|
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(.0f, .0f, .0f, .0f));
|
|
|
|
|
|
|
|
// prev button
|
|
|
|
ImColor button_text_color = m_is_dark ? ImColor(228, 228, 228, (int)(255 * m_fade_opacity)) : ImColor(38, 46, 48, (int)(255 * m_fade_opacity));
|
|
|
|
ImVec2 prev_button_pos = pos + size + ImVec2(-button_margin_x - button_size.x * 2, -size.y + (size.y - button_size.y) / 2);
|
|
|
|
ImGui::SetCursorScreenPos(prev_button_pos);
|
|
|
|
button_text = ImGui::PrevArrowBtnIcon;
|
|
|
|
if (ImGui::IsMouseHoveringRect(prev_button_pos, prev_button_pos + button_size, true))
|
|
|
|
{
|
2025-03-21 07:12:45 +00:00
|
|
|
//button_text_color = ImColor(0, 174, 66, (int)(255 * m_fade_opacity));
|
|
|
|
button_text_color = ImColor(33, 95, 154, (int)(255 * m_fade_opacity));
|
2024-12-20 06:44:50 +00:00
|
|
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
|
|
|
|
retrieve_data_from_hint_database(HintDataNavigation::Prev);
|
|
|
|
}
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, button_text_color.Value);// for icon-font button
|
|
|
|
imgui.button(button_text);
|
|
|
|
ImGui::PopStyleColor();
|
|
|
|
|
|
|
|
// next button
|
|
|
|
button_text_color = m_is_dark ? ImColor(228, 228, 228, (int)(255 * m_fade_opacity)) : ImColor(38, 46, 48, (int)(255 * m_fade_opacity));
|
|
|
|
ImVec2 next_button_pos = pos + size + ImVec2(-button_size.x, -size.y + (size.y - button_size.y) / 2);
|
|
|
|
ImGui::SetCursorScreenPos(next_button_pos);
|
|
|
|
button_text = ImGui::NextArrowBtnIcon;
|
|
|
|
if (ImGui::IsMouseHoveringRect(next_button_pos, next_button_pos + button_size, true))
|
|
|
|
{
|
2025-03-21 07:12:45 +00:00
|
|
|
//button_text_color = ImColor(0, 174, 66, (int)(255 * m_fade_opacity));
|
|
|
|
button_text_color = ImColor(33, 95, 154, (int)(255 * m_fade_opacity));
|
2024-12-20 06:44:50 +00:00
|
|
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left))
|
|
|
|
retrieve_data_from_hint_database(HintDataNavigation::Next);
|
|
|
|
}
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_Text, button_text_color.Value);// for icon-font button
|
|
|
|
imgui.button(button_text);
|
|
|
|
ImGui::PopStyleColor();
|
|
|
|
|
|
|
|
ImGui::PopStyleColor(4);
|
|
|
|
}
|
|
|
|
ImGui::EndChild();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::push_styles()
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
float scale = imgui.get_font_size() / 15.0f;
|
|
|
|
imgui.push_common_window_style(scale);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
|
|
|
// framePadding cannot be zero. Otherwise, there is a problem with icon font button display
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(1.0f, 1.0f));
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0.0f, 0.0f));
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemInnerSpacing, ImVec2(0.0f, 0.0f));
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_ScrollbarSize, 4.0f * scale);
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ScrollbarBg, m_is_dark ? ImGuiWrapper::COL_WINDOW_BG_DARK : ImGuiWrapper::COL_WINDOW_BG);
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ScrollbarGrab, ImVec4(0.42f, 0.42f, 0.42f, 1.00f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ScrollbarGrabHovered, ImVec4(0.93f, 0.93f, 0.93f, 1.00f));
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_ScrollbarGrabActive, ImVec4(0.93f, 0.93f, 0.93f, 1.00f));
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsPanel::pop_styles()
|
|
|
|
{
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
imgui.pop_common_window_style();
|
|
|
|
ImGui::PopStyleVar(6);
|
|
|
|
ImGui::PopStyleColor(4);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DailyTipsWindow::DailyTipsWindow()
|
|
|
|
{
|
|
|
|
m_panel = new DailyTipsPanel(false, DailyTipsLayout::Vertical);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsWindow::open()
|
|
|
|
{
|
|
|
|
m_show = true;
|
|
|
|
m_panel->retrieve_data_from_hint_database(HintDataNavigation::Curr);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsWindow::close()
|
|
|
|
{
|
|
|
|
m_show = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsWindow::render()
|
|
|
|
{
|
|
|
|
if (!m_show)
|
|
|
|
return;
|
|
|
|
//if (m_show)
|
|
|
|
// ImGui::OpenPopup((_u8L("Daily Tips")).c_str());
|
|
|
|
|
|
|
|
ImGuiWrapper& imgui = *wxGetApp().imgui();
|
|
|
|
float scale = imgui.get_font_size() / 15.0f;
|
|
|
|
|
|
|
|
const Size& cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size();
|
|
|
|
ImVec2 center = ImVec2(cnv_size.get_width() * 0.5f, cnv_size.get_height() * 0.5f);
|
|
|
|
ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
|
|
|
|
|
|
|
|
ImVec2 padding = ImVec2(25, 25) * scale;
|
|
|
|
imgui.push_menu_style(scale);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, padding);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 12.f * scale);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(10, 3) * scale);
|
|
|
|
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(10, 7) * scale);
|
|
|
|
ImGui::PushStyleColor(ImGuiCol_TitleBgActive, m_is_dark ? ImVec4(54 / 255.0f, 54 / 255.0f, 60 / 255.0f, 1.00f) : ImVec4(245 / 255.0f, 245 / 255.0f, 245 / 255.0f, 1.00f));
|
|
|
|
ImGui::GetCurrentContext()->DimBgRatio = 1.0f;
|
|
|
|
int windows_flag =
|
|
|
|
ImGuiWindowFlags_NoCollapse
|
|
|
|
| ImGuiWindowFlags_AlwaysAutoResize
|
|
|
|
| ImGuiWindowFlags_NoResize
|
|
|
|
| ImGuiWindowFlags_NoScrollbar
|
|
|
|
| ImGuiWindowFlags_NoScrollWithMouse;
|
|
|
|
imgui.push_bold_font();
|
|
|
|
//if (ImGui::BeginPopupModal((_u8L("Daily Tips")).c_str(), NULL, windows_flag))
|
|
|
|
if (ImGui::Begin((_u8L("Daily Tips")).c_str(), &m_show, windows_flag))
|
|
|
|
{
|
|
|
|
imgui.pop_bold_font();
|
|
|
|
|
|
|
|
ImVec2 panel_pos = ImGui::GetWindowPos() + ImGui::GetWindowContentRegionMin();
|
|
|
|
ImVec2 panel_size = ImVec2(400.0f, 435.0f) * scale;
|
|
|
|
m_panel->set_position(panel_pos);
|
|
|
|
m_panel->set_size(panel_size);
|
|
|
|
m_panel->render();
|
|
|
|
|
|
|
|
if (ImGui::IsKeyDown(ImGui::GetKeyIndex(ImGuiKey_Escape))) {
|
|
|
|
m_show = false;
|
|
|
|
ImGui::CloseCurrentPopup();
|
|
|
|
}
|
|
|
|
ImGui::End();
|
|
|
|
//ImGui::EndPopup();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
imgui.pop_bold_font();
|
|
|
|
}
|
|
|
|
ImGui::PopStyleVar(4);
|
|
|
|
ImGui::PopStyleColor();
|
|
|
|
imgui.pop_menu_style();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DailyTipsWindow::on_change_color_mode(bool is_dark)
|
|
|
|
{
|
|
|
|
m_is_dark = is_dark;
|
|
|
|
m_panel->on_change_color_mode(is_dark);
|
|
|
|
}
|
|
|
|
|
|
|
|
}}
|