27 #include <QWaitCondition>
32 #include "klflatexpreviewthread.h"
33 #include "klflatexpreviewthread_p.h"
37 KLFLatexPreviewHandler::KLFLatexPreviewHandler(
QObject * parent)
41 KLFLatexPreviewHandler::~KLFLatexPreviewHandler()
55 Q_UNUSED(preview); Q_UNUSED(largePreview); Q_UNUSED(fullPreview);
63 Q_UNUSED(largePreview);
67 Q_UNUSED(fullPreview);
71 Q_UNUSED(errorString); Q_UNUSED(errorCode);
79 KLFLatexPreviewThread::KLFLatexPreviewThread(
QObject * parent)
89 qRegisterMetaType<KLFBackend::klfOutput>(
"KLFBackend::klfOutput") ;
92 qRegisterMetaType<KLFBackend::klfInput>(
"KLFBackend::klfInput") ;
95 qRegisterMetaType<KLFBackend::klfSettings>(
"KLFBackend::klfSettings") ;
98 qRegisterMetaType<KLFLatexPreviewThreadWorker::Task>(
"KLFLatexPreviewThreadWorker::Task") ;
101 qRegisterMetaType<KLFLatexPreviewThread::TaskId>(
"KLFLatexPreviewThread::TaskId") ;
109 d->worker =
new KLFLatexPreviewThreadWorker;
110 d->worker->moveToThread(
this);
113 connect(d, SIGNAL(internalRequestAbort()), d->worker, SLOT(abort()), Qt::DirectConnection);
116 connect(d, SIGNAL(internalRequestSubmitNewTask(KLFLatexPreviewThreadWorker::Task,
bool,
117 KLFLatexPreviewThread::TaskId)),
118 d->worker, SLOT(threadSubmitTask(KLFLatexPreviewThreadWorker::Task,
bool,
119 KLFLatexPreviewThread::TaskId)),
120 Qt::QueuedConnection);
122 connect(d, SIGNAL(internalRequestClearPendingTasks()), d->worker, SLOT(threadClearPendingTasks()),
123 Qt::QueuedConnection);
125 connect(d, SIGNAL(internalRequestCancelTask(KLFLatexPreviewThread::TaskId)),
126 d->worker, SLOT(threadCancelTask(KLFLatexPreviewThread::TaskId)),
127 Qt::QueuedConnection);
130 KLFLatexPreviewThread::~KLFLatexPreviewThread()
142 QSize KLFLatexPreviewThread::previewSize()
const
143 {
return d->previewSize; }
144 QSize KLFLatexPreviewThread::largePreviewSize()
const
145 {
return d->largePreviewSize; }
147 void KLFLatexPreviewThread::setPreviewSize(
const QSize& previewSize)
148 { d->previewSize = previewSize; }
149 void KLFLatexPreviewThread::setLargePreviewSize(
const QSize& largePreviewSize)
150 { d->largePreviewSize = largePreviewSize; }
153 void KLFLatexPreviewThread::start(Priority priority)
161 void KLFLatexPreviewThread::stop()
164 emit d->internalRequestAbort();
170 void KLFLatexPreviewThread::run()
178 KLFLatexPreviewThread::TaskId
182 const QSize& previewSize,
183 const QSize& largePreviewSize)
185 KLFLatexPreviewThreadWorker::Task t;
187 t.settings = settings;
188 t.handler = outputhandler;
189 t.previewSize = previewSize;
190 t.largePreviewSize = largePreviewSize;
192 return d->submitTask(t,
false, -1);
195 KLFLatexPreviewThread::TaskId
200 KLFLatexPreviewThreadWorker::Task t;
202 t.settings = settings;
203 t.handler = outputhandler;
204 t.previewSize = d->previewSize;
205 t.largePreviewSize = d->largePreviewSize;
207 return d->submitTask(t,
false, -1);
210 KLFLatexPreviewThread::TaskId
214 const QSize& previewSize,
215 const QSize& largePreviewSize)
217 KLFLatexPreviewThreadWorker::Task t;
219 t.settings = settings;
220 t.handler = outputhandler;
221 t.previewSize = previewSize;
222 t.largePreviewSize = largePreviewSize;
224 return d->submitTask(t,
true, -1);
227 KLFLatexPreviewThread::TaskId
232 KLFLatexPreviewThreadWorker::Task t;
234 t.settings = settings;
235 t.handler = outputhandler;
236 t.previewSize = d->previewSize;
237 t.largePreviewSize = d->largePreviewSize;
239 return d->submitTask(t,
true, -1);
242 KLFLatexPreviewThread::TaskId
243 KLFLatexPreviewThread::replaceSubmitPreviewTask(KLFLatexPreviewThread::TaskId replaceId,
247 const QSize& previewSize,
248 const QSize& largePreviewSize)
250 KLFLatexPreviewThreadWorker::Task t;
252 t.settings = settings;
253 t.handler = outputhandler;
254 t.previewSize = previewSize;
255 t.largePreviewSize = largePreviewSize;
257 return d->submitTask(t,
false, replaceId);
260 KLFLatexPreviewThread::TaskId
261 KLFLatexPreviewThread::replaceSubmitPreviewTask(KLFLatexPreviewThread::TaskId replaceId,
266 KLFLatexPreviewThreadWorker::Task t;
268 t.settings = settings;
269 t.handler = outputhandler;
270 t.previewSize = d->previewSize;
271 t.largePreviewSize = d->largePreviewSize;
273 return d->submitTask(t,
false, replaceId);
278 void KLFLatexPreviewThread::cancelTask(TaskId task)
280 emit d->internalRequestCancelTask(task);
282 void KLFLatexPreviewThread::clearPendingTasks()
284 emit d->internalRequestClearPendingTasks();
294 void KLFLatexPreviewThreadWorker::threadSubmitTask(Task task,
bool clearOtherJobs, TaskId replaceTaskId)
298 if (clearOtherJobs) {
299 threadClearPendingTasks();
302 threadCancelTask(replaceTaskId);
306 newTasks.enqueue(task);
308 klfDbg(
"enqueued task id="<<task.taskid) ;
314 bool KLFLatexPreviewThreadWorker::threadCancelTask(TaskId taskid)
317 for (k = 0; k < newTasks.size(); ++k) {
318 if (newTasks.at(k).taskid == taskid) {
319 newTasks.removeAt(k);
326 klfDbg(
"No such task ID: "<<taskid) ;
330 void KLFLatexPreviewThreadWorker::threadClearPendingTasks()
335 void KLFLatexPreviewThreadWorker::threadProcessJobs()
342 if (!newTasks.size()) {
351 task = newTasks.dequeue();
353 klfDbg(
"processing job ID="<<task.taskid) ;
356 if ( task.input.latex.trimmed().isEmpty() ) {
360 klfDbg(
"worker: running KLFBackend::getLatexFormula()") ;
366 if (ouroutput.
status != 0) {
370 Q_ARG(
int, ouroutput.
status));
375 if (task.previewSize.isValid()) {
377 if (prev.
width() > task.previewSize.width() || prev.
height() > task.previewSize.height()) {
378 prev = img.
scaled(task.previewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
381 if (task.largePreviewSize.isValid()) {
383 if (lprev.
width() > task.largePreviewSize.width() || lprev.
height() > task.largePreviewSize.height()) {
384 lprev = img.
scaled(task.largePreviewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
392 if (task.previewSize.isValid()) {
396 if (task.largePreviewSize.isValid()) {
405 klfDbg(
"about to invoke delayed threadProcessJobs.") ;
410 klfDbg(
"threadProcessJobs: end") ;
432 KLFContLatexPreview::~KLFContLatexPreview()
443 bool KLFContLatexPreview::enabled()
const
448 void KLFContLatexPreview::setEnabled(
bool enabled)
450 d->enabled = enabled;
463 if (d->input == input)
473 if (disableExtraFormats) {
479 if (d->settings == s)
489 if (d->previewSize == previewSize)
491 d->previewSize = previewSize;
497 if (d->largePreviewSize == largePreviewSize)
499 d->largePreviewSize = largePreviewSize;