Offer an option to just complete the text

Make the kids fight no more.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2015-07-14 18:43:47 -03:00 committed by Dirk Hohndel
parent 4dfb39cc49
commit cd3f10d5ad
4 changed files with 73 additions and 9 deletions

View file

@ -1,6 +1,8 @@
#include "divelocationmodel.h" #include "divelocationmodel.h"
#include "dive.h" #include "dive.h"
#include <QDebug> #include <QDebug>
#include <QLineEdit>
#include <QIcon>
bool dive_site_less_than(dive_site *a, dive_site *b) bool dive_site_less_than(dive_site *a, dive_site *b)
{ {
@ -13,7 +15,9 @@ LocationInformationModel *LocationInformationModel::instance()
return self; return self;
} }
LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractTableModel(obj), internalRowCount(0) LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractTableModel(obj),
internalRowCount(0),
textField(NULL)
{ {
} }
@ -25,19 +29,45 @@ int LocationInformationModel::columnCount(const QModelIndex &parent) const
int LocationInformationModel::rowCount(const QModelIndex &parent) const int LocationInformationModel::rowCount(const QModelIndex &parent) const
{ {
Q_UNUSED(parent); Q_UNUSED(parent);
return internalRowCount; return internalRowCount + 1;
} }
QVariant LocationInformationModel::data(const QModelIndex &index, int role) const QVariant LocationInformationModel::data(const QModelIndex &index, int role) const
{ {
if (!index.isValid()) if (!index.isValid())
return QVariant(); return QVariant();
struct dive_site *ds = get_dive_site(index.row());
// Special case to handle the 'create dive site' with name.
if (index.row() == 0) {
if (index.column() == UUID)
return 0;
switch(role) {
case Qt::DisplayRole : {
struct dive_site *ds;
int i;
for_each_dive_site(i, ds) {
QString dsName(ds->name);
if (dsName.startsWith(textField->text()))
return dsName;
}
return textField->text();
}
case Qt::ToolTipRole : {
return QString(tr("Create dive site"));
}
case Qt::EditRole : return textField->text();
case Qt::DecorationRole : return QIcon(":plus");
}
}
// The dive sites are -1 because of the first item.
struct dive_site *ds = get_dive_site(index.row()-1);
if (!ds) if (!ds)
return QVariant(); return QVariant();
switch(role) { switch(role) {
case Qt::EditRole:
case Qt::DisplayRole : case Qt::DisplayRole :
switch(index.column()) { switch(index.column()) {
case UUID: return ds->uuid; case UUID: return ds->uuid;
@ -52,11 +82,22 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons
case TAXONOMY_3: return "TODO"; case TAXONOMY_3: return "TODO";
} }
break; break;
case Qt::DecorationRole : {
if (dive_site_has_gps_location(ds))
return QIcon(":geocode");
else
return QVariant();
}
} }
return QVariant(); return QVariant();
} }
void LocationInformationModel::setFirstRowTextField(QLineEdit *t)
{
textField = t;
}
void LocationInformationModel::update() void LocationInformationModel::update()
{ {
beginResetModel(); beginResetModel();
@ -71,7 +112,7 @@ int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int
latitude.udeg = lat; latitude.udeg = lat;
longitude.udeg = lon; longitude.udeg = lon;
beginInsertRows(QModelIndex(), dive_site_table.nr, dive_site_table.nr); beginInsertRows(QModelIndex(), dive_site_table.nr + 1, dive_site_table.nr + 1);
uint32_t uuid = create_dive_site_with_gps(name.toUtf8().data(), latitude, longitude); uint32_t uuid = create_dive_site_with_gps(name.toUtf8().data(), latitude, longitude);
qSort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than); qSort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than);
internalRowCount = dive_site_table.nr; internalRowCount = dive_site_table.nr;
@ -81,7 +122,7 @@ int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int
bool LocationInformationModel::setData(const QModelIndex &index, const QVariant &value, int role) bool LocationInformationModel::setData(const QModelIndex &index, const QVariant &value, int role)
{ {
if (!index.isValid()) if (!index.isValid() || index.row() == 0)
return false; return false;
if (role != Qt::EditRole) if (role != Qt::EditRole)
@ -99,7 +140,7 @@ bool LocationInformationModel::removeRows(int row, int count, const QModelIndex
if(row >= rowCount()) if(row >= rowCount())
return false; return false;
beginRemoveRows(QModelIndex(), row, row); beginRemoveRows(QModelIndex(), row + 1, row + 1);
struct dive_site *ds = get_dive_site(row); struct dive_site *ds = get_dive_site(row);
if (ds) if (ds)
delete_dive_site(ds->uuid); delete_dive_site(ds->uuid);

View file

@ -5,6 +5,8 @@
#include <QStringListModel> #include <QStringListModel>
#include <stdint.h> #include <stdint.h>
class QLineEdit;
class LocationInformationModel : public QAbstractTableModel { class LocationInformationModel : public QAbstractTableModel {
Q_OBJECT Q_OBJECT
public: public:
@ -16,12 +18,14 @@ public:
int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0); int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0);
bool setData(const QModelIndex &index, const QVariant &value, int role); bool setData(const QModelIndex &index, const QVariant &value, int role);
bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
void setFirstRowTextField(QLineEdit *textField);
public slots: public slots:
void update(); void update();
private: private:
LocationInformationModel(QObject *obj = 0); LocationInformationModel(QObject *obj = 0);
int internalRowCount; int internalRowCount;
QLineEdit *textField;
}; };
class GeoReferencingOptionsModel : public QStringListModel { class GeoReferencingOptionsModel : public QStringListModel {

View file

@ -61,10 +61,11 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
QCompleter *completer = new QCompleter(); QCompleter *completer = new QCompleter();
QListView *completerListview = new QListView(); QListView *completerListview = new QListView();
LocationInformationModel::instance()->setFirstRowTextField(ui.location);
completer->setPopup(completerListview); completer->setPopup(completerListview);
completer->setModel(LocationInformationModel::instance()); completer->setModel(LocationInformationModel::instance());
completer->setCompletionColumn(LocationInformationModel::NAME); completer->setCompletionColumn(LocationInformationModel::NAME);
completer->setCompletionRole(Qt::DisplayRole);
completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setCaseSensitivity(Qt::CaseInsensitive);
completerListview->setItemDelegate(new LocationFilterDelegate()); completerListview->setItemDelegate(new LocationFilterDelegate());

View file

@ -495,14 +495,22 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
QStyledItemDelegate::initStyleOption(&opt, index); QStyledItemDelegate::initStyleOption(&opt, index);
QBrush bg; QBrush bg;
QString diveSiteName = index.data().toString(); QString diveSiteName = index.data().toString();
QString bottomText;
QIcon icon = index.data(Qt::DecorationRole).value<QIcon>();
struct dive_site *ds = get_dive_site_by_uuid( struct dive_site *ds = get_dive_site_by_uuid(
index.model()->data(index.model()->index(index.row(),0)).toInt() index.model()->data(index.model()->index(index.row(),0)).toInt()
); );
//Special case: do not show name, but instead, show
if (index.row() == 0) {
diveSiteName = index.data().toString();
bottomText = index.data(Qt::ToolTipRole).toString();
goto print_part;
}
if (!ds) if (!ds)
return; return;
QString bottomText;
for (int i = 0; i < ds->taxonomy.nr; i++) { for (int i = 0; i < ds->taxonomy.nr; i++) {
if(ds->taxonomy.category[i].category == TC_NONE) if(ds->taxonomy.category[i].category == TC_NONE)
continue; continue;
@ -517,11 +525,13 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
free( (void*) gpsCoords); free( (void*) gpsCoords);
} }
print_part:
fontBigger.setPointSize(fontBigger.pointSize() + 1); fontBigger.setPointSize(fontBigger.pointSize() + 1);
fontBigger.setBold(true); fontBigger.setBold(true);
initStyleOption(&opt, index); initStyleOption(&opt, index);
opt.text = QString(); opt.text = QString();
opt.icon = QIcon();
qApp->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, NULL); qApp->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, NULL);
painter->save(); painter->save();
@ -539,6 +549,14 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
painter->setBrush(option.palette.brightText()); painter->setBrush(option.palette.brightText());
painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText); painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText);
painter->restore(); painter->restore();
if (!icon.isNull()) {
painter->save();
painter->drawPixmap(
option.rect.x() + option.rect.width() - 24,
option.rect.y() + option.rect.height() - 24, icon.pixmap(20,20));
painter->restore();
}
} }
QSize LocationFilterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const QSize LocationFilterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const