diff options
-rw-r--r-- | .github/workflows/ci.yml | 7 | ||||
-rw-r--r-- | ci/msys-deps.txt | 3 | ||||
-rw-r--r-- | ci/tree/etc/gtk-3.0/settings.ini | 2 | ||||
-rw-r--r-- | res/css/application-low-priority.css | 97 | ||||
-rw-r--r-- | res/css/bare.css | 35 | ||||
-rw-r--r-- | res/css/main.css | 358 | ||||
-rw-r--r-- | src/abaddon.cpp | 11 | ||||
-rw-r--r-- | src/abaddon.hpp | 1 | ||||
-rw-r--r-- | src/components/channelscellrenderer.cpp | 88 | ||||
-rw-r--r-- | src/components/chatinput.cpp | 61 | ||||
-rw-r--r-- | src/components/chatinput.hpp | 6 | ||||
-rw-r--r-- | src/components/chatmessage.cpp | 5 | ||||
-rw-r--r-- | src/components/chatwindow.cpp | 10 | ||||
-rw-r--r-- | src/components/progressbar.cpp | 19 | ||||
-rw-r--r-- | src/components/progressbar.hpp | 11 | ||||
-rw-r--r-- | src/dialogs/setstatus.cpp | 41 | ||||
-rw-r--r-- | src/dialogs/setstatus.hpp | 4 | ||||
-rw-r--r-- | src/settings.cpp | 2 | ||||
-rw-r--r-- | src/settings.hpp | 1 | ||||
-rw-r--r-- | src/windows/voicesettingswindow.cpp | 20 | ||||
-rw-r--r-- | src/windows/voicewindow.cpp | 40 |
21 files changed, 233 insertions, 589 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f20cb2..cdfa8f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: if_true: >- git make + unzip mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja @@ -41,6 +42,7 @@ jobs: if_false: >- git make + unzip mingw-w64-x86_64-toolchain mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja @@ -95,6 +97,11 @@ jobs: mkdir -p 16x16/devices 24x24/devices 32x32/devices 48x48/devices 64x64/devices 96x96/devices scalable/devices mkdir -p 16x16/status 24x24/status 32x32/status 48x48/status 64x64/status 96x96/status scalable/status cd ${GITHUB_WORKSPACE} + wget https://github.com/rtlewis1/GTK/archive/refs/heads/Material-Black-Colors-Desktop.zip + unzip Material-Black-Colors-Desktop.zip 'GTK-Material-Black-Colors-Desktop/Material-Black-Cherry/**/*' + mkdir -p ${artifact_dir}/share/themes + mv ./GTK-Material-Black-Colors-Desktop/Material-Black-Cherry ${artifact_dir}/share/themes/Material-Black-Cherry + cp -r ci/tree/. ${artifact_dir} cp ci/gtk-for-windows/gtk-nsis-pack/share/icons/Adwaita/index.theme ${artifact_dir}/share/icons/Adwaita/index.theme cat "ci/used-icons.txt" | sed 's/\r$//' | xargs -I % cp ci/gtk-for-windows/gtk-nsis-pack/share/icons/Adwaita/16x16/%.symbolic.png ${artifact_dir}/share/icons/Adwaita/16x16/%.symbolic.png || : cat "ci/used-icons.txt" | sed 's/\r$//' | xargs -I % cp ci/gtk-for-windows/gtk-nsis-pack/share/icons/Adwaita/24x24/%.symbolic.png ${artifact_dir}/share/icons/Adwaita/24x24/%.symbolic.png || : diff --git a/ci/msys-deps.txt b/ci/msys-deps.txt index 39172f0..d37418b 100644 --- a/ci/msys-deps.txt +++ b/ci/msys-deps.txt @@ -38,6 +38,7 @@ /bin/libidn2-0.dll /bin/libintl-8.dll /bin/libjpeg-8.dll +/bin/liblzma-5.dll /bin/libnghttp2-14.dll /bin/libopus-0.dll /bin/libpango-1.0-0.dll @@ -49,6 +50,7 @@ /bin/libpixman-1-0.dll /bin/libpng16-16.dll /bin/libpsl-5.dll +/bin/librsvg-2-2.dll /bin/libsigc-2.0-0.dll /bin/libsodium-26.dll /bin/libspdlog.dll @@ -59,6 +61,7 @@ /bin/libthai-0.dll /bin/libunistring-5.dll /bin/libwinpthread-1.dll +/bin/libxml2-2.dll /bin/libzstd.dll /bin/zlib1.dll /../usr/bin/msys-2.0.dll diff --git a/ci/tree/etc/gtk-3.0/settings.ini b/ci/tree/etc/gtk-3.0/settings.ini new file mode 100644 index 0000000..a148875 --- /dev/null +++ b/ci/tree/etc/gtk-3.0/settings.ini @@ -0,0 +1,2 @@ +[Settings] +gtk-theme-name=Material-Black-Cherry diff --git a/res/css/application-low-priority.css b/res/css/application-low-priority.css deleted file mode 100644 index 130033f..0000000 --- a/res/css/application-low-priority.css +++ /dev/null @@ -1,97 +0,0 @@ -/* -application wide stuff -has to be separate to allow main.css to override certain things -*/ - -.app-window label:not(:disabled) { - color: @text_color; -} - -.app-window entry { - background: @secondary_color; - color: @text_color; - border: 1px solid #1c2e40; -} - -.app-window button { - background: @secondary_color; - color: @text_color; - text-shadow: none; - box-shadow: none; -} - -.app-window button:checked { - border-top: 0px; - border-left: 0px; - border-right: 0px; - border-bottom: 3px solid #39a2ed; - color: #ffffff; -} - -.app-window button:not(:checked) { - border: 3px #0000ff; -} - -.app-window.background { - background: @background_color; -} - -.app-window treeview { - color: @text_color; -} - -.app-window treeview:not(:selected) { - background: @secondary_color; -} - -.app-window list, .app-popup list { - background: @secondary_color; -} - -.app-window paned separator { - background: @background_color; -} - -.app-window scrollbar { - background: @background_color; - border-left: 1px solid transparent; -} - -.app-window menubar, menu { - background: @background_color; - color: #cccccc; -} - -.app-window textview text { - caret-color: #ababab; -} - -.app-window check, -.app-window radio { - background-clip: padding-box; - background: @secondary_color; - border-color: #070707; - box-shadow: 0 1px rgba(0, 0, 0, 0); - color: #dddddd; -} - -.app-window check:checked, -.app-window radio:checked { - background-clip: border-box; - background: #0b4285; - border-color: #092444; - box-shadow: 0 1px rgba(0, 0, 0, 0); - color: #dddddd; -} - -.app-window colorswatch { - box-shadow: 0 1px rgba(0, 0, 0, 0); -} - -.app-window scale { - padding-top: 0px; - padding-bottom: 0px; - margin-top: 0px; - margin-bottom: 0px; - color: @text_color; -} diff --git a/res/css/bare.css b/res/css/bare.css deleted file mode 100644 index 80ef2f8..0000000 --- a/res/css/bare.css +++ /dev/null @@ -1,35 +0,0 @@ -.embed { - border-radius: 5px; - padding: 10px; -} - -.embed-footer { - margin-top: 5px; - font-size: 11px; -} - -.embed-author { - margin-bottom: 10px; - font-size: 12px; -} - -.message-attachment-box { - border: 1px solid #aaaaaa; - padding: 2px 5px 2px 5px; -} - -.status-indicator.dnd { - color: #982929; -} - -.status-indicator.online { - color: #43B581; -} - -.status-indicator.offline { - color: #808080; -} - -.status-indicator.idle { - color: #FAA61A; -} diff --git a/res/css/main.css b/res/css/main.css index 2cc4727..8fcca72 100644 --- a/res/css/main.css +++ b/res/css/main.css @@ -1,12 +1,7 @@ -@define-color background_color #141414; -@define-color secondary_color #111111; -@define-color text_color #fbfbfb; - .embed { - background-color: rgba(0, 0, 0, 0.2); - color: #cbcbcb; border-radius: 5px; padding: 10px; + background-color: rgba(0.0, 0.0, 0.0, 0.1); } .embed-footer { @@ -19,140 +14,7 @@ font-size: 12px; } -.channel-list { - background-color: @secondary_color; -} - -.channel-row-label { - padding: 5px; -} - -.channel-row-label, .channel-row-label text { - color: @text_color; - background: rgba(0, 0, 0, 0); -} - -.channel-row-label.nsfw text { - color: #ed6666; -} - -.channel-row:focus { - background-color: #34495e; -} - -.channel-row-category { - padding-left: 15px; - color: #ff5370; -} - -.channel-row-channel { - padding-left: 30px; -} - -.messages, .message-container { - background-color: @background_color; -} - -.messages { - padding: 15px; -} - -.message-container-extra { - color: #78909c; -} - -.message-container-timestamp { - color: #78909c; -} - -.message-text { - /* this isnt stricly necessary but it fixes emoji clipping */ - padding-bottom: 5px; -} - -.message-text:not(.failed) text, .message-reply { - color: @text_color; -} - -.message-text.pending text { - color: shade(@text_color, 0.5); -} - -.message-text.failed text { - color: #b72d4f; -} - -.message-reply { - border-left: 2px solid gray; - padding-left: 20px; - padding-top: 6px; - padding-bottom: 6px; - opacity: 0.7; -} - -.message-text + .message-text { - padding-top: 5px; -} - -.message-text text { - background-color: @background_color; -} - -.message-input, .message-input textview, .message-input textview text { - background-color: #242424; - color: #adadad; - border-radius: 3px; - border: 1px solid transparent; -} - -.message-input { - border: 1px solid #444444; - margin-right: 15px; -} - -.message-input.replying { - border: 1px solid #026FB9; -} - -.message-input.editing { - border: 1px solid #b9026f; -} - -.message-input.bad-input { - border: 1px solid #dd3300; -} - -.message-input-browse-icon { - color: #b9bbbe; - margin-left: 5px; - margin-top: 11px; -} - -/* i dont think theres a way to circumvent having to do this to adjust around the browse icon */ -.message-input:not(.with-browser-icon) { - padding: 0px 0px 0px 5px; -} - -.message-input.with-browse-icon { - padding: 0px 0px 0px 30px; -} - -.members { - background-color: @background_color; -} - -.members-row-label { - color: @text_color; - padding: 5px; -} - -.members-row-member { - padding: 0; - padding-left: 15px; -} - .message-attachment-box { - color: #aaaaaa; border: 1px solid #aaaaaa; padding: 2px 5px 2px 5px; } @@ -161,61 +23,6 @@ margin: 5px; } -.message-component { - margin: 5px; -} - -.message-component.primary { - background: #5865F2; -} - -.message-component.secondary, .message-component.link { - background: #4F545C; -} - -.message-component.success { - background: #43B581; -} - -.message-component.danger { - background: #F04747; -} - -.reaction-box { - padding: 2px 5px 2px 5px; - margin: 0px 0px 0px 0px; - background-color: rgba(0.4, 0.4, 0.4, 0.4); - border-radius: 5px; - border: 1px solid transparent; -} - -.reaction-box.reacted { - border: 1px solid white; -} - -.reaction-count { - color: @text_color; -} - -.completer { - background-color: @secondary_color; - padding: 5px; -} - -.completer-entry { - color: @text_color; -} - -.completer-entry-image { - margin-right: 6px; -} - -.typing-indicator { - margin-top: 10px; - margin-bottom: -7px; - color: @text_color; -} - .status-indicator.dnd { color: #982929; } @@ -232,39 +39,41 @@ color: #FAA61A; } -.profile-main-container { - padding: 20px; +.message-input textview, .message-input textview text { + background-color: inherit; } -.profile-username { - margin-left: 10px; - font-size: 20px; +.message-text, .message-text text { + background: inherit; } -.profile-username-nondisplay { - margin-left: 10px; +.message-input textview { + padding: 10px 5px; } -.profile-badge { - margin-right: 10px; +.message-reply { + border-left: 2px solid gray; + padding-left: 10px; + padding-top: 6px; + padding-bottom: 6px; + opacity: 0.8; } -.profile-switcher { - padding-top: 5px; +.profile-main-container { + padding: 20px; } -.profile-connections { - margin-top: 10px; +.profile-username { + margin-left: 10px; + font-size: 20px; } -.profile-connection { - background: @secondary_color; - border-radius: 15px; - margin-right: 20px; +.profile-username-nondisplay { + margin-left: 10px; } -.profile-connection box { - padding: 5px; +.profile-switcher { + padding-top: 5px; } .profile-stack { @@ -276,126 +85,55 @@ padding-bottom: 5px; } -.profile-notes-text, .profile-notes-text text { - background: @secondary_color; -} - -.profile-notes-text text { - border-radius: 5px; - border: 1px solid #36515e; - color: @text_color; - padding-bottom: 5px; -} - .profile-badges { padding-left: 5px; } -.guild-members-pane-info { - padding: 10px; -} - -.drag-hover-top { - background: linear-gradient(to bottom, rgba(255, 66, 66, 0.65) 0%, rgba(0, 0, 0, 0) 35%); -} - -.drag-hover-bottom { - background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 65%, rgba(255, 66, 66, 0.65) 100%); -} - -.friends-list list { - background: @background_color; - padding-left: 10px; -} - -.friends-list-row-bot { - color: #ff0000; -} - -.channel-tab-switcher .box { - margin: -7px -1px -7px -1px; - background: #2a2a2a; - border: 1px solid black; -} - -.channel-tab-switcher tab:hover { - box-shadow: inset 0 -6px #17633e; -} - -.channel-tab-switcher tab:checked { - box-shadow: inset 0 -6px #2feb90; -} - -.channel-tab-switcher tab { - background: #1A1A1A; - border: 1px solid #808080; - min-height: 35px; -} - -.channel-tab-switcher tab.needs-attention:not(:checked) { - font-weight: bold; - animation: 150ms ease-in; - /* background-image: radial-gradient(ellipse at bottom, #FF5370, #1A1A1A 30%); */ - box-shadow: inset 0 -6px red; +.profile-badge { + margin-right: 5px; } -.channel-tab-switcher tab > button { - border: none; - padding: 0; - margin: 5px; - min-width: 16px; - min-height: 16px; - color: #FF5370; - background-color: rgba(0.21, 0.21, 0.21, 0.5); +.profile-connections { + margin-top: 10px; } -.channel-tab-switcher tab > button:hover { - background-color: alpha(#ff0000, 0.5); +.profile-connection { + padding: 5px; + border-radius: 10px; + border: 1px solid @theme_fg_color; } -.message-progress { - border: none; - margin-bottom: -8px; +.profile-connection-image { + padding-right: 5px; } -.message-progress trough { - border: none; - background-color: transparent; +.reaction-box { + padding: 2px 5px 2px 5px; + border-radius: 5px; + border: 1px solid @theme_fg_color; } -.message-progress progress { - border: none; - background-color: #dd3300; - margin-left: 1px; +.reaction-box.reacted { + border: 1px solid #5865f2; + background-color: alpha(@theme_selected_bg_color, 0.5); } -.voice-info { - background-color: #0B0B0B; +.set-status-dialog .dialog-vbox { padding: 5px; - border: 1px solid #202020; -} - -.voice-info-disconnect-image { - color: #DDDDDD; } -.voice-info-status { - font-weight: bold; +.set-status-dialog .dialog-action-area { + margin: 10px 5px 5px 5px; } -.voice-info-location { - -} - -.voice-state-server { - color: red; +.voice-settings-window > box { + padding: 5px; } -spinbutton { - color: @text_color; - margin-top: 10px; +.voice-settings-window scale { + margin-right: 8px; } -.emoji-picker, .emoji-picker stack box { - background-color: @background_color; +.message-input scrollbar.vertical slider { + min-height: 0px; } diff --git a/src/abaddon.cpp b/src/abaddon.cpp index cf10f91..ccc9022 100644 --- a/src/abaddon.cpp +++ b/src/abaddon.cpp @@ -192,13 +192,6 @@ int Abaddon::StartGTK() { dlg.run(); }); - m_css_low_provider = Gtk::CssProvider::create(); - m_css_low_provider->signal_parsing_error().connect([](const Glib::RefPtr<const Gtk::CssSection> §ion, const Glib::Error &error) { - Gtk::MessageDialog dlg("low-priority css failed parsing (" + error.what() + ")", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - dlg.set_position(Gtk::WIN_POS_CENTER); - dlg.run(); - }); - #ifdef _WIN32 bool png_found = false; bool gif_found = false; @@ -1087,10 +1080,6 @@ void Abaddon::ActionReloadCSS() { Gtk::StyleContext::remove_provider_for_screen(Gdk::Screen::get_default(), m_css_provider); m_css_provider->load_from_path(GetCSSPath("/" + GetSettings().MainCSS)); Gtk::StyleContext::add_provider_for_screen(Gdk::Screen::get_default(), m_css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - - Gtk::StyleContext::remove_provider_for_screen(Gdk::Screen::get_default(), m_css_low_provider); - m_css_low_provider->load_from_path(GetCSSPath("/application-low-priority.css")); - Gtk::StyleContext::add_provider_for_screen(Gdk::Screen::get_default(), m_css_low_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - 1); } catch (Glib::Error &e) { Gtk::MessageDialog dlg(*m_main_window, "css failed to load (" + e.what() + ")", false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); dlg.set_position(Gtk::WIN_POS_CENTER); diff --git a/src/abaddon.hpp b/src/abaddon.hpp index 85b2fa0..6093523 100644 --- a/src/abaddon.hpp +++ b/src/abaddon.hpp @@ -182,7 +182,6 @@ private: mutable std::mutex m_mutex; Glib::RefPtr<Gtk::Application> m_gtk_app; Glib::RefPtr<Gtk::CssProvider> m_css_provider; - Glib::RefPtr<Gtk::CssProvider> m_css_low_provider; // registered with a lower priority to allow better customization Glib::RefPtr<Gtk::StatusIcon> m_tray; std::unique_ptr<MainWindow> m_main_window; // wah wah cant create a gtkstylecontext fuck you diff --git a/src/components/channelscellrenderer.cpp b/src/components/channelscellrenderer.cpp index ac98512..35c6137 100644 --- a/src/components/channelscellrenderer.cpp +++ b/src/components/channelscellrenderer.cpp @@ -7,6 +7,17 @@ constexpr static double M_PI = 3.14159265358979; constexpr static double M_PI_H = M_PI / 2.0; constexpr static double M_PI_3_2 = M_PI * 3.0 / 2.0; +void AddUnreadIndicator(const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area) { + static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); + cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); + const auto x = background_area.get_x(); + const auto y = background_area.get_y(); + const auto w = background_area.get_width(); + const auto h = background_area.get_height(); + cr->rectangle(x, y, 3, h); + cr->fill(); +} + CellRendererChannels::CellRendererChannels() : Glib::ObjectBase(typeid(CellRendererChannels)) , Gtk::CellRenderer() @@ -243,12 +254,12 @@ void CellRendererChannels::render_vfunc_folder(const Cairo::RefPtr<Cairo::Contex static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelColor); if (m_property_color.get_value().has_value()) { - m_renderer_text.property_foreground_rgba() = *m_property_color.get_value(); + // m_renderer_text.property_foreground_rgba() = *m_property_color.get_value(); } else { - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - m_renderer_text.property_foreground_set() = false; + // m_renderer_text.property_foreground_set() = false; } // guild functions @@ -326,7 +337,7 @@ void CellRendererChannels::render_vfunc_guild(const Cairo::RefPtr<Cairo::Context static_cast<int>(text_h)); static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelColor); - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); const bool hover_only = Abaddon::Get().GetSettings().AnimatedGuildHoverOnly; @@ -373,14 +384,9 @@ void CellRendererChannels::render_vfunc_guild(const Cairo::RefPtr<Cairo::Context const auto has_unread = discord.GetUnreadStateForGuild(id, total_mentions); if (has_unread && !discord.IsGuildMuted(id)) { - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); - cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y + h / 2.0 - 24.0 / 2.0, 3.0, 24.0); - cr->fill(); + auto area = background_area; + area.set_y(area.get_y() + area.get_height() / 2.0 - 24.0 / 2.0); + AddUnreadIndicator(cr, area); } if (total_mentions < 1) return; @@ -410,17 +416,6 @@ void CellRendererChannels::get_preferred_height_for_width_vfunc_category(Gtk::Wi m_renderer_text.get_preferred_height_for_width(widget, width, minimum_height, natural_height); } -void AddUnreadIndicator(const Cairo::RefPtr<Cairo::Context> &cr, const Gdk::Rectangle &background_area) { - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); - cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y, 3, h); - cr->fill(); -} - void CellRendererChannels::render_vfunc_category(const Cairo::RefPtr<Cairo::Context> &cr, Gtk::Widget &widget, const Gdk::Rectangle &background_area, const Gdk::Rectangle &cell_area, Gtk::CellRendererState flags) { // todo: figure out how Gtk::Arrow is rendered because i like it better :^) constexpr static int len = 5; @@ -465,15 +460,15 @@ void CellRendererChannels::render_vfunc_category(const Cairo::RefPtr<Cairo::Cont muted.set_red(muted.get_red() * 0.5); muted.set_green(muted.get_green() * 0.5); muted.set_blue(muted.get_blue() * 0.5); - m_renderer_text.property_foreground_rgba() = muted; + // m_renderer_text.property_foreground_rgba() = muted; } else { if (discord.GetUnreadChannelsCountForCategory(id) > 0) { AddUnreadIndicator(cr, background_area); } - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - m_renderer_text.property_foreground_set() = false; + // m_renderer_text.property_foreground_set() = false; } // text channel @@ -511,22 +506,28 @@ void CellRendererChannels::render_vfunc_channel(const Cairo::RefPtr<Cairo::Conte static const auto sfw_unmuted = Gdk::RGBA(Abaddon::Get().GetSettings().ChannelColor); - m_renderer_text.property_sensitive() = false; static const auto nsfw_color = Gdk::RGBA(Abaddon::Get().GetSettings().NSFWChannelColor); - if (m_property_nsfw.get_value()) - m_renderer_text.property_foreground_rgba() = nsfw_color; + /* if (m_property_nsfw.get_value()) + // m_renderer_text.property_foreground_rgba() = nsfw_color; else - m_renderer_text.property_foreground_rgba() = sfw_unmuted; + // m_renderer_text.property_foreground_rgba() = sfw_unmuted; if (is_muted) { - auto col = m_renderer_text.property_foreground_rgba().get_value(); + auto col = // m_renderer_text.property_foreground_rgba().get_value(); col.set_red(col.get_red() * 0.5); col.set_green(col.get_green() * 0.5); col.set_blue(col.get_blue() * 0.5); - m_renderer_text.property_foreground_rgba() = col; + // m_renderer_text.property_foreground_rgba() = col; + }*/ + + if (is_muted) { + auto color = widget.get_style_context()->get_color(Gtk::STATE_FLAG_NORMAL); + color.set_alpha(0.6); + m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - // unset foreground to default so properties dont bleed m_renderer_text.property_foreground_set() = false; + // unset foreground to default so properties dont bleed + // m_renderer_text.property_foreground_set() = false; // unread if (!Abaddon::Get().GetSettings().Unreads) return; @@ -586,12 +587,12 @@ void CellRendererChannels::render_vfunc_thread(const Cairo::RefPtr<Cairo::Contex muted.set_red(muted.get_red() * 0.5); muted.set_green(muted.get_green() * 0.5); muted.set_blue(muted.get_blue() * 0.5); - m_renderer_text.property_foreground_rgba() = muted; + // m_renderer_text.property_foreground_rgba() = muted; } else { - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - m_renderer_text.property_foreground_set() = false; + // m_renderer_text.property_foreground_set() = false; // unread if (!Abaddon::Get().GetSettings().Unreads) return; @@ -903,12 +904,12 @@ void CellRendererChannels::render_vfunc_dm(const Cairo::RefPtr<Cairo::Context> & muted.set_red(muted.get_red() * 0.5); muted.set_green(muted.get_green() * 0.5); muted.set_blue(muted.get_blue() * 0.5); - m_renderer_text.property_foreground_rgba() = muted; + // m_renderer_text.property_foreground_rgba() = muted; } else { - m_renderer_text.property_foreground_rgba() = color; + // m_renderer_text.property_foreground_rgba() = color; } m_renderer_text.render(cr, widget, background_area, text_cell_area, flags); - m_renderer_text.property_foreground_set() = false; + // m_renderer_text.property_foreground_set() = false; Gdk::Cairo::set_source_pixbuf(cr, m_property_pixbuf.get_value(), icon_x, icon_y); cr->rectangle(icon_x, icon_y, icon_w, icon_h); @@ -921,14 +922,7 @@ void CellRendererChannels::render_vfunc_dm(const Cairo::RefPtr<Cairo::Context> & if (unread_state < 0) return; if (!is_muted) { - static const auto color = Gdk::RGBA(Abaddon::Get().GetSettings().UnreadIndicatorColor); - cr->set_source_rgb(color.get_red(), color.get_green(), color.get_blue()); - const auto x = background_area.get_x(); - const auto y = background_area.get_y(); - const auto w = background_area.get_width(); - const auto h = background_area.get_height(); - cr->rectangle(x, y, 3, h); - cr->fill(); + AddUnreadIndicator(cr, background_area); } } diff --git a/src/components/chatinput.cpp b/src/components/chatinput.cpp index 10896fb..1db03ed 100644 --- a/src/components/chatinput.cpp +++ b/src/components/chatinput.cpp @@ -20,7 +20,7 @@ ChatInputText::ChatInputText() { m_textview.signal_key_press_event().connect(cb, false); m_textview.set_hexpand(false); m_textview.set_halign(Gtk::ALIGN_FILL); - m_textview.set_valign(Gtk::ALIGN_CENTER); + m_textview.set_valign(Gtk::ALIGN_FILL); m_textview.set_wrap_mode(Gtk::WRAP_WORD_CHAR); m_textview.show(); add(m_textview); @@ -113,30 +113,25 @@ ChatInputTextContainer::ChatInputTextContainer() { }; m_input.signal_key_press_proxy().connect(cb); + m_upload_button.set_image(m_upload_img); + m_upload_button.set_halign(Gtk::ALIGN_CENTER); + m_upload_button.set_valign(Gtk::ALIGN_CENTER); + m_upload_button.get_style_context()->add_class(GTK_STYLE_CLASS_FLAT); + m_upload_img.property_icon_name() = "document-send-symbolic"; m_upload_img.property_icon_size() = Gtk::ICON_SIZE_LARGE_TOOLBAR; m_upload_img.get_style_context()->add_class("message-input-browse-icon"); - AddPointerCursor(m_upload_ev); - - m_upload_ev.signal_button_press_event().connect([this](GdkEventButton *ev) -> bool { - if (ev->button == GDK_BUTTON_PRIMARY) { - ShowFileChooser(); - // return focus - m_input.grab_focus(); - return true; - } - return false; + m_upload_button.signal_clicked().connect([this]() { + ShowFileChooser(); + m_input.grab_focus(); }); - m_upload_ev.add(m_upload_img); - add_overlay(m_upload_ev); - add(m_input); + m_upload_box.pack_start(m_upload_button); + pack_start(m_upload_box, false, false); + pack_start(m_input); show_all_children(); - - // stop the overlay from using (start) padding - signal_get_child_position().connect(sigc::mem_fun(*this, &ChatInputTextContainer::GetChildPosition), false); } void ChatInputTextContainer::ShowFileChooser() { @@ -160,39 +155,11 @@ ChatInputText &ChatInputTextContainer::Get() { } void ChatInputTextContainer::ShowChooserIcon() { - m_upload_ev.show(); + m_upload_button.show(); } void ChatInputTextContainer::HideChooserIcon() { - m_upload_ev.hide(); -} - -bool ChatInputTextContainer::GetChildPosition(Gtk::Widget *child, Gdk::Rectangle &pos) { - Gtk::Allocation main_alloc; - { - auto *grandchild = m_input.get_child(); - int x, y; - if (grandchild->translate_coordinates(m_input, 0, 0, x, y)) { - main_alloc.set_x(x); - main_alloc.set_y(y); - } else { - main_alloc.set_x(0); - main_alloc.set_y(0); - } - main_alloc.set_width(grandchild->get_allocated_width()); - main_alloc.set_height(grandchild->get_allocated_height()); - } - - Gtk::Requisition min, req; - child->get_preferred_size(min, req); - - // let css move it around - pos.set_x(0); - pos.set_y(0); - pos.set_width(std::max(min.width, std::min(main_alloc.get_width(), req.width))); - pos.set_height(std::max(min.height, std::min(main_alloc.get_height(), req.height))); - - return true; + m_upload_button.hide(); } ChatInputTextContainer::type_signal_add_attachment ChatInputTextContainer::signal_add_attachment() { diff --git a/src/components/chatinput.hpp b/src/components/chatinput.hpp index be8c141..231d67c 100644 --- a/src/components/chatinput.hpp +++ b/src/components/chatinput.hpp @@ -104,7 +104,7 @@ private: }; // file upload, text -class ChatInputTextContainer : public Gtk::Overlay { +class ChatInputTextContainer : public Gtk::Box { public: ChatInputTextContainer(); @@ -116,9 +116,9 @@ public: private: void ShowFileChooser(); - bool GetChildPosition(Gtk::Widget *child, Gdk::Rectangle &pos); - Gtk::EventBox m_upload_ev; + Gtk::Box m_upload_box; + Gtk::Button m_upload_button; Gtk::Image m_upload_img; ChatInputText m_input; diff --git a/src/components/chatmessage.cpp b/src/components/chatmessage.cpp index 2c2f9dd..a503294 100644 --- a/src/components/chatmessage.cpp +++ b/src/components/chatmessage.cpp @@ -364,7 +364,7 @@ Gtk::Widget *ChatMessageItemContainer::CreateEmbedComponent(const EmbedData &emb } return false; }); - static auto color = Abaddon::Get().GetSettings().LinkColor; + const auto color = title_label->get_style_context()->get_color(Gtk::STATE_FLAG_LINK); title_label->override_color(Gdk::RGBA(color)); title_label->set_markup("<b>" + Glib::Markup::escape_text(*embed.Title) + "</b>"); } @@ -856,7 +856,8 @@ void ChatMessageItemContainer::HandleLinks(Gtk::TextView &tv) { std::string link = match.fetch(0); auto tag = buf->create_tag(); m_link_tagmap[tag] = link; - tag->property_foreground_rgba() = Gdk::RGBA(Abaddon::Get().GetSettings().LinkColor); + const auto color = tv.get_style_context()->get_color(Gtk::STATE_FLAG_LINK); + tag->property_foreground_rgba() = color; tag->set_property("underline", 1); // stupid workaround for vcpkg bug (i think) const auto chars_start = g_utf8_pointer_to_offset(text.c_str(), text.c_str() + mstart); diff --git a/src/components/chatwindow.cpp b/src/components/chatwindow.cpp index aeed4ed..9a2493d 100644 --- a/src/components/chatwindow.cpp +++ b/src/components/chatwindow.cpp @@ -5,7 +5,7 @@ #include "chatlist.hpp" #include "constants.hpp" #ifdef WITH_LIBHANDY - #include "channeltabswitcherhandy.hpp" +#include "channeltabswitcherhandy.hpp" #endif ChatWindow::ChatWindow() { @@ -109,7 +109,13 @@ ChatWindow::ChatWindow() { m_main->add(*m_meta); m_main->add(m_progress); - m_progress.show(); + m_progress.signal_start().connect([this]() { + m_progress.show(); + }); + + m_progress.signal_stop().connect([this]() { + m_progress.hide(); + }); m_main->show(); } diff --git a/src/components/progressbar.cpp b/src/components/progressbar.cpp index 75f86bb..65abfae 100644 --- a/src/components/progressbar.cpp +++ b/src/components/progressbar.cpp @@ -5,12 +5,19 @@ MessageUploadProgressBar::MessageUploadProgressBar() { auto &discord = Abaddon::Get().GetDiscordClient(); discord.signal_message_progress().connect([this](const std::string &nonce, float percent) { if (nonce == m_last_nonce) { + if (!m_active) { + m_active = true; + m_signal_start.emit(); + } set_fraction(percent); } }); discord.signal_message_send_fail().connect([this](const std::string &nonce, float) { - if (nonce == m_last_nonce) + if (nonce == m_last_nonce) { set_fraction(0.0); + m_active = false; + m_signal_stop.emit(); + } }); discord.signal_message_create().connect([this](const Message &msg) { if (msg.IsPending) { @@ -18,6 +25,16 @@ MessageUploadProgressBar::MessageUploadProgressBar() { } else if (msg.Nonce.has_value() && (*msg.Nonce == m_last_nonce)) { m_last_nonce = ""; set_fraction(0.0); + m_active = false; + m_signal_stop.emit(); } }); } + +MessageUploadProgressBar::type_signal_start MessageUploadProgressBar::signal_start() { + return m_signal_start; +} + +MessageUploadProgressBar::type_signal_stop MessageUploadProgressBar::signal_stop() { + return m_signal_stop; +} diff --git a/src/components/progressbar.hpp b/src/components/progressbar.hpp index 483ee47..8efb87a 100644 --- a/src/components/progressbar.hpp +++ b/src/components/progressbar.hpp @@ -6,5 +6,16 @@ public: MessageUploadProgressBar(); private: + bool m_active = false; std::string m_last_nonce; + + using type_signal_start = sigc::signal<void()>; + using type_signal_stop = sigc::signal<void()>; + + type_signal_start m_signal_start; + type_signal_stop m_signal_stop; + +public: + type_signal_start signal_start(); + type_signal_stop signal_stop(); }; diff --git a/src/dialogs/setstatus.cpp b/src/dialogs/setstatus.cpp index 7a3a038..24f0b29 100644 --- a/src/dialogs/setstatus.cpp +++ b/src/dialogs/setstatus.cpp @@ -1,17 +1,31 @@ #include "setstatus.hpp" +static const std::array feelings = { + "wonderful", + "splendiferous", + "delicious", + "outstanding", + "amazing", + "great", + "marvelous", + "superb", + "out of this world", + "stupendous", + "tip-top", + "horrible", +}; + SetStatusDialog::SetStatusDialog(Gtk::Window &parent) : Gtk::Dialog("Set Status", parent, true) , m_layout(Gtk::ORIENTATION_VERTICAL) - , m_bottom(Gtk::ORIENTATION_HORIZONTAL) , m_ok("OK") - , m_cancel("Cancel") - , m_bbox(Gtk::ORIENTATION_HORIZONTAL) { - set_default_size(300, 50); + , m_cancel("Cancel") { + set_default_size(350, 200); get_style_context()->add_class("app-window"); get_style_context()->add_class("app-popup"); + get_style_context()->add_class("set-status-dialog"); - m_text.set_placeholder_text("Status text"); + m_text.set_placeholder_text("I feel " + Glib::ustring(feelings[rand() % feelings.size()]) + "!"); m_status_combo.append("online", "Online"); m_status_combo.append("dnd", "Do Not Disturb"); @@ -35,16 +49,17 @@ SetStatusDialog::SetStatusDialog(Gtk::Window &parent) response(Gtk::RESPONSE_CANCEL); }); - m_bbox.pack_start(m_ok, Gtk::PACK_SHRINK); - m_bbox.pack_start(m_cancel, Gtk::PACK_SHRINK); - m_bbox.set_layout(Gtk::BUTTONBOX_END); + m_layout.pack_start(*Gtk::make_managed<Gtk::Label>("How are you, " + Abaddon::Get().GetDiscordClient().GetUserData().GetDisplayName() + "?", Gtk::ALIGN_START)); + m_layout.pack_start(m_text); + m_layout.pack_start(*Gtk::make_managed<Gtk::Label>("Status", Gtk::ALIGN_START)); + m_layout.pack_start(m_status_combo); + m_layout.pack_start(*Gtk::make_managed<Gtk::Label>("Activity", Gtk::ALIGN_START)); + m_layout.pack_start(m_type_combo); - m_bottom.add(m_status_combo); - m_bottom.add(m_type_combo); - m_bottom.add(m_bbox); - m_layout.add(m_text); - m_layout.add(m_bottom); get_content_area()->add(m_layout); + get_action_area()->pack_start(m_ok, Gtk::PACK_SHRINK); + get_action_area()->pack_start(m_cancel, Gtk::PACK_SHRINK); + get_action_area()->set_layout(Gtk::BUTTONBOX_START); show_all_children(); } diff --git a/src/dialogs/setstatus.hpp b/src/dialogs/setstatus.hpp index b0e6a4c..d4a015d 100644 --- a/src/dialogs/setstatus.hpp +++ b/src/dialogs/setstatus.hpp @@ -8,14 +8,12 @@ public: PresenceStatus GetStatusType() const; std::string GetActivityName() const; -protected: +private: Gtk::Box m_layout; - Gtk::Box m_bottom; Gtk::Entry m_text; Gtk::ComboBoxText m_status_combo; Gtk::ComboBoxText m_type_combo; Gtk::Button m_ok; Gtk::Button m_cancel; - Gtk::ButtonBox m_bbox; }; diff --git a/src/settings.cpp b/src/settings.cpp index c824a34..368d5bb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -68,7 +68,6 @@ void SettingsManager::ReadSettings() { SMINT("http", "concurrent", CacheHTTPConcurrency); SMSTR("http", "user_agent", UserAgent); SMSTR("style", "expandercolor", ChannelsExpanderColor); - SMSTR("style", "linkcolor", LinkColor); SMSTR("style", "nsfwchannelcolor", NSFWChannelColor); SMSTR("style", "channelcolor", ChannelColor); SMSTR("style", "mentionbadgecolor", MentionBadgeColor); @@ -159,7 +158,6 @@ void SettingsManager::Close() { SMINT("http", "concurrent", CacheHTTPConcurrency); SMSTR("http", "user_agent", UserAgent); SMSTR("style", "expandercolor", ChannelsExpanderColor); - SMSTR("style", "linkcolor", LinkColor); SMSTR("style", "nsfwchannelcolor", NSFWChannelColor); SMSTR("style", "channelcolor", ChannelColor); SMSTR("style", "mentionbadgecolor", MentionBadgeColor); diff --git a/src/settings.hpp b/src/settings.hpp index 037233b..67ba515 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -39,7 +39,6 @@ public: // [style] // TODO: convert to StyleProperty... or maybe not? i still cant figure out what the "correct" method is for this - std::string LinkColor { "rgba(40, 200, 180, 255)" }; std::string ChannelsExpanderColor { "rgba(255, 83, 112, 255)" }; std::string NSFWChannelColor { "#ed6666" }; std::string ChannelColor { "#fbfbfb" }; diff --git a/src/windows/voicesettingswindow.cpp b/src/windows/voicesettingswindow.cpp index 97f77b5..1a112f5 100644 --- a/src/windows/voicesettingswindow.cpp +++ b/src/windows/voicesettingswindow.cpp @@ -12,6 +12,7 @@ VoiceSettingsWindow::VoiceSettingsWindow() : m_main(Gtk::ORIENTATION_VERTICAL) { get_style_context()->add_class("app-window"); + get_style_context()->add_class("voice-settings-window"); set_default_size(300, 300); m_encoding_mode.append("Voice"); @@ -115,10 +116,21 @@ VoiceSettingsWindow::VoiceSettingsWindow() m_signal_gain.emit(m_gain.get_value() / 100.0); }); - m_main.add(m_encoding_mode); - m_main.add(m_signal); - m_main.add(m_bitrate); - m_main.add(m_gain); + auto *layout = Gtk::make_managed<Gtk::HBox>(); + auto *labels = Gtk::make_managed<Gtk::VBox>(); + auto *widgets = Gtk::make_managed<Gtk::VBox>(); + layout->pack_start(*labels, false, true, 5); + layout->pack_start(*widgets); + labels->pack_start(*Gtk::make_managed<Gtk::Label>("Coding Mode", Gtk::ALIGN_END)); + labels->pack_start(*Gtk::make_managed<Gtk::Label>("Signal Hint", Gtk::ALIGN_END)); + labels->pack_start(*Gtk::make_managed<Gtk::Label>("Bitrate", Gtk::ALIGN_END)); + labels->pack_start(*Gtk::make_managed<Gtk::Label>("Gain", Gtk::ALIGN_END)); + widgets->pack_start(m_encoding_mode); + widgets->pack_start(m_signal); + widgets->pack_start(m_bitrate); + widgets->pack_start(m_gain); + + m_main.add(*layout); add(m_main); show_all_children(); diff --git a/src/windows/voicewindow.cpp b/src/windows/voicewindow.cpp index 16a9fed..825681c 100644 --- a/src/windows/voicewindow.cpp +++ b/src/windows/voicewindow.cpp @@ -181,7 +181,7 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) m_mix_mono.set_active(audio.GetMixMono()); m_mix_mono.signal_toggled().connect([this]() { - Abaddon::Get().GetAudio().SetMixMono(m_mix_mono.get_active()); + Abaddon::Get().GetAudio().SetMixMono(m_mix_mono.get_active()); }); auto *playback_renderer = Gtk::make_managed<Gtk::CellRendererText>(); @@ -225,20 +225,40 @@ VoiceWindow::VoiceWindow(Snowflake channel_id) window->show(); }); + auto *sliders_container = Gtk::make_managed<Gtk::HBox>(); + auto *sliders_labels = Gtk::make_managed<Gtk::VBox>(); + auto *sliders_sliders = Gtk::make_managed<Gtk::VBox>(); + sliders_container->pack_start(*sliders_labels, false, true, 2); + sliders_container->pack_start(*sliders_sliders); + sliders_labels->pack_start(*Gtk::make_managed<Gtk::Label>("Threshold", Gtk::ALIGN_END)); + sliders_labels->pack_start(*Gtk::make_managed<Gtk::Label>("Gain", Gtk::ALIGN_END)); + sliders_sliders->pack_start(m_vad_param); + sliders_sliders->pack_start(m_capture_gain); + + auto *combos_container = Gtk::make_managed<Gtk::HBox>(); + auto *combos_labels = Gtk::make_managed<Gtk::VBox>(); + auto *combos_combos = Gtk::make_managed<Gtk::VBox>(); + combos_container->pack_start(*combos_labels, false, true, 6); + combos_container->pack_start(*combos_combos, Gtk::PACK_EXPAND_WIDGET, 6); + combos_labels->pack_start(*Gtk::make_managed<Gtk::Label>("VAD Method", Gtk::ALIGN_END)); + combos_labels->pack_start(*Gtk::make_managed<Gtk::Label>("Output Device", Gtk::ALIGN_END)); + combos_labels->pack_start(*Gtk::make_managed<Gtk::Label>("Input Device", Gtk::ALIGN_END)); + combos_combos->pack_start(m_vad_combo); + combos_combos->pack_start(m_playback_combo); + combos_combos->pack_start(m_capture_combo); + m_scroll.add(m_user_list); m_controls.add(m_mute); m_controls.add(m_deafen); m_controls.add(m_noise_suppression); m_controls.add(m_mix_mono); - m_main.add(m_menu_bar); - m_main.add(m_controls); - m_main.add(m_vad_value); - m_main.add(m_vad_param); - m_main.add(m_capture_gain); - m_main.add(m_scroll); - m_main.add(m_vad_combo); - m_main.add(m_playback_combo); - m_main.add(m_capture_combo); + m_main.pack_start(m_menu_bar); + m_main.pack_start(m_controls); + m_main.pack_start(m_vad_value); + m_main.pack_start(*Gtk::make_managed<Gtk::Label>("Input Settings")); + m_main.pack_start(*sliders_container); + m_main.pack_start(m_scroll); + m_main.pack_start(*combos_container, Gtk::PACK_EXPAND_WIDGET, 2); add(m_main); show_all_children(); |