diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | qt-ui/locationinformation.cpp | 185 | ||||
-rw-r--r-- | qt-ui/locationinformation.h | 39 | ||||
-rw-r--r-- | qt-ui/mainwindow.cpp | 1 | ||||
-rw-r--r-- | qt-ui/mainwindow.h | 1 | ||||
-rw-r--r-- | qt-ui/simplewidgets.cpp | 178 | ||||
-rw-r--r-- | qt-ui/simplewidgets.h | 34 |
7 files changed, 227 insertions, 212 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 13ea10a25..94c13dc96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -272,6 +272,7 @@ set(SUBSURFACE_INTERFACE qt-ui/configuredivecomputerdialog.cpp qt-ui/filtermodels.cpp qt-ui/undocommands.cpp + qt-ui/locationinformation.cpp ${SOCIALNETWORKS} ) diff --git a/qt-ui/locationinformation.cpp b/qt-ui/locationinformation.cpp new file mode 100644 index 000000000..5c11f96f2 --- /dev/null +++ b/qt-ui/locationinformation.cpp @@ -0,0 +1,185 @@ +#include "locationinformation.h" +#include "dive.h" +#include "mainwindow.h" +#include "divelistview.h" +#include "qthelper.h" + +#include <QDebug> +#include <QShowEvent> + +LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), modified(false) +{ + ui.setupUi(this); + ui.diveSiteMessage->setCloseButtonVisible(false); + ui.diveSiteMessage->show(); + + // create the three buttons and only show the close button for now + closeAction = new QAction(tr("Close"), this); + connect(closeAction, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); + + acceptAction = new QAction(tr("Apply changes"), this); + connect(acceptAction, SIGNAL(triggered(bool)), this, SLOT(acceptChanges())); + + rejectAction = new QAction(tr("Discard changes"), this); + connect(rejectAction, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); + + ui.diveSiteMessage->setText(tr("Dive site management")); + ui.diveSiteMessage->addAction(closeAction); + +} + +void LocationInformationWidget::setLocationId(uint32_t uuid) +{ + currentDs = get_dive_site_by_uuid(uuid); + + if (!currentDs) { + currentDs = get_dive_site_by_uuid(create_dive_site("")); + displayed_dive.dive_site_uuid = currentDs->uuid; + ui.diveSiteName->clear(); + ui.diveSiteDescription->clear(); + ui.diveSiteNotes->clear(); + ui.diveSiteCoordinates->clear(); + } + displayed_dive_site = *currentDs; + if (displayed_dive_site.name) + ui.diveSiteName->setText(displayed_dive_site.name); + else + ui.diveSiteName->clear(); + if (displayed_dive_site.description) + ui.diveSiteDescription->setText(displayed_dive_site.description); + else + ui.diveSiteDescription->clear(); + if (displayed_dive_site.notes) + ui.diveSiteNotes->setPlainText(displayed_dive_site.notes); + else + ui.diveSiteNotes->clear(); + if (displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg) + ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg)); + else + ui.diveSiteCoordinates->clear(); +} + +void LocationInformationWidget::updateGpsCoordinates() +{ + ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg)); + MainWindow::instance()->setApplicationState("EditDiveSite"); +} + +void LocationInformationWidget::acceptChanges() +{ + char *uiString; + currentDs->latitude = displayed_dive_site.latitude; + currentDs->longitude = displayed_dive_site.longitude; + uiString = ui.diveSiteName->text().toUtf8().data(); + if (!same_string(uiString, currentDs->name)) { + free(currentDs->name); + currentDs->name = copy_string(uiString); + } + uiString = ui.diveSiteDescription->text().toUtf8().data(); + if (!same_string(uiString, currentDs->description)) { + free(currentDs->description); + currentDs->description = copy_string(uiString); + } + uiString = ui.diveSiteNotes->document()->toPlainText().toUtf8().data(); + if (!same_string(uiString, currentDs->notes)) { + free(currentDs->notes); + currentDs->notes = copy_string(uiString); + } + if (dive_site_is_empty(currentDs)) { + delete_dive_site(currentDs->uuid); + displayed_dive.dive_site_uuid = 0; + setLocationId(0); + } else { + setLocationId(currentDs->uuid); + } + mark_divelist_changed(true); + resetState(); + emit informationManagementEnded(); +} + +void LocationInformationWidget::rejectChanges() +{ + Q_ASSERT(currentDs != NULL); + if (dive_site_is_empty(currentDs)) { + delete_dive_site(currentDs->uuid); + displayed_dive.dive_site_uuid = 0; + setLocationId(0); + } else { + setLocationId(currentDs->uuid); + } + resetState(); + emit informationManagementEnded(); +} + +void LocationInformationWidget::showEvent(QShowEvent *ev) { + ui.diveSiteMessage->setCloseButtonVisible(false); +} + +void LocationInformationWidget::markChangedWidget(QWidget *w) +{ + QPalette p; + qreal h, s, l, a; + if (!modified) + enableEdition(); + qApp->palette().color(QPalette::Text).getHslF(&h, &s, &l, &a); + p.setBrush(QPalette::Base, (l <= 0.3) ? QColor(Qt::yellow).lighter() : (l <= 0.6) ? QColor(Qt::yellow).light() : /* else */ QColor(Qt::yellow).darker(300)); + w->setPalette(p); + modified = true; +} + +void LocationInformationWidget::resetState() +{ + modified = false; + resetPallete(); + MainWindow::instance()->dive_list()->setEnabled(true); + MainWindow::instance()->setEnabledToolbar(true); + ui.diveSiteMessage->setText(tr("Dive site management")); + ui.diveSiteMessage->addAction(closeAction); + ui.diveSiteMessage->removeAction(acceptAction); + ui.diveSiteMessage->removeAction(rejectAction); + ui.diveSiteMessage->setCloseButtonVisible(false); +} + +void LocationInformationWidget::enableEdition() +{ + MainWindow::instance()->dive_list()->setEnabled(false); + MainWindow::instance()->setEnabledToolbar(false); + ui.diveSiteMessage->setText(tr("You are editing a dive site")); + ui.diveSiteMessage->removeAction(closeAction); + ui.diveSiteMessage->addAction(acceptAction); + ui.diveSiteMessage->addAction(rejectAction); + ui.diveSiteMessage->setCloseButtonVisible(false); +} + +void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString& text) +{ + if (!same_string(qPrintable(text), printGPSCoords(currentDs->latitude.udeg, currentDs->longitude.udeg))) + markChangedWidget(ui.diveSiteCoordinates); +} + +void LocationInformationWidget::on_diveSiteDescription_textChanged(const QString& text) +{ + if (!same_string(qPrintable(text), currentDs->description)) + markChangedWidget(ui.diveSiteDescription); +} + +void LocationInformationWidget::on_diveSiteName_textChanged(const QString& text) +{ + if (!same_string(qPrintable(text), currentDs->name)) + markChangedWidget(ui.diveSiteName); +} + +void LocationInformationWidget::on_diveSiteNotes_textChanged() +{ + if (!same_string(qPrintable(ui.diveSiteNotes->toPlainText()), currentDs->notes)) + markChangedWidget(ui.diveSiteNotes); +} + +void LocationInformationWidget::resetPallete() +{ + QPalette p; + ui.diveSiteCoordinates->setPalette(p); + ui.diveSiteDescription->setPalette(p); + ui.diveSiteName->setPalette(p); + ui.diveSiteNotes->setPalette(p); +} diff --git a/qt-ui/locationinformation.h b/qt-ui/locationinformation.h new file mode 100644 index 000000000..99974af49 --- /dev/null +++ b/qt-ui/locationinformation.h @@ -0,0 +1,39 @@ +#ifndef LOCATIONINFORMATION_H +#define LOCATIONINFORMATION_H + +#include "ui_locationInformation.h" +#include <stdint.h> + +class LocationInformationWidget : public QGroupBox { +Q_OBJECT +public: + LocationInformationWidget(QWidget *parent = 0); + +public slots: + void acceptChanges(); + void rejectChanges(); + + void showEvent(QShowEvent *); + + void setLocationId(uint32_t uuid); + void updateGpsCoordinates(void); + void markChangedWidget(QWidget *w); + void enableEdition(); + void resetState(); + void resetPallete(); + + void on_diveSiteCoordinates_textChanged(const QString& text); + void on_diveSiteDescription_textChanged(const QString& text); + void on_diveSiteName_textChanged(const QString& text); + void on_diveSiteNotes_textChanged(); +signals: + void informationManagementEnded(); + +private: + struct dive_site *currentDs; + Ui::LocationInformation ui; + bool modified; + QAction *closeAction, *acceptAction, *rejectAction; +}; + +#endif diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 02eb78ede..f2873ab86 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -33,6 +33,7 @@ #include "divelogexportdialog.h" #include "usersurvey.h" #include "divesitehelpers.h" +#include "locationinformation.h" #ifndef NO_USERMANUAL #include "usermanual.h" #endif diff --git a/qt-ui/mainwindow.h b/qt-ui/mainwindow.h index 7b6007bb4..f963330cc 100644 --- a/qt-ui/mainwindow.h +++ b/qt-ui/mainwindow.h @@ -37,6 +37,7 @@ class ProfileWidget2; class PlannerDetails; class PlannerSettingsWidget; class QUndoStack; +class LocationInformationWidget; enum MainWindowTitleFormat { MWTF_DEFAULT, diff --git a/qt-ui/simplewidgets.cpp b/qt-ui/simplewidgets.cpp index a074ad18c..430609c7b 100644 --- a/qt-ui/simplewidgets.cpp +++ b/qt-ui/simplewidgets.cpp @@ -706,181 +706,3 @@ void MultiFilter::closeFilter() MultiFilterSortModel::instance()->clearFilter(); hide(); } -#include <QDebug> -#include <QShowEvent> - -LocationInformationWidget::LocationInformationWidget(QWidget *parent) : QGroupBox(parent), modified(false) -{ - ui.setupUi(this); - ui.diveSiteMessage->setCloseButtonVisible(false); - ui.diveSiteMessage->show(); - - // create the three buttons and only show the close button for now - closeAction = new QAction(tr("Close"), this); - connect(closeAction, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); - - acceptAction = new QAction(tr("Apply changes"), this); - connect(acceptAction, SIGNAL(triggered(bool)), this, SLOT(acceptChanges())); - - rejectAction = new QAction(tr("Discard changes"), this); - connect(rejectAction, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); - - ui.diveSiteMessage->setText(tr("Dive site management")); - ui.diveSiteMessage->addAction(closeAction); -} - -void LocationInformationWidget::setLocationId(uint32_t uuid) -{ - currentDs = get_dive_site_by_uuid(uuid); - - if (!currentDs) { - currentDs = get_dive_site_by_uuid(create_dive_site("")); - displayed_dive.dive_site_uuid = currentDs->uuid; - ui.diveSiteName->clear(); - ui.diveSiteDescription->clear(); - ui.diveSiteNotes->clear(); - ui.diveSiteCoordinates->clear(); - } - displayed_dive_site = *currentDs; - if (displayed_dive_site.name) - ui.diveSiteName->setText(displayed_dive_site.name); - else - ui.diveSiteName->clear(); - if (displayed_dive_site.description) - ui.diveSiteDescription->setText(displayed_dive_site.description); - else - ui.diveSiteDescription->clear(); - if (displayed_dive_site.notes) - ui.diveSiteNotes->setPlainText(displayed_dive_site.notes); - else - ui.diveSiteNotes->clear(); - if (displayed_dive_site.latitude.udeg || displayed_dive_site.longitude.udeg) - ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg)); - else - ui.diveSiteCoordinates->clear(); -} - -void LocationInformationWidget::updateGpsCoordinates() -{ - ui.diveSiteCoordinates->setText(printGPSCoords(displayed_dive_site.latitude.udeg, displayed_dive_site.longitude.udeg)); - MainWindow::instance()->setApplicationState("EditDiveSite"); -} - -void LocationInformationWidget::acceptChanges() -{ - char *uiString; - currentDs->latitude = displayed_dive_site.latitude; - currentDs->longitude = displayed_dive_site.longitude; - uiString = ui.diveSiteName->text().toUtf8().data(); - if (!same_string(uiString, currentDs->name)) { - free(currentDs->name); - currentDs->name = copy_string(uiString); - } - uiString = ui.diveSiteDescription->text().toUtf8().data(); - if (!same_string(uiString, currentDs->description)) { - free(currentDs->description); - currentDs->description = copy_string(uiString); - } - uiString = ui.diveSiteNotes->document()->toPlainText().toUtf8().data(); - if (!same_string(uiString, currentDs->notes)) { - free(currentDs->notes); - currentDs->notes = copy_string(uiString); - } - if (dive_site_is_empty(currentDs)) { - delete_dive_site(currentDs->uuid); - displayed_dive.dive_site_uuid = 0; - setLocationId(0); - } else { - setLocationId(currentDs->uuid); - } - mark_divelist_changed(true); - resetState(); - emit informationManagementEnded(); -} - -void LocationInformationWidget::rejectChanges() -{ - Q_ASSERT(currentDs != NULL); - if (dive_site_is_empty(currentDs)) { - delete_dive_site(currentDs->uuid); - displayed_dive.dive_site_uuid = 0; - setLocationId(0); - } else { - setLocationId(currentDs->uuid); - } - resetState(); - emit informationManagementEnded(); -} - -void LocationInformationWidget::showEvent(QShowEvent *ev) { - ui.diveSiteMessage->setCloseButtonVisible(false); -} - -void LocationInformationWidget::markChangedWidget(QWidget *w) -{ - QPalette p; - qreal h, s, l, a; - if (!modified) - enableEdition(); - qApp->palette().color(QPalette::Text).getHslF(&h, &s, &l, &a); - p.setBrush(QPalette::Base, (l <= 0.3) ? QColor(Qt::yellow).lighter() : (l <= 0.6) ? QColor(Qt::yellow).light() : /* else */ QColor(Qt::yellow).darker(300)); - w->setPalette(p); - modified = true; -} - -void LocationInformationWidget::resetState() -{ - modified = false; - resetPallete(); - MainWindow::instance()->dive_list()->setEnabled(true); - MainWindow::instance()->setEnabledToolbar(true); - ui.diveSiteMessage->setText(tr("Dive site management")); - ui.diveSiteMessage->addAction(closeAction); - ui.diveSiteMessage->removeAction(acceptAction); - ui.diveSiteMessage->removeAction(rejectAction); - ui.diveSiteMessage->setCloseButtonVisible(false); -} - -void LocationInformationWidget::enableEdition() -{ - MainWindow::instance()->dive_list()->setEnabled(false); - MainWindow::instance()->setEnabledToolbar(false); - ui.diveSiteMessage->setText(tr("You are editing a dive site")); - ui.diveSiteMessage->removeAction(closeAction); - ui.diveSiteMessage->addAction(acceptAction); - ui.diveSiteMessage->addAction(rejectAction); - ui.diveSiteMessage->setCloseButtonVisible(false); -} - -void LocationInformationWidget::on_diveSiteCoordinates_textChanged(const QString& text) -{ - if (!same_string(qPrintable(text), printGPSCoords(currentDs->latitude.udeg, currentDs->longitude.udeg))) - markChangedWidget(ui.diveSiteCoordinates); -} - -void LocationInformationWidget::on_diveSiteDescription_textChanged(const QString& text) -{ - if (!same_string(qPrintable(text), currentDs->description)) - markChangedWidget(ui.diveSiteDescription); -} - -void LocationInformationWidget::on_diveSiteName_textChanged(const QString& text) -{ - if (!same_string(qPrintable(text), currentDs->name)) - markChangedWidget(ui.diveSiteName); -} - -void LocationInformationWidget::on_diveSiteNotes_textChanged() -{ - if (!same_string(qPrintable(ui.diveSiteNotes->toPlainText()), currentDs->notes)) - markChangedWidget(ui.diveSiteNotes); -} - -void LocationInformationWidget::resetPallete() -{ - QPalette p; - ui.diveSiteCoordinates->setPalette(p); - ui.diveSiteDescription->setPalette(p); - ui.diveSiteName->setPalette(p); - ui.diveSiteNotes->setPalette(p); -} diff --git a/qt-ui/simplewidgets.h b/qt-ui/simplewidgets.h index dde30335f..17f628392 100644 --- a/qt-ui/simplewidgets.h +++ b/qt-ui/simplewidgets.h @@ -228,40 +228,6 @@ private: Ui::FilterWidget ui; }; -#include "ui_locationInformation.h" - -class LocationInformationWidget : public QGroupBox { -Q_OBJECT -public: - LocationInformationWidget(QWidget *parent = 0); - -public slots: - void acceptChanges(); - void rejectChanges(); - - void showEvent(QShowEvent *); - - void setLocationId(uint32_t uuid); - void updateGpsCoordinates(void); - void markChangedWidget(QWidget *w); - void enableEdition(); - void resetState(); - void resetPallete(); - - void on_diveSiteCoordinates_textChanged(const QString& text); - void on_diveSiteDescription_textChanged(const QString& text); - void on_diveSiteName_textChanged(const QString& text); - void on_diveSiteNotes_textChanged(); -signals: - void informationManagementEnded(); - -private: - struct dive_site *currentDs; - Ui::LocationInformation ui; - bool modified; - QAction *closeAction, *acceptAction, *rejectAction; -}; - bool isGnome3Session(); QImage grayImage(const QImage &coloredImg); |