Hi Soeren, this seems to work nicely - except it doesn't seem to work on the time cursors popup menu. Would you expect your patch to be able to affect that? I guess this isn't relevant to the channel groups popup.
Joel On 09/09/14 21:50, [email protected] wrote: > From: Soeren Apel <[email protected]> > > This patch partly reverts two patches I submitted before: [1] [2] > Instead, it implements a generic approach to the "close on enter" feature > in popups by installing the key event handler on the first editable widget > it finds in the popup. > > [1] http://sigrok.org/gitweb/?p=pulseview.git;a=commit;h=3c10012 > [2] http://sigrok.org/gitweb/?p=pulseview.git;a=commit;h=0891e69 > > --- > pv/view/signal.cpp | 21 --------------------- > pv/view/signal.h | 2 -- > pv/view/trace.cpp | 26 -------------------------- > pv/view/trace.h | 4 ---- > pv/widgets/popup.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ > pv/widgets/popup.h | 4 ++++ > 6 files changed, 44 insertions(+), 53 deletions(-) > > diff --git a/pv/view/signal.cpp b/pv/view/signal.cpp > index 97e0549..51af899 100644 > --- a/pv/view/signal.cpp > +++ b/pv/view/signal.cpp > @@ -118,9 +118,6 @@ void Signal::populate_popup_form(QWidget *parent, > QFormLayout *form) > connect(_name_widget, SIGNAL(editTextChanged(const QString&)), > this, SLOT(on_text_changed(const QString&))); > > - // We want to close the popup when the Enter key was pressed. > - _name_widget->installEventFilter(this); > - > form->addRow(tr("Name"), _name_widget); > > add_colour_option(parent, form); > @@ -140,24 +137,6 @@ QMenu* Signal::create_context_menu(QWidget *parent) > return menu; > } > > -bool Signal::eventFilter(QObject *obj, QEvent *evt) > -{ > - QKeyEvent *keyEvent; > - > - (void)obj; > - > - if (evt->type() == QEvent::KeyPress) { > - keyEvent = static_cast<QKeyEvent*>(evt); > - if (keyEvent->key() == Qt::Key_Enter || > - keyEvent->key() == Qt::Key_Return) { > - close_popup(); > - return true; > - } > - } > - > - return false; > -} > - > void Signal::delete_pressed() > { > on_disable(); > diff --git a/pv/view/signal.h b/pv/view/signal.h > index 7cf08b2..cce9f46 100644 > --- a/pv/view/signal.h > +++ b/pv/view/signal.h > @@ -75,8 +75,6 @@ public: > > void delete_pressed(); > > - bool eventFilter(QObject *obj, QEvent *evt); > - > private Q_SLOTS: > void on_disable(); > > diff --git a/pv/view/trace.cpp b/pv/view/trace.cpp > index 250376e..7aa199c 100644 > --- a/pv/view/trace.cpp > +++ b/pv/view/trace.cpp > @@ -219,24 +219,6 @@ QRectF Trace::get_label_rect(int right) > label_size.width(), label_size.height()); > } > > -bool Trace::eventFilter(QObject *obj, QEvent *evt) > -{ > - QKeyEvent *keyEvent; > - > - (void)obj; > - > - if (evt->type() == QEvent::KeyPress) { > - keyEvent = static_cast<QKeyEvent*>(evt); > - if (keyEvent->key() == Qt::Key_Enter || > - keyEvent->key() == Qt::Key_Return) { > - close_popup(); > - return true; > - } > - } > - > - return false; > -} > - > QColor Trace::get_text_colour() const > { > return (_colour.lightness() > 64) ? Qt::black : Qt::white; > @@ -288,17 +270,9 @@ void Trace::populate_popup_form(QWidget *parent, > QFormLayout *form) > this, SLOT(on_text_changed(const QString&))); > form->addRow(tr("Name"), name_edit); > > - // We want to close the popup when the Enter key was pressed. > - name_edit->installEventFilter(this); > - > add_colour_option(parent, form); > } > > -void Trace::close_popup() > -{ > - _popup->close(); > -} > - > void Trace::on_popup_closed() > { > _popup = NULL; > diff --git a/pv/view/trace.h b/pv/view/trace.h > index 5cab440..7726be2 100644 > --- a/pv/view/trace.h > +++ b/pv/view/trace.h > @@ -148,8 +148,6 @@ public: > */ > QRectF get_label_rect(int right); > > - bool eventFilter(QObject *obj, QEvent *evt); > - > protected: > > /** > @@ -175,8 +173,6 @@ protected: > > virtual void populate_popup_form(QWidget *parent, QFormLayout *form); > > - void close_popup(); > - > private Q_SLOTS: > void on_text_changed(const QString &text); > > diff --git a/pv/widgets/popup.cpp b/pv/widgets/popup.cpp > index 9bdbd76..141985e 100644 > --- a/pv/widgets/popup.cpp > +++ b/pv/widgets/popup.cpp > @@ -25,6 +25,7 @@ > #include <QtGui> > #include <QApplication> > #include <QDesktopWidget> > +#include <QLineEdit> > > #include "popup.h" > > @@ -67,6 +68,45 @@ void Popup::set_position(const QPoint point, Position pos) > > } > > +bool Popup::eventFilter(QObject *obj, QEvent *evt) > +{ > + QKeyEvent *keyEvent; > + > + (void)obj; > + > + if (evt->type() == QEvent::KeyPress) { > + keyEvent = static_cast<QKeyEvent*>(evt); > + if (keyEvent->key() == Qt::Key_Enter || > + keyEvent->key() == Qt::Key_Return) { > + this->close(); > + return true; > + } > + } > + > + return false; > +} > + > +void Popup::show() > +{ > + QLineEdit* le; > + > + QWidget::show(); > + > + // We want to close the popup when the Enter key was > + // pressed and the first editable widget had focus. > + if ((le = this->findChild<QLineEdit*>())) { > + > + // For combo boxes we need to hook into the parent of > + // the line edit (i.e. the QComboBox). For edit boxes > + // we hook into the widget directly. > + if (le->parent()->metaObject()->className() == > + this->metaObject()->className()) > + le->installEventFilter(this); > + else > + le->parent()->installEventFilter(this); > + } > +} > + > bool Popup::space_for_arrow() const > { > // Check if there is room for the arrow > diff --git a/pv/widgets/popup.h b/pv/widgets/popup.h > index ec12304..2fdb23c 100644 > --- a/pv/widgets/popup.h > +++ b/pv/widgets/popup.h > @@ -52,6 +52,10 @@ public: > > void set_position(const QPoint point, Position pos); > > + bool eventFilter(QObject *obj, QEvent *evt); > + > + void show(); > + > private: > bool space_for_arrow() const; > > ------------------------------------------------------------------------------ Want excitement? Manually upgrade your production database. When you want reliability, choose Perforce Perforce version control. Predictably reliable. http://pubads.g.doubleclick.net/gampad/clk?id=157508191&iu=/4140/ostg.clktrk _______________________________________________ sigrok-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/sigrok-devel

