From 80cfdf97b1f2714ca138e86813da553cf80417ee Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 25 Oct 2019 20:14:44 +0200 Subject: [PATCH] Improved entry history that is for instance used in the search dialog. Can now go to previous text history, and back to last written text --- src/entrybox.cc | 31 ++++++++++++++++++++++++------- src/entrybox.h | 4 +++- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/entrybox.cc b/src/entrybox.cc index abe6800..8c558d0 100644 --- a/src/entrybox.cc +++ b/src/entrybox.cc @@ -6,34 +6,51 @@ EntryBox::Entry::Entry(const std::string &content, std::functionon_activate) { auto &history = EntryBox::entry_histories[get_placeholder_text()]; auto text = get_text(); - if(history.size() == 0 || (history.size() > 0 && *history.begin() != text)) + if(!text.empty() && (history.empty() || *history.begin() != text)) history.emplace(history.begin(), text); - selected_history = 0; + selected_history = -1; this->on_activate(text); } }); + signal_changed().connect([this] { + if(!set_text_from_history) { + last_content = get_text(); + selected_history = -1; + } + }); signal_key_press_event().connect([this](GdkEventKey *key) { if(key->keyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up) { auto &history = entry_histories[get_placeholder_text()]; if(history.size() > 0) { selected_history++; - if(selected_history >= history.size()) + if(selected_history == 0 && get_text() == history[selected_history]) + selected_history++; + if(selected_history >= static_cast(history.size())) selected_history = history.size() - 1; + set_text_from_history = true; set_text(history[selected_history]); + set_text_from_history = false; set_position(-1); } } if(key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_KP_Down) { auto &history = entry_histories[get_placeholder_text()]; if(history.size() > 0) { - if(selected_history != 0) - selected_history--; - set_text(history[selected_history]); + selected_history--; + if(selected_history < -1) + selected_history = -1; + set_text_from_history = true; + if(selected_history == -1) + set_text(last_content); + else + set_text(history[selected_history]); + set_text_from_history = false; set_position(-1); } } diff --git a/src/entrybox.h b/src/entrybox.h index ab41449..2c5f339 100644 --- a/src/entrybox.h +++ b/src/entrybox.h @@ -14,7 +14,9 @@ public: std::function on_activate; private: - size_t selected_history; + long selected_history; + std::string last_content; + bool set_text_from_history = false; }; class Button : public Gtk::Button { public: