diff options
| author | Aldrik Ramaekers <aldrikboy@gmail.com> | 2024-03-09 19:06:53 +0100 |
|---|---|---|
| committer | Aldrik Ramaekers <aldrikboy@gmail.com> | 2024-03-09 19:06:53 +0100 |
| commit | 03c271c82ccb434997fdde7bac140bb86b48accd (patch) | |
| tree | 748a39e554f4edd82c86f24266967b01cca8bff1 /src | |
| parent | e20735fe0a67c1fa3de16c10124bdc778acd88a8 (diff) | |
toggle case match
Diffstat (limited to 'src')
| -rw-r--r-- | src/config.cpp | 6 | ||||
| -rw-r--r-- | src/config.h | 1 | ||||
| -rw-r--r-- | src/main.cpp | 14 | ||||
| -rw-r--r-- | src/search.cpp | 17 | ||||
| -rw-r--r-- | src/search.h | 5 | ||||
| -rw-r--r-- | src/widgets/imgui_toggle.cpp | 31 | ||||
| -rw-r--r-- | src/widgets/imgui_toggle.h | 5 |
7 files changed, 64 insertions, 15 deletions
diff --git a/src/config.cpp b/src/config.cpp index 61e4127..5a2e0e0 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -11,6 +11,7 @@ utf8_int8_t filter_buffer[MAX_INPUT_LENGTH]; utf8_int8_t query_buffer[MAX_INPUT_LENGTH]; int ts_thread_count = 4; int max_file_size = 100; // in MBs +bool respect_capitalization = false; static void _ts_config_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) { @@ -18,7 +19,7 @@ static void _ts_config_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entr uint8_t filter[MAX_INPUT_LENGTH]; uint8_t query[MAX_INPUT_LENGTH]; - int threads = 1, maxSize = 100; + int threads = 1, maxSize = 100, matchCase = 0; #if defined(_WIN32) if (sscanf_s(line, "Path=%s", (char*)&path, MAX_INPUT_LENGTH) == 1) { strncpy_s(path_buffer, MAX_INPUT_LENGTH, (char*)path, MAX_INPUT_LENGTH); } @@ -26,12 +27,14 @@ static void _ts_config_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entr else if (sscanf_s(line, "Query=%s", (char*)&query, MAX_INPUT_LENGTH) == 1) { strncpy_s(query_buffer, MAX_INPUT_LENGTH, (char*)query, MAX_INPUT_LENGTH); } else if (sscanf_s(line, "Threads=%d", &threads) == 1) { ts_thread_count = threads; } else if (sscanf_s(line, "MaxSize=%d", &maxSize) == 1) { max_file_size = maxSize; } + else if (sscanf_s(line, "MatchCase=%d", &matchCase) == 1) { respect_capitalization = matchCase; } #elif defined(__linux__) if (sscanf(line, "Path=%s", (char*)&path) == 1) { strncpy(path_buffer, (char*)path, MAX_INPUT_LENGTH); } else if (sscanf(line, "Filter=%s", (char*)&filter) == 1) { strncpy(filter_buffer, (char*)filter, MAX_INPUT_LENGTH); } else if (sscanf(line, "Query=%s", (char*)&query) == 1) { strncpy(query_buffer, (char*)query, MAX_INPUT_LENGTH); } else if (sscanf(line, "Threads=%d", &threads) == 1) { ts_thread_count = threads; } else if (sscanf(line, "MaxSize=%d", &maxSize) == 1) { max_file_size = maxSize; } + else if (sscanf(line, "MatchCase=%d", &matchCase) == 1) { respect_capitalization = matchCase; } #endif } @@ -45,6 +48,7 @@ static void _ts_config_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler buf->appendf("Query=%s\n", query_buffer); buf->appendf("Threads=%d\n", ts_thread_count); buf->appendf("MaxSize=%d\n", max_file_size); + buf->appendf("MatchCase=%d\n", respect_capitalization); buf->append("\n"); } diff --git a/src/config.h b/src/config.h index f6cff36..efc64cb 100644 --- a/src/config.h +++ b/src/config.h @@ -17,5 +17,6 @@ extern utf8_int8_t filter_buffer[MAX_INPUT_LENGTH]; extern utf8_int8_t query_buffer[MAX_INPUT_LENGTH]; extern int ts_thread_count; extern int max_file_size; // in MBs +extern bool respect_capitalization; void ts_load_config();
\ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ed51402..abdc170 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,6 +3,7 @@ #include "../imgui/imgui_impl_opengl3_loader.h" #include "../imfiledialog/imFileDialog.h" #include "../utf8.h" +#include "widgets/imgui_toggle.h" #include "definitions.h" #include "search.h" #include "platform.h" @@ -167,7 +168,7 @@ void ts_init() { int _tb_query_input_cb(ImGuiInputTextCallbackData* data) { if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit) { utf8ncpy(query_buffer, data->Buf, MAX_INPUT_LENGTH); - ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size); + ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size, respect_capitalization); } return 0; @@ -313,7 +314,7 @@ void ts_create_gui(int window_w, int window_h) { ImGui::PushItemWidth(-1); if (ImGui::InputTextWithHint("query", "Query", query_buffer, MAX_INPUT_LENGTH, ImGuiInputTextFlags_CallbackEdit|ImGuiInputTextFlags_EnterReturnsTrue, _tb_query_input_cb)) { - ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size); + ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size, respect_capitalization); } ImGui::PopItemWidth(); ImGui::SetItemTooltip("Text to search within files, supports '*' & '?' wildcards"); @@ -339,7 +340,7 @@ void ts_create_gui(int window_w, int window_h) { ImGui::SameLine(); ImGui::PushItemWidth(-1); if (ImGui::InputTextWithHint("filter-ti", "Filter", filter_buffer, MAX_INPUT_LENGTH, ImGuiInputTextFlags_EnterReturnsTrue)) { - ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size); + ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size, respect_capitalization); } ImGui::PopItemWidth(); ImGui::SetItemTooltip("Files to filter, supports '*' & '?' wildcards"); @@ -351,10 +352,15 @@ void ts_create_gui(int window_w, int window_h) { else { ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); if (ImGui::ImageButton("Search", (void*)(intptr_t)img_search.id, ImVec2(18.0f, 18.0f))) { - ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size); + ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size, respect_capitalization); } ImGui::PopStyleVar(); } + + ImGui::SameLine(); + ImGui::SetCursorPosX(36); + ImGui::ToggleButton("Aa", &respect_capitalization); + ImGui::SetItemTooltip("Match Case"); } ImGui::EndChild(); diff --git a/src/search.cpp b/src/search.cpp index 61f8d54..3897cc7 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -118,7 +118,7 @@ bool string_is_asteriks(char *text) return true; } -bool ts_string_contains(char *text_to_search, utf8_int8_t *text_to_find, ts_array *text_matches) +bool ts_string_contains(char *text_to_search, utf8_int8_t *text_to_find, ts_array *text_matches, bool respect_capitalization) { bool final_result = false; bool is_asteriks_only = false; @@ -151,7 +151,7 @@ bool ts_string_contains(char *text_to_search, utf8_int8_t *text_to_find, ts_arra int index = 0; while ((text_to_search = utf8codepoint(text_to_search, &text_to_search_ch)) && text_to_search_ch) { - text_to_search_ch = utf8lwrcodepoint(text_to_search_ch); + if (!respect_capitalization) text_to_search_ch = utf8lwrcodepoint(text_to_search_ch); word_offset_val += utf8codepointsize(text_to_search_ch); if (text_to_search_ch == '\n') { @@ -166,7 +166,7 @@ bool ts_string_contains(char *text_to_search, utf8_int8_t *text_to_find, ts_arra bool in_wildcard = false; text_to_find = utf8codepoint(text_to_find, &text_to_find_ch); - text_to_find_ch = utf8lwrcodepoint(text_to_find_ch); + if (!respect_capitalization) text_to_find_ch = utf8lwrcodepoint(text_to_find_ch); // text_to_search_current_attempt = utf8codepoint(text_to_search_current_attempt, //&text_to_search_current_attempt_ch); @@ -185,7 +185,7 @@ bool ts_string_contains(char *text_to_search, utf8_int8_t *text_to_find, ts_arra if (text_to_find_ch == '*') { text_to_find = utf8codepoint(text_to_find, &text_to_find_ch); - text_to_find_ch = utf8lwrcodepoint(text_to_find_ch); + if (!respect_capitalization) text_to_find_ch = utf8lwrcodepoint(text_to_find_ch); in_wildcard = true; } @@ -196,14 +196,14 @@ bool ts_string_contains(char *text_to_search, utf8_int8_t *text_to_find, ts_arra continue_search: if (!in_wildcard) { text_to_find = utf8codepoint(text_to_find, &text_to_find_ch); - text_to_find_ch = utf8lwrcodepoint(text_to_find_ch); + if (!respect_capitalization) text_to_find_ch = utf8lwrcodepoint(text_to_find_ch); } word_match_len_val += utf8codepointsize(text_to_search_current_attempt_ch); text_to_search_current_attempt = utf8codepoint( text_to_search_current_attempt, &text_to_search_current_attempt_ch); - text_to_search_current_attempt_ch = utf8lwrcodepoint(text_to_search_current_attempt_ch); + if (!respect_capitalization) text_to_search_current_attempt_ch = utf8lwrcodepoint(text_to_search_current_attempt_ch); if (!text_to_search_current_attempt_ch && !text_to_find_ch) goto done; @@ -248,7 +248,7 @@ static void _ts_search_file(ts_found_file *ref, ts_file_content content, ts_sear { ts_array text_matches = ts_array_create(sizeof(ts_text_match)); size_t search_len = strlen(result->search_text); - if (ts_string_contains((char *)content.content, result->search_text, &text_matches)) + if (ts_string_contains((char *)content.content, result->search_text, &text_matches, result->respect_capitalization)) { ts_mutex_lock(&result->matches.mutex); for (int i = 0; i < text_matches.length; i++) @@ -393,7 +393,7 @@ static void _ts_list_files(ts_search_result* result) ts_thread_detach(&thr); } -void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, int thread_count, int max_file_size) +void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, int thread_count, int max_file_size, bool respect_capitalization) { if (utf8len(query) > 0 && utf8len(query) <= 2) { // need a string of atleast 3 characters return; @@ -410,6 +410,7 @@ void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, new_result->filters = ts_get_filters(filter); new_result->max_ts_thread_count = thread_count; new_result->max_file_size = max_file_size; + new_result->respect_capitalization = respect_capitalization; if (utf8len(query) == 0) { new_result->search_text = nullptr; diff --git a/src/search.h b/src/search.h index b56e007..8bc6260 100644 --- a/src/search.h +++ b/src/search.h @@ -38,6 +38,7 @@ typedef struct t_ts_search_result utf8_int8_t *search_text; int max_ts_thread_count; uint64_t max_file_size; + bool respect_capitalization; } ts_search_result; typedef struct t_ts_file_match @@ -64,8 +65,8 @@ ts_array ts_get_filters(utf8_int8_t *pattern); size_t ts_filter_matches(ts_array *filters, utf8_int8_t *string, utf8_int8_t **matched_filter); int ts_string_match(utf8_int8_t *first, utf8_int8_t *second); ts_search_result* ts_create_empty_search_result(); -bool ts_string_contains(utf8_int8_t *text_to_search, utf8_int8_t *text_to_find, ts_array *text_matches); -void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, int thread_count, int max_file_size); +bool ts_string_contains(utf8_int8_t *text_to_search, utf8_int8_t *text_to_find, ts_array *text_matches, bool respect_capitalization); +void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, int thread_count, int max_file_size, bool respect_capitalization); void ts_destroy_result(ts_search_result* result); #endif
\ No newline at end of file diff --git a/src/widgets/imgui_toggle.cpp b/src/widgets/imgui_toggle.cpp new file mode 100644 index 0000000..f1c50da --- /dev/null +++ b/src/widgets/imgui_toggle.cpp @@ -0,0 +1,31 @@ +#include "imgui.h" +#include "imgui_toggle.h" + +namespace ImGui { + void ToggleButton(const char* label, bool* v) { + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f); + if (*v) { + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor(204, 233, 252)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor(204, 233, 252)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor(204, 233, 252)); + ImGui::PushStyleColor(ImGuiCol_Border, (ImVec4)ImColor(0, 122, 204)); + ImGui::PushStyleColor(ImGuiCol_Text, (ImVec4)ImColor(64, 73, 79)); + + if (ImGui::Button(label)) { + *v = !(*v); + } + + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + ImGui::PopStyleColor(); + } + else { + if (ImGui::Button(label)) { + *v = !(*v); + } + } + ImGui::PopStyleVar(); + } +}
\ No newline at end of file diff --git a/src/widgets/imgui_toggle.h b/src/widgets/imgui_toggle.h new file mode 100644 index 0000000..3a514a9 --- /dev/null +++ b/src/widgets/imgui_toggle.h @@ -0,0 +1,5 @@ +#pragma once + +namespace ImGui { + void ToggleButton(const char* label, bool* v); +}
\ No newline at end of file |
