From: Joel Holdsworth Date: Sun, 30 Aug 2015 15:52:14 +0000 (-0600) Subject: ScaleSignalHandle: Initial implementation X-Git-Tag: pulseview-0.3.0~69 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=f1626bb80080435e306c9a6c5d6ff20dd6dc9e57 ScaleSignalHandle: Initial implementation --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 51170dee..caf2eac3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,6 +210,7 @@ set(pulseview_SOURCES pv/view/rowitem.cpp pv/view/ruler.cpp pv/view/signal.cpp + pv/view/signalscalehandle.cpp pv/view/timeitem.cpp pv/view/timemarker.cpp pv/view/trace.cpp @@ -263,6 +264,7 @@ set(pulseview_HEADERS pv/view/rowitem.hpp pv/view/ruler.hpp pv/view/signal.hpp + pv/view/signalscalehandle.hpp pv/view/timeitem.hpp pv/view/timemarker.hpp pv/view/trace.hpp diff --git a/pv/view/signal.cpp b/pv/view/signal.cpp index 57d78834..47e91f4b 100644 --- a/pv/view/signal.cpp +++ b/pv/view/signal.cpp @@ -35,6 +35,7 @@ #include "view.hpp" using std::shared_ptr; +using std::make_shared; using sigrok::Channel; @@ -63,7 +64,8 @@ Signal::Signal(pv::Session &session, Trace(QString::fromUtf8(channel->name().c_str())), session_(session), channel_(channel), - items_(), + scale_handle_(make_shared(*this)), + items_({scale_handle_}), name_widget_(nullptr), updating_name_widget_(false) { diff --git a/pv/view/signal.hpp b/pv/view/signal.hpp index 714b44f6..db328652 100644 --- a/pv/view/signal.hpp +++ b/pv/view/signal.hpp @@ -28,6 +28,7 @@ #include +#include "signalscalehandle.hpp" #include "trace.hpp" #include "viewitemowner.hpp" @@ -104,6 +105,7 @@ protected: pv::Session &session_; std::shared_ptr channel_; + const std::shared_ptr scale_handle_; const item_list items_; QComboBox *name_widget_; diff --git a/pv/view/signalscalehandle.cpp b/pv/view/signalscalehandle.cpp new file mode 100644 index 00000000..59e618ca --- /dev/null +++ b/pv/view/signalscalehandle.cpp @@ -0,0 +1,106 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2015 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include + +#include "signal.hpp" +#include "signalscalehandle.hpp" +#include "tracetreeitemowner.hpp" + +using std::max; +using std::min; + +namespace pv { +namespace view { + +SignalScaleHandle::SignalScaleHandle(Signal &owner) : + owner_(owner) +{ +} + +bool SignalScaleHandle::enabled() const +{ + return selected() || owner_.selected(); +} + +void SignalScaleHandle::select(bool select) +{ + ViewItem::select(select); + owner_.owner()->row_item_appearance_changed(true, true); +} + +void SignalScaleHandle::drag_release() +{ + RowItem::drag_release(); + owner_.scale_handle_released(); + owner_.owner()->row_item_appearance_changed(true, true); +} + +void SignalScaleHandle::drag_by(const QPoint &delta) +{ + owner_.scale_handle_dragged( + drag_point_.y() + delta.y() - owner_.get_visual_y()); +} + +QPoint SignalScaleHandle::point(const QRect &rect) const +{ + return owner_.point(rect) + QPoint(0, owner_.scale_handle_offset()); +} + +QRectF SignalScaleHandle::hit_box_rect(const ViewItemPaintParams &pp) const +{ + const int text_height = ViewItemPaintParams::text_height(); + const double x = -pp.pixels_offset() - text_height / 2; + const double min_x = pp.left() + text_height; + const double max_x = pp.right() - text_height * 2; + return QRectF(min(max(x, min_x), max_x), + owner_.get_visual_y() + owner_.scale_handle_offset() - + text_height / 2, + text_height, text_height); +} + +void SignalScaleHandle::paint_fore(QPainter &p, const ViewItemPaintParams &pp) +{ + if (!enabled()) + return; + + const QRectF r(hit_box_rect(pp)); + const QPointF c = (r.topLeft() + 2 * r.center()) / 3; + QRadialGradient gradient(c, r.width(), c); + + if (selected()) { + gradient.setColorAt(0.0, QColor(255, 255, 255)); + gradient.setColorAt(0.75, QColor(192, 192, 192)); + gradient.setColorAt(1.0, QColor(128, 128, 128)); + } else { + gradient.setColorAt(0.0, QColor(192, 192, 192)); + gradient.setColorAt(0.75, QColor(128, 128, 128)); + gradient.setColorAt(1.0, QColor(128, 128, 128)); + } + + p.setBrush(QBrush(gradient)); + p.setPen(QColor(128, 128, 128)); + p.drawEllipse(r); +} + +} // view +} // pv diff --git a/pv/view/signalscalehandle.hpp b/pv/view/signalscalehandle.hpp new file mode 100644 index 00000000..a91d6785 --- /dev/null +++ b/pv/view/signalscalehandle.hpp @@ -0,0 +1,93 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2015 Joel Holdsworth + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PULSEVIEW_PV_VIEW_SIGNALSCALEHANDLE_HPP +#define PULSEVIEW_PV_VIEW_SIGNALSCALEHANDLE_HPP + +#include "rowitem.hpp" + +namespace pv { +namespace view { + +class Signal; + +/** + * A row item owned by a @c Signal that implements the v-scale adjustment grab + * handle. + */ +class SignalScaleHandle : public RowItem +{ + Q_OBJECT +public: + /** + * Constructor + */ + explicit SignalScaleHandle(Signal &owner); + +public: + /** + * Returns true if the parent item is enabled. + */ + bool enabled() const; + + /** + * Selects or deselects the signal. + */ + void select(bool select = true); + + /** + * Sets this item into the un-dragged state. + */ + void drag_release(); + + /** + * Drags the item to a delta relative to the drag point. + * @param delta the offset from the drag point. + */ + void drag_by(const QPoint &delta); + + /** + * Get the drag point. + * @param rect the rectangle of the widget area. + */ + QPoint point(const QRect &rect) const; + + /** + * Computes the outline rectangle of the viewport hit-box. + * @param rect the rectangle of the viewport area. + * @return Returns the rectangle of the hit-box. + */ + QRectF hit_box_rect(const ViewItemPaintParams &pp) const; + + /** + * Paints the foreground layer of the item with a QPainter + * @param p the QPainter to paint into. + * @param pp the painting parameters object to paint with. + **/ + void paint_fore(QPainter &p, const ViewItemPaintParams &pp); + +private: + Signal &owner_; +}; + +} // namespace view +} // namespace pv + +#endif // PULSEVIEW_PV_VIEW_SIGNALSCALEHANDLE_HPP