From 52e95355e2307a7ac4c064ab4458c480d15ba9cf Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Sun, 2 Apr 2023 18:30:03 -0500 Subject: [PATCH] Clean up RemoveKeys and add a remove list to the key overlay --- RGBController/KeyboardLayoutManager.cpp | 61 ++++++++++++++++++++++--- RGBController/KeyboardLayoutManager.h | 2 + 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/RGBController/KeyboardLayoutManager.cpp b/RGBController/KeyboardLayoutManager.cpp index 43347e43..3deebbae 100644 --- a/RGBController/KeyboardLayoutManager.cpp +++ b/RGBController/KeyboardLayoutManager.cpp @@ -416,6 +416,7 @@ void KeyboardLayoutManager::ChangeKeys(keyboard_keymap_overlay new_layout) { InsertKeys(new_layout.insert); SwapKeys(new_layout.swap); + RemoveKeys(new_layout.remove); UpdateDimensions(); } @@ -423,6 +424,7 @@ void KeyboardLayoutManager::ChangeKeys(keyboard_keymap_overlay_values new_layout { InsertKeys(new_layout.insert); SwapKeys(new_layout.swap); + RemoveKeys(new_layout.remove); UpdateDimensions(); } @@ -605,18 +607,63 @@ void KeyboardLayoutManager::SwapKeys(std::vector swp_keys) void KeyboardLayoutManager::RemoveKeys(std::vector rmv_keys) { - for(size_t i = 0; i < rmv_keys.size(); i++) + /*---------------------------------------------------------------------*\ + | Remove keys one by one | + \*---------------------------------------------------------------------*/ + for(unsigned int rmv_key_idx = 0; rmv_key_idx < rmv_keys.size(); rmv_key_idx++) { - for(std::vector::iterator key = keymap.begin(); key != keymap.end(); ++key) + /*---------------------------------------------------------------------*\ + | Get the remove point | + \*---------------------------------------------------------------------*/ + unsigned int rmv_row = rmv_keys[rmv_key_idx].row; + unsigned int rmv_col = rmv_keys[rmv_key_idx].col; + const char* rmv_name = rmv_keys[rmv_key_idx].name; + unsigned int rmv_value = rmv_keys[rmv_key_idx].value; + + /*---------------------------------------------------------------------*\ + | Loop through and find the entry to remove | + \*---------------------------------------------------------------------*/ + for(unsigned int key_idx = 0; key_idx < keymap.size(); key_idx++) { - if(key->row == rmv_keys[i].row && key->col == rmv_keys[i].col) + /*---------------------------------------------------------------------*\ + | If the row and column are identical, we've found the swap location | + \*---------------------------------------------------------------------*/ + if((rmv_row == keymap[key_idx].row) && (rmv_col == keymap[key_idx].col)) { - LOG_DEBUG("[%s] Removing %s @ %02d, %02d and shifting keys left", KLM_CLASS_NAME, key->name, key->row, key->col); - for(std::vector::iterator shift = key + 1; shift != keymap.end() && shift->row == key->row; ++shift) + LOG_DEBUG("[%s] Removing %s @ %02d, %02d and shifting keys left", KLM_CLASS_NAME, keymap[key_idx].name, rmv_row, rmv_col); + keymap.erase(keymap.begin() + key_idx); + + for(key_idx; key_idx < keymap.size(); key_idx++) { - shift->col--; + if(rmv_row == keymap[key_idx].row) + { + keymap[key_idx].col--; + } + else + { + break; + } } - keymap.erase(key); + + break; + } + + if((rmv_row == keymap[key_idx].row) && (rmv_col < keymap[key_idx].col)) + { + LOG_DEBUG("[%s] Removing unused key @ %02d, %02d and shifting keys left", KLM_CLASS_NAME, rmv_row, rmv_col); + + for(key_idx; key_idx < keymap.size(); key_idx++) + { + if(rmv_row == keymap[key_idx].row) + { + keymap[key_idx].col--; + } + else + { + break; + } + } + break; } } diff --git a/RGBController/KeyboardLayoutManager.h b/RGBController/KeyboardLayoutManager.h index a067ada6..e4c406e8 100644 --- a/RGBController/KeyboardLayoutManager.h +++ b/RGBController/KeyboardLayoutManager.h @@ -74,6 +74,7 @@ typedef struct KEYBOARD_SIZE base_size; key_set insert; key_set swap; + key_set remove; } keyboard_keymap_overlay; typedef struct @@ -82,6 +83,7 @@ typedef struct layout_values key_values; key_set insert; key_set swap; + key_set remove; } keyboard_keymap_overlay_values; static const std::vector empty_basemap =