customizable datetime format

This commit is contained in:
Tiago Neto 2022-10-02 22:50:48 +02:00 committed by Alberto Fanjul
parent 2164c6359d
commit ce7b4b2d78
4 changed files with 252 additions and 4 deletions

View file

@ -242,6 +242,27 @@
<summary>Maximum number of days to store previous commit messages</summary>
<description>Maximum number of days to store previous commit messages for commit message history.</description>
</key>
<key name="datetime-selection" type="s">
<default>'predefined'</default>
<summary>Type of datetime format selected.</summary>
<description>
Type of datetime format selected.
</description>
</key>
<key name="predefined-datetime" type="s">
<default>'%Y-%m-%dT%R%z'</default>
<summary>Prefered Datatime format of the user.</summary>
<description>
The datetime format to be used in commit-diff.
</description>
</key>
<key name="custom-datetime" type="s">
<default>''</default>
<summary>Custom datetime format.</summary>
<description>
Custom datetime format.
</description>
</key>
</schema>
<schema gettext-domain="@GETTEXT_PACKAGE@" id="@APPLICATION_ID@.preferences.diff" path="@SCHEMA_PATH@/preferences/diff/">
<key name="patience" type="b">

View file

@ -59,6 +59,18 @@ public class PreferencesCommit : Gtk.Grid, GitgExt.Preferences
[GtkChild (name = "spin_button_max_num_days_commit_messages")]
private unowned Gtk.SpinButton d_spin_button_max_num_days_commit_messages;
[GtkChild (name = "radiobutton_predefined_datetime" )]
private unowned Gtk.RadioButton d_predefined_datetime;
[GtkChild (name = "radiobutton_custom_datetime" )]
private unowned Gtk.RadioButton d_custom_datetime;
[GtkChild (name = "combobox_predefined_datetime")]
private unowned Gtk.ComboBox d_predefined_datetime_combo;
[GtkChild (name = "custom_datetime")]
private unowned Gtk.Entry d_custom_datetime_entry;
construct
{
var settings = new Settings(Gitg.Config.APPLICATION_ID + ".preferences.commit.message");
@ -122,6 +134,32 @@ public class PreferencesCommit : Gtk.Grid, GitgExt.Preferences
"value",
SettingsBindFlags.GET | SettingsBindFlags.SET);
settings.bind("predefined-datetime",
d_predefined_datetime_combo,
"active-id",
SettingsBindFlags.GET | SettingsBindFlags.SET);
settings.bind("custom-datetime",
d_custom_datetime_entry,
"text",
SettingsBindFlags.GET | SettingsBindFlags.SET);
settings.bind("datetime-selection",
this,
"datetime-selection",
SettingsBindFlags.GET | SettingsBindFlags.SET);
d_predefined_datetime.notify["active"].connect(() => {
if (d_predefined_datetime.active) {
notify_property("datetime-selection");
}
});
d_custom_datetime.notify["active"].connect(() => {
if (d_custom_datetime.active) {
notify_property("datetime-selection");
}
});
}
public Gtk.Widget widget
@ -141,6 +179,25 @@ public class PreferencesCommit : Gtk.Grid, GitgExt.Preferences
{
owned get { return C_("Preferences", "Commit"); }
}
public string datetime_selection
{
get
{
return d_custom_datetime.active ? "custom" : "predefined";
}
set
{
if (value == "custom"){
d_custom_datetime.active = true;
}
else
{
d_predefined_datetime.active = true;
}
}
}
}
}

View file

@ -358,5 +358,116 @@
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkGrid" id="grid_datetime">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="datetime_preference_top_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Datetime format</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkGrid" id="grid_prefered_datetime_default">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkComboBoxText" id="combobox_predefined_datetime">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">0</property>
<property name="active_id">0</property>
<items>
<item id="%Y-%m">%Y-%m</item>
<item id="%Y-%m-%d">%Y-%m-%d</item>
<item id="%Y-%m-%dT%R%z">%Y-%m-%dT%R%z</item>
<item id="%Y-%m-%dT%T%z">%Y-%m-%dT%T%z</item>
<item id="%Y">%Y</item>
<item id="%Y-%d-%m">%Y-%d-%m</item>
<item id="%Y-%d-%mT%R%z">%Y-%d-%mT%R%z</item>
<item id="%Y-%d-%mT%T%z">%Y-%d-%mT%T%z</item>
</items>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="radiobutton_predefined_datetime">
<property name="label" translatable="yes">Predefined:</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<property name="group">radiobutton_custom_datetime</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkRadioButton" id="radiobutton_custom_datetime">
<property name="label" translatable="yes">Custom:</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<property name="group">radiobutton_predefined_datetime</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="custom_datetime">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="secondary_icon_stock">gtk-help</property>
<property name="secondary_icon_sensitive">False</property>
<property name="secondary_icon_tooltip_markup" translatable="yes">Check in vala documentation for datetime to write your own format.</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
</template>
</interface>

