diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-04-06 21:07:45 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-04-06 21:07:45 -0400 |
commit | 57e95c8969394915c1796f48108443b0a8b7c28b (patch) | |
tree | c35b29142dd60b344b21109d1cb801dd1c11dbd8 /src/windows/guildsettings | |
parent | 56a74fb5dd8d42b96c00e3a8602221fabe5eadfe (diff) | |
download | abaddon-portaudio-57e95c8969394915c1796f48108443b0a8b7c28b.tar.gz abaddon-portaudio-57e95c8969394915c1796f48108443b0a8b7c28b.zip |
replace file chooser with native
also remove clipboard since it was just a workaround and i dont want to maintain it
Diffstat (limited to 'src/windows/guildsettings')
-rw-r--r-- | src/windows/guildsettings/infopane.cpp | 69 | ||||
-rw-r--r-- | src/windows/guildsettings/infopane.hpp | 2 |
2 files changed, 14 insertions, 57 deletions
diff --git a/src/windows/guildsettings/infopane.cpp b/src/windows/guildsettings/infopane.cpp index bccfbf8..578aaac 100644 --- a/src/windows/guildsettings/infopane.cpp +++ b/src/windows/guildsettings/infopane.cpp @@ -3,8 +3,7 @@ #include <filesystem> GuildSettingsInfoPane::GuildSettingsInfoPane(Snowflake id) - : m_guild_icon_label("Guild icon") - , m_guild_name_label("Guild name") + : m_guild_name_label("Guild name") , GuildID(id) { auto &discord = Abaddon::Get().GetDiscordClient(); const auto guild = *discord.GetGuild(id); @@ -45,11 +44,8 @@ GuildSettingsInfoPane::GuildSettingsInfoPane(Snowflake id) m_guild_icon_ev.set_tooltip_text("Click to choose a file, right click to paste"); m_guild_icon_ev.signal_button_press_event().connect([this](GdkEventButton *event) -> bool { - if (event->type == GDK_BUTTON_PRESS) { - if (event->button == GDK_BUTTON_PRIMARY) - UpdateGuildIconPicker(); - else if (event->button == GDK_BUTTON_SECONDARY) - UpdateGuildIconClipboard(); + if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_PRIMARY) { + UpdateGuildIconPicker(); } return false; @@ -140,14 +136,12 @@ void GuildSettingsInfoPane::UpdateGuildIconFromPixbuf(Glib::RefPtr<Gdk::Pixbuf> } void GuildSettingsInfoPane::UpdateGuildIconPicker() { - // this picker fucking sucks - Gtk::FileChooserDialog dlg("Choose new guild icon", Gtk::FILE_CHOOSER_ACTION_OPEN); - dlg.get_style_context()->remove_provider(Abaddon::Get().GetStyleProvider()); - dlg.set_modal(true); - dlg.signal_response().connect([this, &dlg](int response) { - if (response == Gtk::RESPONSE_OK) { - auto data = ReadWholeFile(dlg.get_filename()); - if (GetExtension(dlg.get_filename()) == ".gif") + auto dlg = Gtk::FileChooserNative::create("Choose new guild icon", Gtk::FILE_CHOOSER_ACTION_OPEN); + dlg->set_modal(true); + dlg->signal_response().connect([this, dlg](int response) { + if (response == Gtk::RESPONSE_ACCEPT) { + auto data = ReadWholeFile(dlg->get_filename()); + if (GetExtension(dlg->get_filename()) == ".gif") UpdateGuildIconFromData(data, "image/gif"); else try { @@ -160,15 +154,12 @@ void GuildSettingsInfoPane::UpdateGuildIconPicker() { loader->write(data.data(), data.size()); loader->close(); UpdateGuildIconFromPixbuf(loader->get_pixbuf()); - } catch (const std::exception &) {} + } catch (...) {} } }); - dlg.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); - dlg.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); - auto filter_images = Gtk::FileFilter::create(); - if (Abaddon::Get().GetDiscordClient().GetGuild(GuildID)->HasFeature("ANIMATED_ICON")) { + if (const auto guild = Abaddon::Get().GetDiscordClient().GetGuild(GuildID); guild.has_value() && guild->HasFeature("ANIMATED_ICON")) { filter_images->set_name("Supported images (*.jpg, *.jpeg, *.png, *.gif)"); filter_images->add_pattern("*.gif"); } else { @@ -177,44 +168,12 @@ void GuildSettingsInfoPane::UpdateGuildIconPicker() { filter_images->add_pattern("*.jpg"); filter_images->add_pattern("*.jpeg"); filter_images->add_pattern("*.png"); - dlg.add_filter(filter_images); + dlg->add_filter(filter_images); auto filter_all = Gtk::FileFilter::create(); filter_all->set_name("All files (*.*)"); filter_all->add_pattern("*.*"); - dlg.add_filter(filter_all); - - dlg.run(); -} + dlg->add_filter(filter_all); -void GuildSettingsInfoPane::UpdateGuildIconClipboard() { - std::vector<uint8_t> icon_data; - - auto cb = Gtk::Clipboard::get(); - // query for file path then for actual image - if (cb->wait_is_text_available()) { - auto path = cb->wait_for_text(); - if (!std::filesystem::exists(path.c_str())) return; - auto data = ReadWholeFile(path); - try { - auto loader = Gdk::PixbufLoader::create(); - loader->signal_size_prepared().connect([&loader](int inw, int inh) { - int w, h; - GetImageDimensions(inw, inh, w, h, 1024, 1024); - loader->set_size(w, h); - }); - loader->write(data.data(), data.size()); - loader->close(); - auto pb = loader->get_pixbuf(); - UpdateGuildIconFromPixbuf(pb); - - return; - } catch (const std::exception &) {} - } - - if (cb->wait_is_image_available()) { - auto pb = cb->wait_for_image(); - UpdateGuildIconFromPixbuf(pb); - return; - } + dlg->run(); } diff --git a/src/windows/guildsettings/infopane.hpp b/src/windows/guildsettings/infopane.hpp index 8a7e6a2..d779b99 100644 --- a/src/windows/guildsettings/infopane.hpp +++ b/src/windows/guildsettings/infopane.hpp @@ -13,9 +13,7 @@ private: void UpdateGuildIconFromData(const std::vector<uint8_t> &data, const std::string &mime); void UpdateGuildIconFromPixbuf(Glib::RefPtr<Gdk::Pixbuf> pixbuf); void UpdateGuildIconPicker(); - void UpdateGuildIconClipboard(); - Gtk::Label m_guild_icon_label; Gtk::EventBox m_guild_icon_ev; // necessary to make custom cursor behave properly Gtk::Image m_guild_icon; |