*/
#include <config.h>
+
#include "GuiSelectionManager.h"
-#include "GuiDocument.h"
#include "support/debug.h"
-using std::vector;
+#include <QKeyEvent>
+#include <QListView>
+#include <QPushButton>
+#include <QAbstractListModel>
+
+#ifdef KeyPress
+#undef KeyPress
+#endif
+
+#ifdef ControlModifier
+#undef ControlModifier
+#endif
+
namespace lyx {
namespace frontend {
-
GuiSelectionManager::GuiSelectionManager(
- QListView * avail,
+ QAbstractItemView * avail,
QListView * sel,
QPushButton * add,
QPushButton * del,
QPushButton * down,
QAbstractListModel * amod,
QAbstractListModel * smod)
- {
+{
availableLV = avail;
selectedLV = sel;
addPB = add;
availableLV->setModel(amod);
connect(availableLV->selectionModel(),
- SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
- this, SLOT(availableChanged(const QModelIndex &, const QModelIndex &)));
+ SIGNAL(currentChanged(QModelIndex,QModelIndex)),
+ this, SLOT(availableChanged(QModelIndex, QModelIndex)));
connect(selectedLV->selectionModel(),
- SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
- this, SLOT(selectedChanged(const QModelIndex &, const QModelIndex &)));
+ SIGNAL(currentChanged(QModelIndex, QModelIndex)),
+ this, SLOT(selectedChanged(QModelIndex, QModelIndex)));
connect(addPB, SIGNAL(clicked()),
this, SLOT(addPB_clicked()));
connect(deletePB, SIGNAL(clicked()),
this, SLOT(upPB_clicked()));
connect(downPB, SIGNAL(clicked()),
this, SLOT(downPB_clicked()));
- connect(availableLV, SIGNAL(clicked(const QModelIndex &)),
- this, SLOT(availableLV_clicked(const QModelIndex &)));
- connect(availableLV, SIGNAL(doubleClicked(const QModelIndex &)),
- this, SLOT(availableLV_doubleClicked(const QModelIndex &)));
- connect(selectedLV, SIGNAL(clicked(const QModelIndex &)),
- this, SLOT(selectedLV_clicked(const QModelIndex &)));
+ connect(availableLV, SIGNAL(clicked(QModelIndex)),
+ this, SLOT(availableLV_clicked(QModelIndex)));
+ connect(availableLV, SIGNAL(doubleClicked(QModelIndex)),
+ this, SLOT(availableLV_doubleClicked(QModelIndex)));
+ connect(selectedLV, SIGNAL(clicked(QModelIndex)),
+ this, SLOT(selectedLV_clicked(QModelIndex)));
availableLV->installEventFilter(this);
selectedLV->installEventFilter(this);
QVariant const & str = availableModel->data(idx, Qt::DisplayRole);
QModelIndexList qmil =
selectedModel->match(selectedModel->index(0),
- Qt::DisplayRole, str,
- Qt::MatchExactly | Qt::MatchWrap);
+ Qt::DisplayRole, str, 1,
+ Qt::MatchFlags(Qt::MatchExactly | Qt::MatchWrap));
return !qmil.empty();
}
void GuiSelectionManager::addPB_clicked()
{
- QModelIndex const idxToAdd = getSelectedIndex(availableLV);
- if (!idxToAdd.isValid())
+ QModelIndexList selIdx =
+ availableLV->selectionModel()->selectedIndexes();
+ if (selIdx.isEmpty())
return;
+
+ QModelIndex const idxToAdd = selIdx.first();
QModelIndex const idx = selectedLV->currentIndex();
int const srows = selectedModel->rowCount();
insertRowToSelected(srows, qm);
selectionChanged(); //signal
-
+
if (idx.isValid())
selectedLV->setCurrentIndex(idx);
void GuiSelectionManager::deletePB_clicked()
{
- QModelIndex idx = getSelectedIndex(selectedLV);
- if (!idx.isValid())
+ QModelIndexList selIdx =
+ selectedLV->selectionModel()->selectedIndexes();
+ if (selIdx.isEmpty())
return;
-
+ QModelIndex idx = selIdx.first();
selectedModel->removeRow(idx.row());
selectionChanged(); //signal
if (nrows > 1)
selectedLV->setCurrentIndex(idx);
else if (nrows == 1)
- selectedLV->setCurrentIndex(selectedLV->model()->index(0,0));
+ selectedLV->setCurrentIndex(selectedLV->model()->index(0, 0));
selectedHasFocus_ = (nrows > 0);
updateHook();
}
}
-//FIXME These slots do not really do what they need to do, since focus
-//can enter the QListView in other ways. But there are no signals sent
-//in that case. We need to reimplement focusInEvent() to capture those,
-//which means subclassing QListView. (rgh)
+// FIXME These slots do not really do what they need to do, since focus
+// can enter the QListView in other ways. But there are no signals sent
+// in that case. We need to reimplement focusInEvent() to capture those,
+// which means subclassing QListView. (rgh)
+// Or by installing an event listener.. (andre)
void GuiSelectionManager::availableLV_clicked(const QModelIndex &)
{
selectedHasFocus_ = false;
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.
- //Ctrl-Enter will add it and close the dialog.
- //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) &&
- //We want one or both of Control and Keypad, and nothing else
- //(KeypadModifier is what you get if you use the Enter key on the
- //numeric keypad.)
- (!keyModifiers ||
- (keyModifiers == Qt::ControlModifier) ||
- (keyModifiers == Qt::KeypadModifier) ||
- (keyModifiers == (Qt::ControlModifier | Qt::KeypadModifier))
- )
- ) {
- if (addPB->isEnabled()) {
+ // Enter key without modifier will add current item.
+ // Ctrl-Enter will add it and close the dialog.
+ // 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();
- okHook(); //signal
+ else if (keyModifiers == Qt::ControlModifier ||
+ keyModifiers == Qt::KeypadModifier ||
+ keyModifiers == (Qt::ControlModifier | Qt::KeypadModifier)) {
+ if (addPB->isEnabled()) {
+ addPB_clicked();
+ okHook(); //signal
+ }
}
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();
+ // Delete or backspace key will delete current item
+ // ...with control modifier will clear the list
if (keyPressed == Qt::Key_Delete || keyPressed == Qt::Key_Backspace) {
- if (keyModifiers == Qt::NoModifier && deletePB->isEnabled())
+ if (keyModifiers == Qt::NoModifier && deletePB->isEnabled()) {
deletePB_clicked();
- else if (keyModifiers == Qt::ControlModifier) {
+ updateHook();
+ } else if (keyModifiers == Qt::ControlModifier) {
selectedModel->removeRows(0, selectedModel->rowCount());
updateHook();
} else
- //ignore it otherwise
return QObject::eventFilter(obj, event);
+ }
+ // Ctrl-Up activates upPB
+ else if (keyPressed == Qt::Key_Up) {
+ if (keyModifiers == Qt::ControlModifier) {
+ if (upPB->isEnabled())
+ upPB_clicked();
event->accept();
return true;
+ }
+ }
+ // Ctrl-Down activates downPB
+ else if (keyPressed == Qt::Key_Down) {
+ if (keyModifiers == Qt::ControlModifier) {
+ if (downPB->isEnabled())
+ downPB_clicked();
+ event->accept();
+ return true;
+ }
}
}
return QObject::eventFilter(obj, event);
} // namespace frontend
} // namespace lyx
-#include "GuiSelectionManager_moc.cpp"
+#include "moc_GuiSelectionManager.cpp"