diff options
author | Dylam De La Torre <DyXel04@gmail.com> | 2021-11-23 05:21:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-23 04:21:56 +0000 |
commit | a51a54bc5979a2491f152abc47ad54e6b63f27c8 (patch) | |
tree | ce67092b2f6df366033a65a6111e4650866766b2 /src/components/completer.hpp | |
parent | d88079000a79e6bcbe51c5a2868d57b303b5fcb6 (diff) | |
download | abaddon-portaudio-a51a54bc5979a2491f152abc47ad54e6b63f27c8.tar.gz abaddon-portaudio-a51a54bc5979a2491f152abc47ad54e6b63f27c8.zip |
Restructure source and resource files (#46)
importantly, res is now res/res and css is now res/css
Diffstat (limited to 'src/components/completer.hpp')
-rw-r--r-- | src/components/completer.hpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/components/completer.hpp b/src/components/completer.hpp new file mode 100644 index 0000000..6bd8be9 --- /dev/null +++ b/src/components/completer.hpp @@ -0,0 +1,68 @@ +#pragma once +#include <gtkmm.h> +#include <functional> +#include "lazyimage.hpp" +#include "discord/snowflake.hpp" + +constexpr static int CompleterImageSize = 24; + +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); + void SetImage(const std::string &url); + void SetAnimation(const std::string &url); + + int GetIndex() const; + Glib::ustring GetCompletion() const; + +private: + void CheckImage(); + + Glib::ustring m_completion; + int m_index; + Gtk::Box m_box; + Gtk::Label *m_text = nullptr; + LazyImage *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; +}; |