15
15
UndoManager undo_manager;
17
// GODDAMN Gtk.TextBuffer. I hate you. Hate Hate Hate.
18
struct ImageInsertData
21
public Gtk.TextBuffer buffer;
22
public Gtk.TextMark position;
23
public Gdk.Pixbuf image;
27
uint imageQueueTimeout;
17
30
// list of Gtk.TextTags to apply on insert
18
31
ArrayList active_tags;
150
166
void ImageSwap (NoteTag tag,
151
167
Gtk.TextIter start,
154
if (tag.Image != null &&
155
tag.Image != start.Pixbuf) {
156
Logger.Log ("ImageSwap: tag='{0}' {1}:'{3}'-{2}:'{4}'",
163
start.Buffer.InsertPixbuf (ref start, tag.Image);
171
if (tag.Image == null)
174
Gtk.TextIter prev = start;
177
if ((adding == true && tag.Image != prev.Pixbuf) ||
178
(adding == false && tag.Image == prev.Pixbuf)) {
179
ImageInsertData data = new ImageInsertData();
180
data.buffer = start.Buffer;
182
data.image = tag.Image;
183
data.adding = adding;
186
data.position = start.Buffer.CreateMark (null, start, true);
188
data.position = tag.ImageLocation;
191
imageQueue.Add(data);
193
if (imageQueueTimeout == 0) {
194
imageQueueTimeout = GLib.Idle.Add(RunImageQueue);
199
public bool RunImageQueue ()
201
foreach (ImageInsertData data in imageQueue) {
202
NoteBuffer buffer = data.buffer as NoteBuffer;
203
Gtk.TextIter iter = buffer.GetIterAtMark (data.position);
205
buffer.Undoer.FreezeUndo();
207
if (data.adding && data.tag.ImageLocation == null) {
208
buffer.InsertPixbuf (ref iter, data.image);
209
data.tag.ImageLocation = data.position;
210
} else if (!data.adding && data.tag.ImageLocation != null) {
211
Gtk.TextIter end = iter;
213
buffer.Delete (ref iter, ref end);
214
buffer.DeleteMark (data.position);
215
data.tag.ImageLocation = null;
218
buffer.Undoer.ThawUndo();
223
imageQueueTimeout = 0;
167
227
void OnTagChanged (object sender, Gtk.TagChangedArgs args)
171
231
TextTagEnumerator enumerator =
172
232
new TextTagEnumerator (this, note_tag);
173
233
foreach (TextRange range in enumerator) {
174
ImageSwap (note_tag, range.Start, range.End);
234
ImageSwap (note_tag, range.Start, range.End, true);
185
245
NoteTag note_tag = tag as NoteTag;
186
246
if (note_tag != null) {
187
ImageSwap (note_tag, start, end);
247
ImageSwap (note_tag, start, end, true);
251
protected override void OnTagRemoved (Gtk.TextTag tag,
255
NoteTag note_tag = tag as NoteTag;
256
if (note_tag != null) {
257
ImageSwap (note_tag, start, end, false);
260
base.OnTagRemoved (tag, start, end);
191
263
public UndoManager Undoer