GUI: Implement Copy from term explorer result table. Closes issue #75
This commit is contained in:
parent
c53ca49f07
commit
3fa907a2eb
@ -97,7 +97,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTableWidget" name="suggsLV">
|
<widget class="QTableWidget" name="resTW">
|
||||||
<property name="rowCount">
|
<property name="rowCount">
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
#include "autoconfig.h"
|
#include "autoconfig.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
@ -30,6 +32,8 @@
|
|||||||
#include <qcombobox.h>
|
#include <qcombobox.h>
|
||||||
#include <QTableWidget>
|
#include <QTableWidget>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
|
#include <QClipboard>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
|
||||||
#include "debuglog.h"
|
#include "debuglog.h"
|
||||||
#include "recoll.h"
|
#include "recoll.h"
|
||||||
@ -88,23 +92,24 @@ void SpellW::init()
|
|||||||
|
|
||||||
QStringList labels(tr("Term"));
|
QStringList labels(tr("Term"));
|
||||||
labels.push_back(tr("Doc. / Tot."));
|
labels.push_back(tr("Doc. / Tot."));
|
||||||
suggsLV->setHorizontalHeaderLabels(labels);
|
resTW->setHorizontalHeaderLabels(labels);
|
||||||
suggsLV->setShowGrid(0);
|
resTW->setShowGrid(0);
|
||||||
suggsLV->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
|
resTW->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
|
||||||
suggsLV->verticalHeader()->setDefaultSectionSize(20);
|
resTW->verticalHeader()->setDefaultSectionSize(20);
|
||||||
connect(suggsLV,
|
connect(resTW,
|
||||||
SIGNAL(cellDoubleClicked(int, int)),
|
SIGNAL(cellDoubleClicked(int, int)),
|
||||||
this, SLOT(textDoubleClicked(int, int)));
|
this, SLOT(textDoubleClicked(int, int)));
|
||||||
|
|
||||||
suggsLV->setColumnWidth(0, 200);
|
resTW->setColumnWidth(0, 200);
|
||||||
suggsLV->setColumnWidth(1, 150);
|
resTW->setColumnWidth(1, 150);
|
||||||
|
resTW->installEventFilter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Expand term according to current mode */
|
/* Expand term according to current mode */
|
||||||
void SpellW::doExpand()
|
void SpellW::doExpand()
|
||||||
{
|
{
|
||||||
// Can't clear qt4 table widget: resets column headers too
|
// Can't clear qt4 table widget: resets column headers too
|
||||||
suggsLV->setRowCount(0);
|
resTW->setRowCount(0);
|
||||||
if (baseWordLE->text().isEmpty())
|
if (baseWordLE->text().isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -176,7 +181,7 @@ void SpellW::doExpand()
|
|||||||
|
|
||||||
|
|
||||||
if (res.entries.empty()) {
|
if (res.entries.empty()) {
|
||||||
suggsLV->setItem(0, 0, new QTableWidgetItem(tr("No expansion found")));
|
resTW->setItem(0, 0, new QTableWidgetItem(tr("No expansion found")));
|
||||||
} else {
|
} else {
|
||||||
int row = 0;
|
int row = 0;
|
||||||
for (list<Rcl::TermMatchEntry>::iterator it = res.entries.begin();
|
for (list<Rcl::TermMatchEntry>::iterator it = res.entries.begin();
|
||||||
@ -187,14 +192,14 @@ void SpellW::doExpand()
|
|||||||
sprintf(num, "%d / %d", it->docs, it->wcf);
|
sprintf(num, "%d / %d", it->docs, it->wcf);
|
||||||
else
|
else
|
||||||
num[0] = 0;
|
num[0] = 0;
|
||||||
if (suggsLV->rowCount() <= row)
|
if (resTW->rowCount() <= row)
|
||||||
suggsLV->setRowCount(row+1);
|
resTW->setRowCount(row+1);
|
||||||
suggsLV->setItem(row, 0,
|
resTW->setItem(row, 0,
|
||||||
new QTableWidgetItem(QString::fromUtf8(it->term.c_str())));
|
new QTableWidgetItem(QString::fromUtf8(it->term.c_str())));
|
||||||
suggsLV->setItem(row++, 1,
|
resTW->setItem(row++, 1,
|
||||||
new QTableWidgetItem(QString::fromAscii(num)));
|
new QTableWidgetItem(QString::fromAscii(num)));
|
||||||
}
|
}
|
||||||
suggsLV->setRowCount(row+1);
|
resTW->setRowCount(row+1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +207,7 @@ void SpellW::wordChanged(const QString &text)
|
|||||||
{
|
{
|
||||||
if (text.isEmpty()) {
|
if (text.isEmpty()) {
|
||||||
expandPB->setEnabled(false);
|
expandPB->setEnabled(false);
|
||||||
suggsLV->setRowCount(0);
|
resTW->setRowCount(0);
|
||||||
} else {
|
} else {
|
||||||
expandPB->setEnabled(true);
|
expandPB->setEnabled(true);
|
||||||
}
|
}
|
||||||
@ -211,7 +216,7 @@ void SpellW::wordChanged(const QString &text)
|
|||||||
void SpellW::textDoubleClicked() {}
|
void SpellW::textDoubleClicked() {}
|
||||||
void SpellW::textDoubleClicked(int row, int)
|
void SpellW::textDoubleClicked(int row, int)
|
||||||
{
|
{
|
||||||
QTableWidgetItem *item = suggsLV->item(row, 0);
|
QTableWidgetItem *item = resTW->item(row, 0);
|
||||||
if (item)
|
if (item)
|
||||||
emit(wordSelect(item->text()));
|
emit(wordSelect(item->text()));
|
||||||
}
|
}
|
||||||
@ -223,3 +228,63 @@ void SpellW::modeSet(int mode)
|
|||||||
else
|
else
|
||||||
stemLangCMB->setEnabled(false);
|
stemLangCMB->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SpellW::copy()
|
||||||
|
{
|
||||||
|
QItemSelectionModel * selection = resTW->selectionModel();
|
||||||
|
QModelIndexList indexes = selection->selectedIndexes();
|
||||||
|
|
||||||
|
if(indexes.size() < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// QModelIndex::operator < sorts first by row, then by column.
|
||||||
|
// this is what we need
|
||||||
|
std::sort(indexes.begin(), indexes.end());
|
||||||
|
|
||||||
|
// You need a pair of indexes to find the row changes
|
||||||
|
QModelIndex previous = indexes.first();
|
||||||
|
indexes.removeFirst();
|
||||||
|
QString selected_text;
|
||||||
|
QModelIndex current;
|
||||||
|
Q_FOREACH(current, indexes)
|
||||||
|
{
|
||||||
|
QVariant data = resTW->model()->data(previous);
|
||||||
|
QString text = data.toString();
|
||||||
|
// At this point `text` contains the text in one cell
|
||||||
|
selected_text.append(text);
|
||||||
|
// If you are at the start of the row the row number of the previous index
|
||||||
|
// isn't the same. Text is followed by a row separator, which is a newline.
|
||||||
|
if (current.row() != previous.row())
|
||||||
|
{
|
||||||
|
selected_text.append(QLatin1Char('\n'));
|
||||||
|
}
|
||||||
|
// Otherwise it's the same row, so append a column separator, which is a tab.
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selected_text.append(QLatin1Char('\t'));
|
||||||
|
}
|
||||||
|
previous = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add last element
|
||||||
|
selected_text.append(resTW->model()->data(current).toString());
|
||||||
|
selected_text.append(QLatin1Char('\n'));
|
||||||
|
qApp->clipboard()->setText(selected_text, QClipboard::Selection);
|
||||||
|
qApp->clipboard()->setText(selected_text, QClipboard::Clipboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool SpellW::eventFilter(QObject *target, QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() != QEvent::KeyPress ||
|
||||||
|
(target != resTW && target != resTW->viewport()))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QKeyEvent *keyEvent = (QKeyEvent *)event;
|
||||||
|
if(keyEvent->matches(QKeySequence::Copy) )
|
||||||
|
{
|
||||||
|
copy();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@ -35,6 +35,7 @@ public:
|
|||||||
|
|
||||||
~SpellW(){}
|
~SpellW(){}
|
||||||
|
|
||||||
|
virtual bool eventFilter(QObject *target, QEvent *event );
|
||||||
public slots:
|
public slots:
|
||||||
virtual void doExpand();
|
virtual void doExpand();
|
||||||
virtual void wordChanged(const QString&);
|
virtual void wordChanged(const QString&);
|
||||||
@ -47,6 +48,7 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void init();
|
void init();
|
||||||
|
void copy();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _ASPELL_W_H_INCLUDED_ */
|
#endif /* _ASPELL_W_H_INCLUDED_ */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user