Improve support for extension command line arguments

This commit is contained in:
Jesse van den Kieboom 2015-08-05 19:14:40 +02:00
parent c086d96466
commit dba244de0f
7 changed files with 161 additions and 50 deletions

View File

@ -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);
}
}

View File

@ -131,6 +131,11 @@ public class UIElements<T> : Object
return;
}
if (d_current == element)
{
return;
}
d_current = element;
if (d_stack != null)

View File

@ -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();

View File

@ -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 \

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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<T>()
{
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