Implement the functionality of remove_picture.

Added the remove_picture functionality, with code
shamelessy stolen from remove_event, and hoock it
up with the interface.

Fixes #650

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2014-07-29 23:03:32 -03:00 committed by Dirk Hohndel
parent 1e6986d870
commit 3b9bceacb6
6 changed files with 32 additions and 8 deletions

17
dive.c
View file

@ -2489,9 +2489,22 @@ void dive_set_geodata_from_picture(struct dive *d, struct picture *pic)
} }
} }
void dive_remove_picture(struct dive *d, struct picture *p) static void picture_free( struct picture *p){
if (!p)
return;
free( p->filename );
free( p );
}
void dive_remove_picture(struct picture *p)
{ {
struct picture **ep = &current_dive->picture_list;
while (ep && !same_string((*ep)->filename, p->filename))
ep = &(*ep)->next;
if (ep) {
struct picture *temp = (*ep)->next;
picture_free(*ep);
*ep = temp;
}
} }
/* this always acts on the current divecomputer of the current dive */ /* this always acts on the current divecomputer of the current dive */

2
dive.h
View file

@ -311,7 +311,7 @@ struct picture {
extern struct picture *alloc_picture(); extern struct picture *alloc_picture();
extern void dive_create_picture(struct dive *d, char *filename, int shift_time); extern void dive_create_picture(struct dive *d, char *filename, int shift_time);
extern void dive_add_picture(struct dive *d, struct picture *newpic); extern void dive_add_picture(struct dive *d, struct picture *newpic);
extern void dive_remove_picture(struct dive *d, struct picture *pic); extern void dive_remove_picture(struct picture *pic);
extern unsigned int dive_get_picture_count(struct dive *d); extern unsigned int dive_get_picture_count(struct dive *d);
extern void picture_load_exif_data(struct picture *p, timestamp_t *timestamp); extern void picture_load_exif_data(struct picture *p, timestamp_t *timestamp);
extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic); extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic);

View file

@ -89,11 +89,21 @@ QVariant DivePictureModel::data(const QModelIndex &index, int role) const
switch (role) { switch (role) {
case Qt::UserRole: case Qt::UserRole:
ret = QVariant::fromValue((void *)stringPixmapCache[key].picture); ret = QVariant::fromValue((void *)stringPixmapCache[key].picture);
break;
case Qt::DisplayRole:
ret = key;
} }
} }
return ret; return ret;
} }
void DivePictureModel::removePicture(const QString &fileUrl)
{
dive_remove_picture(stringPixmapCache[fileUrl].picture);
copy_dive(current_dive, &displayed_dive);
updateDivePictures();
}
int DivePictureModel::rowCount(const QModelIndex &parent) const int DivePictureModel::rowCount(const QModelIndex &parent) const
{ {
return numberOfPictures; return numberOfPictures;

View file

@ -19,6 +19,7 @@ public:
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
void updateDivePictures(); void updateDivePictures();
void removePicture(const QString& fileUrl);
private: private:
DivePictureModel(); DivePictureModel();

View file

@ -119,9 +119,7 @@ void DivePictureItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
void DivePictureItem::removePicture() void DivePictureItem::removePicture()
{ {
/* this is a WIP, it doesn't really *removes* anything, merely hides it.
* good workaround, I still need to figure out how to activelly remove
* it from the model. */
button->hide(); button->hide();
hide(); hide();
DivePictureModel::instance()->removePicture(fileUrl);
} }

View file

@ -1352,7 +1352,9 @@ void ProfileWidget2::keyEscAction()
void ProfileWidget2::plotPictures() void ProfileWidget2::plotPictures()
{ {
qDeleteAll(pictures); Q_FOREACH(DivePictureItem *item, pictures){
item->deleteLater();
}
pictures.clear(); pictures.clear();
if (printMode) if (printMode)
@ -1368,7 +1370,7 @@ void ProfileWidget2::plotPictures()
continue; continue;
DivePictureItem *item = new DivePictureItem(); DivePictureItem *item = new DivePictureItem();
item->setPixmap(m->index(i,0).data(Qt::DecorationRole).value<QPixmap>()); item->setPixmap(m->index(i,0).data(Qt::DecorationRole).value<QPixmap>());
item->setFileUrl(m->index(i,0).data(Qt::DisplayPropertyRole).toString()); item->setFileUrl(m->index(i,1).data().toString());
// let's put the picture at the correct time, but at a fixed "depth" on the profile // let's put the picture at the correct time, but at a fixed "depth" on the profile
// not sure this is ideal, but it seems to look right. // not sure this is ideal, but it seems to look right.
x = timeAxis->posAtValue(pic->offset.seconds); x = timeAxis->posAtValue(pic->offset.seconds);