summaryrefslogtreecommitdiff
path: root/components/channels.hpp
blob: f898df7dc1e1bd70ea75171549011d20622501e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#pragma once
#include <gtkmm.h>
#include <string>
#include <queue>
#include <mutex>
#include <unordered_set>
#include <sigc++/sigc++.h>
#include "../discord/discord.hpp"

class ChannelListRow : public Gtk::ListBoxRow {
public:
    bool IsUserCollapsed;
    bool IsHidden;
    Snowflake ID;
    std::unordered_set<ChannelListRow *> Children;

    typedef sigc::signal<void> type_signal_list_collapse;
    typedef sigc::signal<void> type_signal_list_uncollapse;

    type_signal_list_collapse signal_list_collapse();
    type_signal_list_uncollapse signal_list_uncollapse();

protected:
    type_signal_list_collapse m_signal_list_collapse;
    type_signal_list_uncollapse m_signal_list_uncollapse;
};

class ChannelListRowDMHeader : public ChannelListRow {
public:
    ChannelListRowDMHeader();

protected:
    Gtk::EventBox *m_ev;
    Gtk::Box *m_box;
    Gtk::Label *m_lbl;
};

class ChannelListRowDMChannel : public ChannelListRow {
public:
    ChannelListRowDMChannel(const Channel *data);

protected:
    Gtk::EventBox *m_ev;
    Gtk::Box *m_box;
    Gtk::Label *m_lbl;
};

class ChannelListRowGuild : public ChannelListRow {
public:
    ChannelListRowGuild(const Guild *data);

    int GuildIndex;

protected:
    Gtk::EventBox *m_ev;
    Gtk::Box *m_box;
    Gtk::Label *m_lbl;
    Gtk::Image *m_icon;
};

class ChannelListRowCategory : public ChannelListRow {
public:
    ChannelListRowCategory(const Channel *data);

protected:
    Gtk::EventBox *m_ev;
    Gtk::Box *m_box;
    Gtk::Label *m_lbl;
    Gtk::Arrow *m_arrow;
};

class ChannelListRowChannel : public ChannelListRow {
public:
    ChannelListRowChannel(const Channel *data);

protected:
    Gtk::EventBox *m_ev;
    Gtk::Box *m_box;
    Gtk::Label *m_lbl;
};

class ChannelList {
public:
    ChannelList();
    Gtk::Widget *GetRoot() const;
    void UpdateListing();
    void Clear();

protected:
    Gtk::ListBox *m_list;
    Gtk::ScrolledWindow *m_main;

    void on_row_activated(Gtk::ListBoxRow *row);

    int m_guild_count;
    Gtk::Menu m_guild_menu;
    Gtk::MenuItem *m_guild_menu_up;
    Gtk::MenuItem *m_guild_menu_down;
    Gtk::MenuItem *m_guild_menu_copyid;
    void on_menu_move_up();
    void on_menu_move_down();
    void on_menu_copyid();

    Glib::Dispatcher m_update_dispatcher;
    //mutable std::mutex m_update_mutex;
    //std::queue<std::unordered_set<Snowflake>> m_update_queue;
    void AddPrivateChannels(); // retard moment
    void UpdateListingInternal();
    void AttachMenuHandler(Gtk::ListBoxRow *row);

public:
    typedef sigc::signal<void, Snowflake> type_signal_action_channel_item_select;
    typedef sigc::signal<void, Snowflake> type_signal_action_guild_move_up;
    typedef sigc::signal<void, Snowflake> type_signal_action_guild_move_down;
    typedef sigc::signal<void, Snowflake> type_signal_action_guild_copy_id;

    type_signal_action_channel_item_select signal_action_channel_item_select();
    type_signal_action_guild_move_up signal_action_guild_move_up();
    type_signal_action_guild_move_down signal_action_guild_move_down();
    type_signal_action_guild_copy_id signal_action_guild_copy_id();

protected:
    type_signal_action_channel_item_select m_signal_action_channel_item_select;
    type_signal_action_guild_move_up m_signal_action_guild_move_up;
    type_signal_action_guild_move_down m_signal_action_guild_move_down;
    type_signal_action_guild_copy_id m_signal_action_guild_copy_id;
};