[sparklediff] Use system colours for iconview and fix some bugs
This commit is contained in:
parent
f3d4dd588a
commit
28554164dd
|
@ -14,9 +14,6 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// 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/>.
|
||||||
|
|
||||||
// TODO: Hand cursor when hovering icon view items
|
|
||||||
// TODO: Use theme colours
|
|
||||||
|
|
||||||
using Gtk;
|
using Gtk;
|
||||||
using Mono.Unix;
|
using Mono.Unix;
|
||||||
using System;
|
using System;
|
||||||
|
@ -39,11 +36,13 @@ namespace SparkleShare {
|
||||||
public IconView IconView;
|
public IconView IconView;
|
||||||
public int Selected;
|
public int Selected;
|
||||||
|
|
||||||
private ToggleButton ToggleButton;
|
public ToggleButton ToggleButton;
|
||||||
private Viewport Viewport;
|
private Viewport Viewport;
|
||||||
private ListStore Store;
|
private ListStore Store;
|
||||||
private Image Image;
|
private Image Image;
|
||||||
private int Count;
|
private int Count;
|
||||||
|
private string SecondaryTextColor;
|
||||||
|
private string SelectedTextColor;
|
||||||
|
|
||||||
|
|
||||||
public RevisionView () : base (false, 0)
|
public RevisionView () : base (false, 0)
|
||||||
|
@ -52,6 +51,12 @@ namespace SparkleShare {
|
||||||
Count = 0;
|
Count = 0;
|
||||||
Selected = 0;
|
Selected = 0;
|
||||||
|
|
||||||
|
TreeView treeview = new TreeView ();
|
||||||
|
SelectedTextColor = GdkColorToHex (treeview.Style.Foreground (StateType.Selected));
|
||||||
|
|
||||||
|
Window window = new Window ("");
|
||||||
|
SecondaryTextColor = GdkColorToHex (window.Style.Foreground (StateType.Insensitive));
|
||||||
|
|
||||||
ToggleButton = new ToggleButton ();
|
ToggleButton = new ToggleButton ();
|
||||||
ToggleButton.Clicked += ToggleView;
|
ToggleButton.Clicked += ToggleView;
|
||||||
ToggleButton.Relief = ReliefStyle.None;
|
ToggleButton.Relief = ReliefStyle.None;
|
||||||
|
@ -85,12 +90,20 @@ namespace SparkleShare {
|
||||||
public void ChangeSelection (object o, EventArgs args)
|
public void ChangeSelection (object o, EventArgs args)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
TreeIter iter;
|
||||||
|
Store.GetIter (out iter, new TreePath (GetSelected ().ToString ()));
|
||||||
|
string text = (string) Store.GetValue (iter, 1);
|
||||||
|
Store.SetValue (iter, 1, text.Replace (SelectedTextColor, SecondaryTextColor));
|
||||||
|
|
||||||
if (IconView.SelectedItems.Length > 0) {
|
if (IconView.SelectedItems.Length > 0) {
|
||||||
|
|
||||||
TreeIter iter;
|
|
||||||
Store.GetIter (out iter, IconView.SelectedItems [0]);
|
Store.GetIter (out iter, IconView.SelectedItems [0]);
|
||||||
SetSelected ((int) Store.GetValue (iter, 2));
|
SetSelected ((int) Store.GetValue (iter, 2));
|
||||||
|
|
||||||
|
text = (string) Store.GetValue (iter, 1);
|
||||||
|
text = text.Replace (SecondaryTextColor, SelectedTextColor);
|
||||||
|
Store.SetValue (iter, 1, text);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
IconView.SelectPath (new TreePath (GetSelected ().ToString()));
|
IconView.SelectPath (new TreePath (GetSelected ().ToString()));
|
||||||
|
@ -100,6 +113,17 @@ namespace SparkleShare {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Converts a Gdk RGB color to a hex value.
|
||||||
|
// Example: from "rgb:0,0,0" to "#000000"
|
||||||
|
public string GdkColorToHex (Gdk.Color color)
|
||||||
|
{
|
||||||
|
return String.Format("#{0:X2}{1:X2}{2:X2}",
|
||||||
|
(int) Math.Truncate(color.Red / 256.00),
|
||||||
|
(int) Math.Truncate(color.Green / 256.00),
|
||||||
|
(int) Math.Truncate(color.Blue / 256.00));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Makes sure everything is in place before showing the widget
|
// Makes sure everything is in place before showing the widget
|
||||||
new public void ShowAll ()
|
new public void ShowAll ()
|
||||||
{
|
{
|
||||||
|
@ -127,7 +151,7 @@ namespace SparkleShare {
|
||||||
string text = (string) Store.GetValue (iter, 1);
|
string text = (string) Store.GetValue (iter, 1);
|
||||||
Gdk.Pixbuf pixbuf = (Gdk.Pixbuf) Store.GetValue (iter, 0);
|
Gdk.Pixbuf pixbuf = (Gdk.Pixbuf) Store.GetValue (iter, 0);
|
||||||
|
|
||||||
Label label = new Label (text);
|
Label label = new Label (text.Replace (SelectedTextColor, SecondaryTextColor));
|
||||||
label.UseMarkup = true;
|
label.UseMarkup = true;
|
||||||
|
|
||||||
Arrow arrow_down = new Arrow (ArrowType.Down, ShadowType.None);
|
Arrow arrow_down = new Arrow (ArrowType.Down, ShadowType.None);
|
||||||
|
@ -152,7 +176,10 @@ namespace SparkleShare {
|
||||||
public void AddRow (Gdk.Pixbuf pixbuf, string header, string subtext)
|
public void AddRow (Gdk.Pixbuf pixbuf, string header, string subtext)
|
||||||
{
|
{
|
||||||
|
|
||||||
Store.AppendValues (pixbuf, "<b>" + header + "</b>\n<span fgcolor='#777'>" + subtext + "</span>", Count);
|
Store.AppendValues (pixbuf, "<b>" + header + "</b>\n" +
|
||||||
|
"<span fgcolor='" + SecondaryTextColor + "'>" + subtext + "</span>",
|
||||||
|
Count);
|
||||||
|
|
||||||
IconView.Model = Store;
|
IconView.Model = Store;
|
||||||
Count++;
|
Count++;
|
||||||
|
|
||||||
|
|
|
@ -54,8 +54,7 @@ namespace SparkleShare {
|
||||||
|
|
||||||
DeleteEvent += Quit;
|
DeleteEvent += Quit;
|
||||||
|
|
||||||
// TRANSLATORS: The parameter is a filename
|
Title = file_name;
|
||||||
Title = String.Format(_("Comparing Revisions of ‘{0}’"), file_name);
|
|
||||||
|
|
||||||
VBox layout_vertical = new VBox (false, 12);
|
VBox layout_vertical = new VBox (false, 12);
|
||||||
|
|
||||||
|
@ -128,18 +127,29 @@ namespace SparkleShare {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ViewLeft.ToggleButton.Clicked += delegate {
|
||||||
|
if (ViewLeft.ToggleButton.Active)
|
||||||
|
DetachViews ();
|
||||||
|
else
|
||||||
|
HookUpViews ();
|
||||||
|
};
|
||||||
|
|
||||||
|
ViewRight.ToggleButton.Clicked += delegate {
|
||||||
|
if (ViewLeft.ToggleButton.Active)
|
||||||
|
DetachViews ();
|
||||||
|
else
|
||||||
|
HookUpViews ();
|
||||||
|
};
|
||||||
|
|
||||||
layout_horizontal.PackStart (ViewLeft);
|
layout_horizontal.PackStart (ViewLeft);
|
||||||
layout_horizontal.PackStart (ViewRight);
|
layout_horizontal.PackStart (ViewRight);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ResizeToViews ();
|
ResizeToViews ();
|
||||||
|
|
||||||
// Order time view according to the user's reading direction
|
// Order time view according to the user's reading direction
|
||||||
if (Direction == Gtk.TextDirection.Rtl)
|
if (Direction == Gtk.TextDirection.Rtl)
|
||||||
layout_horizontal.ReorderChild (ViewLeft, 1);
|
layout_horizontal.ReorderChild (ViewLeft, 1);
|
||||||
|
|
||||||
|
|
||||||
HookUpViews ();
|
HookUpViews ();
|
||||||
|
|
||||||
HButtonBox dialog_buttons = new HButtonBox ();
|
HButtonBox dialog_buttons = new HButtonBox ();
|
||||||
|
@ -160,23 +170,8 @@ namespace SparkleShare {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Converts a UNIX timestamp to a more usable time object
|
|
||||||
public DateTime UnixTimestampToDateTime (int timestamp)
|
|
||||||
{
|
|
||||||
DateTime unix_epoch = new DateTime (1970, 1, 1, 0, 0, 0, 0);
|
|
||||||
return unix_epoch.AddSeconds (timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Looks up an icon from the system's theme
|
|
||||||
public Gdk.Pixbuf GetIcon (string name, int size)
|
|
||||||
{
|
|
||||||
IconTheme icon_theme = new IconTheme ();
|
|
||||||
icon_theme.AppendSearchPath (System.IO.Path.Combine ("/usr/share/sparkleshare", "icons"));
|
|
||||||
return icon_theme.LoadIcon (name, size, IconLookupFlags.GenericFallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
// Resizes the window so it will fit the content in the best possible way
|
||||||
private void ResizeToViews ()
|
private void ResizeToViews ()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -195,6 +190,7 @@ namespace SparkleShare {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Hooks up two views so their scrollbars will be kept in sync
|
// Hooks up two views so their scrollbars will be kept in sync
|
||||||
private void HookUpViews ()
|
private void HookUpViews ()
|
||||||
{
|
{
|
||||||
|
@ -207,6 +203,18 @@ namespace SparkleShare {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Detach the two views from each other so they don't try to sync anymore
|
||||||
|
private void DetachViews ()
|
||||||
|
{
|
||||||
|
|
||||||
|
ViewLeft.ScrolledWindow.Hadjustment.ValueChanged -= SyncViewsHorizontally;
|
||||||
|
ViewLeft.ScrolledWindow.Vadjustment.ValueChanged -= SyncViewsVertically;
|
||||||
|
ViewRight.ScrolledWindow.Hadjustment.ValueChanged -= SyncViewsHorizontally;
|
||||||
|
ViewRight.ScrolledWindow.Vadjustment.ValueChanged -= SyncViewsVertically;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Keeps the two image views in sync horizontally
|
// Keeps the two image views in sync horizontally
|
||||||
private void SyncViewsHorizontally (object o, EventArgs args)
|
private void SyncViewsHorizontally (object o, EventArgs args)
|
||||||
{
|
{
|
||||||
|
@ -244,6 +252,23 @@ namespace SparkleShare {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Converts a UNIX timestamp to a more usable time object
|
||||||
|
public DateTime UnixTimestampToDateTime (int timestamp)
|
||||||
|
{
|
||||||
|
DateTime unix_epoch = new DateTime (1970, 1, 1, 0, 0, 0, 0);
|
||||||
|
return unix_epoch.AddSeconds (timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Looks up an icon from the system's theme
|
||||||
|
public Gdk.Pixbuf GetIcon (string name, int size)
|
||||||
|
{
|
||||||
|
IconTheme icon_theme = new IconTheme ();
|
||||||
|
icon_theme.AppendSearchPath (System.IO.Path.Combine ("/usr/share/sparkleshare", "icons"));
|
||||||
|
return icon_theme.LoadIcon (name, size, IconLookupFlags.GenericFallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Creates an MD5 hash of input
|
// Creates an MD5 hash of input
|
||||||
public static string GetMD5 (string s)
|
public static string GetMD5 (string s)
|
||||||
{
|
{
|
||||||
|
@ -255,12 +280,10 @@ namespace SparkleShare {
|
||||||
|
|
||||||
|
|
||||||
// TODO: Turn this into an avatar fetching library
|
// TODO: Turn this into an avatar fetching library
|
||||||
// TODO: This should be included from SparkleHelpers, but I don't know how to do that
|
|
||||||
// Gets the avatar for a specific email address and size
|
// Gets the avatar for a specific email address and size
|
||||||
public Gdk.Pixbuf GetAvatar (string Email, int Size)
|
public Gdk.Pixbuf GetAvatar (string Email, int Size)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
UnixUserInfo UnixUserInfo = new UnixUserInfo (UnixEnvironment.UserName);
|
UnixUserInfo UnixUserInfo = new UnixUserInfo (UnixEnvironment.UserName);
|
||||||
|
|
||||||
string HomePath = UnixUserInfo.HomeDirectory;
|
string HomePath = UnixUserInfo.HomeDirectory;
|
||||||
|
@ -271,7 +294,6 @@ namespace SparkleShare {
|
||||||
|
|
||||||
if (!Directory.Exists (AvatarPath)) {
|
if (!Directory.Exists (AvatarPath)) {
|
||||||
Directory.CreateDirectory (AvatarPath);
|
Directory.CreateDirectory (AvatarPath);
|
||||||
// SparkleHelpers.DebugInfo ("Config", "Created '" + AvatarPath + "'");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string AvatarFilePath = CombineMore (AvatarPath, Email);
|
string AvatarFilePath = CombineMore (AvatarPath, Email);
|
||||||
|
@ -295,7 +317,6 @@ namespace SparkleShare {
|
||||||
FileInfo TmpFileInfo = new FileInfo (TmpFile);
|
FileInfo TmpFileInfo = new FileInfo (TmpFile);
|
||||||
if (TmpFileInfo.Length > 255)
|
if (TmpFileInfo.Length > 255)
|
||||||
File.Move (TmpFile, AvatarFilePath);
|
File.Move (TmpFile, AvatarFilePath);
|
||||||
Console.WriteLine ("AAAAAAA");
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -310,6 +331,7 @@ namespace SparkleShare {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Quits the program
|
// Quits the program
|
||||||
private void Quit (object o, EventArgs args)
|
private void Quit (object o, EventArgs args)
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,6 +20,7 @@ using SparkleShare;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace SparkleShare {
|
namespace SparkleShare {
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ namespace SparkleShare {
|
||||||
HideAll ();
|
HideAll ();
|
||||||
|
|
||||||
string RepoRemoteUrl = RemoteUrlCombo.Entry.Text;
|
string RepoRemoteUrl = RemoteUrlCombo.Entry.Text;
|
||||||
RepoRemoteUrl = SparkleHelpers.SparkleToGitUrl (RepoRemoteUrl);
|
RepoRemoteUrl = SparkleToGitUrl (RepoRemoteUrl);
|
||||||
|
|
||||||
int SlashPos = RepoRemoteUrl.LastIndexOf ("/");
|
int SlashPos = RepoRemoteUrl.LastIndexOf ("/");
|
||||||
int ColumnPos = RepoRemoteUrl.LastIndexOf (":");
|
int ColumnPos = RepoRemoteUrl.LastIndexOf (":");
|
||||||
|
@ -212,12 +213,35 @@ namespace SparkleShare {
|
||||||
// Enables the Add button when the fields are
|
// Enables the Add button when the fields are
|
||||||
// filled in correctly
|
// filled in correctly
|
||||||
public void CheckFields (object o, EventArgs args) {
|
public void CheckFields (object o, EventArgs args) {
|
||||||
if (SparkleHelpers.IsGitUrl (RemoteUrlCombo.Entry.Text))
|
if (IsGitUrl (RemoteUrlCombo.Entry.Text))
|
||||||
AddButton.Sensitive = true;
|
AddButton.Sensitive = true;
|
||||||
else
|
else
|
||||||
AddButton.Sensitive = false;
|
AddButton.Sensitive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Convert the more human readable sparkle:// url to something Git can use.
|
||||||
|
// Example: sparkle://gitorious.org/sparkleshare ssh://git@gitorious.org/sparkleshare
|
||||||
|
public static string SparkleToGitUrl (string Url)
|
||||||
|
{
|
||||||
|
if (Url.StartsWith ("sparkle://"))
|
||||||
|
Url = Url.Replace ("sparkle://", "ssh://git@");
|
||||||
|
|
||||||
|
// Usually don't need the ".git" at the end.
|
||||||
|
// It looks ugly as a folder too.
|
||||||
|
if (Url.EndsWith (".git"))
|
||||||
|
Url = Url.Substring (0, Url.Length - 4);
|
||||||
|
|
||||||
|
return Url;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Checks if a url is a valid git url
|
||||||
|
public static bool IsGitUrl (string Url)
|
||||||
|
{
|
||||||
|
return Regex.Match (Url, @"(.)+(/|:)(.)+").Success;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,19 +21,13 @@ using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
|
|
||||||
namespace SparkleShare {
|
namespace SparkleShare {
|
||||||
|
|
||||||
public static class SparkleHelpers
|
public static class SparkleHelpers
|
||||||
{
|
{
|
||||||
|
|
||||||
public static string _ (string s)
|
|
||||||
{
|
|
||||||
return Catalog.GetString (s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Gets the avatar for a specific email address and size
|
// Gets the avatar for a specific email address and size
|
||||||
public static Gdk.Pixbuf GetAvatar (string Email, int Size)
|
public static Gdk.Pixbuf GetAvatar (string Email, int Size)
|
||||||
{
|
{
|
||||||
|
@ -90,27 +84,8 @@ namespace SparkleShare {
|
||||||
return BitConverter.ToString (encodedBytes).ToLower ().Replace ("-", "");
|
return BitConverter.ToString (encodedBytes).ToLower ().Replace ("-", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Convert the more human readable sparkle:// url to
|
|
||||||
// something Git can use
|
|
||||||
// Example: sparkle://gitorious.org/sparkleshare
|
|
||||||
// to ssh://git@gitorious.org/sparkleshare
|
|
||||||
public static string SparkleToGitUrl (string Url)
|
|
||||||
{
|
|
||||||
if (Url.StartsWith ("sparkle://"))
|
|
||||||
Url = Url.Replace ("sparkle://", "ssh://git@");
|
|
||||||
|
|
||||||
// Usually don't need the ".git" at the end.
|
|
||||||
// It looks ugly as a folder too.
|
|
||||||
if (Url.EndsWith (".git"))
|
|
||||||
Url = Url.Substring (0, Url.Length - 4);
|
|
||||||
|
|
||||||
return Url;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Makes it possible to combine more than
|
// Makes it possible to combine more than
|
||||||
// two paths at once.
|
// two paths at once
|
||||||
public static string CombineMore (params string [] Parts)
|
public static string CombineMore (params string [] Parts)
|
||||||
{
|
{
|
||||||
string NewPath = " ";
|
string NewPath = " ";
|
||||||
|
@ -130,13 +105,6 @@ namespace SparkleShare {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Checks if a url is a valid git url
|
|
||||||
public static bool IsGitUrl (string Url)
|
|
||||||
{
|
|
||||||
return Regex.Match (Url, @"(.)+(/|:)(.)+").Success;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static bool ShowDebugInfo = true;
|
public static bool ShowDebugInfo = true;
|
||||||
|
|
||||||
|
|
||||||
|
@ -198,21 +166,6 @@ namespace SparkleShare {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Checks for unicorns
|
|
||||||
public static void CheckForUnicorns (string s) {
|
|
||||||
|
|
||||||
s = s.ToLower ();
|
|
||||||
if (s.Contains ("unicorn") && (s.Contains (".png") || s.Contains (".jpg"))) {
|
|
||||||
string title = _("Hold your ponies!");
|
|
||||||
string subtext = _("SparkleShare is known to be insanely fast with \n" +
|
|
||||||
"pictures of unicorns. Please make sure your internets\n" +
|
|
||||||
"are upgraded to the latest version to avoid problems.");
|
|
||||||
SparkleBubble unicorn_bubble = new SparkleBubble (title, subtext);
|
|
||||||
unicorn_bubble.Show ();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,7 +179,7 @@ namespace SparkleShare {
|
||||||
FetchTimer.Start ();
|
FetchTimer.Start ();
|
||||||
BufferTimer.Start ();
|
BufferTimer.Start ();
|
||||||
|
|
||||||
SparkleHelpers.CheckForUnicorns (Message);
|
CheckForUnicorns (Message);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,6 +457,22 @@ namespace SparkleShare {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Checks for unicorns
|
||||||
|
public static void CheckForUnicorns (string s) {
|
||||||
|
|
||||||
|
s = s.ToLower ();
|
||||||
|
if (s.Contains ("unicorn") && (s.Contains (".png") || s.Contains (".jpg"))) {
|
||||||
|
string title = _("Hold your ponies!");
|
||||||
|
string subtext = _("SparkleShare is known to be insanely fast with \n" +
|
||||||
|
"pictures of unicorns. Please make sure your internets\n" +
|
||||||
|
"are upgraded to the latest version to avoid problems.");
|
||||||
|
SparkleBubble unicorn_bubble = new SparkleBubble (title, subtext);
|
||||||
|
unicorn_bubble.Show ();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue