]> git.lyx.org Git - lyx.git/blob - src/graphics/PreviewedInset.C
Cache the BufferView as a weak_ptr; get rid of those horrible current_views.
[lyx.git] / src / graphics / PreviewedInset.C
1 // -*- C++ -*-
2 /**
3  *  \file PreviewedInset.C
4  *  Copyright 2002 the LyX Team
5  *  Read the file COPYING
6  *
7  * \author Angus Leeming <leeming@lyx.org>
8  */
9
10 #ifdef __GNUG__
11 #pragma implementation
12 #endif
13
14 #include <config.h>
15
16 #include "PreviewedInset.h"
17 #include "GraphicsImage.h"
18 #include "PreviewLoader.h"
19 #include "PreviewImage.h"
20 #include "Previews.h"
21
22 #include "buffer.h"
23 #include "BufferView.h"
24
25 #include "frontends/LyXView.h"
26
27 #include "support/lstrings.h"
28
29 #include <boost/bind.hpp>
30
31
32 namespace grfx {
33
34 bool PreviewedInset::activated()
35 {
36         return Previews::activated();
37 }
38
39
40 void PreviewedInset::generatePreview()
41 {
42         if (!Previews::activated() || !previewWanted() ||
43             !view() || !view()->buffer())
44                 return;
45
46         grfx::Previews & previews = grfx::Previews::get();
47         grfx::PreviewLoader & loader = previews.loader(view()->buffer());
48         addPreview(loader);
49         if (!snippet_.empty())
50                 loader.startLoading();
51 }
52
53
54 void PreviewedInset::addPreview(grfx::PreviewLoader & ploader)
55 {
56         if (!Previews::activated() || !previewWanted())
57                 return;
58
59         setView(ploader.buffer().getUser());
60
61         snippet_ = trim(latexString());
62         if (snippet_.empty())
63                 return;
64
65         pimage_ = ploader.preview(snippet_);
66         if (pimage_)
67                 return;
68
69         // If this is the first time of calling, connect to the
70         // grfx::PreviewLoader signal that'll inform us when the preview image
71         // is ready for loading.
72         if (!connection_.connected()) {
73                 connection_ = ploader.connect(
74                         boost::bind(&PreviewedInset::imageReady, this, _1));
75         }
76
77         ploader.add(snippet_);
78 }
79
80
81 bool PreviewedInset::previewReady() const
82 {
83         if (!Previews::activated() || !previewWanted() ||
84             !view() || !view()->buffer())
85                 return false;
86
87         if (!pimage_ || snippet_ != pimage_->snippet()) {
88                 grfx::PreviewLoader & ploader =
89                         grfx::Previews::get().loader(view()->buffer());
90                 pimage_ = ploader.preview(snippet_);
91         }
92
93         if (!pimage_)
94                 return false;
95
96         return pimage_->image(inset_, *view());
97 }
98
99
100 void PreviewedInset::setView(BufferView * bv)
101 {
102         if (!bv)
103                 return;
104         
105         view_ = bv->owner()->view();
106 }
107
108 void PreviewedInset::imageReady(grfx::PreviewImage const & pimage) const
109 {
110         // Check snippet against the Inset's current contents
111         if (snippet_ != pimage.snippet())
112                 return;
113
114         pimage_ = &pimage;
115
116         if (view())
117                 view()->updateInset(&inset_, false);
118 }
119
120 } // namespace grfx