diff options
Diffstat (limited to 'src/actions/actionRegistry.vala')
-rw-r--r-- | src/actions/actionRegistry.vala | 102 |
1 files changed, 68 insertions, 34 deletions
diff --git a/src/actions/actionRegistry.vala b/src/actions/actionRegistry.vala index 091865f..135e90c 100644 --- a/src/actions/actionRegistry.vala +++ b/src/actions/actionRegistry.vala @@ -27,56 +27,68 @@ public class ActionRegistry : GLib.Object { /// A list containing all available Action types. ///////////////////////////////////////////////////////////////////// - public static Gee.ArrayList<Type> types { get; private set; } + public static Gee.ArrayList<string> types { get; private set; } ///////////////////////////////////////////////////////////////////// - /// Three maps associating a displayable name for each Action, + /// A map associating a displayable name for each Action, /// whether it has a custom icon and a name for the pies.conf /// file with it's type. ///////////////////////////////////////////////////////////////////// - public static Gee.HashMap<Type, string> names { get; private set; } - public static Gee.HashMap<Type, bool> icon_name_editables { get; private set; } - public static Gee.HashMap<Type, string> settings_names { get; private set; } + public static Gee.HashMap<string, TypeDescription?> descriptions { get; private set; } + + ///////////////////////////////////////////////////////////////////// + /// A helper class storing information on a Action type. + ///////////////////////////////////////////////////////////////////// + + public class TypeDescription { + public string name { get; set; default=""; } + public string icon { get; set; default=""; } + public string description { get; set; default=""; } + public string id { get; set; default=""; } + public bool icon_name_editable { get; set; default=false; } + } ///////////////////////////////////////////////////////////////////// /// Registers all Action types. ///////////////////////////////////////////////////////////////////// public static void init() { - types = new Gee.ArrayList<Type>(); - - names = new Gee.HashMap<Type, string>(); - icon_name_editables = new Gee.HashMap<Type, bool>(); - settings_names = new Gee.HashMap<Type, string>(); + types = new Gee.ArrayList<string>(); + descriptions = new Gee.HashMap<string, TypeDescription?>(); - string name = ""; - bool icon_name_editable = true; - string settings_name = ""; + TypeDescription type_description; - AppAction.register(out name, out icon_name_editable, out settings_name); - types.add(typeof(AppAction)); - names.set(typeof(AppAction), name); - icon_name_editables.set(typeof(AppAction), icon_name_editable); - settings_names.set(typeof(AppAction), settings_name); + types.add(typeof(AppAction).name()); + type_description = AppAction.register(); + descriptions.set(typeof(AppAction).name(), type_description); - KeyAction.register(out name, out icon_name_editable, out settings_name); - types.add(typeof(KeyAction)); - names.set(typeof(KeyAction), name); - icon_name_editables.set(typeof(KeyAction), icon_name_editable); - settings_names.set(typeof(KeyAction), settings_name); + types.add(typeof(KeyAction).name()); + type_description = KeyAction.register(); + descriptions.set(typeof(KeyAction).name(), type_description); - PieAction.register(out name, out icon_name_editable, out settings_name); - types.add(typeof(PieAction)); - names.set(typeof(PieAction), name); - icon_name_editables.set(typeof(PieAction), icon_name_editable); - settings_names.set(typeof(PieAction), settings_name); + types.add(typeof(PieAction).name()); + type_description = PieAction.register(); + descriptions.set(typeof(PieAction).name(), type_description); + + types.add(typeof(UriAction).name()); + type_description = UriAction.register(); + descriptions.set(typeof(UriAction).name(), type_description); + } + + ///////////////////////////////////////////////////////////////////// + /// Creates a new Action from the given type name. + ///////////////////////////////////////////////////////////////////// + + public static Action? create_action(string type_id, string name, string icon, string command, bool quickaction) { + switch (type_id) { + case "app": return new AppAction(name, icon, command, quickaction); + case "key": return new KeyAction(name, icon, command, quickaction); + case "uri": return new UriAction(name, icon, command, quickaction); + case "pie": return new PieAction(command, quickaction); + } - UriAction.register(out name, out icon_name_editable, out settings_name); - types.add(typeof(UriAction)); - names.set(typeof(UriAction), name); - icon_name_editables.set(typeof(UriAction), icon_name_editable); - settings_names.set(typeof(UriAction), settings_name); + return null; } ///////////////////////////////////////////////////////////////////// @@ -109,10 +121,12 @@ public class ActionRegistry : GLib.Object { case "http": case "https": final_icon = "www"; + final_name = get_domain_name(uri); break; case "ftp": case "sftp": final_icon = "folder-remote"; + final_name = get_domain_name(uri); break; default: @@ -174,6 +188,12 @@ public class ActionRegistry : GLib.Object { ///////////////////////////////////////////////////////////////////// public static Action? new_for_desktop_file(string file_name) { + // check whether its a desktop file to open one of Gnome-Pie's pies + if (file_name.has_prefix(Paths.launchers)) { + string id = file_name.substring((long)file_name.length - 11, 3); + return new PieAction(id); + } + var info = new DesktopAppInfo.from_filename(file_name); return new_for_app_info(info); } @@ -192,9 +212,23 @@ public class ActionRegistry : GLib.Object { ///////////////////////////////////////////////////////////////////// public static Action? default_for_uri(string uri) { - var info = AppInfo. get_default_for_uri_scheme(uri); + var info = AppInfo.get_default_for_uri_scheme(uri); return new_for_app_info(info); } + + ///////////////////////////////////////////////////////////////////// + /// Returns for example www.google.com when http://www.google.de/?q=h + /// is given. + ///////////////////////////////////////////////////////////////////// + + private static string get_domain_name(string url) { + int domain_end = url.index_of_char('/', 7); + int domain_begin = url.index_of_char('/', 0) + 2; + + if (domain_begin < domain_end) return url.substring(domain_begin, domain_end-domain_begin); + + return url; + } } } |