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 | |
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')
-rw-r--r-- | src/discord/guild.cpp | 2 | ||||
-rw-r--r-- | src/discord/guild.hpp | 2 | ||||
-rw-r--r-- | src/windows/guildsettings/infopane.cpp | 69 | ||||
-rw-r--r-- | src/windows/guildsettings/infopane.hpp | 2 |
4 files changed, 16 insertions, 59 deletions
diff --git a/src/discord/guild.cpp b/src/discord/guild.cpp index 3995293..bb99044 100644 --- a/src/discord/guild.cpp +++ b/src/discord/guild.cpp @@ -119,7 +119,7 @@ void GuildData::update_from_json(const nlohmann::json &j) { JS_RD("approximate_presence_count", ApproximatePresenceCount); } -bool GuildData::HasFeature(const std::string &search_feature) { +bool GuildData::HasFeature(const std::string &search_feature) const { if (!Features.has_value()) return false; for (const auto &feature : *Features) if (search_feature == feature) diff --git a/src/discord/guild.hpp b/src/discord/guild.hpp index 3370fa8..152e250 100644 --- a/src/discord/guild.hpp +++ b/src/discord/guild.hpp @@ -91,7 +91,7 @@ struct GuildData { friend void from_json(const nlohmann::json &j, GuildData &m); void update_from_json(const nlohmann::json &j); - bool HasFeature(const std::string &feature); + bool HasFeature(const std::string &feature) const; bool HasIcon() const; bool HasAnimatedIcon() const; std::string GetIconURL(const std::string &ext = "png", const std::string &size = "32") const; 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; |