27#include <QWaitCondition>
32#include "klflatexpreviewthread.h"
33#include "klflatexpreviewthread_p.h"
37KLFLatexPreviewHandler::KLFLatexPreviewHandler(
QObject * parent)
41KLFLatexPreviewHandler::~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);
79KLFLatexPreviewThread::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);
130KLFLatexPreviewThread::~KLFLatexPreviewThread()
142QSize KLFLatexPreviewThread::previewSize()
const
143{
return d->previewSize; }
144QSize KLFLatexPreviewThread::largePreviewSize()
const
145{
return d->largePreviewSize; }
147void KLFLatexPreviewThread::setPreviewSize(
const QSize& previewSize)
148{ d->previewSize = previewSize; }
149void KLFLatexPreviewThread::setLargePreviewSize(
const QSize& largePreviewSize)
150{ d->largePreviewSize = largePreviewSize; }
153void KLFLatexPreviewThread::start(Priority priority)
161void KLFLatexPreviewThread::stop()
164 emit d->internalRequestAbort();
170void KLFLatexPreviewThread::run()
178KLFLatexPreviewThread::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);
195KLFLatexPreviewThread::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);
210KLFLatexPreviewThread::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);
227KLFLatexPreviewThread::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);
242KLFLatexPreviewThread::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);
260KLFLatexPreviewThread::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);
278void KLFLatexPreviewThread::cancelTask(TaskId task)
280 emit d->internalRequestCancelTask(task);
282void KLFLatexPreviewThread::clearPendingTasks()
284 emit d->internalRequestClearPendingTasks();
294void 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) ;
314bool 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) ;
330void KLFLatexPreviewThreadWorker::threadClearPendingTasks()
335void 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") ;
432KLFContLatexPreview::~KLFContLatexPreview()
443bool KLFContLatexPreview::enabled()
const
448void 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;
static klfOutput getLatexFormula(const klfInput &in, const klfSettings &settings, bool isMainThread=true)
The function that processes everything.
bool setLargePreviewSize(const QSize &largePreviewSize)
bool setSettings(const KLFBackend::klfSettings &settings, bool disableExtraFormats=true)
bool setInput(const KLFBackend::klfInput &input)
bool setPreviewSize(const QSize &previewSize)
virtual void latexPreviewReset()
virtual void latexPreviewImageAvailable(const QImage &preview)
virtual void latexPreviewLargeImageAvailable(const QImage &largePreview)
virtual void latexPreviewAvailable(const QImage &preview, const QImage &largePreview, const QImage &fullPreview)
virtual void latexPreviewError(const QString &errorString, int errorCode)
virtual void latexPreviewFullImageAvailable(const QImage &fullPreview)
virtual void latexOutputAvailable(const KLFBackend::klfOutput &output)
Definition of class KLFBackend.
#define KLF_DEBUG_TIME_BLOCK(msg)
#define KLF_DEBUG_BLOCK(msg)
#define klfDbg(streamableItems)
#define KLF_DELETE_PRIVATE
#define KLF_INIT_PRIVATE(ClassName)
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Priority priority() const
void start(Priority priority)
bool wait(unsigned long time)
KLFBackend::getLatexFormula() result.
int status
A code describing the status of the request.
QImage result
The actual resulting image.
QString errorstr
An explicit error string.
General settings for KLFBackend::getLatexFormula()