summaryrefslogtreecommitdiff
path: root/src/actions/actionRegistry.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/actions/actionRegistry.vala')
-rw-r--r--src/actions/actionRegistry.vala102
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;
+ }
}
}