X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiSelectionManager.cpp;h=eeba9372f0ef73d4205863e7ed0399884722fed1;hb=a0ce37147cffa39b1a5c8859eb001dd2194b22a1;hp=6e712ae02771ace46aed47e01903032d11930fbb;hpb=ffd3b5a6a34dec07f31eae7fea732586ce45c2ac;p=lyx.git diff --git a/src/frontends/qt4/GuiSelectionManager.cpp b/src/frontends/qt4/GuiSelectionManager.cpp index 6e712ae027..eeba9372f0 100644 --- a/src/frontends/qt4/GuiSelectionManager.cpp +++ b/src/frontends/qt4/GuiSelectionManager.cpp @@ -15,9 +15,11 @@ #include #include "GuiSelectionManager.h" +#include "qt_helpers.h" #include "support/debug.h" +#include #include #include #include @@ -32,32 +34,34 @@ #undef ControlModifier #endif +#ifdef FocusIn +#undef FocusIn +#endif + namespace lyx { namespace frontend { -GuiSelectionManager::GuiSelectionManager( - QAbstractItemView * avail, - QListView * sel, - QPushButton * add, - QPushButton * del, - QPushButton * up, - QPushButton * down, - QAbstractListModel * amod, - QAbstractListModel * smod) +GuiSelectionManager::GuiSelectionManager(QObject * parent, + QAbstractItemView * avail, + QAbstractItemView * sel, + QPushButton * add, + QPushButton * del, + QPushButton * up, + QPushButton * down, + QAbstractListModel * amod, + QAbstractItemModel * smod, + int const main_sel_col) +: QObject(parent), availableLV(avail), selectedLV(sel), + addPB(add), deletePB(del), upPB(up), downPB(down), + availableModel(amod), selectedModel(smod), + selectedHasFocus_(false), main_sel_col_(main_sel_col) { - availableLV = avail; - selectedLV = sel; - addPB = add; - deletePB = del; - upPB = up; - downPB = down; - availableModel = amod; - selectedModel = smod; - selectedLV->setModel(smod); availableLV->setModel(amod); - + selectedLV->setSelectionBehavior(QAbstractItemView::SelectRows); + selectedLV->setSelectionMode(QAbstractItemView::SingleSelection); + connect(availableLV->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(availableChanged(QModelIndex, QModelIndex))); @@ -70,17 +74,19 @@ GuiSelectionManager::GuiSelectionManager( connect(selectedLV->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(selectedChanged(QItemSelection, QItemSelection))); - connect(addPB, SIGNAL(clicked()), + connect(selectedLV->itemDelegate(), SIGNAL(commitData(QWidget*)), + this, SLOT(selectedEdited())); + connect(addPB, SIGNAL(clicked()), this, SLOT(addPB_clicked())); - connect(deletePB, SIGNAL(clicked()), + connect(deletePB, SIGNAL(clicked()), this, SLOT(deletePB_clicked())); - connect(upPB, SIGNAL(clicked()), + connect(upPB, SIGNAL(clicked()), this, SLOT(upPB_clicked())); - connect(downPB, SIGNAL(clicked()), + connect(downPB, SIGNAL(clicked()), this, SLOT(downPB_clicked())); - connect(availableLV, SIGNAL(doubleClicked(QModelIndex)), + connect(availableLV, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(availableLV_doubleClicked(QModelIndex))); - + availableLV->installEventFilter(this); selectedLV->installEventFilter(this); } @@ -95,10 +101,10 @@ void GuiSelectionManager::update() } -QModelIndex GuiSelectionManager::getSelectedIndex() const +QModelIndex GuiSelectionManager::getSelectedIndex(int const c) const { QModelIndexList avail = availableLV->selectionModel()->selectedIndexes(); - QModelIndexList sel = selectedLV->selectionModel()->selectedIndexes(); + QModelIndexList sel = selectedLV->selectionModel()->selectedRows(c); bool const have_avl = !avail.isEmpty(); bool const have_sel = !sel.isEmpty(); @@ -138,7 +144,7 @@ void GuiSelectionManager::updateDelPB() } QModelIndexList const selSels = selectedLV->selectionModel()->selectedIndexes(); - int const sel_nr = selSels.empty() ? -1 : selSels.first().row(); + int const sel_nr = selSels.empty() ? -1 : selSels.first().row(); deletePB->setEnabled(sel_nr >= 0); } @@ -152,7 +158,7 @@ void GuiSelectionManager::updateUpPB() } QModelIndexList const selSels = selectedLV->selectionModel()->selectedIndexes(); - int const sel_nr = selSels.empty() ? -1 : selSels.first().row(); + int const sel_nr = selSels.empty() ? -1 : selSels.first().row(); upPB->setEnabled(sel_nr > 0); } @@ -166,7 +172,7 @@ void GuiSelectionManager::updateDownPB() } QModelIndexList const selSels = selectedLV->selectionModel()->selectedIndexes(); - int const sel_nr = selSels.empty() ? -1 : selSels.first().row(); + int const sel_nr = selSels.empty() ? -1 : selSels.first().row(); downPB->setEnabled(sel_nr >= 0 && sel_nr < srows - 1); } @@ -177,7 +183,7 @@ bool GuiSelectionManager::isSelected(const QModelIndex & idx) return false; QVariant const & str = availableModel->data(idx, Qt::DisplayRole); QModelIndexList qmil = - selectedModel->match(selectedModel->index(0), + selectedModel->match(selectedModel->index(0, main_sel_col_), Qt::DisplayRole, str, 1, Qt::MatchFlags(Qt::MatchExactly | Qt::MatchWrap)); return !qmil.empty(); @@ -197,7 +203,7 @@ void GuiSelectionManager::availableChanged(const QModelIndex & idx, const QModel { if (!idx.isValid()) return; - + selectedHasFocus_ = false; updateHook(); } @@ -216,12 +222,18 @@ void GuiSelectionManager::selectedChanged(const QModelIndex & idx, const QModelI { if (!idx.isValid()) return; - + selectedHasFocus_ = true; updateHook(); } +void GuiSelectionManager::selectedEdited() +{ + selectionChanged(); +} + + bool GuiSelectionManager::insertRowToSelected(int i, QMap const & itemData) { @@ -231,7 +243,23 @@ bool GuiSelectionManager::insertRowToSelected(int i, i = selectedModel->rowCount(); if (!selectedModel->insertRow(i)) return false; - return selectedModel->setItemData(selectedModel->index(i), itemData); + return selectedModel->setItemData(selectedModel->index(i, main_sel_col_), itemData); +} + + +bool GuiSelectionManager::insertRowToSelected(int i, QMap> & qms) +{ + if (i <= -1) + i = 0; + if (i > selectedModel->rowCount()) + i = selectedModel->rowCount(); + if (!selectedModel->insertRow(i)) + return false; + bool res = true; + QMap>::const_iterator it = qms.constBegin(); + for (; it != qms.constEnd(); ++it) + res &= selectedModel->setItemData(selectedModel->index(i, it.key()), it.value()); + return res; } @@ -245,15 +273,15 @@ void GuiSelectionManager::addPB_clicked() QModelIndex const idxToAdd = selIdx.first(); QModelIndex const idx = selectedLV->currentIndex(); int const srows = selectedModel->rowCount(); - + QMap qm = availableModel->itemData(idxToAdd); insertRowToSelected(srows, qm); - + selectionChanged(); //signal if (idx.isValid()) selectedLV->setCurrentIndex(idx); - + updateHook(); } @@ -267,11 +295,11 @@ void GuiSelectionManager::deletePB_clicked() QModelIndex idx = selIdx.first(); selectedModel->removeRow(idx.row()); selectionChanged(); //signal - + int nrows = selectedLV->model()->rowCount(); if (idx.row() == nrows) //was last item on list idx = idx.sibling(idx.row() - 1, idx.column()); - + if (nrows > 1) selectedLV->setCurrentIndex(idx); else if (nrows == 1) @@ -292,11 +320,14 @@ void GuiSelectionManager::upPB_clicked() int const pos = idx.row(); if (pos <= 0) return; - - QMap qm = selectedModel->itemData(idx); + + QMap> qms; + QList::const_iterator it = selIdx.constBegin(); + for (; it != selIdx.constEnd(); ++it) + qms[it->column()] = selectedModel->itemData(*it); selectedModel->removeRow(pos); - insertRowToSelected(pos - 1, qm); + insertRowToSelected(pos - 1, qms); selectionChanged(); //signal @@ -318,13 +349,16 @@ void GuiSelectionManager::downPB_clicked() if (pos >= selectedModel->rowCount() - 1) return; - QMap qm = selectedModel->itemData(idx); + QMap> qms; + QList::const_iterator it = selIdx.constBegin(); + for (; it != selIdx.constEnd(); ++it) + qms[it->column()] = selectedModel->itemData(*it); selectedModel->removeRow(pos); - insertRowToSelected(pos + 1, qm); + insertRowToSelected(pos + 1, qms); selectionChanged(); //signal - + selectedLV->setCurrentIndex(idx.sibling(idx.row() + 1, idx.column())); selectedHasFocus_ = true; updateHook(); @@ -335,7 +369,7 @@ void GuiSelectionManager::availableLV_doubleClicked(const QModelIndex & idx) { if (isSelected(idx) || !addPB->isEnabled()) return; - + if (idx.isValid()) selectedHasFocus_ = false; addPB_clicked(); @@ -356,27 +390,32 @@ bool GuiSelectionManager::eventFilter(QObject * obj, QEvent * event) // This is designed to work both with the main enter key // and the one on the numeric keypad. if (keyPressed == Qt::Key_Enter || keyPressed == Qt::Key_Return) { - if (!keyModifiers) - addPB_clicked(); - else if (keyModifiers == Qt::ControlModifier || - keyModifiers == Qt::KeypadModifier || - keyModifiers == (Qt::ControlModifier | Qt::KeypadModifier)) { + if (!keyModifiers || + keyModifiers == Qt::ControlModifier || + keyModifiers == Qt::KeypadModifier || + keyModifiers == (Qt::ControlModifier + | Qt::KeypadModifier)) { if (addPB->isEnabled()) { addPB_clicked(); - okHook(); //signal } + if (keyModifiers) + okHook(); //signal } event->accept(); return true; } + else if (keyPressed == Qt::Key_Right) { + focusAndHighlight(selectedLV); + event->accept(); + return true; + } } else if (etype == QEvent::FocusIn) { if (selectedHasFocus_) { selectedHasFocus_ = false; updateHook(); } - event->accept(); - return true; - } + return false; + } } else if (obj == selectedLV) { if (etype == QEvent::KeyPress) { QKeyEvent * keyEvent = static_cast(event); @@ -393,7 +432,7 @@ bool GuiSelectionManager::eventFilter(QObject * obj, QEvent * event) updateHook(); } else return QObject::eventFilter(obj, event); - } + } // Ctrl-Up activates upPB else if (keyPressed == Qt::Key_Up) { if (keyModifiers == Qt::ControlModifier) { @@ -402,7 +441,7 @@ bool GuiSelectionManager::eventFilter(QObject * obj, QEvent * event) event->accept(); return true; } - } + } // Ctrl-Down activates downPB else if (keyPressed == Qt::Key_Down) { if (keyModifiers == Qt::ControlModifier) { @@ -412,13 +451,17 @@ bool GuiSelectionManager::eventFilter(QObject * obj, QEvent * event) return true; } } + else if (keyPressed == Qt::Key_Left) { + focusAndHighlight(availableLV); + event->accept(); + return true; + } } else if (etype == QEvent::FocusIn) { if (!selectedHasFocus_) { selectedHasFocus_ = true; updateHook(); } - event->accept(); - return true; + return false; } } return QObject::eventFilter(obj, event);