From bbcdab2baabbaf5a72ab01f40944498743466d69 Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Wed, 22 Jul 2020 15:45:32 -0400 Subject: [PATCH] Base+MenuApplet: Add new controls and icons for AudioApplet Adds a classic volume slider to the AudioApplet. Percent text and mute state can now be toggled via checkboxes. Left click opens, right click mutes. Updates existing icons and adds unique icons for muted vs zero volume states. --- Base/res/icons/audio-volume-high.png | Bin 191 -> 196 bytes Base/res/icons/audio-volume-low.png | Bin 163 -> 180 bytes Base/res/icons/audio-volume-medium.png | Bin 180 -> 192 bytes Base/res/icons/audio-volume-muted.png | Bin 240 -> 230 bytes Base/res/icons/audio-volume-zero.png | Bin 0 -> 163 bytes MenuApplets/Audio/main.cpp | 120 ++++++++++++++++++++++--- 6 files changed, 108 insertions(+), 12 deletions(-) mode change 100644 => 100755 Base/res/icons/audio-volume-high.png mode change 100644 => 100755 Base/res/icons/audio-volume-low.png mode change 100644 => 100755 Base/res/icons/audio-volume-medium.png mode change 100644 => 100755 Base/res/icons/audio-volume-muted.png create mode 100755 Base/res/icons/audio-volume-zero.png diff --git a/Base/res/icons/audio-volume-high.png b/Base/res/icons/audio-volume-high.png old mode 100644 new mode 100755 index fd512d6ea759cd77d36c31b05fc68ac1b23fcc27..75879178092acafd8e918cde4f38337611b0f11a GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp@3=9kc9Bd2>3}+XAwPavm==OAR4AD5BoFI|$VZMi9 zOUgW@WbMeH?~+D zovG+QvH9Wk^YJ@!5)WMX!kxuDOKlCqx|il5hO<6@$Zop%;q`I-Nspe|GczClFITSn zMB%vDmk$?`TatF%pKv5mNEaloaXvXgLgRz{ zbQWQ=qm^AU7N(1{f9zkU!El$sEydTzW7(hdgoK12e?P06U4A(0ftik9VcLn{Cka2k zeirw;9BA^VX;#lN#_h}NokbT}a&BjvadLm%A0?|h|BVd{{=6@|{%ij76CdThCoHO% xCD`?_&QYjcGwn#G^d#Pj{(rN}K=y diff --git a/Base/res/icons/audio-volume-low.png b/Base/res/icons/audio-volume-low.png old mode 100644 new mode 100755 index b5baca3a1557022d32be32e854a65af8ca5718fa..839e2cb3a859e72e388908b48e28c4112add5597 GIT binary patch delta 152 zcmZ3?xP@_oN`1Abi(`n!`Q!u%jSuqES%l4wR(8qo9Lf5zf1L)y`l~)3em~A1IB?*@ z@8|w|{F-lXusAwX(SKs|!|UhcPkicmG3$X;oujYY<%Zk*`xkOuoYNA`eCA2KeVw4} zyZ@3B692yM$o_ji_{k6d6PJ4ec)oK_vPir=A!mV2<^?$hhKW)Jg4uG1Yr`2B7#KWV L{an^LB{Ts59A-zn delta 134 zcmdnOxR`N*N`026i(`n!`Q!u%jSuqES%l4wR(8qo9Lf5zf1L)y`l~uG{C@oXtRBZ( zAT74s!uW}1k-?u|Kf5h>_b*TrUi;8IMDe0u)674wkLxcw{MVkD`S5?a^0ogfyJT1% rHwtz=tW(sS_VK1e(WM2p3=D_mbn>6gU;c)Hfq}u()z4*}Q$iB}sgpa` diff --git a/Base/res/icons/audio-volume-medium.png b/Base/res/icons/audio-volume-medium.png old mode 100644 new mode 100755 index 839e2cb3a859e72e388908b48e28c4112add5597..d1906915787b4cf9e51f134e62eb6d1913d33dd6 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp@3=9kc9Bd2>3}+XAwPavmX!mq+4AD5BoFI|$L4Ll9 zuo-Vb z_iS5`@r!jUqp$G4h9A74JvazH3JUZD w@O+n^WZ}cC92Y$?M`?zY#EC$UXaEaloaXvXgLgRz{ zbQWQ=qm^AUJV&yA>|dwBu>Pu#hu@F$2M!$g@cX&{9>3<>8!V2_RP>+N{P6nu_!FOc zUd(zRRp;pIcDdm;|Nezs7w5D@GoN`9Z(k=U`|iJ_gv7t^JF@?t4}S8)|HS2<0G{vM mlPnT%PsmwdlX*dofnlPQLAKoC+HeL21_n=8KbLh*2~7YNgGo*R diff --git a/Base/res/icons/audio-volume-muted.png b/Base/res/icons/audio-volume-muted.png old mode 100644 new mode 100755 index 9f6940a4b3f77fb735c63573c71bd0a455eafcfc..ced31e0e5cc7ff16dd27495c6e946d8ce6bab522 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp@3=9kc9Bd2>3}+XAwPavmSnKKH7@~1LIYA=hgZz9I zVKd&!E*Tyc)4lwB4Kx4L#|ARQ2zkl`U*4YX|B$Qh{~yllAKu;!USno>D5oMT^V9)V z)w3I1KNvTkua0ZWKR?gNL*D*u$8~?}kQq5kppK1=jZH15>#^xk$qkyvmOcF6w8>&lS8x3O@)XA+CT3=4=ELvj+ZSrN zZA{E^Q*hq1%;NC+`TGmB+%A52ecfN5{+vB<;J|@|f`?{)M>C`p z)c*hfEWSKRgtx8wyy2gJ-?|_EzrUa7^pA)FHyPn8&Fm_X5qt&)1_o~?i5-%@>~mt_ y!_WVWlb^3E{&D$OWZ=QSCuUuE-1?7!VF{mq-R5ooUNSH+FnGH9xvX3}+XAwPavm$ntb?4AD5BoFI|$L4Ll9 zuo-VfLX*4V_j<_)Q^Y7>WO|u@D>G~C>od|xC@Z;-e@sG3W9CH;sFXyjF znly)f^TX@?@hV48*R!#;{kMG=_5ZVoWk;8~n?~F3-X~WaPN;2~B>0zsp-@IAKh5&j Rb_NCp22WQ%mvv4FO#m%-KuQ1r literal 0 HcmV?d00001 diff --git a/MenuApplets/Audio/main.cpp b/MenuApplets/Audio/main.cpp index 52319a6e53..42e9c92f9f 100644 --- a/MenuApplets/Audio/main.cpp +++ b/MenuApplets/Audio/main.cpp @@ -26,7 +26,11 @@ #include #include +#include +#include +#include #include +#include #include #include #include @@ -42,6 +46,8 @@ public: m_audio_client->on_muted_state_change = [this](bool muted) { if (m_audio_muted == muted) return; + m_mute_box->set_checked(!m_audio_muted); + m_slider->set_enabled(!muted); m_audio_muted = muted; update(); }; @@ -52,21 +58,88 @@ public: update(); }; - m_volume_level_bitmaps.append({66, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-high.png")}); - m_volume_level_bitmaps.append({33, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-medium.png")}); - m_volume_level_bitmaps.append({1, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-low.png")}); - m_volume_level_bitmaps.append({0, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-muted.png")}); + m_volume_level_bitmaps.append({ 66, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-high.png") }); + m_volume_level_bitmaps.append({ 33, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-medium.png") }); + m_volume_level_bitmaps.append({ 1, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-low.png") }); + m_volume_level_bitmaps.append({ 0, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-zero.png") }); + m_volume_level_bitmaps.append({ 0, Gfx::Bitmap::load_from_file("/res/icons/audio-volume-muted.png") }); + + m_slider_window = add(window()); + m_slider_window->set_frameless(true); + m_slider_window->set_resizable(false); + m_slider_window->set_minimizable(false); + m_slider_window->on_active_input_change = [this](bool is_active_input) { + if (!is_active_input) + close(); + }; + + m_root_container = m_slider_window->set_main_widget(); + m_root_container->set_fill_with_background_color(true); + m_root_container->set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill); + m_root_container->set_layout(); + m_root_container->layout()->set_margins({ 0, 4, 0, 4 }); + m_root_container->layout()->set_spacing(0); + m_root_container->set_frame_thickness(2); + m_root_container->set_frame_shape(Gfx::FrameShape::Container); + m_root_container->set_frame_shadow(Gfx::FrameShadow::Raised); + + m_percent_box = m_root_container->add("\xE2\x84\xB9"); + m_percent_box->set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); + m_percent_box->set_preferred_size(27, 16); + m_percent_box->set_checked(false); + m_percent_box->set_tooltip("Show percent"); + m_percent_box->on_checked = [&](bool show_percent) { + m_show_percent = show_percent; + if (!m_show_percent) { + window()->resize(16, 16); + m_percent_box->set_tooltip("Show percent"); + } else { + window()->resize(44, 16); + m_percent_box->set_tooltip("Hide percent"); + } + reposition_slider_window(); + GUI::Application::the()->hide_tooltip(); + }; + + m_slider = m_root_container->add(); + m_slider->set_max(20); + m_slider->set_value(0); + m_slider->set_knob_size_mode(GUI::Slider::KnobSizeMode::Proportional); + m_slider->set_size_policy(GUI::SizePolicy::Fill, GUI::SizePolicy::Fill); + m_slider->on_value_changed = [&](int value) { + int volume = clamp((20 - value) * 5, 0, 100); + m_audio_client->set_main_mix_volume(volume); + update(); + }; + + m_mute_box = m_root_container->add("\xE2\x9D\x8C"); + m_mute_box->set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); + m_mute_box->set_preferred_size(27, 16); + m_mute_box->set_checked(false); + m_mute_box->set_tooltip("Mute"); + m_mute_box->on_checked = [&](bool is_muted) { + m_mute_box->set_tooltip(is_muted ? "Unmute" : "Mute"); + m_audio_client->set_muted(is_muted); + GUI::Application::the()->hide_tooltip(); + }; } - virtual ~AudioWidget() override {} + virtual ~AudioWidget() override { } private: virtual void mousedown_event(GUI::MouseEvent& event) override { - if (event.button() != GUI::MouseButton::Left) + if (event.button() == GUI::MouseButton::Left) { + if (!m_slider_window->is_visible()) + open(); + else + close(); return; - m_audio_client->set_muted(!m_audio_muted); - update(); + } + if (event.button() == GUI::MouseButton::Right) { + m_audio_client->set_muted(!m_audio_muted); + update(); + } } virtual void mousewheel_event(GUI::MouseEvent& event) override @@ -75,6 +148,7 @@ private: return; int volume = clamp(m_audio_volume - event.wheel_delta() * 5, 0, 100); m_audio_client->set_main_mix_volume(volume); + m_slider->set_value(20 - (volume / 5)); update(); } @@ -87,8 +161,21 @@ private: auto& audio_bitmap = choose_bitmap_from_volume(); painter.blit({}, audio_bitmap, audio_bitmap.rect()); - auto volume_text = m_audio_muted ? "Mut" : String::format("%d%%", m_audio_volume); - painter.draw_text({16, 3, 24, 16}, volume_text, Gfx::Font::default_font(), Gfx::TextAlignment::TopLeft, palette().window_text()); + if (m_show_percent) { + auto volume_text = m_audio_muted ? "mute" : String::format("%d%%", m_audio_volume); + painter.draw_text({ 16, 3, 24, 16 }, volume_text, Gfx::Font::default_fixed_width_font(), Gfx::TextAlignment::TopLeft, palette().window_text()); + } + } + + void open() + { + reposition_slider_window(); + m_slider_window->show(); + } + + void close() + { + m_slider_window->hide(); } Gfx::Bitmap& choose_bitmap_from_volume() @@ -103,15 +190,24 @@ private: ASSERT_NOT_REACHED(); } + void reposition_slider_window() { m_slider_window->set_rect(window()->rect_in_menubar().x() - 20, 19, 50, 100); } + struct VolumeBitmapPair { int volume_threshold { 0 }; RefPtr bitmap; }; NonnullRefPtr m_audio_client; - Vector m_volume_level_bitmaps; + Vector m_volume_level_bitmaps; + bool m_show_percent { false }; bool m_audio_muted { false }; int m_audio_volume { 100 }; + + RefPtr m_slider; + RefPtr m_slider_window; + RefPtr m_mute_box; + RefPtr m_percent_box; + RefPtr m_root_container; }; int main(int argc, char** argv) @@ -132,7 +228,7 @@ int main(int argc, char** argv) window->set_has_alpha_channel(true); window->set_title("Audio"); window->set_window_type(GUI::WindowType::MenuApplet); - window->resize(42, 16); + window->resize(16, 16); window->set_main_widget(); window->show();