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;
bool setSettings(const KLFBackend::klfSettings &settings, bool disableExtraFormats=true)
#define klfDbg(streamableItems)
#define KLF_DEBUG_BLOCK(msg)
static klfOutput getLatexFormula(const klfInput &in, const klfSettings &settings, bool isMainThread=true)
The function that processes everything.
int status
A code describing the status of the request.
void start(Priority priority)
#define KLF_DELETE_PRIVATE
virtual void latexPreviewError(const QString &errorString, int errorCode)
virtual void latexPreviewImageAvailable(const QImage &preview)
#define KLF_DEBUG_TIME_BLOCK(msg)
Definition of class KLFBackend.
QImage result
The actual resulting image.
virtual void latexPreviewFullImageAvailable(const QImage &fullPreview)
QString errorstr
An explicit error string.
KLFBackend::getLatexFormula() result.
virtual void latexPreviewLargeImageAvailable(const QImage &largePreview)
bool setPreviewSize(const QSize &previewSize)
virtual void latexOutputAvailable(const KLFBackend::klfOutput &output)
bool setLargePreviewSize(const QSize &largePreviewSize)
#define KLF_INIT_PRIVATE(ClassName)
bool setInput(const KLFBackend::klfInput &input)
virtual void latexPreviewAvailable(const QImage &preview, const QImage &largePreview, const QImage &fullPreview)
virtual void latexPreviewReset()
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const
General settings for KLFBackend::getLatexFormula()