Signed-off-by: Dirk Hohndel <dirk@hohndel.org>

Conflicts:
	qt-ui/maintab.h
This commit is contained in:
Dirk Hohndel 2013-09-16 20:52:01 -04:00
commit 396d73705e
3 changed files with 135 additions and 68 deletions

View file

@ -226,16 +226,7 @@ void DiveListView::currentChanged(const QModelIndex& current, const QModelIndex&
{ {
if (!current.isValid()) if (!current.isValid())
return; return;
const QAbstractItemModel *model = current.model();
int selectedDive = 0;
struct dive *dive = (struct dive*) model->data(current, DiveTripModel::DIVE_ROLE).value<void*>();
if (!dive) // it's a trip! select first child.
dive = (struct dive*) model->data(current.child(0,0), DiveTripModel::DIVE_ROLE).value<void*>();
selectedDive = get_divenr(dive);
scrollTo(current); scrollTo(current);
if (selectedDive == selected_dive)
return;
Q_EMIT currentDiveChanged(selectedDive);
} }
void DiveListView::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) void DiveListView::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected)

View file

@ -20,12 +20,12 @@
#include <QSet> #include <QSet>
#include <QTableView> #include <QTableView>
#include <QSettings> #include <QSettings>
#include <QPalette>
MainTab::MainTab(QWidget *parent) : QTabWidget(parent), MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
ui(new Ui::MainTab()), ui(new Ui::MainTab()),
weightModel(new WeightModel()), weightModel(new WeightModel()),
cylindersModel(new CylindersModel()), cylindersModel(new CylindersModel()),
currentDive(0),
editMode(NONE) editMode(NONE)
{ {
ui->setupUi(this); ui->setupUi(this);
@ -91,7 +91,7 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
void MainTab::enableEdition() void MainTab::enableEdition()
{ {
if (ui->editAccept->isVisible() || !currentDive) if (ui->editAccept->isVisible() || !selected_dive)
return; return;
ui->editAccept->setChecked(true); ui->editAccept->setChecked(true);
@ -150,6 +150,7 @@ void MainTab::clearStats()
void MainTab::updateDiveInfo(int dive) void MainTab::updateDiveInfo(int dive)
{ {
editMode = NONE;
// This method updates ALL tabs whenever a new dive or trip is // This method updates ALL tabs whenever a new dive or trip is
// selected. // selected.
// If exactly one trip has been selected, we show the location / notes // If exactly one trip has been selected, we show the location / notes
@ -162,7 +163,7 @@ void MainTab::updateDiveInfo(int dive)
process_selected_dives(); process_selected_dives();
process_all_dives(d, &prevd); process_all_dives(d, &prevd);
currentDive = d;
UPDATE_TEXT(d, notes); UPDATE_TEXT(d, notes);
UPDATE_TEXT(d, location); UPDATE_TEXT(d, location);
UPDATE_TEXT(d, suit); UPDATE_TEXT(d, suit);
@ -325,24 +326,39 @@ void MainTab::on_editAccept_clicked(bool edit)
mainWindow()->dive_list()->setEnabled(!edit); mainWindow()->dive_list()->setEnabled(!edit);
if (edit) { if (edit) {
// We may be editing one or more dives here. backup everything.
notesBackup.clear();
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) { if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
// we are editing trip location and notes // we are editing trip location and notes
ui->diveNotesMessage->setText(tr("This trip is being edited. Select Save or Undo when ready.")); ui->diveNotesMessage->setText(tr("This trip is being edited. Select Save or Undo when ready."));
ui->diveNotesMessage->animatedShow(); ui->diveNotesMessage->animatedShow();
notesBackup.notes = ui->notes->toPlainText(); notesBackup[NULL].notes = ui->notes->toPlainText();
notesBackup.location = ui->location->text(); notesBackup[NULL].location = ui->location->text();
editMode = TRIP; editMode = TRIP;
} else { } else {
ui->diveNotesMessage->setText(tr("This dive is being edited. Select Save or Undo when ready.")); ui->diveNotesMessage->setText(tr("This dive is being edited. Select Save or Undo when ready."));
ui->diveNotesMessage->animatedShow(); ui->diveNotesMessage->animatedShow();
notesBackup.buddy = ui->buddy->text();
notesBackup.suit = ui->suit->text(); // We may be editing one or more dives here. backup everything.
notesBackup.notes = ui->notes->toPlainText(); struct dive *mydive;
notesBackup.divemaster = ui->divemaster->text(); for (int i = 0; i < dive_table.nr; i++) {
notesBackup.location = ui->location->text(); mydive = get_dive(i);
notesBackup.rating = ui->rating->currentStars(); if (!mydive)
notesBackup.visibility = ui->visibility->currentStars(); continue;
editMode = DIVE; if (!mydive->selected)
continue;
notesBackup[mydive].buddy = QString(mydive->buddy);
notesBackup[mydive].suit = QString(mydive->suit);
notesBackup[mydive].notes = QString(mydive->notes);
notesBackup[mydive].divemaster = QString(mydive->divemaster);
notesBackup[mydive].location = QString(mydive->location);
notesBackup[mydive].rating = mydive->rating;
notesBackup[mydive].visibility = mydive->visibility;
}
editMode = DIVE;
} }
} else { } else {
ui->diveNotesMessage->animatedHide(); ui->diveNotesMessage->animatedHide();
@ -350,38 +366,78 @@ void MainTab::on_editAccept_clicked(bool edit)
ui->editReset->hide(); ui->editReset->hide();
/* now figure out if things have changed */ /* now figure out if things have changed */
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) { if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
if (notesBackup.notes != ui->notes->toPlainText() || if (notesBackup[NULL].notes != ui->notes->toPlainText() ||
notesBackup.location != ui->location->text()) notesBackup[NULL].location != ui->location->text())
mark_divelist_changed(TRUE); mark_divelist_changed(TRUE);
} else { } else {
if (notesBackup.buddy != ui->buddy->text() || struct dive *curr = current_dive;
notesBackup.suit != ui->suit->text() || if (notesBackup[curr].buddy != ui->buddy->text() ||
notesBackup.notes != ui->notes->toPlainText() || notesBackup[curr].suit != ui->suit->text() ||
notesBackup.divemaster != ui->divemaster->text() || notesBackup[curr].notes != ui->notes->toPlainText() ||
notesBackup.location != ui->location->text() || notesBackup[curr].divemaster != ui->divemaster->text() ||
notesBackup.visibility != ui->visibility->currentStars() || notesBackup[curr].location != ui->location->text() ||
notesBackup.rating != ui->rating->currentStars()) notesBackup[curr].rating != ui->visibility->currentStars() ||
notesBackup[curr].visibility != ui->rating->currentStars())
mark_divelist_changed(TRUE); mark_divelist_changed(TRUE);
if (notesBackup.location != ui->location->text()) if (notesBackup[curr].location != ui->location->text())
mainWindow()->globe()->reload(); mainWindow()->globe()->reload();
} }
editMode = NONE; editMode = NONE;
} }
QPalette p;
ui->buddy->setPalette(p);
ui->notes->setPalette(p);
ui->location->setPalette(p);
ui->divemaster->setPalette(p);
ui->suit->setPalette(p);
} }
#define EDIT_TEXT2(what, text) \
textByteArray = text.toLocal8Bit(); \
free(what);\
what = strdup(textByteArray.data());
#define EDIT_TEXT(what, text) \
QByteArray textByteArray = text.toLocal8Bit(); \
free(what);\
what = strdup(textByteArray.data());
void MainTab::on_editReset_clicked() void MainTab::on_editReset_clicked()
{ {
if (!ui->editAccept->isChecked()) if (!ui->editAccept->isChecked())
return; return;
ui->notes->setText(notesBackup.notes); if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1){
ui->location->setText(notesBackup.location); ui->notes->setText(notesBackup[NULL].notes );
if (mainWindow() && mainWindow()->dive_list()->selectedTrips.count() != 1) { ui->location->setText(notesBackup[NULL].location);
ui->buddy->setText(notesBackup.buddy); }else{
ui->suit->setText(notesBackup.suit); struct dive *curr = current_dive;
ui->divemaster->setText(notesBackup.divemaster); ui->notes->setText(notesBackup[curr].notes );
ui->rating->setCurrentStars(notesBackup.rating); ui->location->setText(notesBackup[curr].location);
ui->visibility->setCurrentStars(notesBackup.visibility); ui->buddy->setText(notesBackup[curr].buddy);
ui->suit->setText(notesBackup[curr].suit);
ui->divemaster->setText(notesBackup[curr].divemaster);
ui->rating->setCurrentStars(notesBackup[curr].rating);
ui->visibility->setCurrentStars(notesBackup[curr].visibility);
struct dive *mydive;
for (int i = 0; i < dive_table.nr; i++) {
mydive = get_dive(i);
if (!mydive)
continue;
if (!mydive->selected)
continue;
QByteArray textByteArray;
EDIT_TEXT2(mydive->buddy, notesBackup[mydive].buddy);
EDIT_TEXT2(mydive->suit, notesBackup[mydive].suit);
EDIT_TEXT2(mydive->notes, notesBackup[mydive].notes);
EDIT_TEXT2(mydive->divemaster, notesBackup[mydive].divemaster);
EDIT_TEXT2(mydive->location, notesBackup[mydive].location);
mydive->rating = notesBackup[mydive].rating;
mydive->visibility = notesBackup[mydive].visibility;
}
} }
ui->editAccept->setChecked(false); ui->editAccept->setChecked(false);
ui->diveNotesMessage->animatedHide(); ui->diveNotesMessage->animatedHide();
@ -397,75 +453,95 @@ void MainTab::on_editReset_clicked()
ui->editAccept->hide(); ui->editAccept->hide();
ui->editReset->hide(); ui->editReset->hide();
notesBackup.clear();
QPalette p;
ui->buddy->setPalette(p);
ui->notes->setPalette(p);
ui->location->setPalette(p);
ui->divemaster->setPalette(p);
ui->suit->setPalette(p);
editMode = NONE; editMode = NONE;
} }
#undef EDIT_TEXT2
#define EDIT_TEXT(what, text) \ #define EDIT_SELECTED_DIVES( WHAT ) \
QByteArray textByteArray = text.toLocal8Bit(); \ if (editMode == NONE) \
free(what);\ return; \
what = strdup(textByteArray.data()); struct dive *mydive; \
\
for (int i = 0; i < dive_table.nr; i++) { \
mydive = get_dive(i); \
if (!mydive) \
continue; \
if (!mydive->selected) \
continue; \
\
WHAT; \
}
void markChangedWidget(QWidget *w){
QPalette p;
p.setBrush(QPalette::Base, QColor(Qt::yellow).lighter());
w->setPalette(p);
}
void MainTab::on_buddy_textChanged(const QString& text) void MainTab::on_buddy_textChanged(const QString& text)
{ {
if (!currentDive) EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->buddy, text) );
return; markChangedWidget(ui->buddy);
EDIT_TEXT(currentDive->buddy, text);
} }
void MainTab::on_divemaster_textChanged(const QString& text) void MainTab::on_divemaster_textChanged(const QString& text)
{ {
if (!currentDive) EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->divemaster, text) );
return; markChangedWidget(ui->divemaster);
EDIT_TEXT(currentDive->divemaster, text);
} }
void MainTab::on_location_textChanged(const QString& text) void MainTab::on_location_textChanged(const QString& text)
{ {
if (editMode == NONE)
return;
if (editMode == TRIP && mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) { if (editMode == TRIP && mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
// we are editing a trip // we are editing a trip
dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips.begin(); dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips.begin();
EDIT_TEXT(currentTrip->location, text); EDIT_TEXT(currentTrip->location, text);
} else if (editMode == DIVE){ } else if (editMode == DIVE){
if (!currentDive) EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->location, text) )
return;
EDIT_TEXT(currentDive->location, text);
} }
markChangedWidget(ui->location);
} }
void MainTab::on_suit_textChanged(const QString& text) void MainTab::on_suit_textChanged(const QString& text)
{ {
if (!currentDive) EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->suit, text) );
return; markChangedWidget(ui->suit);
EDIT_TEXT(currentDive->suit, text);
} }
void MainTab::on_notes_textChanged() void MainTab::on_notes_textChanged()
{ {
if (editMode == NONE)
return;
if (editMode == TRIP && mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) { if (editMode == TRIP && mainWindow() && mainWindow()->dive_list()->selectedTrips.count() == 1) {
// we are editing a trip // we are editing a trip
dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips.begin(); dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips.begin();
EDIT_TEXT(currentTrip->notes, ui->notes->toPlainText()); EDIT_TEXT(currentTrip->notes, ui->notes->toPlainText());
} else if (editMode == DIVE) { } else if (editMode == DIVE) {
if (!currentDive) EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->notes, ui->notes->toPlainText()) );
return;
EDIT_TEXT(currentDive->notes, ui->notes->toPlainText());
} }
markChangedWidget(ui->notes);
} }
#undef EDIT_TEXT #undef EDIT_TEXT
void MainTab::on_rating_valueChanged(int value) void MainTab::on_rating_valueChanged(int value)
{ {
if (!currentDive) EDIT_SELECTED_DIVES(mydive->rating = value );
return;
currentDive->rating = value;
} }
void MainTab::on_visibility_valueChanged(int value) void MainTab::on_visibility_valueChanged(int value)
{ {
if (!currentDive) EDIT_SELECTED_DIVES( mydive->visibility = value );
return;
currentDive->visibility = value;
} }
void MainTab::editCylinderWidget(const QModelIndex& index) void MainTab::editCylinderWidget(const QModelIndex& index)

View file

@ -9,11 +9,12 @@
#include <QTabWidget> #include <QTabWidget>
#include <QDialog> #include <QDialog>
#include <QMap>
#include "models.h" #include "models.h"
class QCompleter; class QCompleter;
struct dive;
namespace Ui namespace Ui
{ {
class MainTab; class MainTab;
@ -68,8 +69,7 @@ private:
Ui::MainTab *ui; Ui::MainTab *ui;
WeightModel *weightModel; WeightModel *weightModel;
CylindersModel *cylindersModel; CylindersModel *cylindersModel;
NotesBackup notesBackup; QMap<dive*, NotesBackup> notesBackup;
struct dive* currentDive;
enum { NONE, DIVE, TRIP } editMode; enum { NONE, DIVE, TRIP } editMode;
Completers completers; Completers completers;
void enableEdition(); void enableEdition();