#include "signal.h"
#include "../sigsession.h"
-#include <assert.h>
+#include <cassert>
+#include <algorithm>
#include <QApplication>
#include <QMenu>
using std::make_pair;
using std::pair;
using std::shared_ptr;
+using std::stable_sort;
using std::vector;
namespace pv {
update();
}
+void Header::show_popup(const shared_ptr<RowItem> &item)
+{
+ using pv::widgets::Popup;
+
+ Popup *const p = item->create_popup(&_view);
+ if (!p)
+ return;
+
+ const QPoint pt(width() - BaselineOffset, item->get_y());
+ p->set_position(mapToGlobal(pt), Popup::Right);
+ p->show();
+}
+
void Header::paintEvent(QPaintEvent*)
{
// The trace labels are not drawn with the arrows exactly on the
// left edge of the widget, because then the selection shadow
// would be clipped away.
const int w = width() - BaselineOffset;
- const vector< shared_ptr<RowItem> > row_items(_view.child_items());
+
+ vector< shared_ptr<RowItem> > row_items(_view.child_items());
+ stable_sort(row_items.begin(), row_items.end(),
+ [](const shared_ptr<RowItem> &a, const shared_ptr<RowItem> &b) {
+ return a->v_offset() < b->v_offset(); });
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
void Header::mouseReleaseEvent(QMouseEvent *event)
{
- using pv::widgets::Popup;
-
assert(event);
if (event->button() == Qt::LeftButton) {
if (_dragging)
{
const shared_ptr<RowItem> mouse_over_row_item =
get_mouse_over_row_item(event->pos());
- if (mouse_over_row_item) {
- const int w = width() - BaselineOffset;
- Popup *const p =
- mouse_over_row_item->create_popup(&_view);
- p->set_position(mapToGlobal(QPoint(w,
- mouse_over_row_item->get_y())),
- Popup::Right);
- p->show();
- }
+ if (mouse_over_row_item)
+ show_popup(mouse_over_row_item);
}
_dragging = false;
void Header::contextMenuEvent(QContextMenuEvent *event)
{
const shared_ptr<RowItem> r = get_mouse_over_row_item(_mouse_point);
+ if (!r)
+ return;
+
+ QMenu *const menu = r->create_context_menu(this);
+ if (!menu)
+ return;
- if (r)
- r->create_context_menu(this)->exec(event->globalPos());
+ menu->exec(event->globalPos());
}
void Header::keyPressEvent(QKeyEvent *e)