View file

@ -53,6 +53,8 @@ class Gitg.DiffViewCommitDetails : Gtk.Grid
[GtkChild( name = "label_expand_collapse_files" )]
private unowned Gtk.Label d_label_expand_collapse_files;
private Settings d_settings;
public bool expanded
{
get { return d_expander_files.expanded; }
@ -131,14 +133,39 @@ class Gitg.DiffViewCommitDetails : Gtk.Grid
public Gitg.Repository? repository {get; set; }
private string d_datetime_format;
private string datetime_format
{
get {
return d_datetime_format;
}
set {
d_datetime_format = value;
update_datetime();
}
}
private Gee.HashMap<Ggit.OId, Gtk.RadioButton> d_parents_map;
private GLib.Regex regex_url = /\w+:(\/?\/?)[^\s]+/;
private Ggit.Config config {get; set;}
private GLib.Regex regex_custom_links = /gitg\.custom-link\.(.+)\.regex/;
private void on_change_datetime(Settings settings, string key) {
datetime_format = settings.get_string("datetime-selection") == "custom"
? settings.get_string("custom-datetime")
: settings.get_string("predefined-datetime");
}
construct
{
d_settings = new Settings(Gitg.Config.APPLICATION_ID + ".preferences.commit.message");
d_settings.changed["datetime-selection"].connect(on_change_datetime);
d_settings.changed["custom-datetime"].connect(on_change_datetime);
d_settings.changed["predefined-datetime"].connect(on_change_datetime);
on_change_datetime(d_settings, "");
d_expander_files.notify["expanded"].connect(() => {
if (d_expander_files.expanded)
{
@ -151,11 +178,19 @@ class Gitg.DiffViewCommitDetails : Gtk.Grid
notify_property("expanded");
});
}
protected override void dispose()
{
if (d_settings != null)
{
d_settings.changed["datetime-selection"].disconnect(on_change_datetime);
d_settings.changed["custom-datetime"].disconnect(on_change_datetime);
d_settings.changed["predefined-datetime"].disconnect(on_change_datetime);
d_settings = null;
}
if (d_avatar_cancel != null)
{
d_avatar_cancel.cancel();
@ -192,7 +227,6 @@ class Gitg.DiffViewCommitDetails : Gtk.Grid
var author = commit.get_author();
d_label_author.label = author_to_markup(author);
d_label_author_date.label = author.get_time().to_timezone(author.get_time_zone()).format("%x %X %z");
var committer = commit.get_committer();
@ -201,14 +235,14 @@ class Gitg.DiffViewCommitDetails : Gtk.Grid
committer.get_time().compare(author.get_time()) != 0)
{
d_label_committer.label = _("Committed by %s").printf(author_to_markup(committer));
d_label_committer_date.label = committer.get_time().to_timezone(committer.get_time_zone()).format("%x %X %z");
}
else
{
d_label_committer.label = "";
d_label_committer_date.label = "";
}
update_datetime();
var parents = commit.get_parents();
var first_parent = parents.size == 0 ? null : parents.get(0);
@ -257,6 +291,31 @@ class Gitg.DiffViewCommitDetails : Gtk.Grid
update_avatar();
}
private void update_datetime()
{
if (commit == null)
{
return;
}
var author = commit.get_author();
d_label_author_date.label = author.get_time().to_timezone(author.get_time_zone()).format(datetime_format);
var committer = commit.get_committer();
if (committer.get_name() != author.get_name() ||
committer.get_email() != author.get_email() ||
committer.get_time().compare(author.get_time()) != 0)
{
d_label_committer_date.label = committer.get_time().to_timezone(committer.get_time_zone()).format(datetime_format);
}
else
{
d_label_committer_date.label = "";
}
}
private string subject_to_markup(string subject_text)
{
return parse_links_on_subject(subject_text);