rock_widget_collection  0.1
ImageViewOld.cc
Go to the documentation of this file.
1 /*
2  * File: ImageViewOld.cc
3  * Author: blueck
4  *
5  * Created on 17. Juni 2010, 14:14
6  */
7 
8 #include "ImageViewOld.h"
9 #include <stdexcept>
10 #include <QtCore/QtPlugin>
11 
12 using namespace base::samples::frame;
13 //Q_EXPORT_PLUGIN2(ImageView, ImageView)
14 
15 ImageViewOld::ImageViewOld(QWidget *parent,bool use_openGL):
16  MultiWidget(parent),
17  contextMenu(this),
18  image(0, 0, QImage::Format_RGB888),
19  aspect_ratio(false),
20  zoomEnabled(false)
21 {
22  resize(width(),height());
23  //setting up popup menue
24  save_image_act = new QAction(tr("&Save Image"),this);
25  user_export_act = new QAction(tr("&User Export"),this);
26  save_image_act->setStatusTip(tr("Save the image to disk"));
27  user_export_act->setStatusTip(tr("Emits an event for user specific export"));
28  connect(save_image_act,SIGNAL(triggered()),this,SLOT(saveImage()));
29  connect(user_export_act,SIGNAL(triggered()),this,SLOT(emitUserExport()));
30  contextMenu.addAction(save_image_act);
31  contextMenu.addAction(user_export_act);
32 
33  //setting up widget
34  setWindowTitle(tr("ImageView"));
37 
38  //configure opengl if activated
39  image_view_gl = NULL;
40  openGL(use_openGL);
41 }
42 
43 
45 {
46  disconnect(save_image_act, 0, 0, 0);
47  delete save_image_act;
48 }
49 
51 {
52  emit userExport();
53 }
54 
55 
56 void ImageViewOld::setZoomEnabled(bool enabled)
57 {
58  zoomEnabled = enabled;
59 }
60 
61 void ImageViewOld::contextMenuEvent ( QContextMenuEvent * event )
62 {
63  contextMenu.exec(event->globalPos());
64 }
65 
66 std::pair<QPoint, bool> ImageViewOld::toImage(QPoint const& p)
67 {
68  //calculate pos on image
69  int offset_x = target.x();
70  int offset_y = target.y();
71  float scale_x = source.width()/target.width();
72  float scale_y = source.height()/target.height();
73 
74  int x = (int)(scale_x*(p.x()-offset_x)+0.5);
75  int y = (int)(scale_y*(p.y()-offset_y)+0.5);
76 
77  bool valid = (x>=0 && x <= source.width() &&
78  y>=0 && y <= source.height());
79 
80  if (!valid)
81  {
82  x = x < 0 ? 0 : source.width() - 1;
83  y = y < 0 ? 0 : source.height() - 1;
84  }
85  x += currentCrop.x();
86  y += currentCrop.y();
87  return std::make_pair(QPoint(x, y), valid);
88 }
89 
91 {
92  std::pair<QPoint, bool> img = toImage(QPoint(event->x(), event->y()));
93  pressPoint = img.first;
94  pressValid = img.second;
95 }
96 
98 {
99  if (event->modifiers() & Qt::ControlModifier)
100  {
101  // Cancel current zoom
102  if (!zoomEnabled)
103  return;
104 
105  resetCrop();
106  update();
107  return;
108  }
109 
110  std::pair<QPoint, bool> imgPoint = toImage(QPoint(event->x(), event->y()));
111  QPoint releasePoint = imgPoint.first;
112  int distance = (releasePoint - pressPoint).manhattanLength();
113  if (zoomEnabled && distance > 5)
114  {
115  int w = abs((pressPoint - releasePoint).x()) + 1;
116  int h = abs((pressPoint - releasePoint).y()) + 1;
117  int x = std::min(pressPoint.x(), releasePoint.x());
118  int y = std::min(pressPoint.y(), releasePoint.y());
119  crop(x, y, w, h);
120  update();
121  }
122  else if (pressValid)
123  emit clickImage(pressPoint.x(), pressPoint.y());
124 }
125 
127 {
128  static QColor background(127, 127, 127);
129  static QColor textcolor(255,255,255);
130  this->originalImage = QImage(width(),height(),QImage::Format_RGB888);
131  QPainter painter(&this->originalImage);
132  painter.setBrush(background);
133  painter.drawRect(0,0,image.width(),image.height());
134  painter.setBrush(textcolor);
135  painter.drawText(0,0,image.width(),image.height(),
136  Qt::AlignVCenter|Qt::AlignHCenter,"No Signal");
138  no_input = true;
139 }
140 
141 void ImageViewOld::openGL(bool flag)
142 {
143  if(flag)
144  {
145  //prevent activating if it is already activated
146  if(image_view_gl)
147  return;
148 
149  image_view_gl = new ImageViewOldGL(*this);
150  if (!image_view_gl)
151  return;
152  image_view_gl->resize(width(),height());
154  image_view_gl->show();
155  }
156  else
157  {
158  delete image_view_gl;
159  image_view_gl = NULL;
160  }
161  isOpenGL = flag;
162  for(QList<DrawItem*>::iterator iter = items.begin();iter != items.end();++iter) (*iter)->openGL(flag);
163 }
164 
165 void ImageViewOld::saveImage(bool overlay)
166 {
167  QString path = QFileDialog::getSaveFileName(this, tr("Save File"),
168  save_path,
169  tr("Images (*.png)"));
170  if(path.length() > 0)
171  saveImage2(path,overlay);
172 }
173 bool ImageViewOld::saveImage2(QString path,bool overlay)
174 {
175  if(overlay)
176  {
177  QImage temp(image);
178  drawDrawItemsToImage(temp,true);
179  temp.save(path,"PNG",80);
180  }
181  else
182  image.save(path,"PNG",80);
183  return true;
184 }
185 
186 bool ImageViewOld::saveImage3(const QString &mode, int pixel_size, int width, int height,const char* pbuffer, QString path, QString format)
187 {
188  QImage image;
189  frame_converter.copyFrameToQImageRGB888(image,mode, pixel_size, width, height,pbuffer);
190  image.save(path,format.toAscii().data(),80);
191  return true;
192 }
193 
194 void ImageViewOld::setGroupStatus(int groupNr, bool enable)
195 {
196  if(!enable)
197  {
198  disabledGroups.push_back(groupNr);
199  }
200  else
201  {
202  disabledGroups.removeAll(groupNr);
203  }
204 }
205 
207 {
208  disabledGroups.clear();
209 }
210 
212 {
213  this->image = this->originalImage;
214  currentCrop = QRect(0, 0, image.width(), image.height());
215  calculateRects();
216 }
217 
218 void ImageViewOld::crop(int x, int y, int w, int h)
219 {
220  this->image = this->image.copy(x, y, w, h);
221  currentCrop = QRect(x, y, w, h);
222  calculateRects();
223 }
224 
225 void ImageViewOld::addRawImage(const QString &mode, int pixel_size, int width, int height,const char* pbuffer, const int size)
226 {
227  //check if image size has been changed
228  //zoom factor must be recalculated
229  if(frame_converter.copyFrameToQImageRGB888(originalImage,mode, pixel_size, width, height,pbuffer,size))
230  {
231  this->image = this->originalImage;
232  if(image_view_gl)
233  {
235  }
236  }
237  calculateRects();
238  this->image = this->originalImage;
239  no_input = false;
240 }
241 
242 void ImageViewOld::addImage(const QImage &image)
243 {
244  //check if image size has changed
245  //zoom factor must be recalculated
246  this->image = this->originalImage = image;
247  no_input = false;
248 }
249 
250 void ImageViewOld::addFrame(const base::samples::frame::Frame &frame)
251 {
252  if(frame_converter.copyFrameToQImageRGB888(originalImage,frame))
253  {
254  this->image = this->originalImage;
255  if(image_view_gl)
256  {
258  }
259  }
260  calculateRects();
261  this->image = this->originalImage;
262  no_input = false;
263 }
264 
265 void ImageViewOld::drawDrawItemsToPainter(QPainter &painter,bool all)
266 {
267  if(!image_view_gl)
268  all = true;
269 
270  if(!items.empty())
271  {
272  painter.setRenderHint(QPainter::TextAntialiasing, true);
273  QList<DrawItem*>::iterator iter = items.begin();
274  for(;iter != items.end();++iter)
275  {
276  if(!disabledGroups.contains((*iter)->getGroupNr()))
277  if(!(*iter)->onOpenGL() || all == true)
278  (*iter)->draw(&painter,source,target);
279  }
280  }
281 }
282 
284 {
285  QPainter painter(&image);
286  drawDrawItemsToPainter(painter,all);
287 }
288 
289 //slots from base classes are shadowed in ruby therefore update2 is to
290 //access ImageView::update from ruby
292 {
293  update();
294 }
295 
297 {
298  if(image_view_gl)
299  {
300  //only opengl overlays are displayed
301  image_view_gl->repaint();
302  }
303  else
304  {
305  QWidget::update();
306  }
307 }
308 
310 {
311  int x_offset = 0;
312  int y_offset = 0;
313  if(aspect_ratio)
314  {
315  float x =1;
316  float y =1;
317  if (image.width() && image.height())
318  {
319  x = ((float)width())/ image.width();
320  y = ((float)height())/ image.height();
321  }
322  if(x < y)
323  y_offset = 0.5f*(height()-x*image.height());
324  else
325  x_offset = 0.5f*(width()-y*image.width());
326  }
327  target.setRect(x_offset, y_offset, width()-x_offset*2, height()-y_offset*2);
328  source.setRect(0.0, 0.0, image.width(), image.height());
329 }
330 
331 void ImageViewOld::paintEvent(QPaintEvent *)
332 {
333  QPainter painter(this);
334  painter.drawImage(target, image, source);
335  drawDrawItemsToPainter(painter,true);
336 }
337 
338 void ImageViewOld::resizeEvent ( QResizeEvent * event )
339 {
340  QWidget::resizeEvent(event);
341 
342  if(no_input)
343  setDefaultImage();
344  if(image_view_gl)
345  image_view_gl->resize(width(),height());
346 
347  calculateRects();
348 }
349 
351 {
352 }
353 
void setZoomEnabled(bool enabled)
Definition: ImageViewOld.cc:56
bool saveImage2(QString path, bool overlay=true)
QPoint pressPoint
Definition: ImageViewOld.h:201
std::pair< QPoint, bool > toImage(QPoint const &p)
Definition: ImageViewOld.cc:66
QList< DrawItem * > items
Definition: PaintWidget.h:127
void mouseReleaseEvent(QMouseEvent *event)
Definition: ImageViewOld.cc:97
QAction * save_image_act
Definition: ImageViewOld.h:184
QRect currentCrop
Definition: ImageViewOld.h:190
void clearGroups()
bool saveImage3(const QString &mode, int pixel_size, int width, int height, const char *pbuffer, QString path, QString format)
friend class ImageViewOldGL
Definition: ImageViewOld.h:82
void addRawImage(const QString &mode, int pixel_size, int width, int height, const char *pbuffer, const int size)
frame_helper::FrameQImageConverter frame_converter
Definition: ImageViewOld.h:194
ImageViewOld(QWidget *parent=NULL, bool use_openGL=false)
Definition: ImageViewOld.cc:15
void drawDrawItemsToImage(QImage &image, bool all=false)
void contextMenuEvent(QContextMenuEvent *event)
Definition: ImageViewOld.cc:61
void setGLViewPoint(int display_width=0, int display_height=0)
void userExport()
void calculateRects()
void setGroupStatus(int groupNr, bool enable)
void setDefaultImage()
virtual void resizeEvent(QResizeEvent *event)
ImageViewOldGL * image_view_gl
Definition: ImageViewOld.h:195
void mouseDoubleClickEvent(QMouseEvent *event)
virtual void openGL(bool flag)
void addImage(const QImage &image)
QMenu contextMenu
Definition: ImageViewOld.h:183
void crop(int x, int y, int w, int h)
bool event(QEvent *event)
Definition: MultiWidget.h:63
void addFrame(const base::samples::frame::Frame &frame)
QList< int > disabledGroups
Definition: PaintWidget.h:129
QString save_path
Definition: ImageViewOld.h:186
void mousePressEvent(QMouseEvent *event)
Definition: ImageViewOld.cc:90
void setAspectRatio(bool value)
void clickImage(int x, int y)
QImage originalImage
Definition: ImageViewOld.h:188
virtual void paintEvent(QPaintEvent *event)
void drawDrawItemsToPainter(QPainter &painter, bool all=false)
QAction * user_export_act
Definition: ImageViewOld.h:185
void resetCrop()
virtual ~ImageViewOld()
Definition: ImageViewOld.cc:44
void saveImage(bool overlay=true)
void emitUserExport()
Definition: ImageViewOld.cc:50