#pragma once #include #include #include #include #include #include namespace QuickMedia { using TextUpdateCallback = std::function; // Return true to consume the search (clear the search field) using TextSubmitCallback = std::function; using TextBeginTypingCallback = std::function; using AutocompleteRequestCallback = std::function; class SearchBar { public: SearchBar(sf::Font &font, sf::Texture &plugin_logo, const std::string &placeholder); void draw(sf::RenderWindow &window, bool draw_shadow = true); void on_event(sf::Event &event); void update(); void onWindowResize(const sf::Vector2f &window_size); void onTextEntered(sf::Uint32 codepoint); void clear(); void append_text(const std::string &text_to_add); bool is_cursor_at_start_of_line() const; void set_to_autocomplete(); void set_autocomplete_text(const std::string &text); float getBottom() const; float getBottomWithoutShadow() const; TextUpdateCallback onTextUpdateCallback; TextSubmitCallback onTextSubmitCallback; TextBeginTypingCallback onTextBeginTypingCallback; AutocompleteRequestCallback onAutocompleteRequestCallback; int text_autosearch_delay; int autocomplete_search_delay; private: void clear_autocomplete_if_text_not_substring(); void clear_autocomplete_if_last_char_not_substr(); private: sf::Text text; sf::Text autocomplete_text; sf::RectangleShape background; sf::RectangleShape background_shadow; sf::RectangleShape shade; sf::RectangleShape caret; sf::Sprite plugin_logo_sprite; std::string placeholder_str; bool show_placeholder; bool updated_search; bool updated_autocomplete; bool draw_logo; bool needs_update; sf::Clock time_since_search_update; }; }