gui results table: allow resetting to relevance order from header right-click menu + small gui sort-consistency fixes

This commit is contained in:
Jean-Francois Dockes 2011-01-17 10:08:34 +01:00
parent c4f79e49da
commit 9b738ebb61
3 changed files with 65 additions and 13 deletions

View File

@ -902,6 +902,7 @@ void RclMain::onResTableSortBy(DocSeqSortSpec spec)
actionSortByDateAsc->setChecked(!spec.desc); actionSortByDateAsc->setChecked(!spec.desc);
} }
m_sortspecnochange = false; m_sortspecnochange = false;
m_source->setSortSpec(spec);
m_sortspec = spec; m_sortspec = spec;
emit applyFiltSortData(); emit applyFiltSortData();
} }

View File

@ -146,8 +146,16 @@ FieldGetter *RecollModel::chooseGetter(const string& field)
return gengetter; return gengetter;
} }
string RecollModel::baseField(const string& field)
{
if (!stringlowercmp("date", field) || !stringlowercmp("datetime", field))
return "mtime";
else
return field;
}
RecollModel::RecollModel(const QStringList fields, QObject *parent) RecollModel::RecollModel(const QStringList fields, QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent), m_ignoreSort(false)
{ {
// Add dynamic "stored" fields to the full column list. This // Add dynamic "stored" fields to the full column list. This
// could be protected to be done only once, but it's no real // could be protected to be done only once, but it's no real
@ -187,6 +195,7 @@ int RecollModel::columnCount(const QModelIndex&) const
void RecollModel::readDocSource() void RecollModel::readDocSource()
{ {
LOGDEB(("RecollModel::readDocSource()\n"));
beginResetModel(); beginResetModel();
endResetModel(); endResetModel();
} }
@ -271,22 +280,22 @@ QVariant RecollModel::data(const QModelIndex& index, int role) const
return QString::fromUtf8(m_getters[index.column()](colname, doc).c_str()); return QString::fromUtf8(m_getters[index.column()](colname, doc).c_str());
} }
// This is called when the column headers are clicked // This gets called when the column headers are clicked
void RecollModel::sort(int column, Qt::SortOrder order) void RecollModel::sort(int column, Qt::SortOrder order)
{ {
if (m_ignoreSort)
return;
LOGDEB(("RecollModel::sort(%d, %d)\n", column, int(order))); LOGDEB(("RecollModel::sort(%d, %d)\n", column, int(order)));
if (m_source.isNotNull() && column >= 0 && column < int(m_fields.size())) { DocSeqSortSpec spec;
DocSeqSortSpec spec; if (column >= 0 && column < int(m_fields.size())) {
spec.field = m_fields[column]; spec.field = m_fields[column];
if (!stringlowercmp("date", spec.field) || if (!stringlowercmp("date", spec.field) ||
!stringlowercmp("datetime", spec.field)) !stringlowercmp("datetime", spec.field))
spec.field = "mtime"; spec.field = "mtime";
spec.desc = order == Qt::AscendingOrder ? false : true; spec.desc = order == Qt::AscendingOrder ? false : true;
m_source->setSortSpec(spec);
readDocSource();
emit sortColumnChanged(spec);
} }
emit sortColumnChanged(spec);
} }
/////////////////////////// ///////////////////////////
@ -434,12 +443,40 @@ void ResTable::resetSource()
} }
// This is called when the sort order is changed from another widget // This is called when the sort order is changed from another widget
void ResTable::onSortDataChanged(DocSeqSortSpec) void ResTable::onSortDataChanged(DocSeqSortSpec spec)
{ {
LOGDEB(("ResTable::onSortDataChanged: [%s] desc %d\n",
spec.field.c_str(), int(spec.desc)));
QHeaderView *header = tableView->horizontalHeader(); QHeaderView *header = tableView->horizontalHeader();
if (!header) if (!header || !m_model)
return; return;
header->setSortIndicator(-1, Qt::AscendingOrder);
// Check if the specified field actually matches one of columns
// and set indicator
m_model->setIgnoreSort(true);
bool matched = false;
const vector<string> fields = m_model->getFields();
for (unsigned int i = 0; i < fields.size(); i++) {
if (!spec.field.compare(m_model->baseField(fields[i]))) {
header->setSortIndicator(i, spec.desc ?
Qt::DescendingOrder : Qt::AscendingOrder);
matched = true;
}
}
if (!matched)
header->setSortIndicator(-1, Qt::AscendingOrder);
m_model->setIgnoreSort(false);
}
void ResTable::resetSort()
{
LOGDEB(("ResTable::resetSort()\n"));
QHeaderView *header = tableView->horizontalHeader();
if (header)
header->setSortIndicator(-1, Qt::AscendingOrder);
// the model's sort slot is not called by qt in this case (qt 4.7)
if (m_model)
m_model->sort(-1, Qt::AscendingOrder);
} }
void ResTable::readDocSource(bool resetPos) void ResTable::readDocSource(bool resetPos)
@ -497,13 +534,20 @@ void ResTable::createHeaderPopupMenu(const QPoint& pos)
const map<string, string>& allfields = m_model->getAllFields(); const map<string, string>& allfields = m_model->getAllFields();
const vector<string>& fields = m_model->getFields(); const vector<string>& fields = m_model->getFields();
QMenu *popup = new QMenu(this); QMenu *popup = new QMenu(this);
popup->addAction(tr("&Reset sort"), this, SLOT(resetSort()));
popup->addSeparator();
popup->addAction(tr("&Delete column"), this, SLOT(deleteColumn())); popup->addAction(tr("&Delete column"), this, SLOT(deleteColumn()));
popup->addSeparator();
QAction *act; QAction *act;
for (map<string, string>::const_iterator it = allfields.begin(); for (map<string, string>::const_iterator it = allfields.begin();
it != allfields.end(); it++) { it != allfields.end(); it++) {
if (std::find(fields.begin(), fields.end(), it->first) != fields.end()) if (std::find(fields.begin(), fields.end(), it->first) != fields.end())
continue; continue;
act = new QAction(tr("Add ") + tr(it->second.c_str()), popup); act = new QAction(tr("Add \"")+tr(it->second.c_str())+tr("\" column"),
popup);
act->setData(QString::fromUtf8(it->first.c_str())); act->setData(QString::fromUtf8(it->first.c_str()));
connect(act, SIGNAL(triggered(bool)), this , SLOT(addColumn())); connect(act, SIGNAL(triggered(bool)), this , SLOT(addColumn()));
popup->addAction(act); popup->addAction(act);

View File

@ -55,6 +55,12 @@ public:
return o_displayableFields; return o_displayableFields;
} }
virtual void addColumn(int, const string&); virtual void addColumn(int, const string&);
// Some column name are aliases/translator for base document field
// (ie: date, datetime->mtime). Help deal with this:
virtual string baseField(const string&);
// Ignore sort() call because
virtual void setIgnoreSort(bool onoff) {m_ignoreSort = onoff;}
signals: signals:
void sortColumnChanged(DocSeqSortSpec); void sortColumnChanged(DocSeqSortSpec);
@ -64,6 +70,7 @@ private:
vector<string> m_fields; vector<string> m_fields;
vector<FieldGetter*> m_getters; vector<FieldGetter*> m_getters;
static map<string, string> o_displayableFields; static map<string, string> o_displayableFields;
bool m_ignoreSort;
FieldGetter* chooseGetter(const string&); FieldGetter* chooseGetter(const string&);
}; };
@ -99,7 +106,7 @@ public slots:
virtual void createHeaderPopupMenu(const QPoint&); virtual void createHeaderPopupMenu(const QPoint&);
virtual void deleteColumn(); virtual void deleteColumn();
virtual void addColumn(); virtual void addColumn();
virtual void resetSort(); // Revert to natural (relevance) order
signals: signals:
void docPreviewClicked(int, Rcl::Doc, int); void docPreviewClicked(int, Rcl::Doc, int);
void docEditClicked(Rcl::Doc); void docEditClicked(Rcl::Doc);