X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fwidgets%2Fdevicetoolbutton.cpp;h=6a12aa25c446904651b60bfe6de58e13d27eaa12;hp=27ba31a62120d5e97a2085fed6e4337d204116b6;hb=f4ab4b5c657e5613caba82feaa81a8a400e4f331;hpb=079d39ea735015597a65390e4c5cacc7d272f78c diff --git a/pv/widgets/devicetoolbutton.cpp b/pv/widgets/devicetoolbutton.cpp index 27ba31a6..6a12aa25 100644 --- a/pv/widgets/devicetoolbutton.cpp +++ b/pv/widgets/devicetoolbutton.cpp @@ -14,15 +14,18 @@ * 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 + * along with this program; if not, see . */ #include -#include +#include +#include + +#include #include +#include #include "devicetoolbutton.hpp" @@ -32,7 +35,7 @@ using std::string; using std::weak_ptr; using std::vector; -using sigrok::Device; +using pv::devices::Device; namespace pv { namespace widgets { @@ -54,6 +57,9 @@ DeviceToolButton::DeviceToolButton(QWidget *parent, connect(&mapper_, SIGNAL(mapped(QObject*)), this, SLOT(on_action(QObject*))); + + connect(&menu_, SIGNAL(hovered(QAction*)), + this, SLOT(on_menu_hovered(QAction*))); } shared_ptr DeviceToolButton::selected_device() @@ -65,12 +71,19 @@ void DeviceToolButton::set_device_list( const list< shared_ptr > &devices, shared_ptr selected) { selected_device_ = selected; - setText(QString::fromStdString( - device_manager_.get_display_name(selected))); + setText(selected ? QString::fromStdString( + selected->display_name(device_manager_)) : tr("")); devices_ = vector< weak_ptr >(devices.begin(), devices.end()); update_device_list(); } +void DeviceToolButton::reset() +{ + setText(tr("")); + selected_device_.reset(); + update_device_list(); +} + void DeviceToolButton::update_device_list() { menu_.clear(); @@ -78,16 +91,17 @@ void DeviceToolButton::update_device_list() menu_.setDefaultAction(connect_action_); menu_.addSeparator(); - for (weak_ptr dev_weak_ptr : devices_) { - shared_ptr dev(dev_weak_ptr); + for (weak_ptr& dev_weak_ptr : devices_) { + shared_ptr dev(dev_weak_ptr.lock()); if (!dev) continue; QAction *const a = new QAction(QString::fromStdString( - device_manager_.get_display_name(dev)), this); + dev->display_name(device_manager_)), this); a->setCheckable(true); a->setChecked(selected_device_ == dev); a->setData(qVariantFromValue((void*)dev.get())); + a->setToolTip(QString::fromStdString(dev->full_name())); mapper_.setMapping(a, a); connect(a, SIGNAL(triggered()), &mapper_, SLOT(map())); @@ -100,8 +114,10 @@ void DeviceToolButton::on_action(QObject *action) { assert(action); + selected_device_.reset(); + Device *const dev = (Device*)((QAction*)action)->data().value(); - for (weak_ptr dev_weak_ptr : devices_) { + for (weak_ptr& dev_weak_ptr : devices_) { shared_ptr dev_ptr(dev_weak_ptr); if (dev_ptr.get() == dev) { selected_device_ = shared_ptr(dev_ptr); @@ -111,10 +127,35 @@ void DeviceToolButton::on_action(QObject *action) update_device_list(); setText(QString::fromStdString( - device_manager_.get_display_name(selected_device_))); + selected_device_->display_name(device_manager_))); device_selected(); } -} // widgets -} // pv +void DeviceToolButton::on_menu_hovered(QAction *action) +{ + assert(action); + + // Only show the tooltip for device entries (they hold + // device pointers in their data field) + if (!action->data().isValid()) + return; + + device_tooltip_ = action->toolTip(); + + if (QToolTip::isVisible()) + on_menu_hover_timeout(); + else + QTimer::singleShot(1000, this, SLOT(on_menu_hover_timeout())); +} + +void DeviceToolButton::on_menu_hover_timeout() +{ + if (device_tooltip_.isEmpty()) + return; + + QToolTip::showText(QCursor::pos(), device_tooltip_); +} + +} // namespace widgets +} // namespace pv