コード例 #1
0
ファイル: MessageTextView.cs プロジェクト: shubhtr/smuxi
        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;
            }

            // A mark here serves two pusposes. One is to allow us to apply the
            // tag across the pixbuf. It also lets us know later where to put
            // the pixbuf if we need to load it from the network
            var mark = new Gtk.TextMark(null, true);

            buffer.AddMark(mark, iter);

            var    emojiName = unicode + ".png";
            string emojiPath;

            if (EmojiCache.TryGetIcon("emojione", emojiName, out emojiPath))
            {
                var emojiFile = new FileInfo(emojiPath);
                if (emojiFile.Exists && emojiFile.Length > 0)
                {
                    AddEmoji(buffer, ref iter, imgPart, shortName, mark, emojiPath);
                }
                else
                {
                    AddAlternativeText(buffer, ref iter, imgPart);
                }

                return;
            }

            var emojiUrl = Emojione.UnicodeToUrl(unicode);

            EmojiCache.BeginDownloadFile("emojione", emojiName, emojiUrl,
                                         (path) => {
                GLib.Idle.Add(delegate {
                    var markIter = buffer.GetIterAtMark(mark);
                    AddEmoji(buffer, ref markIter, imgPart, shortName, mark, path);
                    return(false);
                });
            },
                                         (ex) => {
                GLib.Idle.Add(delegate {
                    var markIter = buffer.GetIterAtMark(mark);
                    buffer.DeleteMark(mark);
                    AddAlternativeText(buffer, ref markIter, imgPart);
                    return(false);
                });
            }
                                         );
        }
コード例 #2
0
ファイル: MessageTextView.cs プロジェクト: kvsm/smuxi
        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;
            }

            int width, height;
            int descent;

            using (var layout = CreatePangoLayout(null)) {
                layout.GetPixelSize(out width, out height);
                descent = layout.Context.GetMetrics(layout.FontDescription, null).Descent;
            }

            // A mark here serves two pusposes. One is to allow us to apply the
            // tag across the pixbuf. It also lets us know later where to put
            // the pixbuf if we need to load it from the network
            var mark = new Gtk.TextMark(null, true);

            buffer.AddMark(mark, iter);

            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, -1, height);
                    buffer.InsertPixbuf(ref iter, pix);
                    var beforeIter = buffer.GetIterAtMark(mark);
                    var imgTag     = new EmojiTag(mark, emojiFile.FullName);
                    imgTag.Rise = -descent;
                    _MessageTextTagTable.Add(imgTag);
                    buffer.ApplyTag(imgTag, beforeIter, iter);
                }
                else
                {
                    AddAlternativeText(buffer, ref iter, imgPart);
                }

                return;
            }

            var emojiUrl = Emojione.UnicodeToUrl(unicode);

            EmojiCache.BeginDownloadFile("emojione", emojiName, emojiUrl,
                                         (path) => {
                GLib.Idle.Add(delegate {
                    var afterIter = buffer.GetIterAtMark(mark);
                    buffer.InsertPixbuf(ref afterIter, new Gdk.Pixbuf(path, -1, height));
                    var beforeIter = buffer.GetIterAtMark(mark);
                    var emojiTag   = new EmojiTag(mark, path);
                    _MessageTextTagTable.Add(emojiTag);
                    emojiTag.Rise = -descent;
                    buffer.ApplyTag(emojiTag, beforeIter, afterIter);
                    return(false);
                });
            },
                                         (ex) => {
                GLib.Idle.Add(delegate {
                    var markIter = buffer.GetIterAtMark(mark);
                    buffer.DeleteMark(mark);
                    AddAlternativeText(buffer, ref markIter, imgPart);
                    return(false);
                });
            }
                                         );
        }