summaryrefslogtreecommitdiff
path: root/components/channels.hpp
blob: 9cd8c326bf4930e29f49a30dc38d6725171f0b22 (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
128
129
130
131
132
#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;
    Gtk::MenuItem *m_guild_menu_leave;
    void on_menu_move_up();
    void on_menu_move_down();
    void on_menu_copyid();
    void on_menu_leave();

    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;
    typedef sigc::signal<void, Snowflake> type_signal_action_guild_leave;

    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();
    type_signal_action_guild_leave signal_action_guild_leave();

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;
    type_signal_action_guild_leave m_signal_action_guild_leave;
};