/* * Copyright 2013 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authors: * Charles Kerr */ class Profile: Object { protected Bluetooth bluetooth; protected string profile_name; protected Menu root; protected Menu menu; protected bool visible { get; set; default = true; } public Profile (Bluetooth bluetooth, string profile_name) { this.bluetooth = bluetooth; this.profile_name = profile_name; menu = new Menu (); var item = create_root_menuitem (); item.set_submenu (menu); root = new Menu (); root.append_item (item); } public void export_menu (DBusConnection connection, string object_path) { try { debug (@"exporting '$profile_name' on $object_path"); connection.export_menu_model (object_path, this.root); } catch (Error e) { 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 (); } }