From 15de00ae64ca3ad14d1b55fdb1e8c704a45825e0 Mon Sep 17 00:00:00 2001 From: Hylke Bons Date: Sat, 22 May 2010 18:29:57 +0100 Subject: [PATCH] add service icons to the autocomplete list --- SparkleShare/SparkleDialog.cs | 28 +++-- SparkleShare/SparkleHelpers.cs | 108 ++++++++++++++++++ .../hicolor/16x16/places/fedorahosted.png | Bin 0 -> 747 bytes data/icons/hicolor/16x16/places/github.png | Bin 0 -> 440 bytes data/icons/hicolor/16x16/places/gnome.png | Bin 0 -> 650 bytes 5 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 SparkleShare/SparkleHelpers.cs create mode 100644 data/icons/hicolor/16x16/places/fedorahosted.png create mode 100644 data/icons/hicolor/16x16/places/github.png create mode 100644 data/icons/hicolor/16x16/places/gnome.png diff --git a/SparkleShare/SparkleDialog.cs b/SparkleShare/SparkleDialog.cs index 3e115e78..14855203 100644 --- a/SparkleShare/SparkleDialog.cs +++ b/SparkleShare/SparkleDialog.cs @@ -52,19 +52,33 @@ namespace SparkleShare { RemoteUrlCombo = new ComboBoxEntry (); - ListStore Defaults = new ListStore (typeof (string)); + ListStore Defaults = new ListStore (typeof (string), + typeof (Gdk.Pixbuf)); + + + - Defaults.AppendValues ("ssh://git@github.com/"); - Defaults.AppendValues ("ssh://git@git.gnome.org/"); - Defaults.AppendValues ("ssh://git@fedorahosted.org/"); - Defaults.AppendValues ("ssh://git@gitorious.org/"); - RemoteUrlCombo.Entry.Completion = new EntryCompletion (); + + CellRendererPixbuf CellRendererPixbuf = new CellRendererPixbuf (); RemoteUrlCombo.Entry.Completion.Model = Defaults; + RemoteUrlCombo.Entry.Completion.PackStart (CellRendererPixbuf, false); + RemoteUrlCombo.Entry.Completion.AddAttribute (CellRendererPixbuf, "pixbuf", 1); + RemoteUrlCombo.Entry.Completion.InlineCompletion = true; + RemoteUrlCombo.Entry.Completion.PopupCompletion = true;; RemoteUrlCombo.Entry.Completion.TextColumn = 0; + Defaults.AppendValues ("ssh://git@github.com/", + SparkleHelpers.GetIcon ("github", 16)); + Defaults.AppendValues ("ssh://git@git.gnome.org/", + SparkleHelpers.GetIcon ("gnome", 16)); + Defaults.AppendValues ("ssh://git@fedorahosted.org/", + SparkleHelpers.GetIcon ("fedorahosted", 16)); + Defaults.AppendValues ("ssh://git@gitorious.org/", + null); + Label RemoteUrlExample = new Label (_("These usually look something like this:\n ") + - _("‘sparkle://sparkleshare.org/SparkleShare’.")); + _("‘git://git@gnome.org/project’.")); RemoteUrlExample.UseMarkup = true; RemoteUrlExample.SetAlignment (0, 0); diff --git a/SparkleShare/SparkleHelpers.cs b/SparkleShare/SparkleHelpers.cs new file mode 100644 index 00000000..47b580e9 --- /dev/null +++ b/SparkleShare/SparkleHelpers.cs @@ -0,0 +1,108 @@ +// SparkleShare, an instant update workflow to Git. +// Copyright (C) 2010 Hylke Bons +// +// 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 . + +using Gtk; +using System; +using System.IO; +using System.Net; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; + +namespace SparkleShare { + + public static class SparkleHelpers { + + public static Gdk.Pixbuf GetAvatar (string Email, int Size) { + + string AvatarPath = Path.Combine (SparklePaths.SparkleAvatarPath, + Size + "x" + Size); + + if (!Directory.Exists (AvatarPath)) { + Directory.CreateDirectory (AvatarPath); + Console.WriteLine ("[Config] Created '" + AvatarPath + "'"); + } + + string AvatarFilePath = AvatarPath + Email; + + if (File.Exists (AvatarFilePath)) + return new Gdk.Pixbuf (AvatarFilePath); + else { + + // Let's try to get the person's gravatar for next time + WebClient WebClient = new WebClient (); + Uri GravatarUri = new Uri ("http://www.gravatar.com/avatar/" + + GetMD5 (Email) + ".jpg?s=" + Size + "&d=404"); + + string TmpFile = SparklePaths.SparkleTmpPath + Email + Size; + + if (!File.Exists (TmpFile)) { + + WebClient.DownloadFileAsync (GravatarUri, TmpFile); + WebClient.DownloadFileCompleted += delegate { + File.Delete (AvatarPath + Email); + FileInfo TmpFileInfo = new FileInfo (TmpFile); + if (TmpFileInfo.Length > 255) + File.Move (TmpFile, AvatarPath + Email); + }; + + } + + if (File.Exists (AvatarPath + Email)) + return new Gdk.Pixbuf (AvatarPath + Email); + else + return GetIcon ("avatar-default", Size); + + } + + } + + // Creates an MD5 hash + public static string GetMD5 (string s) { + MD5 md5 = new MD5CryptoServiceProvider (); + Byte[] Bytes = ASCIIEncoding.Default.GetBytes (s); + Byte[] EncodedBytes = md5.ComputeHash (Bytes); + return BitConverter.ToString(EncodedBytes).ToLower ().Replace ("-", ""); + } + + // Makes it possible to combine more than + // two paths at once. + public static string CombineMore (params string [] Parts) { + string NewPath = " "; + foreach (string Part in Parts) + NewPath = Path.Combine (NewPath, Part); + return NewPath; + } + + public static IconTheme SparkleTheme = new IconTheme (); + + // Looks up an icon from the system's theme + public static Gdk.Pixbuf GetIcon (string Name, int Size) { + + SparkleTheme.AppendSearchPath + (CombineMore (SparklePaths.SparkleInstallPath, "icons")); + + return SparkleTheme.LoadIcon (Name, Size, + IconLookupFlags.GenericFallback); + } + + public static bool IsGitUrl (string Url) { + return Regex.Match (Url, @"[a-z]+://(.)+").Success; + } + + } + +} diff --git a/data/icons/hicolor/16x16/places/fedorahosted.png b/data/icons/hicolor/16x16/places/fedorahosted.png new file mode 100644 index 0000000000000000000000000000000000000000..84287bbb1f13ba5097807865434cc88bec3bea59 GIT binary patch literal 747 zcmVizbV;y-bm-DkllFA8o+SWSN_f15i+Ter~N{ z*13y!E&2@r0pV%@DFwTGs&sd`J=A%9?Ecs+J_sFlW^l?8)VCaG_+k%z!Djr8Zd|71 z)sx#yCo{a9N~3jw_0)pH>~sLG+CyHBgw7#^fixumHPRrL|Lvfl+5VnlbNMs5?3M#a zmVV*zv2FnDxwqV(Dhggdy92=B@ZD-1f)+D|bFMvD&(21=oK9_xL@8Z888C#NECKR6 zSq^v_Fl5oxnbQIMjcyjdt^K7s<9=6cqSV5M{gI}wUam*4(9`arue*i3Dlqo^O_f~I zrc_Y?$H8)T)h3;sCfwmA9B3w)1jTC$=VbG2X$LCB!+7wKhFC#0|P|rRSGe z_D$T=i=4LnhHX@#pgYI42xkC-A(X*nCG9KTWzv6YAU;%B|(0}Xvih_ND zl;)4}2Uh!$j%^y9I8zCs`|ee99(_K6jat=rr#aAEt&(iF`|8gmR{cH5x<*F2G)oE^ zz=$iiSIx}(Q`l8q{b4GvB{9K|00RIL`H2~CnPl()0000 z;wdb z{t5^R{TC7z`G4ljnL3zyCUgUsSXkC5D=Y676cprVWoKt_a&nSqVPy?uWoKt%WoKuI zi;H70Ha6aeVY9THLZG~|YOtiN{93=jp#NL8ZL>+w%6{_c)2Av)S@}jOS^582xq1J; zef!pmtd9l8U}j|t5f>K^EX>cfP*ji?*tlie)sLUP#)^#A|=rwj}XoD2*M3}3!|XGloPe50+US&!jm7~{;b z!#DW_1?|)Gil#HMuqH6GvT-uAvN0fGk>J39N}L8TFfcI8U$!#qF9V|}6Du17I<~X5 zWrzq3K8bDs3o?h1h0Oq60UIkTLuy>qzm(XhMotcnnRpFgU}n9|z`$Sx<7#WDGBlMJ zUC>rnP1CS(yN9kB!wdgeSmyp`VP*Kw!pgwT&CM{kzjNuVWosPO?L1ffXJUR6mR_(B zuK~9X@7&GF%`@*m6Dz~_-~Soh;<8?CKXfAEKNG9ce4$uQ~t!{~s=%8t(tEEG^ETk&$r=UIQ2y7#RNl|IfT-|Ixf_cOPVNva_q`Yp7he kGc~AWWMtfkO+7^b02Skx#B+*xzW@LL07*qoM6N<$g3pyB_W%F@ literal 0 HcmV?d00001