summaryrefslogtreecommitdiff
path: root/src/windows/guildsettings/memberspane.hpp
blob: 72039e8be35f5130687cb67b6e57b74f9c538b3c (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
133
134
135
136
137
138
139
140
141
142
143
144
#pragma once

#include <unordered_set>

#include <gtkmm/box.h>
#include <gtkmm/checkbutton.h>
#include <gtkmm/entry.h>
#include <gtkmm/eventbox.h>
#include <gtkmm/label.h>
#include <gtkmm/listbox.h>
#include <gtkmm/scrolledwindow.h>

#include "discord/member.hpp"
#include "discord/guild.hpp"
#include "components/lazyimage.hpp"

class GuildSettingsMembersPaneRolesItem : public Gtk::ListBoxRow {
public:
    GuildSettingsMembersPaneRolesItem(bool sensitive, const RoleData &role);
    void SetChecked(bool checked);
    void SetToggleable(bool toggleable);
    void UpdateRoleData(const RoleData &role);

    Snowflake RoleID;
    int Position;

private:
    void UpdateLabel();
    void ComputeSensitivity();
    bool m_desired_sensitivity = true;

    RoleData m_role;

    Gtk::Box m_main;
    Gtk::CheckButton m_check;
    Gtk::Label m_label;

    // own thing so we can stop it from actually changing
    typedef sigc::signal<void, Snowflake, bool> type_signal_role_click;

    type_signal_role_click m_signal_role_click;

public:
    type_signal_role_click signal_role_click();
};

class GuildSettingsMembersPaneRoles : public Gtk::ScrolledWindow {
public:
    GuildSettingsMembersPaneRoles(Snowflake guild_id);

    void SetRoles(Snowflake user_id, const std::vector<Snowflake> &roles, bool is_owner);

private:
    void CreateRow(bool has_manage_roles, const RoleData &role, bool is_owner);

    void OnRoleToggle(Snowflake role_id, bool new_set);

    void OnRoleCreate(Snowflake guild_id, Snowflake role_id);
    void OnRoleUpdate(Snowflake guild_id, Snowflake role_id);
    void OnRoleDelete(Snowflake guild_id, Snowflake role_id);

    int m_hoisted_position = 0;

    std::vector<sigc::connection> m_update_connection;

    std::unordered_set<Snowflake> m_set_role_ids;

    Snowflake GuildID;
    Snowflake UserID;

    Gtk::ListBox m_list;

    std::unordered_map<Snowflake, GuildSettingsMembersPaneRolesItem *> m_rows;
};

class GuildSettingsMembersPaneInfo : public Gtk::ScrolledWindow {
public:
    GuildSettingsMembersPaneInfo(Snowflake guild_id);

    void SetUser(Snowflake user_id);

private:
    Snowflake GuildID;
    Snowflake UserID;

    Gtk::Label m_bot;
    Gtk::Label m_id;
    Gtk::Label m_created;
    Gtk::Label m_joined;
    Gtk::Label m_nickname;
    Gtk::Label m_boosting;
    GuildSettingsMembersPaneRoles m_roles;
    Gtk::Box m_box;
};

class GuildSettingsMembersPaneMembers : public Gtk::Box {
public:
    GuildSettingsMembersPaneMembers(Snowflake id);

private:
    Snowflake GuildID;

    Gtk::Entry m_search;
    Gtk::ScrolledWindow m_list_scroll;
    Gtk::ListBox m_list;

    typedef sigc::signal<void, Snowflake> type_signal_member_select;
    type_signal_member_select m_signal_member_select;

public:
    type_signal_member_select signal_member_select();
};

class GuildSettingsMembersListItem : public Gtk::ListBoxRow {
public:
    GuildSettingsMembersListItem(const GuildData &guild, const GuildMember &member);

    Glib::ustring DisplayTerm;

    Snowflake UserID;
    Snowflake GuildID;

private:
    void UpdateColor();

    Gtk::EventBox m_ev;
    LazyImage m_avatar;
    Gtk::Label m_name;
    Gtk::Box m_main;
    Gtk::Image *m_crown = nullptr;
};

class GuildSettingsMembersPane : public Gtk::Box {
public:
    GuildSettingsMembersPane(Snowflake id);

private:
    Snowflake GuildID;

    Gtk::Box m_layout;
    Gtk::Label m_note;
    GuildSettingsMembersPaneMembers m_member_list;
    GuildSettingsMembersPaneInfo m_member_info;
};