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()
141 QSize KLFLatexPreviewThread::previewSize()
const
142 {
return d->previewSize; }
143 QSize KLFLatexPreviewThread::largePreviewSize()
const
144 {
return d->largePreviewSize; }
146 void KLFLatexPreviewThread::setPreviewSize(
const QSize& previewSize)
147 { d->previewSize = previewSize; }
148 void KLFLatexPreviewThread::setLargePreviewSize(
const QSize& largePreviewSize)
149 { d->largePreviewSize = largePreviewSize; }
152 void KLFLatexPreviewThread::start(Priority priority)
160 void KLFLatexPreviewThread::stop()
163 emit d->internalRequestAbort();
169 void KLFLatexPreviewThread::run()
177 KLFLatexPreviewThread::TaskId
181 const QSize& previewSize,
182 const QSize& largePreviewSize)
184 KLFLatexPreviewThreadWorker::Task t;
186 t.settings = settings;
187 t.handler = outputhandler;
188 t.previewSize = previewSize;
189 t.largePreviewSize = largePreviewSize;
191 return d->submitTask(t,
false, -1);
194 KLFLatexPreviewThread::TaskId
199 KLFLatexPreviewThreadWorker::Task t;
201 t.settings = settings;
202 t.handler = outputhandler;
203 t.previewSize = d->previewSize;
204 t.largePreviewSize = d->largePreviewSize;
206 return d->submitTask(t,
false, -1);
209 KLFLatexPreviewThread::TaskId
213 const QSize& previewSize,
214 const QSize& largePreviewSize)
216 KLFLatexPreviewThreadWorker::Task t;
218 t.settings = settings;
219 t.handler = outputhandler;
220 t.previewSize = previewSize;
221 t.largePreviewSize = largePreviewSize;
223 return d->submitTask(t,
true, -1);
226 KLFLatexPreviewThread::TaskId
231 KLFLatexPreviewThreadWorker::Task t;
233 t.settings = settings;
234 t.handler = outputhandler;
235 t.previewSize = d->previewSize;
236 t.largePreviewSize = d->largePreviewSize;
238 return d->submitTask(t,
true, -1);
241 KLFLatexPreviewThread::TaskId
242 KLFLatexPreviewThread::replaceSubmitPreviewTask(KLFLatexPreviewThread::TaskId replaceId,
246 const QSize& previewSize,
247 const QSize& largePreviewSize)
249 KLFLatexPreviewThreadWorker::Task t;
251 t.settings = settings;
252 t.handler = outputhandler;
253 t.previewSize = previewSize;
254 t.largePreviewSize = largePreviewSize;
256 return d->submitTask(t,
false, replaceId);
259 KLFLatexPreviewThread::TaskId
260 KLFLatexPreviewThread::replaceSubmitPreviewTask(KLFLatexPreviewThread::TaskId replaceId,
265 KLFLatexPreviewThreadWorker::Task t;
267 t.settings = settings;
268 t.handler = outputhandler;
269 t.previewSize = d->previewSize;
270 t.largePreviewSize = d->largePreviewSize;
272 return d->submitTask(t,
false, replaceId);
277 void KLFLatexPreviewThread::cancelTask(TaskId task)
279 emit d->internalRequestCancelTask(task);
281 void KLFLatexPreviewThread::clearPendingTasks()
283 emit d->internalRequestClearPendingTasks();
293 void KLFLatexPreviewThreadWorker::threadSubmitTask(Task task,
bool clearOtherJobs, TaskId replaceTaskId)
297 if (clearOtherJobs) {
298 threadClearPendingTasks();
301 threadCancelTask(replaceTaskId);
305 newTasks.enqueue(task);
307 klfDbg(
"enqueued task id="<<task.taskid) ;
313 bool KLFLatexPreviewThreadWorker::threadCancelTask(TaskId taskid)
316 for (k = 0; k < newTasks.size(); ++k) {
317 if (newTasks.at(k).taskid == taskid) {
318 newTasks.removeAt(k);
325 klfDbg(
"No such task ID: "<<taskid) ;
329 void KLFLatexPreviewThreadWorker::threadClearPendingTasks()
334 void KLFLatexPreviewThreadWorker::threadProcessJobs()
341 if (!newTasks.size()) {
350 task = newTasks.dequeue();
352 klfDbg(
"processing job ID="<<task.taskid) ;
355 if ( task.input.latex.trimmed().isEmpty() ) {
359 klfDbg(
"worker: running KLFBackend::getLatexFormula()") ;
365 if (ouroutput.
status != 0) {
369 Q_ARG(
int, ouroutput.
status));
374 if (task.previewSize.isValid()) {
376 if (prev.
width() > task.previewSize.width() || prev.
height() > task.previewSize.height()) {
377 prev = img.
scaled(task.previewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
380 if (task.largePreviewSize.isValid()) {
382 if (lprev.
width() > task.largePreviewSize.width() || lprev.
height() > task.largePreviewSize.height()) {
383 lprev = img.
scaled(task.largePreviewSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
391 if (task.previewSize.isValid()) {
395 if (task.largePreviewSize.isValid()) {
404 klfDbg(
"about to invoke delayed threadProcessJobs.") ;
409 klfDbg(
"threadProcessJobs: end") ;
431 KLFContLatexPreview::~KLFContLatexPreview()
450 if (d->input == input)
460 if (disableExtraFormats) {
466 if (d->settings == s)
476 if (d->previewSize == previewSize)
478 d->previewSize = previewSize;
484 if (d->largePreviewSize == largePreviewSize)
486 d->largePreviewSize = largePreviewSize;