mirror of
https://github.com/uowuo/abaddon.git
synced 2026-01-18 15:00:05 +00:00
basic pins window
This commit is contained in:
10
abaddon.cpp
10
abaddon.cpp
@@ -14,6 +14,7 @@
|
||||
#include "abaddon.hpp"
|
||||
#include "windows/guildsettingswindow.hpp"
|
||||
#include "windows/profilewindow.hpp"
|
||||
#include "windows/pinnedwindow.hpp"
|
||||
|
||||
#ifdef _WIN32
|
||||
#pragma comment(lib, "crypt32.lib")
|
||||
@@ -99,6 +100,7 @@ int Abaddon::StartGTK() {
|
||||
m_main_window->signal_action_set_status().connect(sigc::mem_fun(*this, &Abaddon::ActionSetStatus));
|
||||
m_main_window->signal_action_reload_settings().connect(sigc::mem_fun(*this, &Abaddon::ActionReloadSettings));
|
||||
m_main_window->signal_action_add_recipient().connect(sigc::mem_fun(*this, &Abaddon::ActionAddRecipient));
|
||||
m_main_window->signal_action_view_pins().connect(sigc::mem_fun(*this, &Abaddon::ActionViewPins));
|
||||
|
||||
m_main_window->GetChannelList()->signal_action_channel_item_select().connect(sigc::mem_fun(*this, &Abaddon::ActionChannelOpened));
|
||||
m_main_window->GetChannelList()->signal_action_guild_leave().connect(sigc::mem_fun(*this, &Abaddon::ActionLeaveGuild));
|
||||
@@ -625,6 +627,14 @@ void Abaddon::ActionAddRecipient(Snowflake channel_id) {
|
||||
}
|
||||
}
|
||||
|
||||
void Abaddon::ActionViewPins(Snowflake channel_id) {
|
||||
const auto data = m_discord.GetChannel(channel_id);
|
||||
if (!data.has_value()) return;
|
||||
auto window = new PinnedWindow(*data);
|
||||
ManageHeapWindow(window);
|
||||
window->show();
|
||||
}
|
||||
|
||||
bool Abaddon::ShowConfirm(const Glib::ustring &prompt, Gtk::Window *window) {
|
||||
ConfirmDialog dlg(window != nullptr ? *window : *m_main_window);
|
||||
dlg.SetConfirmText(prompt);
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
void ActionReactionRemove(Snowflake id, const Glib::ustring ¶m);
|
||||
void ActionGuildSettings(Snowflake id);
|
||||
void ActionAddRecipient(Snowflake channel_id);
|
||||
void ActionViewPins(Snowflake channel_id);
|
||||
|
||||
bool ShowConfirm(const Glib::ustring &prompt, Gtk::Window *window = nullptr);
|
||||
|
||||
|
||||
@@ -710,6 +710,18 @@ void DiscordClient::PutRelationship(Snowflake id, sigc::slot<void(bool success,
|
||||
});
|
||||
}
|
||||
|
||||
void DiscordClient::FetchPinned(Snowflake id, sigc::slot<void(std::vector<Message>, DiscordError code)> callback) {
|
||||
m_http.MakeGET("/channels/" + std::to_string(id) + "/pins", [this, callback](const http::response_type &response) {
|
||||
if (!CheckCode(response)) {
|
||||
callback({}, GetCodeFromResponse(response));
|
||||
return;
|
||||
}
|
||||
|
||||
auto data = nlohmann::json::parse(response.text).get<std::vector<Message>>();
|
||||
callback(std::move(data), DiscordError::NONE);
|
||||
});
|
||||
}
|
||||
|
||||
bool DiscordClient::CanModifyRole(Snowflake guild_id, Snowflake role_id, Snowflake user_id) const {
|
||||
const auto guild = *GetGuild(guild_id);
|
||||
if (guild.OwnerID == user_id) return true;
|
||||
|
||||
@@ -170,6 +170,8 @@ public:
|
||||
void SetUserNote(Snowflake user_id, std::string note, sigc::slot<void(bool success)> callback);
|
||||
void FetchUserRelationships(Snowflake user_id, sigc::slot<void(std::vector<UserData>)> callback);
|
||||
|
||||
void FetchPinned(Snowflake id, sigc::slot<void(std::vector<Message>, DiscordError code)> callback);
|
||||
|
||||
void GetVerificationGateInfo(Snowflake guild_id, sigc::slot<void(std::optional<VerificationGateInfoObject>)> callback);
|
||||
void AcceptVerificationGate(Snowflake guild_id, VerificationGateInfoObject info, sigc::slot<void(bool success)> callback);
|
||||
|
||||
|
||||
@@ -42,7 +42,9 @@ MainWindow::MainWindow()
|
||||
m_menu_view.set_label("View");
|
||||
m_menu_view.set_submenu(m_menu_view_sub);
|
||||
m_menu_view_friends.set_label("Friends");
|
||||
m_menu_view_pins.set_label("Pins");
|
||||
m_menu_view_sub.append(m_menu_view_friends);
|
||||
m_menu_view_sub.append(m_menu_view_pins);
|
||||
m_menu_view_sub.signal_popped_up().connect(sigc::mem_fun(*this, &MainWindow::OnViewSubmenuPopup));
|
||||
|
||||
m_menu_bar.append(m_menu_file);
|
||||
@@ -92,6 +94,10 @@ MainWindow::MainWindow()
|
||||
m_content_stack.set_visible_child("friends");
|
||||
});
|
||||
|
||||
m_menu_view_pins.signal_activate().connect([this] {
|
||||
m_signal_action_view_pins.emit(GetChatActiveChannel());
|
||||
});
|
||||
|
||||
m_content_box.set_hexpand(true);
|
||||
m_content_box.set_vexpand(true);
|
||||
m_content_box.show();
|
||||
@@ -263,6 +269,11 @@ void MainWindow::OnDiscordSubmenuPopup(const Gdk::Rectangle *flipped_rect, const
|
||||
|
||||
void MainWindow::OnViewSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y) {
|
||||
m_menu_view_friends.set_sensitive(Abaddon::Get().GetDiscordClient().IsStarted());
|
||||
auto channel_id = GetChatActiveChannel();
|
||||
auto channel = Abaddon::Get().GetDiscordClient().GetChannel(channel_id);
|
||||
m_menu_view_pins.set_sensitive(false);
|
||||
if (channel.has_value())
|
||||
m_menu_view_pins.set_sensitive(channel->Type == ChannelType::GUILD_TEXT);
|
||||
}
|
||||
|
||||
ChannelList *MainWindow::GetChannelList() {
|
||||
@@ -308,3 +319,7 @@ MainWindow::type_signal_action_reload_settings MainWindow::signal_action_reload_
|
||||
MainWindow::type_signal_action_add_recipient MainWindow::signal_action_add_recipient() {
|
||||
return m_signal_action_add_recipient;
|
||||
}
|
||||
|
||||
MainWindow::type_signal_action_view_pins MainWindow::signal_action_view_pins() {
|
||||
return m_signal_action_view_pins;
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ public:
|
||||
typedef sigc::signal<void> type_signal_action_set_status;
|
||||
typedef sigc::signal<void> type_signal_action_reload_settings;
|
||||
typedef sigc::signal<void, Snowflake> type_signal_action_add_recipient; // channel id
|
||||
typedef sigc::signal<void, Snowflake> type_signal_action_view_pins; // channel id
|
||||
|
||||
type_signal_action_connect signal_action_connect();
|
||||
type_signal_action_disconnect signal_action_disconnect();
|
||||
@@ -52,6 +53,7 @@ public:
|
||||
type_signal_action_set_status signal_action_set_status();
|
||||
type_signal_action_reload_settings signal_action_reload_settings();
|
||||
type_signal_action_add_recipient signal_action_add_recipient();
|
||||
type_signal_action_view_pins signal_action_view_pins();
|
||||
|
||||
protected:
|
||||
type_signal_action_connect m_signal_action_connect;
|
||||
@@ -62,6 +64,7 @@ protected:
|
||||
type_signal_action_set_status m_signal_action_set_status;
|
||||
type_signal_action_reload_settings m_signal_action_reload_settings;
|
||||
type_signal_action_add_recipient m_signal_action_add_recipient;
|
||||
type_signal_action_view_pins m_signal_action_view_pins;
|
||||
|
||||
protected:
|
||||
Gtk::Box m_main_box;
|
||||
@@ -96,5 +99,6 @@ protected:
|
||||
Gtk::MenuItem m_menu_view;
|
||||
Gtk::Menu m_menu_view_sub;
|
||||
Gtk::MenuItem m_menu_view_friends;
|
||||
Gtk::MenuItem m_menu_view_pins;
|
||||
void OnViewSubmenuPopup(const Gdk::Rectangle *flipped_rect, const Gdk::Rectangle *final_rect, bool flipped_x, bool flipped_y);
|
||||
};
|
||||
|
||||
32
windows/pinnedwindow.cpp
Normal file
32
windows/pinnedwindow.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#include "pinnedwindow.hpp"
|
||||
#include "../abaddon.hpp"
|
||||
|
||||
PinnedWindow::PinnedWindow(const ChannelData &data)
|
||||
: ChannelID(data.ID) {
|
||||
if (data.GuildID.has_value())
|
||||
GuildID = *data.GuildID;
|
||||
|
||||
set_name("pinned-messages");
|
||||
set_default_size(450, 375);
|
||||
set_title("#" + *data.Name + " - Pinned Messages");
|
||||
set_position(Gtk::WIN_POS_CENTER);
|
||||
get_style_context()->add_class("app-window");
|
||||
get_style_context()->add_class("app-popup");
|
||||
get_style_context()->add_class("pinned-messages-window");
|
||||
|
||||
add(m_chat);
|
||||
m_chat.show();
|
||||
|
||||
m_chat.SetActiveChannel(ChannelID);
|
||||
|
||||
FetchPinned();
|
||||
}
|
||||
|
||||
void PinnedWindow::FetchPinned() {
|
||||
Abaddon::Get().GetDiscordClient().FetchPinned(ChannelID, sigc::mem_fun(*this, &PinnedWindow::OnFetchedPinned));
|
||||
}
|
||||
|
||||
void PinnedWindow::OnFetchedPinned(const std::vector<Message> &msgs, DiscordError code) {
|
||||
if (code != DiscordError::NONE) return;
|
||||
m_chat.SetMessages(msgs.begin(), msgs.end());
|
||||
}
|
||||
20
windows/pinnedwindow.hpp
Normal file
20
windows/pinnedwindow.hpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
#include <gtkmm.h>
|
||||
#include "../discord/errors.hpp"
|
||||
#include "../discord/channel.hpp"
|
||||
#include "../discord/message.hpp"
|
||||
#include "../components/chatlist.hpp"
|
||||
|
||||
class PinnedWindow : public Gtk::Window {
|
||||
public:
|
||||
PinnedWindow(const ChannelData &data);
|
||||
|
||||
Snowflake GuildID;
|
||||
Snowflake ChannelID;
|
||||
|
||||
private:
|
||||
void FetchPinned();
|
||||
void OnFetchedPinned(const std::vector<Message> &msgs, DiscordError code);
|
||||
|
||||
ChatList m_chat;
|
||||
};
|
||||
Reference in New Issue
Block a user