#include <config.h>
#include "GuiSelectionManager.h"
+#include "GuiDocument.h"
+#include "support/debug.h"
+
+using std::vector;
namespace lyx {
namespace frontend {
+
GuiSelectionManager::GuiSelectionManager(
- QListView * avail,
- QListView * sel,
- QPushButton * add,
- QPushButton * del,
- QPushButton * up,
- QPushButton * down,
- QStringListModel * amod,
- QStringListModel * smod)
-{
+ QListView * avail,
+ QListView * sel,
+ QPushButton * add,
+ QPushButton * del,
+ QPushButton * up,
+ QPushButton * down,
+ QAbstractListModel * amod,
+ QAbstractListModel * smod)
+ {
availableLV = avail;
selectedLV = sel;
addPB = add;
selectedLV->setModel(smod);
availableLV->setModel(amod);
-
+
connect(availableLV->selectionModel(),
- SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
- this, SLOT(availableChanged(const QModelIndex &, const QModelIndex &)));
+ SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
+ this, SLOT(availableChanged(const QModelIndex &, const QModelIndex &)));
connect(selectedLV->selectionModel(),
- SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
- this, SLOT(selectedChanged(const QModelIndex &, const QModelIndex &)));
+ SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
+ this, SLOT(selectedChanged(const QModelIndex &, const QModelIndex &)));
connect(addPB, SIGNAL(clicked()),
- this, SLOT(addPB_clicked()));
+ this, SLOT(addPB_clicked()));
connect(deletePB, SIGNAL(clicked()),
- this, SLOT(deletePB_clicked()));
+ this, SLOT(deletePB_clicked()));
connect(upPB, SIGNAL(clicked()),
- this, SLOT(upPB_clicked()));
+ this, SLOT(upPB_clicked()));
connect(downPB, SIGNAL(clicked()),
- this, SLOT(downPB_clicked()));
+ this, SLOT(downPB_clicked()));
connect(availableLV, SIGNAL(clicked(const QModelIndex &)),
- this, SLOT(availableLV_clicked(const QModelIndex &)));
+ this, SLOT(availableLV_clicked(const QModelIndex &)));
connect(availableLV, SIGNAL(doubleClicked(const QModelIndex &)),
- this, SLOT(availableLV_doubleClicked(const QModelIndex &)));
+ this, SLOT(availableLV_doubleClicked(const QModelIndex &)));
connect(selectedLV, SIGNAL(clicked(const QModelIndex &)),
- this, SLOT(selectedLV_clicked(const QModelIndex &)));
-
+ this, SLOT(selectedLV_clicked(const QModelIndex &)));
+
availableLV->installEventFilter(this);
selectedLV->installEventFilter(this);
}
-void GuiSelectionManager::updateView()
+void GuiSelectionManager::update()
+{
+ updateAddPB();
+ updateDelPB();
+ updateDownPB();
+ updateUpPB();
+}
+
+
+void GuiSelectionManager::updateAddPB()
{
- int const arows = availableLV->model()->rowCount();
+ int const arows = availableModel->rowCount();
QModelIndexList const availSels =
- availableLV->selectionModel()->selectedIndexes();
+ availableLV->selectionModel()->selectedIndexes();
addPB->setEnabled(arows > 0 &&
- !availSels.isEmpty() &&
- !isSelected(availSels.first()));
+ !availSels.isEmpty() &&
+ !isSelected(availSels.first()));
+}
+
+
+void GuiSelectionManager::updateDelPB()
+{
+ int const srows = selectedModel->rowCount();
+ if (srows == 0) {
+ deletePB->setEnabled(false);
+ return;
+ }
+ QModelIndexList const selSels =
+ selectedLV->selectionModel()->selectedIndexes();
+ int const sel_nr = selSels.empty() ? -1 : selSels.first().row();
+ deletePB->setEnabled(sel_nr >= 0);
+}
+
- int const srows = selectedLV->model()->rowCount();
+void GuiSelectionManager::updateUpPB()
+{
+ int const srows = selectedModel->rowCount();
+ if (srows == 0) {
+ upPB->setEnabled(false);
+ return;
+ }
QModelIndexList const selSels =
selectedLV->selectionModel()->selectedIndexes();
int const sel_nr = selSels.empty() ? -1 : selSels.first().row();
- deletePB->setEnabled(sel_nr >= 0);
upPB->setEnabled(sel_nr > 0);
+}
+
+
+void GuiSelectionManager::updateDownPB()
+{
+ int const srows = selectedModel->rowCount();
+ if (srows == 0) {
+ downPB->setEnabled(false);
+ return;
+ }
+ QModelIndexList const selSels =
+ selectedLV->selectionModel()->selectedIndexes();
+ int const sel_nr = selSels.empty() ? -1 : selSels.first().row();
downPB->setEnabled(sel_nr >= 0 && sel_nr < srows - 1);
}
bool GuiSelectionManager::isSelected(const QModelIndex & idx)
{
- QString const str = idx.data().toString();
- return selectedModel->stringList().contains(str);
+ if (selectedModel->rowCount() == 0)
+ return false;
+ QVariant const & str = availableModel->data(idx, Qt::DisplayRole);
+ QModelIndexList qmil =
+ selectedModel->match(selectedModel->index(0),
+ Qt::DisplayRole, str,
+ Qt::MatchExactly | Qt::MatchWrap);
+ return !qmil.empty();
}
{
if (!idx.isValid())
return;
-
+
selectedHasFocus_ = false;
updateHook();
}
{
if (!idx.isValid())
return;
-
+
selectedHasFocus_ = true;
updateHook();
}
-static QModelIndex getSelectedIndex(QListView * lv)
+bool GuiSelectionManager::insertRowToSelected(int i,
+ QMap<int, QVariant> const & itemData)
{
- QModelIndex retval = QModelIndex();
- QModelIndexList selIdx =
- lv->selectionModel()->selectedIndexes();
- if (!selIdx.empty())
- retval = selIdx.first();
- return retval;
+ if (i <= -1 || i > selectedModel->rowCount())
+ return false;
+ if (!selectedModel->insertRow(i))
+ return false;
+ return selectedModel->setItemData(selectedModel->index(i), itemData);
}
QModelIndex const idxToAdd = getSelectedIndex(availableLV);
if (!idxToAdd.isValid())
return;
- QModelIndex idx = selectedLV->currentIndex();
+ QModelIndex const idx = selectedLV->currentIndex();
+ int const srows = selectedModel->rowCount();
+
+ QMap<int, QVariant> qm = availableModel->itemData(idxToAdd);
+ insertRowToSelected(srows, qm);
- QStringList keys = selectedModel->stringList();
- keys.append(idxToAdd.data().toString());
- selectedModel->setStringList(keys);
selectionChanged(); //signal
if (idx.isValid())
selectedLV->setCurrentIndex(idx);
+
updateHook();
}
QModelIndex idx = getSelectedIndex(selectedLV);
if (!idx.isValid())
return;
-
- QStringList keys = selectedModel->stringList();
- keys.removeAt(idx.row());
- selectedModel->setStringList(keys);
+
+ 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)
void GuiSelectionManager::upPB_clicked()
{
QModelIndex idx = selectedLV->currentIndex();
-
+
int const pos = idx.row();
- QStringList keys = selectedModel->stringList();
- keys.swap(pos, pos - 1);
- selectedModel->setStringList(keys);
- selectionChanged(); //signal
+ if (pos <= 0)
+ return;
+ QMap<int, QVariant> qm = selectedModel->itemData(idx);
+
+ selectedModel->removeRow(pos);
+ insertRowToSelected(pos - 1, qm);
+
+ selectionChanged(); //signal
+
selectedLV->setCurrentIndex(idx.sibling(idx.row() - 1, idx.column()));
selectedHasFocus_ = true;
updateHook();
void GuiSelectionManager::downPB_clicked()
{
QModelIndex idx = selectedLV->currentIndex();
-
+
int const pos = idx.row();
- QStringList keys = selectedModel->stringList();
- keys.swap(pos, pos + 1);
- selectedModel->setStringList(keys);
+ if (pos >= selectedModel->rowCount() - 1)
+ return;
+
+ QMap<int, QVariant> qm = selectedModel->itemData(idx);
+
+ selectedModel->removeRow(pos);
+ insertRowToSelected(pos + 1, qm);
+
selectionChanged(); //signal
selectedLV->setCurrentIndex(idx.sibling(idx.row() + 1, idx.column()));
void GuiSelectionManager::availableLV_doubleClicked(const QModelIndex & idx)
{
- if (isSelected(idx))
+ if (isSelected(idx) || !addPB->isEnabled())
return;
-
+
if (idx.isValid())
selectedHasFocus_ = false;
addPB_clicked();
//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))
- )
- ) {
+ (!keyModifiers ||
+ (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 (keyModifiers == Qt::NoModifier && deletePB->isEnabled())
deletePB_clicked();
else if (keyModifiers == Qt::ControlModifier) {
- QStringList list = selectedModel->stringList();
- list.clear();
- selectedModel->setStringList(list);
+ selectedModel->removeRows(0, selectedModel->rowCount());
updateHook();
} else
//ignore it otherwise
return QObject::eventFilter(obj, event);
}
-}//namespace frontend
-}//namespace lyx
+} // namespace frontend
+} // namespace lyx
#include "GuiSelectionManager_moc.cpp"