[smuxi: 10/15] [Frontend-GNOME] Load emoji from the cache, or download from emojione
- From: Mirco M. M. Bauer <mmmbauer src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [smuxi: 10/15] [Frontend-GNOME] Load emoji from the cache, or download from emojione
- Date: Tue, 3 Feb 2015 01:07:48 +0000 (UTC)
commit 9348a7fe8e473bc3954913faf07c4e9135d08bff
Author: Carlos MartÃn Nieto <cmn dwim me>
Date: Sun Feb 1 22:04:44 2015 +0100
[Frontend-GNOME] Load emoji from the cache, or download from emojione
src/Frontend-GNOME/Views/MessageTextView.cs | 80 ++++++++++++++++++++++-----
1 files changed, 66 insertions(+), 14 deletions(-)
---
diff --git a/src/Frontend-GNOME/Views/MessageTextView.cs b/src/Frontend-GNOME/Views/MessageTextView.cs
index bcd1ed1..09005f5 100644
--- a/src/Frontend-GNOME/Views/MessageTextView.cs
+++ b/src/Frontend-GNOME/Views/MessageTextView.cs
@@ -52,6 +52,7 @@ namespace Smuxi.Frontend.Gnome
private Gdk.Color _MarkerlineColor = new Gdk.Color(255, 0, 0);
private int _MarkerlineBufferPosition;
private int _BufferLines = -1;
+ private IconCache _EmojiCache = new IconCache("emoji");
Gtk.TextTag BoldTag { get; set; }
Gtk.TextTag ItalicTag { get; set; }
@@ -242,6 +243,59 @@ namespace Smuxi.Frontend.Gnome
Buffer.Clear();
}
+ static void AddAlternativeText(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel
imgPart)
+ {
+ if (!String.IsNullOrEmpty(imgPart.AlternativeText)) {
+ buffer.Insert(ref iter, imgPart.AlternativeText);
+ }
+ }
+
+ void AddEmoji(Gtk.TextBuffer buffer, ref Gtk.TextIter iter, ImageMessagePartModel imgPart, string
shortName)
+ {
+ var unicode = Emojione.ShortnameToUnicode(shortName);
+ if (unicode == null) {
+ AddAlternativeText(buffer, ref iter, imgPart);
+ return;
+ }
+
+ var emojiName = unicode + ".png";
+ string emojiPath;
+ if (_EmojiCache.TryGetIcon("emojione", emojiName, out emojiPath)) {
+ var emojiFile = new FileInfo(emojiPath);
+ if (emojiFile.Exists && emojiFile.Length > 0) {
+ var pix = new Gdk.Pixbuf(emojiPath);
+ buffer.InsertPixbuf(ref iter, pix);
+ } else {
+ AddAlternativeText(buffer, ref iter, imgPart);
+ }
+
+ return;
+ }
+
+ // add a mark here so we know where to insert the pixbuf
+ // once we've downloaded the file; in case of error we
+ // insert the name instead
+ var mark = new Gtk.TextMark(null, true);
+ buffer.AddMark(mark, iter);
+ var emojiUrl = Emojione.UnicodeToUrl(unicode);
+ _EmojiCache.DownloadFile("emojione", emojiName, emojiUrl,
+ (path) => {
+ GLib.Idle.Add(delegate {
+ var markIter = buffer.GetIterAtMark(mark);
+ buffer.InsertPixbuf(ref markIter, new Gdk.Pixbuf(path));
+ return false;
+ });
+ },
+ (ex) => {
+ GLib.Idle.Add(delegate {
+ var markIter = buffer.GetIterAtMark(mark);
+ AddAlternativeText(buffer, ref markIter, imgPart);
+ return false;
+ });
+ }
+ );
+ }
+
public void AddMessage(MessageModel msg)
{
AddMessage(msg, true);
@@ -409,23 +463,21 @@ namespace Smuxi.Frontend.Gnome
}
} else if (msgPart is ImageMessagePartModel) {
var imgpart = (ImageMessagePartModel) msgPart;
+ Uri uri = null;
try {
- var uri = new Uri(imgpart.ImageFileName);
- if (uri.Scheme == "smuxi-emoji") {
- var emojiPath = System.IO.Path.Combine("/tmp/emoji/assets/images", uri.Host +
".png");
- var emojiFile = new FileInfo(emojiPath);
- if (emojiFile.Exists && emojiFile.Length > 0) {
- var pix = new Gdk.Pixbuf(emojiPath);
- buffer.InsertPixbuf(ref iter, pix);
- continue;
- }
- }
+ uri = new Uri(imgpart.ImageFileName);
} catch (UriFormatException) {
- // we want to simply continue, using the alt text
+ AddAlternativeText(buffer, ref iter, imgpart);
+ }
+ switch (uri.Scheme) {
+ case "smuxi-emoji":
+ var shortName = uri.Host;
+ AddEmoji(buffer, ref iter, imgpart, shortName);
+ break;
+ default:
+ AddAlternativeText(buffer, ref iter, imgpart);
+ break;
}
-
- if (!String.IsNullOrEmpty(imgpart.AlternativeText))
- buffer.Insert(ref iter, imgpart.AlternativeText);
}
}
var startIter = buffer.GetIterAtMark(startMark);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]