summary refs log tree commit diff
path: root/src/kayleevc/gui.py
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2025-09-06 15:42:27 -0700
committerIrene Knapp <ireneista@irenes.space>2025-09-06 15:42:27 -0700
commitcf6e693773101b5ac6aea7a4186e7e15ce4508d5 (patch)
tree139914c41bc17e7e5df132f5b3f2672b68394afd /src/kayleevc/gui.py
parentbaeb0e1fa08fb6b21e4a22458de16b4948d1f2d0 (diff)
move all the Kaylee code into a subdirectory
this is preparation for merging it into the Pollyana repo

Force-Push: yes
Change-Id: I155624ba39a0d212c999f38aaf2de2cd62b7aa49
Diffstat (limited to 'src/kayleevc/gui.py')
-rw-r--r--src/kayleevc/gui.py213
1 files changed, 213 insertions, 0 deletions
diff --git a/src/kayleevc/gui.py b/src/kayleevc/gui.py
new file mode 100644
index 0000000..27085a8
--- /dev/null
+++ b/src/kayleevc/gui.py
@@ -0,0 +1,213 @@
+# This is part of Kaylee
+# -- this code is licensed GPLv3
+# Copyright 2015-2016 Clayton G. Hobbs
+# Portions Copyright 2013 Jezra
+
+import sys
+import gi
+from gi.repository import GObject
+# Gtk
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk, Gdk
+
+
+class GTKTrayInterface(GObject.GObject):
+    __gsignals__ = {
+        'command' : (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE,
+                     (GObject.TYPE_STRING,))
+    }
+    idle_text = "Kaylee - Idle"
+    listening_text = "Kaylee - Listening"
+
+    def __init__(self, args, continuous):
+        GObject.GObject.__init__(self)
+        self.continuous = continuous
+
+        self.statusicon = Gtk.StatusIcon()
+        self.statusicon.set_title("Kaylee")
+        self.statusicon.set_name("Kaylee")
+        self.statusicon.set_tooltip_text(self.idle_text)
+        self.statusicon.set_has_tooltip(True)
+        self.statusicon.connect("activate", self.continuous_toggle)
+        self.statusicon.connect("popup-menu", self.popup_menu)
+
+        self.menu = Gtk.Menu()
+        self.menu_listen = Gtk.MenuItem('Listen')
+        self.menu_continuous = Gtk.CheckMenuItem('Continuous')
+        self.menu_quit = Gtk.MenuItem('Quit')
+        self.menu.append(self.menu_listen)
+        self.menu.append(self.menu_continuous)
+        self.menu.append(self.menu_quit)
+        self.menu_listen.connect("activate", self.toggle_listen)
+        self.menu_continuous.connect("toggled", self.toggle_continuous)
+        self.menu_quit.connect("activate", self.quit)
+        self.menu.show_all()
+
+    def continuous_toggle(self, item):
+        checked = self.menu_continuous.get_active()
+        self.menu_continuous.set_active(not checked)
+
+    def toggle_continuous(self, item):
+        checked = self.menu_continuous.get_active()
+        self.menu_listen.set_sensitive(not checked)
+        if checked:
+            self.menu_listen.set_label("Listen")
+            self.emit('command', "continuous_listen")
+            self.statusicon.set_tooltip_text(self.listening_text)
+            self.set_icon_active()
+        else:
+            self.set_icon_inactive()
+            self.statusicon.set_tooltip_text(self.idle_text)
+            self.emit('command', "continuous_stop")
+
+    def toggle_listen(self, item):
+        val = self.menu_listen.get_label()
+        if val == "Listen":
+            self.set_icon_active()
+            self.emit("command", "listen")
+            self.menu_listen.set_label("Stop")
+            self.statusicon.set_tooltip_text(self.listening_text)
+        else:
+            self.set_icon_inactive()
+            self.menu_listen.set_label("Listen")
+            self.emit("command", "stop")
+            self.statusicon.set_tooltip_text(self.idle_text)
+
+    def popup_menu(self, item, button, time):
+        self.menu.popup(None, None, Gtk.StatusIcon.position_menu, item, button, time)
+
+    def run(self):
+        # Set the icon
+        self.set_icon_inactive()
+        if self.continuous:
+            self.menu_continuous.set_active(True)
+            self.set_icon_active()
+        else:
+            self.menu_continuous.set_active(False)
+        self.statusicon.set_visible(True)
+
+    def quit(self, item):
+        self.statusicon.set_visible(False)
+        self.emit("command", "quit")
+
+    def finished(self, text):
+        if not self.menu_continuous.get_active():
+            self.menu_listen.set_label("Listen")
+            self.set_icon_inactive()
+            self.statusicon.set_tooltip_text(self.idle_text)
+
+    def set_icon_active_asset(self, i):
+        self.icon_active = i
+
+    def set_icon_inactive_asset(self, i):
+        self.icon_inactive = i
+
+    def set_icon_active(self):
+        self.statusicon.set_from_file(self.icon_active)
+
+    def set_icon_inactive(self):
+        self.statusicon.set_from_file(self.icon_inactive)
+
+
+class GTKInterface(GObject.GObject):
+    __gsignals__ = {
+        'command': (GObject.SIGNAL_RUN_LAST, GObject.TYPE_NONE,
+                    (GObject.TYPE_STRING,))
+    }
+
+    def __init__(self, args, continuous):
+        GObject.GObject.__init__(self)
+        self.continuous = continuous
+        # Make a window
+        self.window = Gtk.Window(Gtk.WindowType.TOPLEVEL)
+        self.window.connect("delete_event", self.delete_event)
+        # Give the window a name
+        self.window.set_title("Kaylee")
+        self.window.set_resizable(False)
+
+        layout = Gtk.VBox()
+        self.window.add(layout)
+        # Make a listen/stop button
+        self.lsbutton = Gtk.Button("Listen")
+        layout.add(self.lsbutton)
+        # Make a continuous button
+        self.ccheckbox = Gtk.CheckButton("Continuous Listen")
+        layout.add(self.ccheckbox)
+
+        # Connect the buttons
+        self.lsbutton.connect("clicked", self.lsbutton_clicked)
+        self.ccheckbox.connect("clicked", self.ccheckbox_clicked)
+
+        # Add a label to the UI to display the last command
+        self.label = Gtk.Label()
+        layout.add(self.label)
+
+        # Create an accellerator group for this window
+        accel = Gtk.AccelGroup()
+        # Add the ctrl+q to quit
+        accel.connect(Gdk.keyval_from_name('q'), Gdk.ModifierType.CONTROL_MASK,
+                Gtk.AccelFlags.VISIBLE, self.accel_quit)
+        # Lock the group
+        accel.lock()
+        # Add the group to the window
+        self.window.add_accel_group(accel)
+
+    def ccheckbox_clicked(self, widget):
+        checked = self.ccheckbox.get_active()
+        self.lsbutton.set_sensitive(not checked)
+        if checked:
+            self.lsbutton_stopped()
+            self.emit('command', "continuous_listen")
+            self.set_icon_active()
+        else:
+            self.emit('command', "continuous_stop")
+            self.set_icon_inactive()
+
+    def lsbutton_stopped(self):
+        self.lsbutton.set_label("Listen")
+
+    def lsbutton_clicked(self, button):
+        val = self.lsbutton.get_label()
+        if val == "Listen":
+            self.emit("command", "listen")
+            self.lsbutton.set_label("Stop")
+            # Clear the label
+            self.label.set_text("")
+            self.set_icon_active()
+        else:
+            self.lsbutton_stopped()
+            self.emit("command", "stop")
+            self.set_icon_inactive()
+
+    def run(self):
+        # Set the default icon
+        self.set_icon_inactive()
+        self.window.show_all()
+        if self.continuous:
+            self.set_icon_active()
+            self.ccheckbox.set_active(True)
+
+    def accel_quit(self, accel_group, acceleratable, keyval, modifier):
+        self.emit("command", "quit")
+
+    def delete_event(self, x, y):
+        self.emit("command", "quit")
+
+    def finished(self, text):
+        # If the continuous isn't pressed
+        if not self.ccheckbox.get_active():
+            self.lsbutton_stopped()
+            self.set_icon_inactive()
+        self.label.set_text(text)
+
+    def set_icon_active_asset(self, i):
+        self.icon_active = i
+
+    def set_icon_inactive_asset(self, i):
+        self.icon_inactive = i
+
+    def set_icon_active(self):
+        Gtk.Window.set_default_icon_from_file(self.icon_active)
+
+    def set_icon_inactive(self):
+        Gtk.Window.set_default_icon_from_file(self.icon_inactive)