From 6d974fb826c0e05a8c1f74e6bc913ec507e1d5c6 Mon Sep 17 00:00:00 2001 From: Jose Munoz Date: Fri, 5 Aug 2022 09:46:47 -0700 Subject: [PATCH 1/3] encapsulates the popover widget for easier extension --- meson.build | 1 + src/Indicator.vala | 23 +++++------------------ src/PopOverWidget.vala | 30 ++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 src/PopOverWidget.vala diff --git a/meson.build b/meson.build index 3b6bae5..7f85fe2 100644 --- a/meson.build +++ b/meson.build @@ -28,6 +28,7 @@ shared_module( meson.project_name(), 'src/Indicator.vala', 'src/Caffeinate.vala', + 'src/PopOverWidget.vala', dependencies: [ dependency('glib-2.0'), dependency('gio-2.0'), diff --git a/src/Indicator.vala b/src/Indicator.vala index 8fb12a3..f06bf79 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -1,7 +1,6 @@ public class Caffeine.Indicator : Wingpanel.Indicator { - private Gtk.Box popover_widget; + private PopOverWidget popover_widget; private Gtk.Image display_widget; - private Caffeinate caffeine; public Indicator () { Object ( @@ -9,7 +8,6 @@ public class Caffeine.Indicator : Wingpanel.Indicator { ); visible = true; - caffeine = new Caffeinate (); } public override Gtk.Widget get_display_widget () { @@ -22,22 +20,11 @@ public class Caffeine.Indicator : Wingpanel.Indicator { public override Gtk.Widget ? get_widget () { if (popover_widget == null) { - popover_widget = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); - - var main_switch = new Granite.SwitchModelButton ("Caffeinate"); - main_switch.get_style_context ().add_class (Granite.STYLE_CLASS_H4_LABEL); - main_switch.toggled.connect ((nextState) => { - if (nextState.active) { - display_widget.icon_name = "caffeine-cup-full-symbolic"; - caffeine.activate (); - - } else { - display_widget.icon_name = "caffeine-cup-empty-symbolic"; - caffeine.stop (); - } - }); + popover_widget = new PopOverWidget (); - popover_widget.add (main_switch); + popover_widget.toggle_caffeine.connect ((is_active) => { + display_widget.icon_name = is_active ? "caffeine-cup-full-symbolic" : "caffeine-cup-empty-symbolic"; + }); } return popover_widget; diff --git a/src/PopOverWidget.vala b/src/PopOverWidget.vala new file mode 100644 index 0000000..36e26a9 --- /dev/null +++ b/src/PopOverWidget.vala @@ -0,0 +1,30 @@ +public class PopOverWidget : Gtk.Box { + public signal void toggle_caffeine (bool is_active); + + Caffeinate caffeine; + Granite.SwitchModelButton main_switch; + + public PopOverWidget () { + caffeine = new Caffeinate (); + main_switch = new Granite.SwitchModelButton ("Caffeinate"); + + main_switch.get_style_context ().add_class (Granite.STYLE_CLASS_H4_LABEL); + main_switch.toggled.connect ((nextState) => { + toggle_caffeine (nextState.active); + + if (nextState.active) { + caffeine.activate (); + } else { + caffeine.stop (); + } + }); + + this.pack_start (main_switch); + } + + construct { + orientation = Gtk.Orientation.VERTICAL; + + show_all (); + } +} \ No newline at end of file From e3682d1971734243fd7ef51dcf756375a6bc5283 Mon Sep 17 00:00:00 2001 From: Jose Munoz Date: Fri, 5 Aug 2022 09:31:06 -0700 Subject: [PATCH 2/3] adds revealer switch for more options --- meson.build | 1 + src/RevealerSwitch.vala | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/RevealerSwitch.vala diff --git a/meson.build b/meson.build index 7f85fe2..001f0e7 100644 --- a/meson.build +++ b/meson.build @@ -29,6 +29,7 @@ shared_module( 'src/Indicator.vala', 'src/Caffeinate.vala', 'src/PopOverWidget.vala', + 'src/RevealerSwitch.vala', dependencies: [ dependency('glib-2.0'), dependency('gio-2.0'), diff --git a/src/RevealerSwitch.vala b/src/RevealerSwitch.vala new file mode 100644 index 0000000..c677753 --- /dev/null +++ b/src/RevealerSwitch.vala @@ -0,0 +1,35 @@ +class RevealerSwitch : Gtk.Box { + private Gtk.Revealer revealer; + private Granite.SwitchModelButton main_switch; + + public RevealerSwitch (string title, bool defaultOpen = false, bool inverted = false) { + this.main_switch = new Granite.SwitchModelButton (title) { + active = defaultOpen + }; + + this.revealer = new Gtk.Revealer () { + reveal_child = inverted ? !defaultOpen : defaultOpen + }; + + this.main_switch.toggled.connect ((nextState) => { + this.revealer.reveal_child = inverted ? !nextState.active : nextState.active; + }); + + + this.pack_start (this.main_switch); + this.pack_start (this.revealer); + } + + construct { + orientation = Gtk.Orientation.VERTICAL; + + set_has_window (false); + show_all (); + + } + + public new void add (Gtk.Widget child) { + this.revealer.add (child); + } + +} \ No newline at end of file From 02bfe0a6e90e55f63de3bb49bef656214bb750f9 Mon Sep 17 00:00:00 2001 From: Jose Munoz Date: Fri, 5 Aug 2022 14:38:10 -0700 Subject: [PATCH 3/3] adds timed session functionality --- README.md | 1 + assets/screenshot.jpeg | Bin 19094 -> 25908 bytes meson.build | 4 +- src/Caffeinate.vala | 42 ++++++++++++++++--- src/Indicator.vala | 1 + src/PopOverWidget.vala | 88 +++++++++++++++++++++++++++++++++------- src/RevealerSwitch.vala | 5 ++- 7 files changed, 119 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 9fa7ad9..902f259 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ You'll need the following dependencies: ``` +libnotify libwingpanel-2.0-dev meson valac diff --git a/assets/screenshot.jpeg b/assets/screenshot.jpeg index b8c4c16c494c864c2a4ad6ed991df5dd8113e9a1..c990a3d35729bcf95405fbc5ce6fa6943bc07e0d 100644 GIT binary patch literal 25908 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 { + this.stop (); + callback (); + + return false; + }); + + timer.attach (); + this.activate (); } } \ No newline at end of file diff --git a/src/Indicator.vala b/src/Indicator.vala index f06bf79..75573d4 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -41,5 +41,6 @@ public Wingpanel.Indicator ? get_indicator (Module module, Wingpanel.IndicatorMa return null; } + Notify.init("dev.josemunoz.wingpanel-caffeine"); return new Caffeine.Indicator (); } diff --git a/src/PopOverWidget.vala b/src/PopOverWidget.vala index 36e26a9..ce69e9e 100644 --- a/src/PopOverWidget.vala +++ b/src/PopOverWidget.vala @@ -1,25 +1,85 @@ public class PopOverWidget : Gtk.Box { public signal void toggle_caffeine (bool is_active); - Caffeinate caffeine; - Granite.SwitchModelButton main_switch; + private Caffeinate caffeine; + private Granite.SwitchModelButton main_switch; + private RevealerSwitch indefinite_switch; + private Notify.Notification disable_alert; + private Notify.Notification invalid_input_alert; public PopOverWidget () { - caffeine = new Caffeinate (); - main_switch = new Granite.SwitchModelButton ("Caffeinate"); + try { + caffeine = new Caffeinate (); + main_switch = new Granite.SwitchModelButton ("Caffeinate"); + indefinite_switch = new RevealerSwitch ("Indefinite", true, true); + invalid_input_alert = new Notify.Notification ("Caffeine", "The timeout can only be in numeric values", "dialog-warning"); + disable_alert = new Notify.Notification ("Decaffeinated", "Caffeine will no longer keep the system awake", "caffeine-cup-empty-symbolic"); - main_switch.get_style_context ().add_class (Granite.STYLE_CLASS_H4_LABEL); - main_switch.toggled.connect ((nextState) => { - toggle_caffeine (nextState.active); + bool is_indefinite = true; + Regex only_numbers = new Regex ("^[0-9]*$"); + var timeout_label = new Gtk.Label ("timeout in minutes:"); + var container = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); + var timeout_entry = new Granite.ValidatedEntry.from_regex (only_numbers); - if (nextState.active) { - caffeine.activate (); - } else { - caffeine.stop (); - } - }); + main_switch.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL); + indefinite_switch.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL); - this.pack_start (main_switch); + indefinite_switch.toggled.connect ((nextState) => { + is_indefinite = nextState; + }); + + main_switch.toggled.connect ((nextState) => { + toggle_caffeine (nextState.active); + timeout_entry.set_sensitive (!nextState.active); + indefinite_switch.set_sensitive (!nextState.active); + + if (nextState.active) { + if (is_indefinite) { + caffeine.activate (); + } else if (timeout_entry.is_valid) { + var timeout = int.parse (timeout_entry.get_text ()); + + caffeine.activateFor (timeout, () => { + main_switch.set_active (false); + + try { + disable_alert.show (); + } catch {} + }); + } else { + TimeoutSource timer = new TimeoutSource (1); + + timer.set_callback (() => { + main_switch.set_active (false); + + return false; + }); + + timer.attach (); + + try { + invalid_input_alert.show (); + } catch {} + } + } else { + caffeine.stop (); + } + }); + + disable_alert.set_timeout(3000); + timeout_entry.set_text ("30"); + timeout_entry.set_alignment (1); + timeout_entry.set_margin_end (10); + timeout_entry.set_width_chars (9); + indefinite_switch.add (container); + container.pack_start (timeout_label, true, true, 0); + container.pack_start (timeout_entry, false, false, 0); + container.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL); + + this.pack_start (main_switch); + this.pack_start (new Gtk.Separator (Gtk.Orientation.HORIZONTAL)); + this.pack_start (indefinite_switch); + } catch {} } construct { diff --git a/src/RevealerSwitch.vala b/src/RevealerSwitch.vala index c677753..daa4b9a 100644 --- a/src/RevealerSwitch.vala +++ b/src/RevealerSwitch.vala @@ -1,4 +1,6 @@ class RevealerSwitch : Gtk.Box { + public signal void toggled (bool is_active); + private Gtk.Revealer revealer; private Granite.SwitchModelButton main_switch; @@ -12,6 +14,7 @@ class RevealerSwitch : Gtk.Box { }; this.main_switch.toggled.connect ((nextState) => { + toggled (nextState.active); this.revealer.reveal_child = inverted ? !nextState.active : nextState.active; }); @@ -23,9 +26,7 @@ class RevealerSwitch : Gtk.Box { construct { orientation = Gtk.Orientation.VERTICAL; - set_has_window (false); show_all (); - } public new void add (Gtk.Widget child) {