From cd3f10d5ad4124960b66112074797a16517117e9 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 14 Jul 2015 18:43:47 -0300 Subject: [PATCH] Offer an option to just complete the text Make the kids fight no more. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- qt-models/divelocationmodel.cpp | 53 +++++++++++++++++++++++++++++---- qt-models/divelocationmodel.h | 4 +++ qt-ui/maintab.cpp | 3 +- qt-ui/modeldelegates.cpp | 22 ++++++++++++-- 4 files changed, 73 insertions(+), 9 deletions(-) diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp index 42af4f63a..bddca8f77 100644 --- a/qt-models/divelocationmodel.cpp +++ b/qt-models/divelocationmodel.cpp @@ -1,6 +1,8 @@ #include "divelocationmodel.h" #include "dive.h" #include +#include +#include bool dive_site_less_than(dive_site *a, dive_site *b) { @@ -13,7 +15,9 @@ LocationInformationModel *LocationInformationModel::instance() 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 { Q_UNUSED(parent); - return internalRowCount; + return internalRowCount + 1; } QVariant LocationInformationModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) 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) return QVariant(); switch(role) { + case Qt::EditRole: case Qt::DisplayRole : switch(index.column()) { case UUID: return ds->uuid; @@ -52,11 +82,22 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons case TAXONOMY_3: return "TODO"; } break; + case Qt::DecorationRole : { + if (dive_site_has_gps_location(ds)) + return QIcon(":geocode"); + else + return QVariant(); + } } return QVariant(); } +void LocationInformationModel::setFirstRowTextField(QLineEdit *t) +{ + textField = t; +} + void LocationInformationModel::update() { beginResetModel(); @@ -71,7 +112,7 @@ int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int latitude.udeg = lat; 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); qSort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than); 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) { - if (!index.isValid()) + if (!index.isValid() || index.row() == 0) return false; if (role != Qt::EditRole) @@ -99,7 +140,7 @@ bool LocationInformationModel::removeRows(int row, int count, const QModelIndex if(row >= rowCount()) return false; - beginRemoveRows(QModelIndex(), row, row); + beginRemoveRows(QModelIndex(), row + 1, row + 1); struct dive_site *ds = get_dive_site(row); if (ds) delete_dive_site(ds->uuid); diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h index 8cae3a08a..ee52d2ba4 100644 --- a/qt-models/divelocationmodel.h +++ b/qt-models/divelocationmodel.h @@ -5,6 +5,8 @@ #include #include +class QLineEdit; + class LocationInformationModel : public QAbstractTableModel { Q_OBJECT public: @@ -16,12 +18,14 @@ public: int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0); bool setData(const QModelIndex &index, const QVariant &value, int role); bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); + void setFirstRowTextField(QLineEdit *textField); public slots: void update(); private: LocationInformationModel(QObject *obj = 0); int internalRowCount; + QLineEdit *textField; }; class GeoReferencingOptionsModel : public QStringListModel { diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index abb6af9bd..05196254a 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -61,10 +61,11 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent), QCompleter *completer = new QCompleter(); QListView *completerListview = new QListView(); + LocationInformationModel::instance()->setFirstRowTextField(ui.location); + completer->setPopup(completerListview); completer->setModel(LocationInformationModel::instance()); completer->setCompletionColumn(LocationInformationModel::NAME); - completer->setCompletionRole(Qt::DisplayRole); completer->setCaseSensitivity(Qt::CaseInsensitive); completerListview->setItemDelegate(new LocationFilterDelegate()); diff --git a/qt-ui/modeldelegates.cpp b/qt-ui/modeldelegates.cpp index 3357d3909..953c16b87 100644 --- a/qt-ui/modeldelegates.cpp +++ b/qt-ui/modeldelegates.cpp @@ -495,14 +495,22 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem QStyledItemDelegate::initStyleOption(&opt, index); QBrush bg; QString diveSiteName = index.data().toString(); - + QString bottomText; + QIcon icon = index.data(Qt::DecorationRole).value(); struct dive_site *ds = get_dive_site_by_uuid( 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) return; - QString bottomText; for (int i = 0; i < ds->taxonomy.nr; i++) { if(ds->taxonomy.category[i].category == TC_NONE) continue; @@ -517,11 +525,13 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem free( (void*) gpsCoords); } + print_part: fontBigger.setPointSize(fontBigger.pointSize() + 1); fontBigger.setBold(true); initStyleOption(&opt, index); opt.text = QString(); + opt.icon = QIcon(); qApp->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, NULL); painter->save(); @@ -539,6 +549,14 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem painter->setBrush(option.palette.brightText()); painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText); 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