Richard Heck wrote:
> 
> Still seeking comment on this patch, or permission to commit.
> 
> =====
> 
> The attached patch addresses these bugs
>  http://bugzilla.lyx.org/show_bug.cgi?id=3741
>  http://bugzilla.lyx.org/show_bug.cgi?id=3756
> in a way that is compatible with earlier discussion with Abdel. Here's
> what it does:
> 
>     * In the "Available" list, double clicking or hitting Enter adds the
>       citation. Hitting Ctrl-Enter adds the citation and closes the
>       dialog. Previously, enter did what Ctrl-Enter now does if there
>       was no other citation already selected.
>     * In the "Selected" list, Delete and Backspace delete the selection.
>       Ctrl-Delete and Ctrl-Backspace clear the whole list.
> 
> The only way I could find to implement this was to install an event
> filter on these widgets.
> 
> I've also made two other changes. One was to use the rejected() signal
> instead of checking for Qt::Key_Escape in a KeyPressEvent handler. The
> other is in two places, of which this is an example:
> 
> void QCitationDialog::on_addPB_clicked()
>  {
> +    QModelIndexList const selIdx =
> +        availableLV->selectionModel()->selectedIndexes();
> +    if (selIdx.empty())
> +        return;
> +    QModelIndex const & idxToAdd = selIdx.first();
> +    if (!idxToAdd.isValid())
> +        return;
>      QModelIndex idx = selectedLV->currentIndex();
> -    form_->addKey(availableLV->currentIndex());
> +    form_->addKey(idxToAdd);
>      if (idx.isValid())
>          selectedLV->setCurrentIndex(idx);
>      selectedLV->selectionModel()->reset();
> 
> The point of this is to get the currently highlighted index, if such
> there is, as availableLV->currentIndex() will return the index where the
> cursor is, even if that is not highlighted. As the dialog now works,
> this doesn't make any difference---it's always highlighted---but it
> seemed worth being careful.
> 
> I tried to do something like this so I didn't have the same code in two
> places:
> QModelIndex & QCitationDialog::getSelectedIndex(QListView *) {
>   QModelIndexList const selIdx =
>         availableLV->selectionModel()->selectedIndexes();
>       if (selIdx.empty())
>           return QModelIndex(); //this is an invalid one.
>      return selIdx.first();
> }
> But that failed: warning: returns reference to temporary. Any ideas how
> to avoid this and still return a reference? Or could I return a smart

returning "const QModelIndex &" should be save. But you could also
return may value, copying QModelIndex  isn't that expensive. The Qt
code return often by value, QModelIndex was designed for this.

> pointer of some kind?
> 
> Looking to commit, possibly with improvements.
> 
> Richard
> 
> 
> ------------------------------------------------------------------------
> 
> Index: QCitationDialog.cpp
> ===================================================================
> --- QCitationDialog.cpp       (revision 18580)
> +++ QCitationDialog.cpp       (working copy)
> @@ -65,6 +65,9 @@
>       connect(selectedLV->selectionModel(),
>               SIGNAL(currentChanged(const QModelIndex &, const QModelIndex 
> &)),
>               this, SLOT(selectedChanged(const QModelIndex &, const 
> QModelIndex &)));
> +     connect(this, SIGNAL(rejected()), this, SLOT(cleanUp()));
> +     availableLV->installEventFilter(this);
> +     selectedLV->installEventFilter(this);
>  }
>  
>  
> @@ -73,18 +76,63 @@
>  }
>  
>  
> -void QCitationDialog::keyPressEvent(QKeyEvent * event)
> +bool QCitationDialog::eventFilter(QObject * obj, QEvent * event) 
>  {
> -     if (event->key() == Qt::Key_Escape) {
> -             form_->clearSelection();
> -             form_->clearParams();
> -             event->accept();
> -             close();
> -     } else
> -             event->ignore();
> +     if (obj == availableLV) {
> +             if (event->type() != QEvent::KeyPress)
> +                     return QObject::eventFilter(obj, event);
> +             QKeyEvent * keyEvent = static_cast<QKeyEvent *>(event);
> +             int const keyPressed = keyEvent->key();
> +             Qt::KeyboardModifiers const keyModifiers = 
> keyEvent->modifiers();
> +             //Enter key without modifier will add current item
> +             //...with control modifier will add it and close the dialog
> +             if ((keyPressed ==      Qt::Key_Enter || keyPressed == 
> Qt::Key_Return) &&
> +                             (!keyModifiers || 
> +                              (keyModifiers == Qt::ControlModifier) ||
> +                              (keyModifiers == Qt::KeypadModifier)  ||
> +                              (keyModifiers == (Qt::ControlModifier | 
> Qt::KeypadModifier))
> +                             )
> +                     ) {
> +                             if (addPB->isEnabled())
> +                                     on_addPB_clicked();
> +                             if (keyModifiers & Qt::ControlModifier)
> +                                     on_okPB_clicked();
> +                             event->accept();
> +                             return true;
> +             } 
> +     } else if (obj == selectedLV) {
> +             //Delete or backspace key will delete current item
> +             //...with control modifier will clear the list
> +             if (event->type() != QEvent::KeyPress)
> +                     return QObject::eventFilter(obj, event);
> +             QKeyEvent * keyEvent = static_cast<QKeyEvent *>(event);
> +             int const keyPressed = keyEvent->key();
> +             Qt::KeyboardModifiers const keyModifiers = 
> keyEvent->modifiers();
> +             if (keyPressed == Qt::Key_Delete || keyPressed == 
> Qt::Key_Backspace) {
> +                     if (keyModifiers == Qt::NoModifier && 
> deletePB->isEnabled())
> +                             on_deletePB_clicked();
> +                     else if (keyModifiers == Qt::ControlModifier) {
> +                             form_->clearSelection();
> +                             update();
> +                     } else
> +                             //ignore it otherwise
> +                             return QObject::eventFilter(obj, event);
> +                     event->accept();
> +                     return true;
> +             }
> +     }
> +     return QObject::eventFilter(obj, event);
>  }
>  
>  
> +void QCitationDialog::cleanUp() 
> +{
> +     form_->clearSelection();
> +     form_->clearParams();
> +     close();
> +}
> +
> +
>  void QCitationDialog::closeEvent(QCloseEvent * e)
>  {
>       form_->clearSelection();
> @@ -300,7 +348,6 @@
>  {
>       if (!idx.isValid())
>               return;
> -
>       availableLV->selectionModel()->reset();
>       update();
>  }
> @@ -317,21 +364,18 @@
>  {
>       if (!idx.isValid())
>               return;
> -
>       selectedLV->selectionModel()->reset();
>       update();
>  }
>  
>  
> -void QCitationDialog::on_availableLV_activated(const QModelIndex & idx)
> +void QCitationDialog::on_availableLV_doubleClicked(const QModelIndex & idx)
>  {
>       if (isSelected(idx))
>               return;
>  
>       selectedLV->selectionModel()->reset();
>       on_addPB_clicked();
> -     if (selectedLV->model()->rowCount() == 1)
> -             on_okPB_clicked();
>  }
>  
>  
> @@ -342,8 +386,15 @@
>  
>  void QCitationDialog::on_addPB_clicked()
>  {
> +     QModelIndexList const selIdx = 
> +             availableLV->selectionModel()->selectedIndexes();
> +     if (selIdx.empty())
> +             return;
> +     QModelIndex const & idxToAdd = selIdx.first();
> +     if (!idxToAdd.isValid())
> +             return;
>       QModelIndex idx = selectedLV->currentIndex();
> -     form_->addKey(availableLV->currentIndex());
> +     form_->addKey(idxToAdd);
>       if (idx.isValid())
>               selectedLV->setCurrentIndex(idx);
>       selectedLV->selectionModel()->reset();
> @@ -353,7 +404,13 @@
>  
>  void QCitationDialog::on_deletePB_clicked()
>  {
> -     QModelIndex idx = selectedLV->currentIndex();
> +     QModelIndexList selIdx = 
> +             selectedLV->selectionModel()->selectedIndexes();
> +     if (selIdx.empty())
> +             return;
> +     QModelIndex & idx = selIdx.first();
> +     if (!idx.isValid())
> +             return;
>       int nrows = selectedLV->model()->rowCount();
>  
>       form_->deleteKey(idx);
> 


-- 
Peter Kümmel

Reply via email to