3 #include <QtCore/QDebug>
4 #include <QtCore/QDate>
5 #include <QtGui/QPaintEvent>
16 QFrame(parent), m_cols(columns), m_rows(rows), m_resizes(ScaleAspect), back_color(QColor(
"black")),
17 m_max(1.0), m_min(0.0),
18 dirty_lines(0), widget_resized(true), redraw_all(true), is_drawing(true),
19 m_size_hint(0,0), m_minimum_size(0,0),
20 m_buffer(QSize(rows,columns),QImage::Format_RGB32), waterfall(QSize(rows,columns),QImage::Format_RGB32), data()
30 initData(m_cols, m_rows);
46 return m_minimum_size;
72 initData(cols,m_rows);
90 initData(m_cols,rows);
127 widget_resized =
true;
155 if (m_min >= m_max) {
174 if (m_min >= m_max) {
207 data.push_front(new_data);
209 if (data.front().size() > m_cols) {
211 data.front().resize(m_cols);
216 while (data.size() > m_rows) {
230 vector<float> temp(new_data.size());
232 if ((uint)(new_data.size()) > m_cols) {
234 for(i=0;i<m_cols;i++)
235 temp[i] = new_data[i];
239 for(i=0;i<temp.size();i++)
240 temp[i] = new_data[i];
249 vector<float> temp(new_data, new_data + length);
250 if ((uint)(length)>m_cols)
261 vector<float> temp(length);
263 if (length > m_cols) {
265 for(i=0;i<m_cols;i++)
266 temp[i] = (
float)(new_data[i]);
270 for(i=0;i<length;i++)
271 temp[i] = (
float)(new_data[i]);
281 uint16_t* new_data = (uint16_t*)new_data_in;
282 uint length = length_in/2;
283 vector<float> temp(length);
285 if (length > m_cols) {
287 for(i=0;i<m_cols;i++)
288 temp[i] = (
float)(new_data[i]);
292 for(i=0;i<length;i++)
293 temp[i] = (
float)(new_data[i]);
303 uint32_t* new_data = (uint32_t*)new_data_in;
304 uint length = length_in/4;
305 vector<float> temp(length);
307 if (length > m_cols) {
309 for(i=0;i<m_cols;i++)
310 temp[i] = (
float)(new_data[i]);
314 for(i=0;i<length;i++)
315 temp[i] = (
float)(new_data[i]);
362 QPainter widget_painter(
this);
369 if (redraw_all || widget_resized || (dirty_lines>0)) {
373 if (is_drawing && (redraw_all || (dirty_lines>0))) {
375 QSize waterfall_size(m_cols,m_rows);
376 QImage new_waterfall(waterfall_size,QImage::Format_RGB32);
377 new_waterfall.fill(0);
378 QPainter waterfall_painter(&new_waterfall);
379 waterfall_painter.fillRect(new_waterfall.rect(),back_color);
381 if (!(data.empty())) {
383 list< vector<float> >::const_iterator it;
389 for(it = data.begin(); it != data.end(); it++) {
390 t_line = (QRgb*)(new_waterfall.scanLine(it_count));
391 drawLine(t_line, *it);
399 else if (dirty_lines>0) {
402 target.setTopLeft(QPoint(0,dirty_lines));
403 target.setWidth(new_waterfall.width());
404 target.setHeight((new_waterfall.height())-dirty_lines);
405 source.setTopLeft(QPoint(0,0));
406 source.setWidth(waterfall.width());
407 source.setHeight((waterfall.height())-dirty_lines);
409 waterfall_painter.drawImage(target,waterfall,source);
412 for(it = data.begin(); ((dirty_lines>0) && (it != data.end())); it++) {
413 t_line = (QRgb*)(new_waterfall.scanLine(it_count));
414 drawLine(t_line, *it);
423 waterfall_painter.end();
427 waterfall = new_waterfall;
434 widget_resized =
true;
439 if (widget_resized) {
440 QImage new_buffer(size(),QImage::Format_RGB32);
443 QPainter buffer_painter(&new_buffer);
444 buffer_painter.fillRect(new_buffer.rect(), back_color);
459 target = new_buffer.rect();
460 source = waterfall.rect();
461 buffer_painter.drawImage(target,waterfall,source);
467 source = waterfall.rect();
468 wf_aspect = (float)(waterfall.width())/(
float)(waterfall.height());
469 bf_aspect = (float)(new_buffer.width())/(
float)(new_buffer.height());
470 if (wf_aspect >= bf_aspect) {
472 m_width = new_buffer.width();
473 m_height = (int)((
float)((new_buffer.width())*(waterfall.height()))/(float)(waterfall.width()));
474 m_y = ((new_buffer.height()) - m_height) / 2;
478 m_height = new_buffer.height();
479 m_width = wf_aspect * (float)(new_buffer.height());
480 m_x = ((new_buffer.width()) - m_width) / 2;
482 target.setTopLeft(QPoint(m_x,m_y));
483 target.setHeight(m_height);
484 target.setWidth(m_width);
485 buffer_painter.drawImage(target,waterfall,source);
492 source = waterfall.rect();
493 qDebug()<<
"QWaterfallDisplay: Resize Type:"<<m_resizes<<
"not implemented ATM!";
498 target.setTopLeft(QPoint(0,0));
499 source.setTopLeft(QPoint(0,0));
500 if (new_buffer.width() > waterfall.width())
501 copy_size.setWidth(waterfall.width());
503 copy_size.setWidth(new_buffer.width());
504 if (new_buffer.height() > waterfall.height())
505 copy_size.setHeight(waterfall.height());
507 copy_size.setHeight(new_buffer.height());
508 target.setSize(copy_size);
509 source.setSize(copy_size);
512 buffer_painter.drawImage(target,waterfall,source);
516 qDebug()<<
"QWaterfallDisplay: Resize Type: "<<m_resizes<<
" not implemented ATM!";
520 qDebug()<<
"QWaterfallDisplay: Unkown Resize Type: "<<m_resizes;
525 buffer_painter.end();
528 m_buffer = new_buffer;
531 widget_resized =
false;
536 widget_painter.drawImage(event->rect(),m_buffer,
event->rect());
541 widget_painter.drawImage(event->rect(),m_buffer,
event->rect());
545 widget_painter.end();
550 widget_resized =
true;
555 void QWaterfallDisplay::initData(uint cols, uint rows)
567 if((cols == m_cols) && (rows < m_rows)) {
568 while (data.size() >
rows) {
575 if (cols != m_cols) {
580 void QWaterfallDisplay::drawLine(QRgb *line,
const vector<float> &data_line)
587 for (uint i=0;i<data_line.size();i++) {
592 index = (int)( (((data_line[i]-fabs(m_min)) / (m_max-fabs(m_min))) * 255.0) + 0.5 );
593 index = (index<0)?0:index;
594 index = (index>255)?255:index;
598 line[i] = qRgb(index,index,index);
603 void QWaterfallDisplay::calcSizeHint()
606 m_size_hint.setWidth(m_cols);
607 m_size_hint.setHeight(m_rows);
610 m_minimum_size.setWidth(m_cols/4);
611 m_minimum_size.setHeight(m_rows/4);
614 setMinimumWidth(m_cols/8);
void setColumns(int cols)
void setBackColor(QColor back)
void setMaxValue(double max)
void pushData(const std::vector< float > &new_data)
void pushDataUint16(const char *new_data, int length)
void pushDataQList(const QList< float > &new_data)
void pushDataUint32(const char *new_data, int length)
void setResizestyle(Resizestyle resizestyle)
void setMaxMinValue(double max, double min)
void pushDataUint8(const char *new_data, int length)
void setColumnsRows(int cols, int rows)
void paintEvent(QPaintEvent *event)
void pushDataFloat(const float *new_data, int elements)
Resizestyle resizestyle() const
void pauseDrawing(bool onoff)
QWaterfallDisplay(int rows=1, int columns=1, QWidget *parent=0)
void resizeEvent(QResizeEvent *event)
void columnsChanged(uint)
void setMinValue(double min)