1
0
Fork 0
mirror of https://github.com/subsurface/subsurface.git synced 2025-02-19 22:16:15 +00:00

Skeleton of the new LocationCombobox

This is the bare minimum skeleton of the new completer for the dive site
management. Nothing works, yet, nothing is hoocked up, yet.

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-09-21 14:01:58 -03:00 committed by Dirk Hohndel
parent 000a93fb64
commit be6e190bd2
4 changed files with 180 additions and 1 deletions

View file

@ -317,3 +317,136 @@ void LocationInformationWidget::reverseGeocode()
geoLookup->lookup(&displayed_dive_site);
updateLabels();
}
DiveLocationFilterProxyModel::DiveLocationFilterProxyModel(QObject *parent)
{
}
DiveLocationLineEdit *location_line_edit = 0;
bool DiveLocationFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
{
if(source_row == 0 || source_row == 1)
return true;
QString sourceString = sourceModel()->index(source_row, DiveLocationModel::NAME).data(Qt::DisplayRole).toString();
return sourceString.toLower().startsWith(location_line_edit->text().toLower());
}
DiveLocationModel::DiveLocationModel(QObject *o)
{
resetModel();
}
void DiveLocationModel::resetModel()
{
beginResetModel();
qDebug() << "Dive site table size" <<dive_site_table.nr;
endResetModel();
}
QVariant DiveLocationModel::data(const QModelIndex& index, int role) const
{
if(index.row() <= 1) { // two special cases.
switch(role) {
case Qt::DisplayRole : return new_ds_value[index.row()];
case Qt::ToolTipRole : return "Create a new dive site";
}
}
// The dive sites are -2 because of the first two items.
struct dive_site *ds = get_dive_site(index.row() - 2);
switch(role) {
case Qt::EditRole:
case Qt::DisplayRole :
switch(index.column()) {
case UUID: return ds->uuid;
case NAME: return ds->name;
case LATITUDE: return ds->latitude.udeg;
case LONGITUDE: return ds->longitude.udeg;
case DESCRIPTION: return ds->description;
case NOTES: return ds->name;
}
break;
case Qt::DecorationRole : {
if (dive_site_has_gps_location(ds))
return QIcon(":geocode");
}
}
return QVariant();
}
int DiveLocationModel::columnCount(const QModelIndex& parent) const
{
return COLUMNS;
}
int DiveLocationModel::rowCount(const QModelIndex& parent) const
{
return dive_site_table.nr + 2;
}
bool DiveLocationModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if(!index.isValid())
return false;
if (index.row() > 1)
return false;
new_ds_value[index.row()] = value.toString();
dataChanged(index, index);
return true;
}
DiveLocationLineEdit::DiveLocationLineEdit(QWidget *parent)
{
proxy = new DiveLocationFilterProxyModel();
model = new DiveLocationModel();
view = new DiveLocationListView();
proxy->setSourceModel(model);
view->setModel(model);
connect(this, &QLineEdit::textEdited, this, &DiveLocationLineEdit::setTemporaryDiveSiteName);
//HACK:
/* This is being show currently just to test. */
qDebug() << "AAAAAAH";
qDebug() << model->rowCount() << model->columnCount();
view->show();
}
void DiveLocationLineEdit::refreshDiveSiteCache()
{
model->resetModel();
}
static struct dive_site *get_dive_site_name_start_which_str(const QString& str) {
struct dive_site *ds;
int i;
for_each_dive_site(i,ds) {
QString dsName(ds->name);
if (dsName.startsWith(str)) {
return ds;
}
}
return NULL;
}
void DiveLocationLineEdit::setTemporaryDiveSiteName(const QString& s)
{
QModelIndex i0 = model->index(0, DiveLocationModel::NAME);
model->setData(i0, text());
struct dive_site *ds = get_dive_site_name_start_which_str(text());
QModelIndex i1 = model->index(1, DiveLocationModel::NAME);
model->setData(i1, ds ? ds->name : INVALID_DIVE_SITE_NAME);
}
DiveLocationListView::DiveLocationListView(QWidget *parent)
{
}

View file

@ -4,6 +4,7 @@
#include "ui_locationInformation.h"
#include <stdint.h>
#include <QAbstractListModel>
#include <QSortFilterProxyModel>
class LocationInformationWidget : public QGroupBox {
Q_OBJECT
@ -58,4 +59,43 @@ private:
uint32_t last_uuid;
};
class DiveLocationFilterProxyModel : public QSortFilterProxyModel {
Q_OBJECT
public:
DiveLocationFilterProxyModel(QObject *parent = 0);
virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
};
class DiveLocationModel : public QAbstractTableModel {
Q_OBJECT
public:
enum columns{UUID, NAME, LATITUDE, LONGITUDE, DESCRIPTION, NOTES, COLUMNS};
DiveLocationModel(QObject *o = 0);
void resetModel();
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
int rowCount(const QModelIndex& parent = QModelIndex()) const;
int columnCount(const QModelIndex& parent = QModelIndex()) const;
bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
private:
QString new_ds_value[2];
};
class DiveLocationListView : public QListView {
Q_OBJECT
public:
DiveLocationListView(QWidget *parent = 0);
};
class DiveLocationLineEdit : public QLineEdit {
Q_OBJECT
public:
DiveLocationLineEdit(QWidget *parent =0 );
void refreshDiveSiteCache();
void setTemporaryDiveSiteName(const QString& s);
private:
DiveLocationFilterProxyModel *proxy;
DiveLocationModel *model;
DiveLocationListView *view;
};
#endif

View file

@ -480,6 +480,7 @@ void MainTab::updateDiveInfo(bool clear)
#endif
}
ui.location->refreshDiveSiteCache();
EditMode rememberEM = editMode;
// don't execute this while adding / planning a dive
if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE || MainWindow::instance()->graphics()->isPlanner())

View file

@ -188,7 +188,7 @@
<number>2</number>
</property>
<item>
<widget class="QLineEdit" name="location"/>
<widget class="DiveLocationLineEdit" name="location"/>
</item>
<item>
<widget class="QToolButton" name="editDiveSiteButton">
@ -1131,6 +1131,11 @@
<header>qtwaitingspinner.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>DiveLocationLineEdit</class>
<extends>QLineEdit</extends>
<header>locationinformation.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>dateEdit</tabstop>