mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Create DivesiteImportDialog to select sites to import
Creates the dialog box to select which sites to import from the file selected in mainwindow.cpp. The DivesiteImportModel is created as a table to display and select which sites are to be imported. Once the sites are selected, the Command::importDiveSites command is called to add the sites to the core dive site table with undo/redo functions. Signed-off-by: Doug Junkins <junkins@foghead.com>
This commit is contained in:
parent
98b3a326bd
commit
00ec824129
7 changed files with 421 additions and 0 deletions
142
qt-models/divesiteimportmodel.cpp
Normal file
142
qt-models/divesiteimportmodel.cpp
Normal file
|
@ -0,0 +1,142 @@
|
|||
#include "divesiteimportmodel.h"
|
||||
#include "core/qthelper.h"
|
||||
#include "core/taxonomy.h"
|
||||
|
||||
DivesiteImportedModel::DivesiteImportedModel(QObject *o) : QAbstractTableModel(o),
|
||||
firstIndex(0),
|
||||
lastIndex(-1),
|
||||
importedSitesTable(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
int DivesiteImportedModel::columnCount(const QModelIndex &) const
|
||||
{
|
||||
return 5;
|
||||
}
|
||||
|
||||
int DivesiteImportedModel::rowCount(const QModelIndex &) const
|
||||
{
|
||||
return lastIndex - firstIndex + 1;
|
||||
}
|
||||
|
||||
QVariant DivesiteImportedModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (orientation == Qt::Vertical)
|
||||
return QVariant();
|
||||
|
||||
if (role == Qt::DisplayRole) {
|
||||
switch (section) {
|
||||
case NAME:
|
||||
return tr("Name");
|
||||
case LOCATION:
|
||||
return tr("Location");
|
||||
case COUNTRY:
|
||||
return tr("Country");
|
||||
case NEAREST:
|
||||
return tr("Nearest\nExisting Site");
|
||||
case DISTANCE:
|
||||
return tr("Distance");
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant DivesiteImportedModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
if (index.row() + firstIndex > lastIndex)
|
||||
return QVariant();
|
||||
|
||||
struct dive_site *ds = get_dive_site(index.row() + firstIndex, importedSitesTable);
|
||||
if (!ds)
|
||||
return QVariant();
|
||||
|
||||
// widgets access the model via index.column()
|
||||
// Not supporting QML access via roles
|
||||
if (role == Qt::DisplayRole) {
|
||||
switch (index.column()) {
|
||||
case NAME:
|
||||
return ds->name;
|
||||
case LOCATION:
|
||||
return printGPSCoords(&ds->location);
|
||||
case COUNTRY:
|
||||
return taxonomy_get_country(&ds->taxonomy);
|
||||
case NEAREST: {
|
||||
// 40075000 is circumference of the earth in meters
|
||||
struct dive_site *nearest_ds =
|
||||
get_dive_site_by_gps_proximity(&ds->location,
|
||||
40075000, &dive_site_table);
|
||||
if (nearest_ds)
|
||||
return nearest_ds->name;
|
||||
else
|
||||
return QString();
|
||||
}
|
||||
case DISTANCE: {
|
||||
unsigned int distance = 0;
|
||||
struct dive_site *nearest_ds =
|
||||
get_dive_site_by_gps_proximity(&ds->location,
|
||||
40075000, &dive_site_table);
|
||||
if (nearest_ds)
|
||||
distance = get_distance(&ds->location,
|
||||
&nearest_ds->location);
|
||||
return distance_string(distance);
|
||||
}
|
||||
case SELECTED:
|
||||
return checkStates[index.row()];
|
||||
}
|
||||
}
|
||||
if (role == Qt::CheckStateRole) {
|
||||
if (index.column() == 0)
|
||||
return checkStates[index.row()] ? Qt::Checked : Qt::Unchecked;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
void DivesiteImportedModel::changeSelected(QModelIndex clickedIndex)
|
||||
{
|
||||
checkStates[clickedIndex.row()] = !checkStates[clickedIndex.row()];
|
||||
dataChanged(index(clickedIndex.row(), 0), index(clickedIndex.row(), 0), QVector<int>() << Qt::CheckStateRole << SELECTED);
|
||||
}
|
||||
|
||||
void DivesiteImportedModel::selectAll()
|
||||
{
|
||||
std::fill(checkStates.begin(), checkStates.end(), true);
|
||||
dataChanged(index(0, 0), index(lastIndex - firstIndex, 0), QVector<int>() << Qt::CheckStateRole << SELECTED);
|
||||
}
|
||||
|
||||
void DivesiteImportedModel::selectRow(int row)
|
||||
{
|
||||
checkStates[row] = !checkStates[row];
|
||||
dataChanged(index(row, 0), index(row, 0), QVector<int>() << Qt::CheckStateRole << SELECTED);
|
||||
}
|
||||
|
||||
void DivesiteImportedModel::selectNone()
|
||||
{
|
||||
std::fill(checkStates.begin(), checkStates.end(), false);
|
||||
dataChanged(index(0, 0), index(lastIndex - firstIndex,0 ), QVector<int>() << Qt::CheckStateRole << SELECTED);
|
||||
}
|
||||
|
||||
Qt::ItemFlags DivesiteImportedModel::flags(const QModelIndex &index) const
|
||||
{
|
||||
if (index.column() != 0)
|
||||
return QAbstractTableModel::flags(index);
|
||||
return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable;
|
||||
}
|
||||
|
||||
void DivesiteImportedModel::repopulate(struct dive_site_table *sites)
|
||||
{
|
||||
beginResetModel();
|
||||
|
||||
importedSitesTable = sites;
|
||||
firstIndex = 0;
|
||||
lastIndex = importedSitesTable->nr - 1;
|
||||
checkStates.resize(importedSitesTable->nr);
|
||||
for (int row = 0; row < importedSitesTable->nr; row++)
|
||||
if (get_dive_site_by_gps(&importedSitesTable->dive_sites[row]->location, &dive_site_table))
|
||||
checkStates[row] = false;
|
||||
else
|
||||
checkStates[row] = true;
|
||||
endResetModel();
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue