aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/desktop.vala95
-rw-r--r--src/phone.vala53
-rw-r--r--src/profile.vala105
3 files changed, 139 insertions, 114 deletions
diff --git a/src/desktop.vala b/src/desktop.vala
index 5eb914b..24d7f9f 100644
--- a/src/desktop.vala
+++ b/src/desktop.vala
@@ -21,10 +21,8 @@ class Desktop: Profile
{
private uint idle_rebuild_id = 0;
private Settings settings;
- private Bluetooth bluetooth;
private SimpleActionGroup action_group;
- private SimpleAction root_action;
private Menu device_section;
private HashTable<uint,SimpleAction> connect_actions;
@@ -41,20 +39,19 @@ class Desktop: Profile
public Desktop (Bluetooth bluetooth, SimpleActionGroup action_group)
{
- base ("desktop");
+ const string profile_name = "desktop";
+
+ base (bluetooth, profile_name);
- this.bluetooth = bluetooth;
this.action_group = action_group;
connect_actions = new HashTable<uint,SimpleAction>(direct_hash, direct_equal);
settings = new Settings ("com.canonical.indicator.bluetooth");
- root_action = create_root_action ();
-
// build the static actions
Action[] actions = {};
- actions += root_action;
+ actions += get_root_action (profile_name);
actions += create_enabled_action (bluetooth);
actions += create_discoverable_action (bluetooth);
actions += create_wizard_action ();
@@ -66,8 +63,10 @@ class Desktop: Profile
build_menu ();
- settings.changed["visible"].connect (()=> update_root_action_state());
- bluetooth.notify.connect (() => update_root_action_state());
+ // know when to show the indicator & when to hide it
+ settings.changed["visible"].connect (()=> update_visibility());
+ bluetooth.notify.connect (() => update_visibility());
+ update_visibility ();
// when devices change, rebuild our device section
bluetooth.devices_changed.connect (()=> {
@@ -80,6 +79,11 @@ class Desktop: Profile
});
}
+ void update_visibility ()
+ {
+ visible = bluetooth.powered && !bluetooth.blocked && settings.get_boolean("visible");
+ }
+
///
/// MenuItems
///
@@ -165,9 +169,7 @@ class Desktop: Profile
// quick toggles section
section = new Menu ();
- item = new MenuItem ("Bluetooth", "indicator.desktop-enabled");
- item.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.switch");
- section.append_item (item);
+ section.append_item (create_enabled_menuitem ());
item = new MenuItem ("Visible", "indicator.desktop-discoverable");
item.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.switch");
section.append_item (item);
@@ -186,34 +188,12 @@ class Desktop: Profile
}
///
- /// Action Helpers
- ///
-
- void spawn_command_line_async (string command)
- {
- try {
- Process.spawn_command_line_async (command);
- } catch (Error e) {
- warning ("unable to launch '$command': $(e.message)");
- }
- }
-
- void show_control_center (string panel)
- {
- spawn_command_line_async ("gnome-control-center " + panel);
- }
-
- ///
/// Actions
///
- Action create_enabled_action (Bluetooth bluetooth)
+ void show_settings (string panel)
{
- var action = new SimpleAction.stateful ("desktop-enabled", null, !bluetooth.blocked);
- action.activate.connect (() => action.set_state (!action.get_state().get_boolean()));
- action.notify["state"].connect (() => bluetooth.try_set_blocked (!action.get_state().get_boolean()));
- bluetooth.notify["blocked"].connect (() => action.set_state (!bluetooth.blocked));
- return action;
+ spawn_command_line_async ("gnome-control-center " + panel);
}
Action create_discoverable_action (Bluetooth bluetooth)
@@ -263,48 +243,7 @@ class Desktop: Profile
Action create_show_settings_action ()
{
var action = new SimpleAction ("desktop-show-settings", VariantType.STRING);
- action.activate.connect ((action, panel) => show_control_center (panel.get_string()));
+ action.activate.connect ((action, panel) => show_settings (panel.get_string()));
return action;
}
-
- private Variant action_state_for_root ()
- {
- bool blocked = bluetooth.blocked;
- bool powered = bluetooth.powered;
-
- settings.changed["visible"].connect (()=> update_root_action_state());
-
- bool visible = powered && settings.get_boolean("visible");
-
- string a11y;
- string icon_name;
- if (powered && !blocked)
- {
- a11y = "Bluetooth (on)";
- icon_name = "bluetooth-active";
- }
- else
- {
- a11y = "Bluetooth (off)";
- icon_name = "bluetooth-disabled";
- }
-
- var icon = new ThemedIcon.with_default_fallbacks (icon_name);
-
- var builder = new VariantBuilder (new VariantType ("a{sv}"));
- builder.add ("{sv}", "visible", new Variant ("b", visible));
- builder.add ("{sv}", "accessible-desc", new Variant ("s", a11y));
- builder.add ("{sv}", "icon", icon.serialize());
- return builder.end ();
- }
-
- SimpleAction create_root_action ()
- {
- return new SimpleAction.stateful ("root-desktop", null, action_state_for_root());
- }
-
- void update_root_action_state ()
- {
- root_action.set_state (action_state_for_root ());
- }
}
diff --git a/src/phone.vala b/src/phone.vala
index de5febe..05e6b9d 100644
--- a/src/phone.vala
+++ b/src/phone.vala
@@ -19,57 +19,54 @@
class Phone: Profile
{
- Bluetooth bluetooth;
SimpleActionGroup action_group;
public Phone (Bluetooth bluetooth, SimpleActionGroup action_group)
{
- base ("phone");
+ const string profile_name = "phone";
+ base (bluetooth, profile_name);
this.bluetooth = bluetooth;
this.action_group = action_group;
// build the static actions
Action[] actions = {};
- actions += new SimpleAction.stateful ("root-phone", null, action_state_for_root());
+ actions += get_root_action (profile_name);
+ actions += create_enabled_action (bluetooth);
actions += create_settings_action ();
foreach (var a in actions)
action_group.insert (a);
var section = new Menu ();
- section.append (_("Sound settingsā€¦"), "indicator.phone-settings");
+ section.append_item (create_enabled_menuitem ());
+ section.append (_("Bluetooth settingsā€¦"), "indicator.phone-show-settings::bluetooth");
menu.append_section (null, section);
+
+ // know when to show the indicator & when to hide it
+ bluetooth.notify.connect (() => update_visibility());
+ update_visibility ();
+
+ bluetooth.notify.connect (() => update_root_action_state());
}
- Action create_settings_action ()
+ void update_visibility ()
{
- var action = new SimpleAction ("phone-settings", null);
+ visible = bluetooth.powered && !bluetooth.blocked;
+ }
- action.activate.connect ((action, param) => {
- try {
- Process.spawn_command_line_async ("system-settings bluetooth");
- } catch (Error e) {
- warning (@"unable to launch settings: $(e.message)");
- }
- });
+ ///
+ /// Actions
+ ///
- return action;
+ void show_settings (string panel)
+ {
+ spawn_command_line_async ("system-settings " + panel);
}
- private Variant action_state_for_root ()
+ Action create_settings_action ()
{
- var label = "Hello World"; // FIXME
- var a11y = "Hello World"; // FIXME
- var visible = true; // FIXME
-
- string icon_name = "bluetooth"; // FIXME: enabled, disabled, connected, etc.
- var icon = new ThemedIcon.with_default_fallbacks (icon_name);
-
- var builder = new VariantBuilder (new VariantType ("a{sv}"));
- builder.add ("{sv}", "visible", new Variant ("b", visible));
- builder.add ("{sv}", "label", new Variant ("s", label));
- builder.add ("{sv}", "accessible-desc", new Variant ("s", a11y));
- builder.add ("{sv}", "icon", icon.serialize());
- return builder.end ();
+ var action = new SimpleAction ("phone-show-settings", VariantType.STRING);
+ action.activate.connect ((action, panel) => show_settings (panel.get_string()));
+ return action;
}
}
diff --git a/src/profile.vala b/src/profile.vala
index d839121..74c8242 100644
--- a/src/profile.vala
+++ b/src/profile.vala
@@ -19,29 +19,32 @@
class Profile: Object
{
- protected string name;
+ protected Bluetooth bluetooth;
+ protected string profile_name;
protected Menu root;
protected Menu menu;
- public Profile (string name)
+ protected bool visible { get; set; default = true; }
+
+ public Profile (Bluetooth bluetooth, string profile_name)
{
- this.name = name;
+ this.bluetooth = bluetooth;
+ this.profile_name = profile_name;
menu = new Menu ();
- var root_item = new MenuItem (null, "indicator.root-" + name);
- root_item.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.root");
- root_item.set_submenu (menu);
+ var item = create_root_menuitem ();
+ item.set_submenu (menu);
root = new Menu ();
- root.append_item (root_item);
+ root.append_item (item);
}
public void export_menu (DBusConnection connection, string object_path)
{
try
{
- debug (@"exporting '$name' on $object_path");
+ debug (@"exporting '$profile_name' on $object_path");
connection.export_menu_model (object_path, this.root);
}
catch (Error e)
@@ -49,4 +52,90 @@ class Profile: Object
critical (@"Unable to export menu on $object_path: $(e.message)");
}
}
+
+ protected void spawn_command_line_async (string command)
+ {
+ try {
+ Process.spawn_command_line_async (command);
+ } catch (Error e) {
+ warning (@"Unable to launch '$command': $(e.message)");
+ }
+ }
+
+ ///
+ /// Menu Items
+ ///
+
+ protected MenuItem create_enabled_menuitem ()
+ {
+ MenuItem item = new MenuItem ("Bluetooth", "indicator.bluetooth-enabled");
+ item.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.switch");
+ return item;
+ }
+
+ private MenuItem create_root_menuitem ()
+ {
+ var item = new MenuItem (null, @"indicator.root-$profile_name");
+ item.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.root");
+ return item;
+ }
+
+ ///
+ /// Actions
+ ///
+
+ protected Action create_enabled_action (Bluetooth bluetooth)
+ {
+ var action = new SimpleAction.stateful ("bluetooth-enabled", null, !bluetooth.blocked);
+ action.activate.connect (() => action.set_state (!action.get_state().get_boolean()));
+ action.notify["state"].connect (() => bluetooth.try_set_blocked (!action.get_state().get_boolean()));
+ bluetooth.notify["blocked"].connect (() => action.set_state (!bluetooth.blocked));
+ return action;
+ }
+
+ protected SimpleAction root_action = null;
+
+ protected SimpleAction get_root_action (string profile)
+ {
+ if (root_action == null)
+ {
+ root_action = new SimpleAction.stateful (@"root-$profile", null, action_state_for_root());
+
+ this.notify["visible"].connect (() => update_root_action_state());
+ }
+
+ return root_action;
+ }
+
+ protected void update_root_action_state ()
+ {
+ root_action.set_state (action_state_for_root ());
+ }
+
+ protected Variant action_state_for_root ()
+ {
+ bool blocked = bluetooth.blocked;
+ bool powered = bluetooth.powered;
+
+ string a11y;
+ string icon_name;
+ if (powered && !blocked)
+ {
+ a11y = "Bluetooth (on)";
+ icon_name = "bluetooth-active";
+ }
+ else
+ {
+ a11y = "Bluetooth (off)";
+ icon_name = "bluetooth-disabled";
+ }
+
+ var icon = new ThemedIcon.with_default_fallbacks (icon_name);
+
+ var builder = new VariantBuilder (new VariantType ("a{sv}"));
+ builder.add ("{sv}", "visible", new Variant.boolean (visible));
+ builder.add ("{sv}", "accessible-desc", new Variant.string (a11y));
+ builder.add ("{sv}", "icon", icon.serialize());
+ return builder.end ();
+ }
}