summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-04-06 21:07:45 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2022-04-06 21:07:45 -0400
commit57e95c8969394915c1796f48108443b0a8b7c28b (patch)
treec35b29142dd60b344b21109d1cb801dd1c11dbd8 /src
parent56a74fb5dd8d42b96c00e3a8602221fabe5eadfe (diff)
downloadabaddon-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.cpp2
-rw-r--r--src/discord/guild.hpp2
-rw-r--r--src/windows/guildsettings/infopane.cpp69
-rw-r--r--src/windows/guildsettings/infopane.hpp2
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;