[KLF Backend][KLF Tools][KLF Home]
KLatexFormula Project
klfdisplaylabel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * file klfdisplaylabel.cpp
3  * This file is part of the KLatexFormula Project.
4  * Copyright (C) 2011 by Philippe Faist
5  * philippe.faist at bluewin.ch
6  * *
7  * This program is free software; you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation; either version 2 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This program is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU General Public License *
18  * along with this program; if not, write to the *
19  * Free Software Foundation, Inc., *
20  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
21  ***************************************************************************/
22 /* $Id: klfdisplaylabel.cpp 961 2016-12-27 06:36:48Z phfaist $ */
23 
24 #include <QLabel>
25 #include <QDir>
26 #include <QTemporaryFile>
27 #include <QMessageBox>
28 #include <QVariant>
29 #include <QPainter>
30 
31 #include <klfguiutil.h>
32 #include "klfdisplaylabel.h"
33 
34 
36  : QLabel(parent), pEnableToolTipPreview(true), mToolTipFile(NULL)
37 {
38  setText(QString());
39  // setLabelFixedSize(QSize(120,80));
40 
41  setAlignment(Qt::AlignCenter);
42 
43  //don't set this to true, because otherwise resizing the label distorts the image
44  //setScaledContents(true);
45 
46  pDefaultPalette = palette();
47  pErrorPalette = pDefaultPalette;
48 
49  pDefaultPalette.setColor(QPalette::Window, QColor(255, 255, 255, 0)); // fully transparent
50  pErrorPalette.setColor(QPalette::Window, QColor(255, 0, 0, 60)); // red color, semi-transparent
51 
52  pGE = false;
53  pGEcolor = QColor(128, 255, 128, 8);
54  pGEradius = 4;
55 }
56 
58 {
59  if (mToolTipFile)
60  delete mToolTipFile;
61 }
62 
63 /*
64 void KLFDisplayLabel::setLabelFixedSize(const QSize& size)
65 {
66  pLabelFixedSize = size;
67  setMinimumSize(size);
68  setFixedSize(size);
69 }
70 */
71 
73 {
74  display_state(Clear);
75  // setEnabled(false);
76  pLabelEnabled = false;
77 }
78 
79 void KLFDisplayLabel::display(QImage displayimg, QImage tooltipimage, bool labelenabled)
80 {
82 
83  pDisplayImage = displayimg;
84  pDisplayTooltip = tooltipimage;
85 
86  pLabelEnabled = labelenabled;
87  display_state(Ok);
88 }
89 
90 void KLFDisplayLabel::displayError(const QString& errorMessage, bool labelenabled)
91 {
92  pDisplayError = errorMessage;
93 
94  pLabelEnabled = labelenabled;
95  display_state(Error);
96 }
97 
98 
99 QPicture KLFDisplayLabel::calc_display_picture()
100 {
102 
103  double dpr = devicePixelRatioF();
104 
105  QImage img = pDisplayImage;
106  QPixmap pix;
107  QSize mysize = (QSizeF(size()) * dpr).toSize();
108  klfDbg("widget size()="<<size()<<", mysize="<<mysize) ;
109  if (/*labelenabled && */ pGE) {
110  int r = pGEradius * dpr;
111  QSize msz = QSize(2*r, 2*r);
112  if (img.width()+msz.width() > width() || img.height()+msz.height() > height())
113  img = pDisplayImage.scaled(mysize-msz, Qt::KeepAspectRatio, Qt::SmoothTransformation);
114  pix = QPixmap(img.size()+msz);
115  pix.fill(QColor(0,0,0,0));
116  QPainter painter(&pix);
117  painter.translate(QPoint(r, r));
118  klfDrawGlowedImage(&painter, img, pGEcolor, r);
119  } else {
120  if (img.width() > mysize.width() || img.height() > mysize.height()) {
121  img = pDisplayImage.scaled(mysize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
122  }
123  pix = QPixmap::fromImage(img);
124  }
125  pix.setDevicePixelRatio(dpr);
126 
127  QPicture labelpic;
128  labelpic.setBoundingRect(QRect(QPoint(0,0), size()));
129  QPainter pp(&labelpic);
130  if (!pLabelEnabled) {
131  pp.setOpacity(0.5f);
132  }
133  QSize pixsizeuser = (QSizeF(pix.size())/dpr).toSize();
134  pp.drawPixmap(QRect(QPoint((width()-pixsizeuser.width())/2, (height()-pixsizeuser.height())/2),
135  pixsizeuser), pix);
136  // // desaturate/grayify the pixmap if we are label-disabled
137  // if (!pLabelEnabled) {
138  // pp.fillRect(QRect(QPoint(0,0), mysize), QColor(255,255,255, 90));
139  // }
140  return labelpic;
141 }
142 
143 void KLFDisplayLabel::display_state(DisplayState state)
144 {
146  pDisplayState = state;
147  if (state == Clear) {
148  setPicture(QPicture());
149  setText(QString());
150  set_error(false);
151  }
152  if (state == Error) {
153  set_error(true);
154  setToolTip(pDisplayError);
155  _bigPreviewText = pDisplayError;
156  }
157  if (state == Ok) {
158  QPicture labelpic = calc_display_picture();
159  setPicture(labelpic);
160 
161  // un-set any error
162  set_error(false);
163 
164  if (mToolTipFile) {
165  delete mToolTipFile;
166  mToolTipFile = 0;
167  }
168  // no big preview by default
169  _bigPreviewText = "";
170  // but if one is given then prepare it (prepare it even if "enableToolTipPreview" is false,
171  // because we will need it for the "showBigPreview" button)
172  if ( ! pDisplayTooltip.isNull() ) {
173  QString tempdir = QDir::tempPath();
174  mToolTipFile = new QTemporaryFile(tempdir+"/klf_tooltip_XXXXXX.png", this);
175  if ( ! mToolTipFile->open() ) {
176  qWarning("WARNING: Failed open for ToolTip Temp Image!\n%s\n",
177  qPrintable(mToolTipFile->fileTemplate()));
178  delete mToolTipFile;
179  mToolTipFile = 0;
180  } else {
181  mToolTipFile->setAutoRemove(true);
182  bool res = pDisplayTooltip.save(mToolTipFile, "PNG");
183  if ( ! res ) {
184  QMessageBox::critical(this, tr("Error"), tr("Failed write to ToolTip Temp Image file %1!")
185  .arg(mToolTipFile->fileName()));
186  qWarning("WARNING: Failed write to Tooltip temp image to temporary file `%s' !\n",
187  qPrintable(mToolTipFile->fileTemplate()));
188  delete mToolTipFile;
189  mToolTipFile = 0;
190  } else {
191  _bigPreviewText = QString("<img src=\"%1\" width=\"%2\" height=\"%3\" style=\"width:%2px; height:%3px;\">")
192  .arg(mToolTipFile->fileName())
193  .arg((int)(pDisplayTooltip.width() / devicePixelRatioF()))
194  .arg((int)(pDisplayTooltip.height() / devicePixelRatioF()));
195  klfDbg("big preview html = " << _bigPreviewText) ;
196  }
197  }
198  }
199  if (pEnableToolTipPreview) {
200  setToolTip(QString("<p style=\"padding: 8px 8px 8px 8px;\">%1</p>").arg(_bigPreviewText));
201  } else {
202  setToolTip(QString(""));
203  }
204  }
205 }
206 
207 void KLFDisplayLabel::set_error(bool error_on)
208 {
210  setProperty("realTimeLatexError", QVariant(error_on));
211  QPalette *p;
212  if (error_on) {
213  p = &pErrorPalette;
214  } else {
215  p = &pDefaultPalette;
216  }
217  setAutoFillBackground(true);
218  setStyleSheet(styleSheet()); // force style sheet refresh
219  setPalette(*p);
220 }
221 
222 
224 {
225  if (pLabelEnabled)
226  emit labelDrag();
227 }
void setOpacity(qreal opacity)
QSize size() const
int width() const
void fill(const QColor &color)
void setColor(ColorGroup group, ColorRole role, const QColor &color)
bool save(const QString &fileName, const char *format, int quality) const
#define klfDbg(streamableItems)
print debug stream items
QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags)
#define KLF_DEBUG_BLOCK(msg)
Utility to debug the execution of a block.
bool isNull() const
virtual void displayClear()
void setBoundingRect(const QRect &r)
QString tempPath()
int width() const
void setAutoRemove(bool b)
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
KLFDisplayLabel(QWidget *parent)
#define KLF_FUNC_NAME
virtual QString fileName() const
virtual void displayError(bool labelenabled=false)
virtual ~KLFDisplayLabel()
int height() const
QSize size() const
void translate(const QPointF &offset)
KLF_EXPORT void klfDrawGlowedImage(QPainter *p, const QImage &foreground, const QColor &glowcol, int r, bool also_draw_image)
Draws the given image with a glow effect.
Definition: klfguiutil.cpp:461
int height() const
virtual void mouseMoveEvent(QMouseEvent *e)
virtual void display(QImage displayimg, QImage tooltipimage, bool labelenabled=true)
QString fileTemplate() const
void setDevicePixelRatio(qreal scaleFactor)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const

Generated by doxygen 1.8.13