diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-12-20 22:10:45 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2020-12-20 22:10:45 -0500 |
commit | 31bef80530edbf622a6678947dc832bc179b52fb (patch) | |
tree | 549a148c0530f3f598932f11e3655199e4bfdb7b /components/completer.hpp | |
parent | c02cfb9dd8a32da233f9dcbfd9616d03034d12af (diff) | |
download | abaddon-portaudio-31bef80530edbf622a6678947dc832bc179b52fb.tar.gz abaddon-portaudio-31bef80530edbf622a6678947dc832bc179b52fb.zip |
add mention/emoji/channel completion
Diffstat (limited to 'components/completer.hpp')
-rw-r--r-- | components/completer.hpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/components/completer.hpp b/components/completer.hpp new file mode 100644 index 0000000..259fcdc --- /dev/null +++ b/components/completer.hpp @@ -0,0 +1,61 @@ +#pragma once +#include <gtkmm.h> +#include <functional> +#include "../discord/snowflake.hpp" + +class CompleterEntry : public Gtk::ListBoxRow { +public: + CompleterEntry(const Glib::ustring &completion, int index); + void SetTextColor(int color); // SetText will reset + void SetText(const Glib::ustring &text); + void SetImage(const Glib::RefPtr<Gdk::Pixbuf> &pb); + + int GetIndex() const; + Glib::ustring GetCompletion() const; + +private: + Glib::ustring m_completion; + int m_index; + Gtk::Box m_box; + Gtk::Label *m_text = nullptr; + Gtk::Image *m_img = nullptr; +}; + +class Completer : public Gtk::Revealer { +public: + Completer(); + Completer(const Glib::RefPtr<Gtk::TextBuffer> &buf); + + void SetBuffer(const Glib::RefPtr<Gtk::TextBuffer> &buf); + bool ProcessKeyPress(GdkEventKey *e); + + using get_recent_authors_cb = std::function<std::vector<Snowflake>()>; + void SetGetRecentAuthors(get_recent_authors_cb cb); // maybe a better way idk + using get_channel_id_cb = std::function<Snowflake()>; + void SetGetChannelID(get_channel_id_cb cb); + + bool IsShown() const; + +private: + CompleterEntry *CreateEntry(const Glib::ustring &completion); + void CompleteMentions(const Glib::ustring &term); + void CompleteEmojis(const Glib::ustring &term); + void CompleteChannels(const Glib::ustring &term); + void DoCompletion(Gtk::ListBoxRow *row); + + std::vector<CompleterEntry *> m_entries; + + void OnRowActivate(Gtk::ListBoxRow *row); + void OnTextBufferChanged(); + Glib::ustring GetTerm(); + + Gtk::TextBuffer::iterator m_start; + Gtk::TextBuffer::iterator m_end; + + Gtk::ScrolledWindow m_scroll; + Gtk::ListBox m_list; + Glib::RefPtr<Gtk::TextBuffer> m_buf; + + get_recent_authors_cb m_recent_authors_cb; + get_channel_id_cb m_channel_id_cb; +}; |