mirror of
https://gitlab.gnome.org/GNOME/gitg
synced 2024-11-04 21:16:52 +00:00
Improve support for extension command line arguments
This commit is contained in:
parent
c086d96466
commit
dba244de0f
7 changed files with 161 additions and 50 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -131,6 +131,11 @@ public class UIElements<T> : Object
|
|||
return;
|
||||
}
|
||||
|
||||
if (d_current == element)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
d_current = element;
|
||||
|
||||
if (d_stack != null)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
62
libgitg-ext/gitg-ext-command-lines.vala
Normal file
62
libgitg-ext/gitg-ext-command-lines.vala
Normal 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
|
Loading…
Reference in a new issue