diff --git a/ImGuiToolkit.cpp b/ImGuiToolkit.cpp index e680f7f..1e0dd7f 100644 --- a/ImGuiToolkit.cpp +++ b/ImGuiToolkit.cpp @@ -345,33 +345,34 @@ void ImGuiToolkit::ShowIconsWindow(bool* p_open) const ImGuiIO& io = ImGui::GetIO(); - ImGui::Begin("Icons", p_open); + if ( ImGui::Begin("Icons", p_open) ) { - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImGui::Image((void*)(intptr_t)textureicons, ImVec2(640, 640)); - if (ImGui::IsItemHovered()) - { - float my_tex_w = 640.0; - float my_tex_h = 640.0; - float zoom = 4.0f; - float region_sz = 32.0f; // 64 x 64 icons - float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; - if (region_x < 0.0f) region_x = 0.0f; else if (region_x > my_tex_w - region_sz) region_x = my_tex_w - region_sz; - float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; - if (region_y < 0.0f) region_y = 0.0f; else if (region_y > my_tex_h - region_sz) region_y = my_tex_h - region_sz; - ImGui::BeginTooltip(); - int i = (int) ( (region_x + region_sz * 0.5f) / region_sz); - int j = (int) ( (region_y + region_sz * 0.5f)/ region_sz); - ImGuiToolkit::Icon(i, j); - ImGui::SameLine(); - ImGui::Text(" Icon (%d, %d)", i, j); - ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); - ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); - ImGui::Image((void*)(intptr_t)textureicons, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, ImVec4(1.0f, 1.0f, 1.0f, 1.0f), ImVec4(1.0f, 1.0f, 1.0f, 0.5f)); - ImGui::EndTooltip(); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImGui::Image((void*)(intptr_t)textureicons, ImVec2(640, 640)); + if (ImGui::IsItemHovered()) + { + float my_tex_w = 640.0; + float my_tex_h = 640.0; + float zoom = 4.0f; + float region_sz = 32.0f; // 64 x 64 icons + float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; + if (region_x < 0.0f) region_x = 0.0f; else if (region_x > my_tex_w - region_sz) region_x = my_tex_w - region_sz; + float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; + if (region_y < 0.0f) region_y = 0.0f; else if (region_y > my_tex_h - region_sz) region_y = my_tex_h - region_sz; + ImGui::BeginTooltip(); + int i = (int) ( (region_x + region_sz * 0.5f) / region_sz); + int j = (int) ( (region_y + region_sz * 0.5f)/ region_sz); + ImGuiToolkit::Icon(i, j); + ImGui::SameLine(); + ImGui::Text(" Icon (%d, %d)", i, j); + ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); + ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); + ImGui::Image((void*)(intptr_t)textureicons, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, ImVec4(1.0f, 1.0f, 1.0f, 1.0f), ImVec4(1.0f, 1.0f, 1.0f, 0.5f)); + ImGui::EndTooltip(); + } + + ImGui::End(); } - - ImGui::End(); } void ImGuiToolkit::ToolTip(const char* desc, const char* shortcut) diff --git a/Log.cpp b/Log.cpp index b46cfbf..2948684 100644 --- a/Log.cpp +++ b/Log.cpp @@ -57,88 +57,86 @@ struct AppLog ImGui::SetNextWindowPos(ImVec2(430, 660), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ImVec2(1150, 220), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSizeConstraints(ImVec2(600, 180), ImVec2(FLT_MAX, FLT_MAX)); - if (!ImGui::Begin(title, p_open)) + if (ImGui::Begin(title, p_open)) { - ImGui::End(); - return; - } + // window + ImGui::SameLine(0, 0); + static bool numbering = true; + ImGuiToolkit::ButtonToggle( ICON_FA_SORT_NUMERIC_DOWN, &numbering ); + ImGui::SameLine(); + bool clear = ImGui::Button( ICON_FA_BACKSPACE " Clear"); + ImGui::SameLine(); + bool copy = ImGui::Button( ICON_FA_COPY " Copy"); + ImGui::SameLine(); + Filter.Draw("Filter", -60.0f); - // window - ImGui::SameLine(0, 0); - static bool numbering = true; - ImGuiToolkit::ButtonToggle( ICON_FA_SORT_NUMERIC_DOWN, &numbering ); - ImGui::SameLine(); - bool clear = ImGui::Button( ICON_FA_BACKSPACE " Clear"); - ImGui::SameLine(); - bool copy = ImGui::Button( ICON_FA_COPY " Copy"); - ImGui::SameLine(); - Filter.Draw("Filter", -60.0f); - - ImGui::Separator(); - ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_AlwaysHorizontalScrollbar); - - if (clear) - Clear(); - if (copy) - ImGui::LogToClipboard(); - - ImGuiToolkit::PushFont(ImGuiToolkit::FONT_MONO); - ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); - - mtx.lock(); - - const char* buf = Buf.begin(); - const char* buf_end = Buf.end(); - if (Filter.IsActive()) - { - // In this example we don't use the clipper when Filter is enabled. - // This is because we don't have a random access on the result on our filter. - // A real application processing logs with ten of thousands of entries may want to store the result of search/filter. - // especially if the filtering function is not trivial (e.g. reg-exp). - for (int line_no = 0; line_no < LineOffsets.Size; line_no++) + ImGui::Separator(); + if ( ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_AlwaysHorizontalScrollbar) ) { - const char* line_start = buf + LineOffsets[line_no]; - const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; - if (Filter.PassFilter(line_start, line_end)) - ImGui::TextUnformatted(line_start, line_end); - } - } - else - { - // The simplest and easy way to display the entire buffer: - // ImGui::TextUnformatted(buf_begin, buf_end); - // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward to skip non-visible lines. - // Here we instead demonstrate using the clipper to only process lines that are within the visible area. - // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them on your side is recommended. - // Using ImGuiListClipper requires A) random access into your data, and B) items all being the same height, - // both of which we can handle since we an array pointing to the beginning of each line of text. - // When using the filter (in the block of code above) we don't have random access into the data to display anymore, which is why we don't use the clipper. - // Storing or skimming through the search result would make it possible (and would be recommended if you want to search through tens of thousands of entries) - ImGuiListClipper clipper; - clipper.Begin(LineOffsets.Size); - while (clipper.Step()) - { - for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) + if (clear) + Clear(); + if (copy) + ImGui::LogToClipboard(); + + ImGuiToolkit::PushFont(ImGuiToolkit::FONT_MONO); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + + mtx.lock(); + + const char* buf = Buf.begin(); + const char* buf_end = Buf.end(); + if (Filter.IsActive()) { - const char* line_start = buf + LineOffsets[line_no] + (numbering?0:6); - const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; - ImGui::TextUnformatted(line_start, line_end); + // In this example we don't use the clipper when Filter is enabled. + // This is because we don't have a random access on the result on our filter. + // A real application processing logs with ten of thousands of entries may want to store the result of search/filter. + // especially if the filtering function is not trivial (e.g. reg-exp). + for (int line_no = 0; line_no < LineOffsets.Size; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + if (Filter.PassFilter(line_start, line_end)) + ImGui::TextUnformatted(line_start, line_end); + } } + else + { + // The simplest and easy way to display the entire buffer: + // ImGui::TextUnformatted(buf_begin, buf_end); + // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward to skip non-visible lines. + // Here we instead demonstrate using the clipper to only process lines that are within the visible area. + // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them on your side is recommended. + // Using ImGuiListClipper requires A) random access into your data, and B) items all being the same height, + // both of which we can handle since we an array pointing to the beginning of each line of text. + // When using the filter (in the block of code above) we don't have random access into the data to display anymore, which is why we don't use the clipper. + // Storing or skimming through the search result would make it possible (and would be recommended if you want to search through tens of thousands of entries) + ImGuiListClipper clipper; + clipper.Begin(LineOffsets.Size); + while (clipper.Step()) + { + for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) + { + const char* line_start = buf + LineOffsets[line_no] + (numbering?0:6); + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + ImGui::TextUnformatted(line_start, line_end); + } + } + clipper.End(); + } + + mtx.unlock(); + + ImGui::PopStyleVar(); + ImGui::PopFont(); + + // Auto scroll + if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) + ImGui::SetScrollHereY(1.0f); + + ImGui::EndChild(); } - clipper.End(); + ImGui::End(); } - - mtx.unlock(); - - ImGui::PopStyleVar(); - ImGui::PopFont(); - - // Auto scroll - if (ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) - ImGui::SetScrollHereY(1.0f); - - ImGui::EndChild(); - ImGui::End(); } };