#include <QFormLayout>
#include <QKeyEvent>
#include <QLineEdit>
+#include <QMenu>
+#include "ruler.hpp"
#include "trace.hpp"
#include "tracepalette.hpp"
#include "view.hpp"
const QColor Trace::BrightGrayBGColor = QColor(0, 0, 0, 10 * 255 / 100);
const QColor Trace::DarkGrayBGColor = QColor(0, 0, 0, 15 * 255 / 100);
+const QColor Trace::ErrorBgColor = QColor(0xEF, 0x29, 0x29);
-Trace::Trace(shared_ptr<data::SignalBase> channel) :
- base_(channel),
+Trace::Trace(shared_ptr<data::SignalBase> signal) :
+ base_(signal),
axis_pen_(AxisPen),
segment_display_mode_(ShowLastSegmentOnly), // Will be overwritten by View
current_segment_(0),
popup_(nullptr),
popup_form_(nullptr)
{
- connect(channel.get(), SIGNAL(name_changed(const QString&)),
+ connect(signal.get(), SIGNAL(name_changed(const QString&)),
this, SLOT(on_name_changed(const QString&)));
- connect(channel.get(), SIGNAL(color_changed(const QColor&)),
+ connect(signal.get(), SIGNAL(color_changed(const QColor&)),
this, SLOT(on_color_changed(const QColor&)));
+ connect(signal.get(), SIGNAL(error_message_changed(const QString&)),
+ this, SLOT(on_error_message_changed(const QString&)));
GlobalSettings::add_change_handler(this);
Qt::AlignCenter | Qt::AlignVCenter, base_->name());
}
+void Trace::paint_error(QPainter &p, const ViewItemPaintParams &pp)
+{
+ const QString message = base_->get_error_message();
+
+ const int y = get_visual_y();
+
+ p.setPen(ErrorBgColor.darker());
+ p.setBrush(ErrorBgColor);
+
+ const QRectF bounding_rect = QRectF(pp.left(), INT_MIN / 2 + y, pp.right(), INT_MAX);
+
+ const QRectF text_rect = p.boundingRect(bounding_rect, Qt::AlignCenter, message);
+ const qreal r = text_rect.height() / 4;
+
+ p.drawRoundedRect(text_rect.adjusted(-r, -r, r, r), r, r, Qt::AbsoluteSize);
+
+ p.setPen(Qt::black);
+ p.drawText(text_rect, message);
+}
+
QMenu* Trace::create_header_context_menu(QWidget *parent)
{
QMenu *const menu = ViewItem::create_header_context_menu(parent);
return menu;
}
+QMenu* Trace::create_view_context_menu(QWidget *parent, QPoint &click_pos)
+{
+ context_menu_x_pos_ = click_pos.x();
+
+ // Get entries from default menu before adding our own
+ QMenu *const menu = new QMenu(parent);
+
+ QMenu* default_menu = TraceTreeItem::create_view_context_menu(parent, click_pos);
+ if (default_menu) {
+ for (QAction *action : default_menu->actions()) { // clazy:exclude=range-loop
+ menu->addAction(action);
+ if (action->parent() == default_menu)
+ action->setParent(menu);
+ }
+ delete default_menu;
+
+ // Add separator if needed
+ if (menu->actions().length() > 0)
+ menu->addSeparator();
+ }
+
+ QAction *const create_marker_here = new QAction(tr("Create marker here"), this);
+ connect(create_marker_here, SIGNAL(triggered()), this, SLOT(on_create_marker_here()));
+ menu->addAction(create_marker_here);
+
+ return menu;
+}
+
pv::widgets::Popup* Trace::create_popup(QWidget *parent)
{
using pv::widgets::Popup;
void Trace::paint_axis(QPainter &p, ViewItemPaintParams &pp, int y)
{
+ bool was_antialiased = p.testRenderHint(QPainter::Antialiasing);
p.setRenderHint(QPainter::Antialiasing, false);
p.setPen(axis_pen_);
p.drawLine(QPointF(pp.left(), y), QPointF(pp.right(), y));
- p.setRenderHint(QPainter::Antialiasing, true);
+ p.setRenderHint(QPainter::Antialiasing, was_antialiased);
}
void Trace::add_color_option(QWidget *parent, QFormLayout *form)
const pair<int, int> extents = v_extents();
+ bool was_antialiased = p.testRenderHint(QPainter::Antialiasing);
p.setRenderHint(QPainter::Antialiasing, false);
p.drawLine(x, get_visual_y() + extents.first,
x, get_visual_y() + extents.second);
- p.setRenderHint(QPainter::Antialiasing, true);
+ p.setRenderHint(QPainter::Antialiasing, was_antialiased);
}
void Trace::create_popup_form()
// handled, leaving the parent popup_ time to handle the change.
if (popup_form_) {
QWidget *suicidal = new QWidget();
- suicidal->setLayout(popup_form_);
+ suicidal->setLayout(popup_->layout());
suicidal->deleteLater();
}
// Repopulate the popup
- popup_form_ = new QFormLayout(popup_);
- popup_->setLayout(popup_form_);
+ widgets::QWidthAdjustingScrollArea* scrollarea = new widgets::QWidthAdjustingScrollArea();
+ QWidget* scrollarea_content = new QWidget(scrollarea);
+
+ scrollarea->setWidget(scrollarea_content);
+ scrollarea->setWidgetResizable(true);
+ scrollarea->setContentsMargins(0, 0, 0, 0);
+ scrollarea->setFrameShape(QFrame::NoFrame);
+ scrollarea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ scrollarea_content->setContentsMargins(0, 0, 0, 0);
+
+ popup_->setLayout(new QVBoxLayout());
+ popup_->layout()->addWidget(scrollarea);
+ popup_->layout()->setContentsMargins(0, 0, 0, 0);
+
+ popup_form_ = new QFormLayout(scrollarea_content);
+ popup_form_->setSizeConstraint(QLayout::SetMinAndMaxSize);
+
populate_popup_form(popup_, popup_form_);
}
owner_->row_item_appearance_changed(true, true);
}
+void Trace::on_error_message_changed(const QString &msg)
+{
+ (void)msg;
+
+ if (owner_)
+ owner_->row_item_appearance_changed(false, true);
+}
+
void Trace::on_popup_closed()
{
popup_ = nullptr;
base_->set_color(color);
}
+void Trace::on_create_marker_here() const
+{
+ View *view = owner_->view();
+ assert(view);
+
+ const Ruler *ruler = view->ruler();
+ QPoint p = ruler->mapFrom(view, QPoint(context_menu_x_pos_, 0));
+
+ view->add_flag(ruler->get_absolute_time_from_x_pos(p.x()));
+}
+
} // namespace trace
} // namespace views
} // namespace pv