From dba244de0f46078ff01b2c481d69cb9e679ccacd Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Wed, 5 Aug 2015 19:14:40 +0200 Subject: [PATCH] Improve support for extension command line arguments --- gitg/gitg-application.vala | 65 ++++++++++++---------- gitg/gitg-ui-elements.vala | 5 ++ gitg/gitg-window.vala | 73 ++++++++++++++++++------- libgitg-ext/Makefile.am | 1 + libgitg-ext/gitg-ext-application.vala | 3 +- libgitg-ext/gitg-ext-command-line.vala | 2 + libgitg-ext/gitg-ext-command-lines.vala | 62 +++++++++++++++++++++ 7 files changed, 161 insertions(+), 50 deletions(-) create mode 100644 libgitg-ext/gitg-ext-command-lines.vala diff --git a/gitg/gitg-application.vala b/gitg/gitg-application.vala index 84bf4cd8..7e893141 100644 --- a/gitg/gitg-application.vala +++ b/gitg/gitg-application.vala @@ -85,13 +85,20 @@ public class Application : Gtk.Application return true; } - private void parse_command_line(ref unowned string[] argv) throws OptionError + private GitgExt.CommandLines parse_command_line(ref unowned string[] argv) throws OptionError { var ctx = new OptionContext(_("- Git repository viewer")); ctx.add_main_entries(Options.entries, Config.GETTEXT_PACKAGE); ctx.add_group(Gtk.get_option_group(true)); + var cmdexts = new GitgExt.CommandLine[0]; + + var historycmd = new GitgHistory.CommandLine(); + cmdexts += historycmd; + + ctx.add_group(historycmd.get_option_group()); + // Add any option groups from plugins var engine = PluginsEngine.get_default(); @@ -103,12 +110,18 @@ public class Application : Gtk.Application if (ext != null) { + cmdexts += ext; ctx.add_group(ext.get_option_group()); } } } ctx.parse(ref argv); + + var ret = new GitgExt.CommandLines(cmdexts); + ret.parse_finished(); + + return ret; } protected override bool local_command_line ([CCode (array_length = false, array_null_terminated = true)] ref unowned string[] arguments, out int exit_status) @@ -144,10 +157,11 @@ public class Application : Gtk.Application { string[] arguments = cmd.get_arguments(); unowned string[] argv = arguments; + GitgExt.CommandLines command_lines; try { - parse_command_line(ref argv); + command_lines = parse_command_line(ref argv); } catch (Error e) { @@ -178,15 +192,14 @@ public class Application : Gtk.Application files += File.new_for_commandline_arg(arg); } - open(files, Options.activity); + open_command_line(files, Options.activity, command_lines); } else { - activate(); + activate_command_line(command_lines); } Options.command_line = tmpcmd; - return 1; } @@ -344,22 +357,11 @@ public class Application : Gtk.Application base.shutdown(); } - protected override void activate() + private void activate_command_line(GitgExt.CommandLines command_lines) { - /* Application gets activated when no command line arguments have - * been provided. However, gitg does something special in the case - * that it has been launched from the terminal. It will try to open - * the cwd as a repository. However, when not launched from the terminal - * this is undesired, and a --no-wd allows gitg to be launched without - * the implicit working directory opening of the repository. In the - * end, the following happens: - * - * 1) --no-wd: present the window - * 2) Get cwd from the commandline: open - */ if (Options.no_wd) { - present_window(); + present_window(Options.activity, command_lines); } else { @@ -367,12 +369,13 @@ public class Application : Gtk.Application string? wd = Options.command_line.get_cwd(); open(new File[] { File.new_for_path(wd) }, Options.activity); - - // Forcing present here covers the case where no window was opened - // because wd is not an actual git repository - present_window(); + present_window(Options.activity, command_lines); } + } + protected override void activate() + { + present_window(); base.activate(); } @@ -397,6 +400,12 @@ public class Application : Gtk.Application } protected override void open(File[] files, string hint) + { + open_command_line(files, hint); + } + + + private void open_command_line(File[] files, string? hint = null, GitgExt.CommandLines? command_lines = null) { if (files.length == 0) { @@ -422,7 +431,7 @@ public class Application : Gtk.Application { // Present the window with this repository open window.set_environment(Options.command_line.get_environ()); - window.present(); + window.present(hint, command_lines); continue; } @@ -436,11 +445,11 @@ public class Application : Gtk.Application catch { continue; } // Finally, create a window for the repository - new_window(repo, hint); + new_window(repo, hint, command_lines); } } - private void new_window(Repository? repo = null, string? hint = null) + private void new_window(Repository? repo = null, string? hint = null, GitgExt.CommandLines? command_lines = null) { var window = Window.create_new(this, repo, hint); @@ -449,10 +458,10 @@ public class Application : Gtk.Application window.set_environment(Options.command_line.get_environ()); } - present_window(); + present_window(hint, command_lines); } - private void present_window() + private void present_window(string? activity = null, GitgExt.CommandLines? command_lines = null) { /* Present the last window in the windows registered on the * application. If there are no windows, then create a new empty @@ -469,7 +478,7 @@ public class Application : Gtk.Application var w = (Gitg.Window)windows.first().data; w.set_environment(Options.command_line.get_environ()); - w.present(); + w.present(activity, command_lines); } } diff --git a/gitg/gitg-ui-elements.vala b/gitg/gitg-ui-elements.vala index 1db47df5..2b075c56 100644 --- a/gitg/gitg-ui-elements.vala +++ b/gitg/gitg-ui-elements.vala @@ -131,6 +131,11 @@ public class UIElements : Object return; } + if (d_current == element) + { + return; + } + d_current = element; if (d_stack != null) diff --git a/gitg/gitg-window.vala b/gitg/gitg-window.vala index f775251e..db2a50ed 100644 --- a/gitg/gitg-window.vala +++ b/gitg/gitg-window.vala @@ -337,7 +337,7 @@ public class Window : Gtk.ApplicationWindow, GitgExt.Application, Initable public GitgExt.Application open_new(Ggit.Repository repository, string? hint = null) { var window = Window.create_new(application, (Gitg.Repository)repository, hint); - window.present(); + base.present(); return window; } @@ -535,45 +535,56 @@ public class Window : Gtk.ApplicationWindow, GitgExt.Application, Initable } } - private void activate_default_activity() + private bool activate_activity(string? action) { - GitgExt.Activity? def = null; - GitgExt.Activity? deffb = null; - string default_activity; - if (d_action == null || d_action == "") + if (action == null || action == "") { default_activity = d_interface_settings.get_string("default-activity"); } else { - default_activity = d_action; + default_activity = action; } + GitgExt.Activity? def = null; + d_activities.foreach((element) => { - GitgExt.Activity activity = (GitgExt.Activity)element; + GitgExt.Activity activity = (GitgExt.Activity)element; - if (activity.is_default_for(default_activity)) - { - def = activity; - } + if (activity.is_default_for(default_activity)) + { + def = activity; + } - if (activity.is_default_for("")) - { - deffb = activity; - } - - return true; + return true; }); if (def != null) { d_activities.current = def; + return true; } - else if (deffb != null) + + return false; + } + + private void activate_default_activity() + { + if (!activate_activity(d_action)) { - d_activities.current = deffb; + d_activities.foreach((element) => { + GitgExt.Activity activity = (GitgExt.Activity)element; + + if (activity.is_default_for("")) + { + d_activities.current = activity; + return false; + } + + return true; + }); } } @@ -665,7 +676,7 @@ public class Window : Gtk.ApplicationWindow, GitgExt.Application, Initable } /* public API implementation of GitgExt.Application */ - public GitgExt.Activity? activity(string id) + public GitgExt.Activity? set_activity_by_id(string id) { GitgExt.Activity? v = d_activities.lookup(id); @@ -684,6 +695,11 @@ public class Window : Gtk.ApplicationWindow, GitgExt.Application, Initable } } + public GitgExt.Activity? get_activity_by_id(string id) + { + return d_activities.lookup(id); + } + public void open_repository(File path) { File repo; @@ -810,6 +826,21 @@ public class Window : Gtk.ApplicationWindow, GitgExt.Application, Initable } } + public new void present(string? hint, GitgExt.CommandLines? command_lines) + { + if (hint != null) + { + activate_activity(hint); + } + + if (command_lines != null) + { + command_lines.apply(this); + } + + base.present(); + } + private void on_select_activated(SimpleAction action) { var st = action.get_state().get_boolean(); diff --git a/libgitg-ext/Makefile.am b/libgitg-ext/Makefile.am index df8e1676..0e48656e 100644 --- a/libgitg-ext/Makefile.am +++ b/libgitg-ext/Makefile.am @@ -47,6 +47,7 @@ libgitg_ext_libgitg_ext_1_0_la_VALASOURCES = \ libgitg-ext/gitg-ext-application.vala \ libgitg-ext/gitg-ext-assembly-info.vala \ libgitg-ext/gitg-ext-command-line.vala \ + libgitg-ext/gitg-ext-command-lines.vala \ libgitg-ext/gitg-ext-commit-action.vala \ libgitg-ext/gitg-ext-history-panel.vala \ libgitg-ext/gitg-ext-history.vala \ diff --git a/libgitg-ext/gitg-ext-application.vala b/libgitg-ext/gitg-ext-application.vala index 8a3120d6..88df0ef1 100644 --- a/libgitg-ext/gitg-ext-application.vala +++ b/libgitg-ext/gitg-ext-application.vala @@ -63,7 +63,8 @@ public interface Application : Object * @return the created new main activity, or ``null`` if no activity with the * given id exists. */ - public abstract GitgExt.Activity? activity(string id); + public abstract GitgExt.Activity? get_activity_by_id(string id); + public abstract GitgExt.Activity? set_activity_by_id(string id); public abstract void user_query(UserQuery query); diff --git a/libgitg-ext/gitg-ext-command-line.vala b/libgitg-ext/gitg-ext-command-line.vala index 958be265..0792104d 100644 --- a/libgitg-ext/gitg-ext-command-line.vala +++ b/libgitg-ext/gitg-ext-command-line.vala @@ -22,6 +22,8 @@ namespace GitgExt public interface CommandLine : Object { public abstract OptionGroup get_option_group(); + public abstract void parse_finished(); + public abstract void apply(GitgExt.Application application); } } diff --git a/libgitg-ext/gitg-ext-command-lines.vala b/libgitg-ext/gitg-ext-command-lines.vala new file mode 100644 index 00000000..d0373d67 --- /dev/null +++ b/libgitg-ext/gitg-ext-command-lines.vala @@ -0,0 +1,62 @@ +/* + * This file is part of gitg + * + * Copyright (C) 2012 - Jesse van den Kieboom + * + * gitg 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; either version 2 of the License, or + * (at your option) any later version. + * + * gitg 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gitg. If not, see . + */ + +namespace GitgExt +{ + public class CommandLines : Object + { + private CommandLine[] d_command_lines; + + public CommandLines(CommandLine[] command_lines) + { + d_command_lines = command_lines; + } + + public T? get_for() + { + foreach (var cmd in d_command_lines) + { + if (cmd.get_type() == typeof(T)) + { + return (T)cmd; + } + } + + return null; + } + + public void parse_finished() + { + foreach (var cmd in d_command_lines) + { + cmd.parse_finished(); + } + } + + public void apply(Application application) + { + foreach (var cmd in d_command_lines) + { + cmd.apply(application); + } + } + } +} + +// vi:ts=4