summaryrefslogtreecommitdiff
path: root/src/components/channellist/channellist.cpp
blob: f4095920ef32fddfb30329b83703addb8e536bbb (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
#include "channellist.hpp"

#include "abaddon.hpp"

ChannelList::ChannelList() {
    get_style_context()->add_class("channel-browser-pane");

    ConnectSignals();

    m_guilds.set_halign(Gtk::ALIGN_START);

    m_guilds_scroll.get_style_context()->add_class("guild-list-scroll");
    m_guilds_scroll.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);

    m_guilds.signal_guild_selected().connect([this](Snowflake guild_id) {
        m_tree.SetSelectedGuild(guild_id);
    });

    m_guilds.signal_dms_selected().connect([this]() {
        m_tree.SetSelectedDMs();
    });

    m_guilds.show();
    m_tree.show();
    m_guilds_scroll.add(m_guilds);
    pack_start(m_guilds_scroll, false, false); // only take the space it needs
    pack_start(m_tree, true, true);            // use all the remaining space
}

void ChannelList::UpdateListing() {
    m_tree.UpdateListing();
    if (m_is_classic) m_guilds.UpdateListing();
}

void ChannelList::SetActiveChannel(Snowflake id, bool expand_to) {
    if (Abaddon::Get().GetSettings().ClassicChangeGuildOnOpen) {
        if (const auto channel = Abaddon::Get().GetDiscordClient().GetChannel(id); channel.has_value() && channel->GuildID.has_value()) {
            m_tree.SetSelectedGuild(*channel->GuildID);
        } else {
            m_tree.SetSelectedDMs();
        }
    }

    m_tree.SetActiveChannel(id, expand_to);
}

void ChannelList::UseExpansionState(const ExpansionStateRoot &state) {
    m_tree.UseExpansionState(state);
}

ExpansionStateRoot ChannelList::GetExpansionState() const {
    return m_tree.GetExpansionState();
}

void ChannelList::UsePanedHack(Gtk::Paned &paned) {
    m_tree.UsePanedHack(paned);
}

void ChannelList::SetClassic(bool value) {
    m_is_classic = value;
    m_tree.SetClassic(value);
    m_guilds_scroll.set_visible(value);
}

void ChannelList::ConnectSignals() {
    // TODO: if these all just travel upwards to the singleton then get rid of them but mayeb they dont

#ifdef WITH_LIBHANDY
    m_tree.signal_action_open_new_tab().connect([this](Snowflake id) {
        m_signal_action_open_new_tab.emit(id);
    });
#endif

#ifdef WITH_VOICE
    m_tree.signal_action_join_voice_channel().connect([this](Snowflake id) {
        m_signal_action_join_voice_channel.emit(id);
    });

    m_tree.signal_action_disconnect_voice().connect([this]() {
        m_signal_action_disconnect_voice.emit();
    });
#endif

    m_tree.signal_action_channel_item_select().connect([this](Snowflake id) {
        m_signal_action_channel_item_select.emit(id);
    });

    m_tree.signal_action_guild_leave().connect([this](Snowflake id) {
        m_signal_action_guild_leave.emit(id);
    });

    m_tree.signal_action_guild_settings().connect([this](Snowflake id) {
        m_signal_action_guild_settings.emit(id);
    });

    m_guilds.signal_action_guild_leave().connect([this](Snowflake id) {
        m_signal_action_guild_leave.emit(id);
    });

    m_guilds.signal_action_guild_settings().connect([this](Snowflake id) {
        m_signal_action_guild_settings.emit(id);
    });
}

#ifdef WITH_LIBHANDY
ChannelList::type_signal_action_open_new_tab ChannelList::signal_action_open_new_tab() {
    return m_signal_action_open_new_tab;
}
#endif

#ifdef WITH_VOICE
ChannelList::type_signal_action_join_voice_channel ChannelList::signal_action_join_voice_channel() {
    return m_signal_action_join_voice_channel;
}

ChannelList::type_signal_action_disconnect_voice ChannelList::signal_action_disconnect_voice() {
    return m_signal_action_disconnect_voice;
}
#endif

ChannelList::type_signal_action_channel_item_select ChannelList::signal_action_channel_item_select() {
    return m_signal_action_channel_item_select;
}

ChannelList::type_signal_action_guild_leave ChannelList::signal_action_guild_leave() {
    return m_signal_action_guild_leave;
}

ChannelList::type_signal_action_guild_settings ChannelList::signal_action_guild_settings() {
    return m_signal_action_guild_settings;
}