mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Changed a lot of code to reduce boilerplate on models in the future.
So, I changed a lot of code to reduce boilerplate on models in the future. Currently we do not have a lot of models, but this can increase quite rapdly. There's a second TreeModel in the works, the Yearly Statistics, this patch will save around 250 LOC for this new model, and more and more models will give us a greater saving. Iwll do that for the table models in the future too - I did the tree models now because they are the most complex case and I didn't wanted to create a second tree model without this. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
This commit is contained in:
parent
14ccbbf6e8
commit
ae68ae38bb
5 changed files with 165 additions and 154 deletions
|
@ -23,9 +23,9 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec
|
||||||
currentHeaderClicked(-1), searchBox(new QLineEdit(this))
|
currentHeaderClicked(-1), searchBox(new QLineEdit(this))
|
||||||
{
|
{
|
||||||
setUniformRowHeights(true);
|
setUniformRowHeights(true);
|
||||||
setItemDelegateForColumn(TreeItemDT::RATING, new StarWidgetsDelegate());
|
setItemDelegateForColumn(DiveTripModel::RATING, new StarWidgetsDelegate());
|
||||||
QSortFilterProxyModel *model = new QSortFilterProxyModel(this);
|
QSortFilterProxyModel *model = new QSortFilterProxyModel(this);
|
||||||
model->setSortRole(TreeItemDT::SORT_ROLE);
|
model->setSortRole(DiveTripModel::SORT_ROLE);
|
||||||
model->setFilterKeyColumn(-1); // filter all columns
|
model->setFilterKeyColumn(-1); // filter all columns
|
||||||
setModel(model);
|
setModel(model);
|
||||||
connect(model, SIGNAL(layoutChanged()), this, SLOT(fixMessyQtModelBehaviour()));
|
connect(model, SIGNAL(layoutChanged()), this, SLOT(fixMessyQtModelBehaviour()));
|
||||||
|
@ -63,7 +63,7 @@ void DiveListView::unselectDives()
|
||||||
void DiveListView::selectDive(struct dive *dive, bool scrollto, bool toggle)
|
void DiveListView::selectDive(struct dive *dive, bool scrollto, bool toggle)
|
||||||
{
|
{
|
||||||
QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model());
|
QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel*>(model());
|
||||||
QModelIndexList match = m->match(m->index(0,0), TreeItemDT::NR, dive->number, 1, Qt::MatchRecursive);
|
QModelIndexList match = m->match(m->index(0,0), DiveTripModel::NR, dive->number, 1, Qt::MatchRecursive);
|
||||||
QItemSelectionModel::SelectionFlags flags;
|
QItemSelectionModel::SelectionFlags flags;
|
||||||
QModelIndex idx = match.first();
|
QModelIndex idx = match.first();
|
||||||
|
|
||||||
|
@ -111,13 +111,13 @@ void DiveListView::headerClicked(int i)
|
||||||
DiveTripModel::Layout newLayout;
|
DiveTripModel::Layout newLayout;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
|
||||||
newLayout = i == (int) TreeItemDT::NR ? DiveTripModel::TREE : DiveTripModel::LIST;
|
newLayout = i == (int) DiveTripModel::NR ? DiveTripModel::TREE : DiveTripModel::LIST;
|
||||||
|
|
||||||
Q_FOREACH(const QModelIndex& index , oldSelection.indexes()) {
|
Q_FOREACH(const QModelIndex& index , oldSelection.indexes()) {
|
||||||
if (index.column() != 0) // We only care about the dives, so, let's stick to rows and discard columns.
|
if (index.column() != 0) // We only care about the dives, so, let's stick to rows and discard columns.
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
struct dive *d = (struct dive *) index.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) index.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (d)
|
if (d)
|
||||||
currentSelectedDives.push_back(d);
|
currentSelectedDives.push_back(d);
|
||||||
}
|
}
|
||||||
|
@ -228,9 +228,9 @@ void DiveListView::currentChanged(const QModelIndex& current, const QModelIndex&
|
||||||
return;
|
return;
|
||||||
const QAbstractItemModel *model = current.model();
|
const QAbstractItemModel *model = current.model();
|
||||||
int selectedDive = 0;
|
int selectedDive = 0;
|
||||||
struct dive *dive = (struct dive*) model->data(current, TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *dive = (struct dive*) model->data(current, DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (!dive) // it's a trip! select first child.
|
if (!dive) // it's a trip! select first child.
|
||||||
dive = (struct dive*) model->data(current.child(0,0), TreeItemDT::DIVE_ROLE).value<void*>();
|
dive = (struct dive*) model->data(current.child(0,0), DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
selectedDive = get_divenr(dive);
|
selectedDive = get_divenr(dive);
|
||||||
scrollTo(current);
|
scrollTo(current);
|
||||||
if (selectedDive == selected_dive)
|
if (selectedDive == selected_dive)
|
||||||
|
@ -250,10 +250,10 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
|
||||||
if (index.column() != 0)
|
if (index.column() != 0)
|
||||||
continue;
|
continue;
|
||||||
const QAbstractItemModel *model = index.model();
|
const QAbstractItemModel *model = index.model();
|
||||||
struct dive *dive = (struct dive*) model->data(index, TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *dive = (struct dive*) model->data(index, DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (!dive) { // it's a trip!
|
if (!dive) { // it's a trip!
|
||||||
if (model->rowCount(index)) {
|
if (model->rowCount(index)) {
|
||||||
struct dive *child = (struct dive*) model->data(index.child(0,0), TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *child = (struct dive*) model->data(index.child(0,0), DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (child && child->divetrip)
|
if (child && child->divetrip)
|
||||||
selectedTrips.remove(child->divetrip);
|
selectedTrips.remove(child->divetrip);
|
||||||
while (child) {
|
while (child) {
|
||||||
|
@ -270,11 +270,11 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const QAbstractItemModel *model = index.model();
|
const QAbstractItemModel *model = index.model();
|
||||||
struct dive *dive = (struct dive*) model->data(index, TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *dive = (struct dive*) model->data(index, DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (!dive) { // it's a trip!
|
if (!dive) { // it's a trip!
|
||||||
if (model->rowCount(index)) {
|
if (model->rowCount(index)) {
|
||||||
QItemSelection selection;
|
QItemSelection selection;
|
||||||
struct dive *child = (struct dive*) model->data(index.child(0,0), TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *child = (struct dive*) model->data(index.child(0,0), DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (child && child->divetrip)
|
if (child && child->divetrip)
|
||||||
selectedTrips.insert(child->divetrip);
|
selectedTrips.insert(child->divetrip);
|
||||||
while (child) {
|
while (child) {
|
||||||
|
@ -300,7 +300,7 @@ void DiveListView::selectionChanged(const QItemSelection& selected, const QItemS
|
||||||
|
|
||||||
void DiveListView::removeFromTrip()
|
void DiveListView::removeFromTrip()
|
||||||
{
|
{
|
||||||
struct dive *d = (struct dive *) contextMenuIndex.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (!d) // shouldn't happen as we only are setting up this action if this is a dive
|
if (!d) // shouldn't happen as we only are setting up this action if this is a dive
|
||||||
return;
|
return;
|
||||||
remove_dive_from_trip(d);
|
remove_dive_from_trip(d);
|
||||||
|
@ -309,7 +309,7 @@ void DiveListView::removeFromTrip()
|
||||||
|
|
||||||
void DiveListView::deleteDive()
|
void DiveListView::deleteDive()
|
||||||
{
|
{
|
||||||
struct dive *d = (struct dive *) contextMenuIndex.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (d)
|
if (d)
|
||||||
delete_single_dive(get_index_for_dive(d));
|
delete_single_dive(get_index_for_dive(d));
|
||||||
reload(currentLayout, false);
|
reload(currentLayout, false);
|
||||||
|
@ -317,12 +317,12 @@ void DiveListView::deleteDive()
|
||||||
|
|
||||||
void DiveListView::testSlot()
|
void DiveListView::testSlot()
|
||||||
{
|
{
|
||||||
struct dive *d = (struct dive *) contextMenuIndex.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (d) {
|
if (d) {
|
||||||
qDebug("testSlot called on dive #%d", d->number);
|
qDebug("testSlot called on dive #%d", d->number);
|
||||||
} else {
|
} else {
|
||||||
QModelIndex child = contextMenuIndex.child(0, 0);
|
QModelIndex child = contextMenuIndex.child(0, 0);
|
||||||
d = (struct dive *) child.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
d = (struct dive *) child.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
if (d)
|
if (d)
|
||||||
qDebug("testSlot called on trip including dive #%d", d->number);
|
qDebug("testSlot called on trip including dive #%d", d->number);
|
||||||
else
|
else
|
||||||
|
@ -335,7 +335,7 @@ void DiveListView::contextMenuEvent(QContextMenuEvent *event)
|
||||||
QAction *collapseAction = NULL;
|
QAction *collapseAction = NULL;
|
||||||
// let's remember where we are
|
// let's remember where we are
|
||||||
contextMenuIndex = indexAt(event->pos());
|
contextMenuIndex = indexAt(event->pos());
|
||||||
struct dive *d = (struct dive *) contextMenuIndex.data(TreeItemDT::DIVE_ROLE).value<void*>();
|
struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value<void*>();
|
||||||
QMenu popup(this);
|
QMenu popup(this);
|
||||||
if (currentLayout == DiveTripModel::TREE) {
|
if (currentLayout == DiveTripModel::TREE) {
|
||||||
popup.addAction(tr("expand all"), this, SLOT(expandAll()));
|
popup.addAction(tr("expand all"), this, SLOT(expandAll()));
|
||||||
|
|
|
@ -437,7 +437,7 @@ void MainWindow::initialUiSetup()
|
||||||
/* if no width are set, use the calculated width for each column;
|
/* if no width are set, use the calculated width for each column;
|
||||||
* for that to work we need to temporarily expand all rows */
|
* for that to work we need to temporarily expand all rows */
|
||||||
ui->ListWidget->expandAll();
|
ui->ListWidget->expandAll();
|
||||||
for (i = TreeItemDT::NR; i < TreeItemDT::COLUMNS; i++) {
|
for (i = DiveTripModel::NR; i < DiveTripModel::COLUMNS; i++) {
|
||||||
QVariant width = settings.value(QString("colwidth%1").arg(i));
|
QVariant width = settings.value(QString("colwidth%1").arg(i));
|
||||||
if (width.isValid())
|
if (width.isValid())
|
||||||
ui->ListWidget->setColumnWidth(i, width.toInt());
|
ui->ListWidget->setColumnWidth(i, width.toInt());
|
||||||
|
@ -526,7 +526,7 @@ void MainWindow::writeSettings()
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
||||||
settings.beginGroup("ListWidget");
|
settings.beginGroup("ListWidget");
|
||||||
for (i = TreeItemDT::NR; i < TreeItemDT::COLUMNS; i++)
|
for (i = DiveTripModel::NR; i < DiveTripModel::COLUMNS; i++)
|
||||||
if (!ui->ListWidget->isColumnHidden(i))
|
if (!ui->ListWidget->isColumnHidden(i))
|
||||||
settings.setValue(QString("colwidth%1").arg(i), ui->ListWidget->columnWidth(i));
|
settings.setValue(QString("colwidth%1").arg(i), ui->ListWidget->columnWidth(i));
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
|
|
|
@ -26,7 +26,7 @@ void StarWidgetsDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o
|
||||||
if (!index.isValid())
|
if (!index.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QVariant value = index.model()->data(index, TreeItemDT::STAR_ROLE);
|
QVariant value = index.model()->data(index, DiveTripModel::STAR_ROLE);
|
||||||
|
|
||||||
if (!value.isValid())
|
if (!value.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
230
qt-ui/models.cpp
230
qt-ui/models.cpp
|
@ -769,6 +769,11 @@ void TankInfoModel::update()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//#################################################################################################
|
||||||
|
//#
|
||||||
|
//# Tree Model - a Basic Tree Model so I don't need to kill myself repeating this for every model.
|
||||||
|
//#
|
||||||
|
//#################################################################################################
|
||||||
|
|
||||||
/*! A DiveItem for use with a DiveTripModel
|
/*! A DiveItem for use with a DiveTripModel
|
||||||
*
|
*
|
||||||
|
@ -778,46 +783,98 @@ void TankInfoModel::update()
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TreeItemDT::~TreeItemDT()
|
TreeItem::~TreeItem()
|
||||||
{
|
{
|
||||||
qDeleteAll(children);
|
qDeleteAll(children);
|
||||||
}
|
}
|
||||||
|
|
||||||
int TreeItemDT::row() const
|
int TreeItem::row() const
|
||||||
{
|
{
|
||||||
if (parent)
|
if (parent)
|
||||||
return parent->children.indexOf(const_cast<TreeItemDT*>(this));
|
return parent->children.indexOf(const_cast<TreeItem*>(this));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant TreeItemDT::data(int column, int role) const
|
QVariant TreeItem::data(int column, int role) const
|
||||||
{
|
{
|
||||||
QVariant ret;
|
return QVariant();
|
||||||
switch(role){
|
|
||||||
case Qt::DisplayRole :
|
|
||||||
switch (column) {
|
|
||||||
case NR: ret = tr("#"); break;
|
|
||||||
case DATE: ret = tr("Date"); break;
|
|
||||||
case RATING: ret = UTF8_BLACKSTAR; break;
|
|
||||||
case DEPTH: ret = (get_units()->length == units::METERS) ? tr("m") : tr("ft"); break;
|
|
||||||
case DURATION: ret = tr("min"); break;
|
|
||||||
case TEMPERATURE: ret = QString("%1%2").arg(UTF8_DEGREE).arg((get_units()->temperature == units::CELSIUS) ? "C" : "F"); break;
|
|
||||||
case TOTALWEIGHT: ret = (get_units()->weight == units::KG) ? tr("kg") : tr("lbs"); break;
|
|
||||||
case SUIT: ret = tr("Suit"); break;
|
|
||||||
case CYLINDER: ret = tr("Cyl"); break;
|
|
||||||
case NITROX: ret = QString("O%1%").arg(UTF8_SUBSCRIPT_2); break;
|
|
||||||
case SAC: ret = tr("SAC"); break;
|
|
||||||
case OTU: ret = tr("OTU"); break;
|
|
||||||
case MAXCNS: ret = tr("maxCNS"); break;
|
|
||||||
case LOCATION: ret = tr("Location"); break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TripItem : public TreeItemDT {
|
TreeModel::TreeModel(QObject* parent): QAbstractItemModel(parent)
|
||||||
|
{
|
||||||
|
rootItem = new TreeItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
TreeModel::~TreeModel()
|
||||||
|
{
|
||||||
|
delete rootItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant TreeModel::data(const QModelIndex& index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
if (role == Qt::FontRole) {
|
||||||
|
return defaultModelFont();
|
||||||
|
}
|
||||||
|
TreeItem* item = static_cast<TreeItem*>(index.internalPointer());
|
||||||
|
|
||||||
|
return item->data(index.column(), role);
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex TreeModel::index(int row, int column, const QModelIndex& parent)
|
||||||
|
const
|
||||||
|
{
|
||||||
|
if (!hasIndex(row, column, parent))
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
TreeItem* parentItem = (!parent.isValid()) ? rootItem : static_cast<TreeItem*>(parent.internalPointer());
|
||||||
|
|
||||||
|
TreeItem* childItem = parentItem->children[row];
|
||||||
|
|
||||||
|
return (childItem) ? createIndex(row, column, childItem) : QModelIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex TreeModel::parent(const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
TreeItem* childItem = static_cast<TreeItem*>(index.internalPointer());
|
||||||
|
TreeItem* parentItem = childItem->parent;
|
||||||
|
|
||||||
|
if (parentItem == rootItem || !parentItem)
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
return createIndex(parentItem->row(), 0, parentItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TreeModel::rowCount(const QModelIndex& parent) const
|
||||||
|
{
|
||||||
|
TreeItem* parentItem;
|
||||||
|
|
||||||
|
if (!parent.isValid())
|
||||||
|
parentItem = rootItem;
|
||||||
|
else
|
||||||
|
parentItem = static_cast<TreeItem*>(parent.internalPointer());
|
||||||
|
|
||||||
|
int amount = parentItem->children.count();
|
||||||
|
|
||||||
|
return amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
int TreeModel::columnCount(const QModelIndex& parent) const
|
||||||
|
{
|
||||||
|
return columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*################################################################
|
||||||
|
*
|
||||||
|
* Implementation of the Dive List.
|
||||||
|
*
|
||||||
|
* ############################################################### */
|
||||||
|
struct TripItem : public TreeItem {
|
||||||
virtual QVariant data(int column, int role) const;
|
virtual QVariant data(int column, int role) const;
|
||||||
dive_trip_t* trip;
|
dive_trip_t* trip;
|
||||||
};
|
};
|
||||||
|
@ -826,12 +883,12 @@ QVariant TripItem::data(int column, int role) const
|
||||||
{
|
{
|
||||||
QVariant ret;
|
QVariant ret;
|
||||||
|
|
||||||
if (role == SORT_ROLE)
|
if (role == DiveTripModel::SORT_ROLE)
|
||||||
return (qulonglong)trip->when;
|
return (qulonglong)trip->when;
|
||||||
|
|
||||||
if (role == Qt::DisplayRole) {
|
if (role == Qt::DisplayRole) {
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case NR:
|
case DiveTripModel::NR:
|
||||||
ret = QString(trip->location) + ", " + QString(get_trip_date_string(trip->when, trip->nrdives));
|
ret = QString(trip->location) + ", " + QString(get_trip_date_string(trip->when, trip->nrdives));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -840,7 +897,10 @@ QVariant TripItem::data(int column, int role) const
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DiveItem : public TreeItemDT {
|
struct DiveItem : public TreeItem {
|
||||||
|
enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT,
|
||||||
|
SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS };
|
||||||
|
|
||||||
virtual QVariant data(int column, int role) const;
|
virtual QVariant data(int column, int role) const;
|
||||||
struct dive* dive;
|
struct dive* dive;
|
||||||
|
|
||||||
|
@ -876,7 +936,7 @@ QVariant DiveItem::data(int column, int role) const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SORT_ROLE:
|
case DiveTripModel::SORT_ROLE:
|
||||||
switch (column) {
|
switch (column) {
|
||||||
case NR: retVal = (qulonglong) dive->when; break;
|
case NR: retVal = (qulonglong) dive->when; break;
|
||||||
case DATE: retVal = (qulonglong) dive->when; break;
|
case DATE: retVal = (qulonglong) dive->when; break;
|
||||||
|
@ -913,10 +973,10 @@ QVariant DiveItem::data(int column, int role) const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (role == STAR_ROLE)
|
if (role == DiveTripModel::STAR_ROLE)
|
||||||
retVal = dive->rating;
|
retVal = dive->rating;
|
||||||
|
|
||||||
if (role == DIVE_ROLE)
|
if (role == DiveTripModel::DIVE_ROLE)
|
||||||
retVal = QVariant::fromValue<void*>(dive);
|
retVal = QVariant::fromValue<void*>(dive);
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
|
@ -1001,37 +1061,9 @@ int DiveItem::weight() const
|
||||||
return tw.grams;
|
return tw.grams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DiveTripModel::DiveTripModel(QObject* parent): TreeModel(parent)
|
||||||
DiveTripModel::DiveTripModel(QObject* parent) :
|
|
||||||
QAbstractItemModel(parent)
|
|
||||||
{
|
{
|
||||||
rootItem = new TreeItemDT();
|
columns = COLUMNS;
|
||||||
}
|
|
||||||
|
|
||||||
DiveTripModel::~DiveTripModel()
|
|
||||||
{
|
|
||||||
delete rootItem;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DiveTripModel::columnCount(const QModelIndex& parent) const
|
|
||||||
{
|
|
||||||
if (parent.isValid())
|
|
||||||
return static_cast<TreeItemDT*>(parent.internalPointer())->columnCount();
|
|
||||||
else
|
|
||||||
return rootItem->columnCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant DiveTripModel::data(const QModelIndex& index, int role) const
|
|
||||||
{
|
|
||||||
if (!index.isValid())
|
|
||||||
return QVariant();
|
|
||||||
|
|
||||||
if (role == Qt::FontRole) {
|
|
||||||
return defaultModelFont();
|
|
||||||
}
|
|
||||||
TreeItemDT* item = static_cast<TreeItemDT*>(index.internalPointer());
|
|
||||||
|
|
||||||
return item->data(index.column(), role);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Qt::ItemFlags DiveTripModel::flags(const QModelIndex& index) const
|
Qt::ItemFlags DiveTripModel::flags(const QModelIndex& index) const
|
||||||
|
@ -1042,59 +1074,35 @@ Qt::ItemFlags DiveTripModel::flags(const QModelIndex& index) const
|
||||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant DiveTripModel::headerData(int section, Qt::Orientation orientation,
|
QVariant DiveTripModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
int role) const
|
|
||||||
{
|
{
|
||||||
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
|
QVariant ret;
|
||||||
return rootItem->data(section, role);
|
if (orientation == Qt::Vertical)
|
||||||
|
return ret;
|
||||||
|
|
||||||
switch(role){
|
switch(role){
|
||||||
case Qt::FontRole :
|
case Qt::FontRole :
|
||||||
return defaultModelFont();
|
ret = defaultModelFont(); break;
|
||||||
|
case Qt::DisplayRole :
|
||||||
|
switch (section) {
|
||||||
|
case NR: ret = tr("#"); break;
|
||||||
|
case DATE: ret = tr("Date"); break;
|
||||||
|
case RATING: ret = UTF8_BLACKSTAR; break;
|
||||||
|
case DEPTH: ret = (get_units()->length == units::METERS) ? tr("m") : tr("ft"); break;
|
||||||
|
case DURATION: ret = tr("min"); break;
|
||||||
|
case TEMPERATURE:ret = QString("%1%2").arg(UTF8_DEGREE).arg((get_units()->temperature == units::CELSIUS) ? "C" : "F"); break;
|
||||||
|
case TOTALWEIGHT:ret = (get_units()->weight == units::KG) ? tr("kg") : tr("lbs"); break;
|
||||||
|
case SUIT: ret = tr("Suit"); break;
|
||||||
|
case CYLINDER: ret = tr("Cyl"); break;
|
||||||
|
case NITROX: ret = QString("O%1%").arg(UTF8_SUBSCRIPT_2); break;
|
||||||
|
case SAC: ret = tr("SAC"); break;
|
||||||
|
case OTU: ret = tr("OTU"); break;
|
||||||
|
case MAXCNS: ret = tr("maxCNS"); break;
|
||||||
|
case LOCATION: ret = tr("Location"); break;
|
||||||
|
}break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return QVariant();
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex DiveTripModel::index(int row, int column, const QModelIndex& parent)
|
|
||||||
const
|
|
||||||
{
|
|
||||||
if (!hasIndex(row, column, parent))
|
|
||||||
return QModelIndex();
|
|
||||||
|
|
||||||
TreeItemDT* parentItem = (!parent.isValid()) ? rootItem : static_cast<TreeItemDT*>(parent.internalPointer());
|
|
||||||
|
|
||||||
TreeItemDT* childItem = parentItem->children[row];
|
|
||||||
|
|
||||||
return (childItem) ? createIndex(row, column, childItem) : QModelIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex DiveTripModel::parent(const QModelIndex& index) const
|
|
||||||
{
|
|
||||||
if (!index.isValid())
|
|
||||||
return QModelIndex();
|
|
||||||
|
|
||||||
TreeItemDT* childItem = static_cast<TreeItemDT*>(index.internalPointer());
|
|
||||||
TreeItemDT* parentItem = childItem->parent;
|
|
||||||
|
|
||||||
if (parentItem == rootItem || !parentItem)
|
|
||||||
return QModelIndex();
|
|
||||||
|
|
||||||
return createIndex(parentItem->row(), 0, parentItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DiveTripModel::rowCount(const QModelIndex& parent) const
|
|
||||||
{
|
|
||||||
TreeItemDT* parentItem;
|
|
||||||
|
|
||||||
if (!parent.isValid())
|
|
||||||
parentItem = rootItem;
|
|
||||||
else
|
|
||||||
parentItem = static_cast<TreeItemDT*>(parent.internalPointer());
|
|
||||||
|
|
||||||
int amount = parentItem->children.count();
|
|
||||||
|
|
||||||
return amount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiveTripModel::setupModelData()
|
void DiveTripModel::setupModelData()
|
||||||
|
|
|
@ -123,51 +123,54 @@ private:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct TreeItemDT {
|
struct TreeItem {
|
||||||
Q_DECLARE_TR_FUNCTIONS (TreeItemDT);
|
Q_DECLARE_TR_FUNCTIONS (TreeItemDT);
|
||||||
public:
|
public:
|
||||||
enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT,
|
virtual ~TreeItem();
|
||||||
SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS };
|
|
||||||
|
|
||||||
enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, SORT_ROLE};
|
|
||||||
|
|
||||||
virtual ~TreeItemDT();
|
|
||||||
int columnCount() const {
|
|
||||||
return COLUMNS;
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual QVariant data (int column, int role) const;
|
virtual QVariant data (int column, int role) const;
|
||||||
int row() const;
|
int row() const;
|
||||||
QList<TreeItemDT *> children;
|
QList<TreeItem*> children;
|
||||||
TreeItemDT *parent;
|
TreeItem *parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TripItem;
|
struct TripItem;
|
||||||
|
|
||||||
class DiveTripModel : public QAbstractItemModel
|
class TreeModel : public QAbstractItemModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum Layout{TREE, LIST, CURRENT};
|
TreeModel(QObject *parent = 0);
|
||||||
|
virtual ~TreeModel();
|
||||||
|
|
||||||
DiveTripModel(QObject *parent = 0);
|
virtual QVariant data(const QModelIndex &index, int role) const;
|
||||||
~DiveTripModel();
|
|
||||||
|
|
||||||
/*reimp*/ Qt::ItemFlags flags(const QModelIndex &index) const;
|
|
||||||
/*reimp*/ QVariant data(const QModelIndex &index, int role) const;
|
|
||||||
/*reimp*/ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
|
||||||
/*reimp*/ int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
/*reimp*/ int rowCount(const QModelIndex &parent = QModelIndex()) const;
|
||||||
/*reimp*/ int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
/*reimp*/ int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||||
/*reimp*/ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
/*reimp*/ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
||||||
/*reimp*/ QModelIndex parent(const QModelIndex &child) const;
|
/*reimp*/ QModelIndex parent(const QModelIndex &child) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int columns;
|
||||||
|
TreeItem *rootItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
class DiveTripModel : public TreeModel {
|
||||||
|
public:
|
||||||
|
enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT,
|
||||||
|
SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS };
|
||||||
|
|
||||||
|
enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, SORT_ROLE};
|
||||||
|
enum Layout{TREE, LIST, CURRENT};
|
||||||
|
|
||||||
|
Qt::ItemFlags flags(const QModelIndex &index) const;
|
||||||
|
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||||
|
DiveTripModel(QObject* parent = 0);
|
||||||
Layout layout() const;
|
Layout layout() const;
|
||||||
void setLayout(Layout layout);
|
void setLayout(Layout layout);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupModelData();
|
void setupModelData();
|
||||||
|
|
||||||
TreeItemDT *rootItem;
|
|
||||||
QMap<dive_trip_t*, TripItem*> trips;
|
QMap<dive_trip_t*, TripItem*> trips;
|
||||||
Layout currentLayout;
|
Layout currentLayout;
|
||||||
};
|
};
|
||||||
|
@ -185,12 +188,12 @@ public:
|
||||||
virtual Qt::ItemFlags flags(const QModelIndex& index) const;
|
virtual Qt::ItemFlags flags(const QModelIndex& index) const;
|
||||||
virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
|
virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole);
|
||||||
void update();
|
void update();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void remove(const QModelIndex& index);
|
void remove(const QModelIndex& index);
|
||||||
private:
|
private:
|
||||||
int numRows;
|
int numRows;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue