|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
#include <imgui/imgui.h>
|
|
|
|
|
#include <imgui/misc/cpp/imgui_stdlib.h>
|
|
|
|
|
|
|
|
|
|
#include "../misc.h"
|
|
|
|
|
#include "../group_panel.h"
|
|
|
|
|
#include "../filters.h"
|
|
|
|
|
#include "ok_buttons_fragment.h"
|
|
|
|
@ -13,7 +14,8 @@ static inline void render_priority_filter(PriorityFilter* filter);
|
|
|
|
|
static inline void render_group_filter(GroupFilter* filter);
|
|
|
|
|
static std::unique_ptr<Filter> render_add_filter_popup();
|
|
|
|
|
|
|
|
|
|
static void render_filter(Filter* filter, std::string* title, bool* request_removal) {
|
|
|
|
|
static void render_filter(Filter* filter, std::string* title, bool* request_removal,
|
|
|
|
|
auto move_up, auto move_down, bool can_move_up, bool can_move_down) {
|
|
|
|
|
ImGui::PushID(filter);
|
|
|
|
|
ImGui::BeginGroupPanel();
|
|
|
|
|
|
|
|
|
@ -42,6 +44,15 @@ static void render_filter(Filter* filter, std::string* title, bool* request_remo
|
|
|
|
|
*request_removal = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
if (ImGui::ArrowButton("##up", ImGuiDir_Up, can_move_up)) {
|
|
|
|
|
move_up();
|
|
|
|
|
}
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
if (ImGui::ArrowButton("##down", ImGuiDir_Down, can_move_down)) {
|
|
|
|
|
move_down();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
bool disabled = filter->disabled();
|
|
|
|
@ -64,7 +75,7 @@ static void render_filter(Filter* filter, std::string* title, bool* request_remo
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (filter->error()) {
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
|
|
|
|
ImGui::Text("(%s)", filter->error()->c_str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -95,8 +106,8 @@ static inline void render_integer_filter(IntegerFilter* filter) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ImGui::AlignTextToFramePadding();
|
|
|
|
|
ImGui::Text("%s is%s", head, filter->inverted ? " not" : "");
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
ImGui::Text("%s is%s:", head, filter->inverted ? " not" : "");
|
|
|
|
|
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
|
|
|
|
if (ImGui::InputScalar("##int", ImGuiDataType_U64, &filter->other)) {
|
|
|
|
|
filter->updated();
|
|
|
|
|
}
|
|
|
|
@ -112,46 +123,48 @@ static inline void render_string_filter(StringFilter* filter) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ImGui::AlignTextToFramePadding();
|
|
|
|
|
ImGui::Text("%s %s", head, filter->exact_match
|
|
|
|
|
ImGui::Text("%s %s:", head, filter->exact_match
|
|
|
|
|
? (filter->inverted ? "is not" : "is")
|
|
|
|
|
: (filter->inverted ? "doesn't have" : "has"));
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
|
|
|
|
if (ImGui::InputText("##str", &filter->other)) {
|
|
|
|
|
filter->updated();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void render_buffer_filter(BufferFilter* filter) {
|
|
|
|
|
auto update_if_needed = [&](bool updated) {
|
|
|
|
|
if (updated) {
|
|
|
|
|
auto add_checkbox = [&](const char* name, Buffer buffer) {
|
|
|
|
|
if (ImGui::CheckboxFlags(name, &filter->wanted, static_cast<unsigned int>(buffer))) {
|
|
|
|
|
filter->updated();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ImGui::AlignTextToFramePadding();
|
|
|
|
|
ImGui::TextUnformatted("Buffer is:"); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Unknown", &filter->wanted, static_cast<unsigned int>(Buffer::Unknown))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Main", &filter->wanted, static_cast<unsigned int>(Buffer::Main))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("System", &filter->wanted, static_cast<unsigned int>(Buffer::System))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Radio", &filter->wanted, static_cast<unsigned int>(Buffer::Radio))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Events", &filter->wanted, static_cast<unsigned int>(Buffer::Events))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Crash", &filter->wanted, static_cast<unsigned int>(Buffer::Crash)));
|
|
|
|
|
ImGui::TextUnformatted("Buffer is:"); ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
|
|
|
|
add_checkbox("Unknown", Buffer::Unknown); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Main", Buffer::Main); ImGui::SameLine();
|
|
|
|
|
add_checkbox("System", Buffer::System); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Radio", Buffer::Radio); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Events", Buffer::Events); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Crash", Buffer::Crash);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void render_priority_filter(PriorityFilter* filter) {
|
|
|
|
|
auto update_if_needed = [&](bool updated) {
|
|
|
|
|
if (updated) {
|
|
|
|
|
auto add_checkbox = [&](const char* name, Priority priority) {
|
|
|
|
|
if (ImGui::CheckboxFlags(name, &filter->wanted, static_cast<unsigned int>(priority))) {
|
|
|
|
|
filter->updated();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ImGui::AlignTextToFramePadding();
|
|
|
|
|
ImGui::TextUnformatted("Priority is:"); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Unknown", &filter->wanted, static_cast<unsigned int>(Priority::Unknown))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Verbose", &filter->wanted, static_cast<unsigned int>(Priority::Verbose))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Debug", &filter->wanted, static_cast<unsigned int>(Priority::Debug))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Info", &filter->wanted, static_cast<unsigned int>(Priority::Info))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Warning", &filter->wanted, static_cast<unsigned int>(Priority::Warn))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Error", &filter->wanted, static_cast<unsigned int>(Priority::Error))); ImGui::SameLine();
|
|
|
|
|
update_if_needed(ImGui::CheckboxFlags("Fatal", &filter->wanted, static_cast<unsigned int>(Priority::Fatal)));
|
|
|
|
|
ImGui::TextUnformatted("Priority is:"); ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
|
|
|
|
|
add_checkbox("Unknown", Priority::Unknown); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Verbose", Priority::Verbose); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Debug", Priority::Debug); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Info", Priority::Info); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Warning", Priority::Warn); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Error", Priority::Error); ImGui::SameLine();
|
|
|
|
|
add_checkbox("Fatal", Priority::Fatal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void render_group_filter(GroupFilter* filter) {
|
|
|
|
@ -160,16 +173,28 @@ static inline void render_group_filter(GroupFilter* filter) {
|
|
|
|
|
filter->type = static_cast<GroupFilter::Type>(selected_type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (std::vector<std::unique_ptr<Filter>>::iterator it = filter->filters.begin(); it != filter->filters.end();) {
|
|
|
|
|
std::vector<std::pair<size_t, size_t>> swaps_to_do;
|
|
|
|
|
std::vector<size_t> removals_to_do;
|
|
|
|
|
for (size_t i = 0; i < filter->filters.size(); i++) {
|
|
|
|
|
bool removal_requested = false;
|
|
|
|
|
render_filter(it->get(), nullptr, &removal_requested);
|
|
|
|
|
render_filter(filter->filters[i].get(), nullptr, &removal_requested, [&]() {
|
|
|
|
|
swaps_to_do.push_back(std::make_pair(i, i - 1));
|
|
|
|
|
}, [&]() {
|
|
|
|
|
swaps_to_do.push_back(std::make_pair(i, i + 1));
|
|
|
|
|
}, i != 0, i + 1 != filter->filters.size());
|
|
|
|
|
|
|
|
|
|
if (removal_requested) {
|
|
|
|
|
filter->filters.erase(it);
|
|
|
|
|
filter->updated();
|
|
|
|
|
} else {
|
|
|
|
|
it++;
|
|
|
|
|
removals_to_do.push_back(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (auto &[lhs, rhs] : swaps_to_do) {
|
|
|
|
|
std::swap(filter->filters[lhs], filter->filters[rhs]);
|
|
|
|
|
filter->updated();
|
|
|
|
|
}
|
|
|
|
|
for (size_t i : removals_to_do) {
|
|
|
|
|
filter->filters.erase(filter->filters.begin() + static_cast<ssize_t>(i));
|
|
|
|
|
filter->updated();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ImGui::Button("+ add filter")) {
|
|
|
|
|
ImGui::OpenPopup("add_filter");
|
|
|
|
@ -210,15 +235,26 @@ void filters_fragment(Filters& inactive_filters) {
|
|
|
|
|
ImGui::TextWrapped("You can use regex for strings by prepending \"regex:\". "
|
|
|
|
|
"While editing titles, press Enter to use the new title or press Escape to keep the old one");
|
|
|
|
|
|
|
|
|
|
for (Filters::iterator it = inactive_filters.begin(); it != inactive_filters.end();) {
|
|
|
|
|
std::vector<std::pair<size_t, size_t>> swaps_to_do;
|
|
|
|
|
std::vector<size_t> removals_to_do;
|
|
|
|
|
for (size_t i = 0; i < inactive_filters.size(); i++) {
|
|
|
|
|
bool removal_requested = false;
|
|
|
|
|
render_filter(it->second.get(), &it->first, &removal_requested);
|
|
|
|
|
render_filter(inactive_filters[i].second.get(), &inactive_filters[i].first, &removal_requested, [&]() {
|
|
|
|
|
swaps_to_do.push_back(std::make_pair(i, i - 1));
|
|
|
|
|
}, [&]() {
|
|
|
|
|
swaps_to_do.push_back(std::make_pair(i, i + 1));
|
|
|
|
|
}, i != 0, i + 1 != inactive_filters.size());
|
|
|
|
|
|
|
|
|
|
if (removal_requested) {
|
|
|
|
|
inactive_filters.erase(it);
|
|
|
|
|
} else {
|
|
|
|
|
it++;
|
|
|
|
|
removals_to_do.push_back(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for (auto &[lhs, rhs] : swaps_to_do) {
|
|
|
|
|
std::swap(inactive_filters[lhs], inactive_filters[rhs]);
|
|
|
|
|
}
|
|
|
|
|
for (size_t i : removals_to_do) {
|
|
|
|
|
inactive_filters.erase(inactive_filters.begin() + static_cast<ssize_t>(i));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ImGui::Button("+ add filter")) {
|
|
|
|
|
ImGui::OpenPopup("add_filter");
|
|
|
|
|