[log] hurray for clicable links

This commit is contained in:
Hylke Bons 2010-08-26 09:52:49 +01:00
parent 3da17b6508
commit 5ff59133e3
10 changed files with 222 additions and 120 deletions

View file

@ -32,6 +32,8 @@ namespace SparkleLib {
public static string SparkleTmpPath = Path.Combine (SparklePath, ".tmp");
public static string SparkleConfigPath = SparkleHelpers.CombineMore (HomePath, ".config", "sparkleshare");
public static string SparkleKeysPath = SparkleHelpers.CombineMore (HomePath, ".config", "sparkleshare");
public static string SparkleInstallPath = SparkleHelpers.CombineMore (Defines.PREFIX, "sparkleshare");

View file

@ -658,6 +658,7 @@ namespace SparkleLib {
}
// TODO: this is ugly. refactor.
// Creates a pretty commit message based on what has changed
private string FormatCommitMessage ()
{
@ -673,9 +674,9 @@ namespace SparkleLib {
Process.StartInfo.Arguments = "status";
Process.Start ();
string Output = Process.StandardOutput.ReadToEnd ();
string output = Process.StandardOutput.ReadToEnd ();
foreach (string line in Regex.Split (Output, "\n")) {
foreach (string line in Regex.Split (output, "\n")) {
if (line.IndexOf ("new file:") > -1)
FilesAdded++;
if (line.IndexOf ("modified:") > -1)
@ -686,7 +687,7 @@ namespace SparkleLib {
FilesDeleted++;
}
foreach (string line in Regex.Split (Output, "\n")) {
foreach (string line in Regex.Split (output, "\n")) {
// Format message for when files are added,
// example: "added 'file' and 3 more."

View file

@ -12,6 +12,7 @@ SOURCES = \
SparkleEntry.cs \
SparkleIntro.cs \
SparkleInvitation.cs \
SparkleLink.cs \
SparkleLog.cs \
SparkleShare.cs \
SparkleSpinner.cs \

View file

@ -12,7 +12,7 @@
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using Gtk;
using Notifications;

View file

@ -91,7 +91,7 @@ namespace SparkleShare {
};
EmailEntry = new Entry (GetUserEmail ());
EmailEntry = new Entry (SparkleShare.UserEmail);
EmailEntry.Changed += delegate {
CheckAccountForm ();
};
@ -734,42 +734,12 @@ namespace SparkleShare {
}
// Gets the email address if the user alreasy has a SparkleShare key installed
private string GetUserEmail ()
{
string user_email = "";
string keys_path = System.IO.Path.Combine (SparklePaths.HomePath, ".ssh");
if (!Directory.Exists (keys_path))
return "";
foreach (string file_path in Directory.GetFiles (keys_path)) {
string file_name = System.IO.Path.GetFileName (file_path);
if (file_name.StartsWith ("sparkleshare.") && file_name.EndsWith (".key")) {
user_email = file_name.Substring (file_name.IndexOf (".") + 1);
user_email = user_email.Substring (0, user_email.LastIndexOf ("."));
return user_email;
}
}
return "";
}
// Generates and installs an RSA keypair to identify this system
private void GenerateKeyPair ()
{
string user_email = EmailEntry.Text;
string keys_path = System.IO.Path.Combine (SparklePaths.HomePath, ".ssh");
string keys_path = SparklePaths.SparkleKeysPath;
string key_file_name = "sparkleshare." + user_email + ".key";
Process process = new Process () {

View file

@ -0,0 +1,72 @@
// SparkleShare, an instant update workflow to Git.
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
//
// This program 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 3 of the License, or
// (at your option) any later version.
//
// This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
using Gtk;
using System.IO;
using System.Diagnostics;
namespace SparkleShare {
public class SparkleLink : EventBox {
private Label Label;
public SparkleLink (string title, string url) : base ()
{
Label = new Label (title) {
Ellipsize = Pango.EllipsizeMode.Middle,
UseMarkup = true,
Xalign = 0
};
Add (Label);
if (!File.Exists (url))
return;
Gdk.Color color = new Gdk.Color ();
Gdk.Color.Parse ("#3465a4", ref color);
Label.ModifyFg (StateType.Normal, color);
ButtonPressEvent += delegate {
Process process = new Process ();
process.StartInfo.FileName = "xdg-open";
process.StartInfo.Arguments = url.Replace (" ", "\\ "); // Escape space-characters
process.Start ();
};
EnterNotifyEvent += delegate {
Label.Markup = "<u>" + title + "</u>";
ShowAll ();
};
LeaveNotifyEvent += delegate {
Label.Markup = title;
ShowAll ();
};
}
}
}

View file

@ -45,6 +45,7 @@ namespace SparkleShare {
string name = System.IO.Path.GetFileName (LocalPath);
SetSizeRequest (540, 640);
SetPosition (WindowPosition.Center);
BorderWidth = 12;
@ -61,7 +62,9 @@ namespace SparkleShare {
BorderWidth = 0
};
Button open_folder_button = new Button (_("Open Folder"));
Button open_folder_button = new Button (_("_Open Folder")) {
UseUnderline = true
};
open_folder_button.Clicked += delegate (object o, EventArgs args) {
@ -206,72 +209,22 @@ namespace SparkleShare {
}
VBox layout_vertical = new VBox (false, 0);
TreeView tree_view = new TreeView ();
foreach (ActivityDay activity_day in activity_days) {
TreeIter iter = new TreeIter ();
ListStore list_store = new ListStore (typeof (Gdk.Pixbuf),
typeof (string),
typeof (string));
Gdk.Color color = Style.Foreground (StateType.Insensitive);
string secondary_text_color = GdkColorToHex (color);
foreach (ChangeSet change_set in activity_day) {
iter = list_store.Append ();
string edited_files = "";
foreach (string file_path in change_set.Edited)
edited_files += "\n" + file_path;
string added_files = "";
foreach (string file_path in change_set.Added)
added_files += "\n" + file_path;
string deleted_files = "";
foreach (string file_path in change_set.Deleted)
deleted_files += "\n" + file_path;
string log_entry = "<b>" + change_set.UserName + "</b>\n" +
"<span fgcolor='" + secondary_text_color +"'><small>" +
"at " + change_set.DateTime.ToString ("HH:mm") +
"</small></span>";
if (!edited_files.Equals ("")) {
log_entry += "\n\n<span fgcolor='" + secondary_text_color +"'><small>Edited</small></span>" +
edited_files;
}
if (!added_files.Equals ("")) {
log_entry += "\n\n<span fgcolor='" + secondary_text_color +"'><small>Added</small></span>" +
added_files;
}
if (!deleted_files.Equals ("")) {
log_entry += "\n\n<span fgcolor='" + secondary_text_color +"'><small>Deleted</small></span>" +
deleted_files;
}
list_store.SetValue (iter, 0, SparkleHelpers.GetAvatar (change_set.UserEmail , 32));
list_store.SetValue (iter, 1, log_entry);
list_store.SetValue (iter, 2, change_set.UserEmail);
}
Label date_label = new Label ("") {
UseMarkup = true,
Xalign = 0,
Xpad = 9,
Ypad = 9
};
@ -297,28 +250,94 @@ namespace SparkleShare {
}
layout_vertical.PackStart (date_label, false, false, 0);
layout_vertical.PackStart (date_label, true, true, 0);
IconView icon_view = new IconView (list_store) {
ItemWidth = 470,
MarkupColumn = 1,
Orientation = Orientation.Horizontal,
PixbufColumn = 0,
Spacing = 9,
Columns = 1
};
icon_view.SelectionChanged += delegate {
icon_view.UnselectAll ();
};
layout_vertical.PackStart (icon_view, false, false, 0);
Gdk.Color color = Style.Foreground (StateType.Insensitive);
string secondary_text_color = GdkColorToHex (color);
foreach (ChangeSet change_set in activity_day) {
VBox log_entry = new VBox (false, 0);
VBox deleted_files = new VBox (false, 0);
VBox edited_files = new VBox (false, 0);
VBox added_files = new VBox (false, 0);
foreach (string file_path in change_set.Edited){
SparkleLink link = new SparkleLink (file_path, SparkleHelpers.CombineMore (LocalPath, file_path));
edited_files.PackStart (link, false, false, 0);
link.ModifyBg (StateType.Normal, tree_view.Style.Base (StateType.Normal));
}
// TODO: add close delegate
foreach (string file_path in change_set.Added)
added_files.PackStart (new SparkleLink (file_path, SparkleHelpers.CombineMore (LocalPath, file_path)), false, false, 0);
foreach (string file_path in change_set.Deleted)
deleted_files.PackStart (new SparkleLink (file_path, SparkleHelpers.CombineMore (LocalPath, file_path)), false, false, 0);
log_entry.PackStart(new Label ("<b>" + change_set.UserName + "</b>\n" +
"<span fgcolor='" + secondary_text_color +"'><small>" +
"at " + change_set.DateTime.ToString ("HH:mm") +
"</small></span>") { UseMarkup = true, Xalign = 0});
if (edited_files.Children.Length > 0) {
log_entry.PackStart (new Label ("\n<span fgcolor='" + secondary_text_color +"'><small>Edited</small></span>") { UseMarkup=true, Xalign = 0}, false, false, 0);
log_entry.PackStart (edited_files, false, false, 0);
}
if (added_files.Children.Length > 0) {
log_entry.PackStart (new Label ("\n<span fgcolor='" + secondary_text_color +"'><small>Added</small></span>") { UseMarkup=true, Xalign = 0}, false, false, 0);
log_entry.PackStart (added_files, false, false, 0);
}
if (deleted_files.Children.Length > 0) {
log_entry.PackStart (new Label ("\n<span fgcolor='" + secondary_text_color +"'><small>Deleted</small></span>") { UseMarkup=true, Xalign = 0}, false, false, 0);
log_entry.PackStart (deleted_files, false, false, 0);
}
HBox hbox = new HBox (false, 0);
Image i = new Image (SparkleHelpers.GetAvatar (change_set.UserEmail, 32)) {
Yalign = 0
};
hbox.PackStart (i, false, false, 18);
VBox vbox = new VBox (false, 0);
vbox.PackStart (log_entry, true, true, 0);
hbox.PackStart (vbox, true, true, 0);
hbox.PackStart (new Label (""), false, false, 12);
layout_vertical.PackStart (hbox, true, true, 24);
}
// layout_vertical.PackStart (icon_view, false, false, 0);
}
ScrolledWindow = new ScrolledWindow ();
ScrolledWindow.ShadowType = ShadowType.None;
ScrolledWindow.AddWithViewport (layout_vertical);
EventBox wrapper = new EventBox ();
wrapper.ModifyBg (StateType.Normal, tree_view.Style.Base (StateType.Normal));
wrapper.Add (layout_vertical);
ScrolledWindow.AddWithViewport (wrapper);
return ScrolledWindow;

View file

@ -160,20 +160,51 @@ namespace SparkleShare {
public static string GetUserEmail ()
{
string email = "";
string global_config_file_path = SparkleHelpers.CombineMore (SparklePaths.SparkleConfigPath, "config");
StreamReader reader = new StreamReader (global_config_file_path);
// Look in the global config file first
if (File.Exists (global_config_file_path)) {
// Discard the first two lines
reader.ReadLine ();
reader.ReadLine ();
StreamReader reader = new StreamReader (global_config_file_path);
string line = reader.ReadLine ();
reader.Close ();
// Discard the first two lines
reader.ReadLine ();
reader.ReadLine ();
string email = line.Substring (line.IndexOf ("=") + 2);
string line = reader.ReadLine ();
reader.Close ();
return email;
email = line.Substring (line.IndexOf ("=") + 2);
return email;
// Secondly, look at the user's private key file name
} else {
string keys_path = SparklePaths.SparkleKeysPath;
if (!Directory.Exists (keys_path))
return "";
foreach (string file_path in Directory.GetFiles (keys_path)) {
string file_name = System.IO.Path.GetFileName (file_path);
if (file_name.StartsWith ("sparkleshare.") && file_name.EndsWith (".key")) {
email = file_name.Substring (file_name.IndexOf (".") + 1);
email = email.Substring (0, email.LastIndexOf ("."));
return email;
}
}
return "";
}
}
@ -183,7 +214,7 @@ namespace SparkleShare {
public static void AddKey ()
{
string keys_path = Path.Combine (SparklePaths.HomePath, ".ssh");
string keys_path = SparklePaths.SparkleKeysPath;
string key_file_name = "sparkleshare." + UserEmail + ".key";
Process process = new Process ();

View file

@ -120,6 +120,7 @@ namespace SparkleShare {
SparkleLog log = new SparkleLog (path);
log.ShowAll ();
log.Present ();
};
@ -228,9 +229,6 @@ namespace SparkleShare {
if (repo.Description != null)
menu_item.TooltipText = repo.Description;
else
menu_item.TooltipText = _("No description");
Menu.Add (menu_item);

View file

@ -110,6 +110,14 @@ namespace SparkleShare {
ShowAll ();
}
new public void ShowAll ()
{
Present ();
base.ShowAll ();
}
}