Commit 5bd97eb8 authored by DreamSourceLab's avatar DreamSourceLab
Browse files

Add error display for decoder trace; Adjust comboBox width on contents

parent d86c9558
......@@ -499,6 +499,7 @@ void DecoderStack::decode_data(
uint64_t entry_cnt = 0;
uint8_t chunk_type = 0;
uint64_t i = decode_start;
char *error = NULL;
while(!boost::this_thread::interruption_requested() &&
i < decode_end && !_no_memory)
{
......@@ -509,8 +510,8 @@ void DecoderStack::decode_data(
chunk = _snapshot->get_samples(i, chunk_end);
if (srd_session_send(session, chunk_type, i, chunk_end, chunk,
(chunk_end - i) * unit_size, unit_size) != SRD_OK) {
_error_message = tr("Decoder reported an error");
(chunk_end - i) * unit_size, unit_size, &error) != SRD_OK) {
_error_message = QString::fromLocal8Bit(error);
break;
}
......@@ -561,6 +562,8 @@ void DecoderStack::decode_data(
}
entry_cnt++;
}
if (error)
g_free(error);
decode_done();
}
......@@ -617,15 +620,15 @@ void DecoderStack::decode_proc()
srd_pd_output_callback_add(session, SRD_OUTPUT_ANN,
DecoderStack::annotation_callback, this);
srd_session_start(session);
// do {
// decode_data(*sample_count, unit_size, session);
// } while(_error_message.isEmpty() && (sample_count = wait_for_data()));
//decode_data(*sample_count, unit_size, session);
decode_data(decode_start, decode_end, unit_size, session);
char *error = NULL;
if (srd_session_start(session, &error) == SRD_OK)
decode_data(decode_start, decode_end, unit_size, session);
else
_error_message = QString::fromLocal8Bit(error);
// Destroy the session
if (error)
g_free(error);
srd_session_destroy(session);
_decode_state = Stopped;
......
......@@ -92,6 +92,9 @@ MeasureDock::MeasureDock(QWidget *parent, View &view, SigSession &session) :
_t1_last_index = 0;
_t2_last_index = 0;
_t3_last_index = 0;
_t1_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
_t2_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
_t3_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
_cursor_layout = new QGridLayout(_widget);
_cursor_layout->addWidget(new QLabel(tr("T1: "), _widget), 0, 0);
......@@ -203,6 +206,9 @@ void MeasureDock::cursor_update()
index++;
}
_t1_comboBox->setMinimumWidth(_t1_comboBox->sizeHint().width()+15);
_t2_comboBox->setMinimumWidth(_t2_comboBox->sizeHint().width()+15);
_t3_comboBox->setMinimumWidth(_t3_comboBox->sizeHint().width()+15);
if (_t1_last_index < _t1_comboBox->count())
_t1_comboBox->setCurrentIndex(_t1_last_index);
......
......@@ -43,9 +43,11 @@
#include <QFuture>
#include <QProgressDialog>
#include <QtConcurrent/QtConcurrent>
#include <QSizePolicy>
#include <boost/foreach.hpp>
#include <boost/shared_ptr.hpp>
#include <algorithm>
namespace pv {
namespace dock {
......@@ -154,21 +156,19 @@ ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) :
search_button->setFixedWidth(search_button->height());
search_button->setDisabled(true);
_search_edit = new QLineEdit(_dn_widget);
_search_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
_search_edit->setPlaceholderText(tr("search"));
QHBoxLayout *search_layout = new QHBoxLayout();
search_layout->addWidget(search_button);
search_layout->addStretch();
search_layout->addStretch(1);
search_layout->setContentsMargins(0, 0, 0, 0);
_search_edit->setLayout(search_layout);
_search_edit->setTextMargins(search_button->width(), 0, 0, 0);
QSizePolicy sp = _search_edit->sizePolicy();
sp.setHorizontalStretch(1);
_search_edit->setSizePolicy(sp);
QHBoxLayout *dn_search_layout = new QHBoxLayout();
dn_search_layout->addWidget(_pre_button, 0, Qt::AlignLeft);
dn_search_layout->addWidget(_search_edit, 0, Qt::AlignLeft);
dn_search_layout->addWidget(_nxt_button, 0, Qt::AlignRight);
_dn_search_layout = new QHBoxLayout();
_dn_search_layout->addWidget(_pre_button, 0, Qt::AlignLeft);
_dn_search_layout->addWidget(_search_edit, 1, Qt::AlignLeft);
_dn_search_layout->addWidget(_nxt_button, 0, Qt::AlignRight);
_matchs_label = new QLabel(_dn_widget);
QHBoxLayout *dn_match_layout = new QHBoxLayout();
......@@ -176,13 +176,13 @@ ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) :
dn_match_layout->addWidget(_matchs_label, 0, Qt::AlignLeft);
dn_match_layout->addStretch(1);
QVBoxLayout *dn_layout = new QVBoxLayout();
dn_layout->addLayout(dn_title_layout);
dn_layout->addLayout(dn_search_layout);
dn_layout->addLayout(dn_match_layout);
dn_layout->addWidget(_table_view);
_dn_layout = new QVBoxLayout();
_dn_layout->addLayout(dn_title_layout);
_dn_layout->addLayout(_dn_search_layout);
_dn_layout->addLayout(dn_match_layout);
_dn_layout->addWidget(_table_view);
_dn_widget->setLayout(dn_layout);
_dn_widget->setLayout(_dn_layout);
_dn_widget->setMinimumHeight(350);
_split_widget = new QSplitter(this);
......@@ -219,6 +219,18 @@ void ProtocolDock::paintEvent(QPaintEvent *)
// style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
void ProtocolDock::resizeEvent(QResizeEvent *event)
{
int width = this->visibleRegion().boundingRect().width();
width = width - _dn_layout->margin() * 2 -
_dn_search_layout->margin() * 2 -
_dn_search_layout->spacing() * 2 -
_pre_button->width()-_nxt_button->width();
width = std::max(width, 0);
_search_edit->setMinimumWidth(width);
QScrollArea::resizeEvent(event);
}
int ProtocolDock::decoder_name_cmp(const void *a, const void *b)
{
return strcmp(((const srd_decoder*)a)->name,
......
......@@ -64,10 +64,13 @@ public:
public:
ProtocolDock(QWidget *parent, SigSession &session);
~ProtocolDock();
void paintEvent(QPaintEvent *);
void del_all_protocol();
protected:
void paintEvent(QPaintEvent *);
void resizeEvent(QResizeEvent *);
signals:
void protocol_updated();
......@@ -104,6 +107,8 @@ private:
QPushButton *_pre_button;
QPushButton *_nxt_button;
QLineEdit *_search_edit;
QHBoxLayout *_dn_search_layout;
QVBoxLayout *_dn_layout;
QLabel *_matchs_label;
QPushButton *_add_button;
......
......@@ -31,6 +31,7 @@
#include <QAction>
#include <QDebug>
#include <QLabel>
#include <QAbstractItemView>
#include "samplingbar.h"
......@@ -114,7 +115,11 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) :
_run_stop_button.setIcon(_icon_start);
_instant_button.setIcon(_icon_instant);
_device_selector.setSizeAdjustPolicy(QComboBox::AdjustToContents);
_sample_rate.setSizeAdjustPolicy(QComboBox::AdjustToContents);
_sample_count.setSizeAdjustPolicy(QComboBox::AdjustToContents);
_device_selector.setMaximumWidth(ComboBoxMaxWidth);
set_sampling(false);
connect(&_sample_count, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_samplecount_sel(int)));
......@@ -163,6 +168,9 @@ void SamplingBar::set_device_list(
_device_selector.addItem(title,
qVariantFromValue((void*)id));
}
int width = _device_selector.sizeHint().width();
_device_selector.setFixedWidth(min(width+15, _device_selector.maximumWidth()));
_device_selector.view()->setMinimumWidth(width+30);
// The selected device should have been in the list
assert(selected_index != -1);
......@@ -407,6 +415,10 @@ void SamplingBar::update_sample_rate_selector()
_sample_rate.show();
g_variant_unref(gvar_list);
}
_sample_rate.setMinimumWidth(_sample_rate.sizeHint().width()+15);
_sample_rate.view()->setMinimumWidth(_sample_rate.sizeHint().width()+30);
_updating_sample_rate = false;
g_variant_unref(gvar_dict);
......@@ -576,6 +588,8 @@ void SamplingBar::update_sample_count_selector()
_sample_count.show();
g_variant_unref(gvar_list);
}
_sample_count.setMinimumWidth(_sample_count.sizeHint().width()+15);
_sample_count.view()->setMinimumWidth(_sample_count.sizeHint().width()+30);
_updating_sample_count = false;
g_variant_unref(gvar_dict);
......
......@@ -63,6 +63,7 @@ class SamplingBar : public QToolBar
private:
static const uint64_t RecordLengths[19];
static const uint64_t DefaultRecordLength;
static const int ComboBoxMaxWidth = 200;
public:
SamplingBar(SigSession &session, QWidget *parent);
......
......@@ -240,6 +240,14 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right)
{
using namespace pv::data::decode;
assert(_decoder_stack);
const QString err = _decoder_stack->error_message();
if (!err.isEmpty())
{
draw_error(p, err, left, right);
return;
}
const double scale = _view->scale();
assert(scale > 0);
......@@ -267,14 +275,6 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right)
const int annotation_height = _view->get_signalHeight();
assert(_decoder_stack);
const QString err = _decoder_stack->error_message();
if (!err.isEmpty())
{
draw_error(p, err, left, right);
return;
}
// Iterate through the rows
assert(_view);
int y = get_y() - (_totalHeight - annotation_height)*0.5;
......@@ -610,24 +610,19 @@ void DecodeTrace::draw_error(QPainter &p, const QString &message,
int left, int right)
{
const int y = get_y();
const int h = get_totalHeight();
p.setPen(ErrorBgColour.darker());
p.setBrush(ErrorBgColour);
const QRectF bounding_rect =
QRectF(left, INT_MIN / 2 + y, right - left, INT_MAX);
const QRectF text_rect = p.boundingRect(bounding_rect,
Qt::AlignCenter, message);
const float r = text_rect.height() / 4;
p.drawRoundedRect(text_rect.adjusted(-r, -r, r, r), r, r,
Qt::AbsoluteSize);
p.setPen(get_text_colour());
const QRectF text_rect(left, y - h/2 + 0.5, right - left, h);
const QRectF bounding_rect = p.boundingRect(text_rect,
Qt::AlignCenter, message);
p.setPen(Qt::red);
QFont font=p.font();
font.setPointSize(DefaultFontSize);
p.setFont(font);
p.drawText(text_rect, message);
if (bounding_rect.width() < text_rect.width())
p.drawText(text_rect, Qt::AlignCenter, tr("Error: ")+message);
else
p.drawText(text_rect, Qt::AlignCenter, tr("Error: ..."));
}
void DecodeTrace::draw_unshown_row(QPainter &p, int y, int h, int left,
......
......@@ -89,7 +89,7 @@ private:
static const QColor Colours[16];
static const QColor OutlineColours[16];
static const int DefaultFontSize = 8;
static const int DefaultFontSize = 10;
static const int ControlRectWidth = 5;
static const int MaxAnnType = 100;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment