forked from OpenGamers/abaddon
94 lines
3.2 KiB
C++
94 lines
3.2 KiB
C++
#include "friendpicker.hpp"
|
|
#include "../abaddon.hpp"
|
|
|
|
FriendPickerDialog::FriendPickerDialog(Gtk::Window &parent)
|
|
: Gtk::Dialog("Pick a friend", parent, true)
|
|
, m_bbox(Gtk::ORIENTATION_HORIZONTAL) {
|
|
set_default_size(300, 300);
|
|
get_style_context()->add_class("app-window");
|
|
get_style_context()->add_class("app-popup");
|
|
|
|
m_ok_button = add_button("OK", Gtk::RESPONSE_OK);
|
|
m_cancel_button = add_button("Cancel", Gtk::RESPONSE_CANCEL);
|
|
|
|
m_ok_button->set_sensitive(false);
|
|
|
|
auto &discord = Abaddon::Get().GetDiscordClient();
|
|
auto relationships = discord.GetRelationships(RelationshipType::Friend);
|
|
for (auto id : relationships) {
|
|
auto *item = Gtk::manage(new FriendPickerDialogItem(id));
|
|
item->show();
|
|
m_list.add(*item);
|
|
}
|
|
|
|
m_list.signal_row_activated().connect(sigc::mem_fun(*this, &FriendPickerDialog::OnRowActivated));
|
|
m_list.signal_selected_rows_changed().connect(sigc::mem_fun(*this, &FriendPickerDialog::OnSelectionChange));
|
|
m_list.set_activate_on_single_click(false);
|
|
m_list.set_selection_mode(Gtk::SELECTION_SINGLE);
|
|
|
|
m_main.set_propagate_natural_height(true);
|
|
|
|
m_main.add(m_list);
|
|
|
|
get_content_area()->add(m_main);
|
|
|
|
show_all_children();
|
|
}
|
|
|
|
Snowflake FriendPickerDialog::GetUserID() const {
|
|
return m_chosen_id;
|
|
}
|
|
|
|
void FriendPickerDialog::OnRowActivated(Gtk::ListBoxRow *row) {
|
|
auto *x = dynamic_cast<FriendPickerDialogItem *>(row);
|
|
if (x != nullptr) {
|
|
m_chosen_id = x->ID;
|
|
response(Gtk::RESPONSE_OK);
|
|
}
|
|
}
|
|
|
|
void FriendPickerDialog::OnSelectionChange() {
|
|
auto selection = m_list.get_selected_row();
|
|
m_ok_button->set_sensitive(false);
|
|
if (selection != nullptr) {
|
|
auto *row = dynamic_cast<FriendPickerDialogItem *>(selection);
|
|
if (!row) return;
|
|
m_chosen_id = row->ID;
|
|
m_ok_button->set_sensitive(true);
|
|
}
|
|
}
|
|
|
|
FriendPickerDialogItem::FriendPickerDialogItem(Snowflake user_id)
|
|
: ID(user_id)
|
|
, m_layout(Gtk::ORIENTATION_HORIZONTAL) {
|
|
auto user = *Abaddon::Get().GetDiscordClient().GetUser(user_id);
|
|
|
|
m_name.set_markup(user.GetEscapedBoldString<false>());
|
|
m_name.set_single_line_mode(true);
|
|
|
|
m_avatar.property_pixbuf() = Abaddon::Get().GetImageManager().GetPlaceholder(32);
|
|
if (user.HasAnimatedAvatar() && Abaddon::Get().GetSettings().GetShowAnimations()) {
|
|
auto cb = [this](const Glib::RefPtr<Gdk::PixbufAnimation> &pb) {
|
|
m_avatar.property_pixbuf_animation() = pb;
|
|
};
|
|
Abaddon::Get().GetImageManager().LoadAnimationFromURL(user.GetAvatarURL("gif", "32"), 32, 32, sigc::track_obj(cb, *this));
|
|
} else {
|
|
auto cb = [this](const Glib::RefPtr<Gdk::Pixbuf> &pb) {
|
|
m_avatar.property_pixbuf() = pb->scale_simple(32, 32, Gdk::INTERP_BILINEAR);
|
|
};
|
|
Abaddon::Get().GetImageManager().LoadFromURL(user.GetAvatarURL("png", "32"), sigc::track_obj(cb, *this));
|
|
}
|
|
|
|
m_avatar.set_margin_end(5);
|
|
m_avatar.set_halign(Gtk::ALIGN_START);
|
|
m_avatar.set_valign(Gtk::ALIGN_CENTER);
|
|
m_name.set_halign(Gtk::ALIGN_START);
|
|
m_name.set_valign(Gtk::ALIGN_CENTER);
|
|
|
|
m_layout.add(m_avatar);
|
|
m_layout.add(m_name);
|
|
add(m_layout);
|
|
|
|
show_all_children();
|
|
}
|