summaryrefslogtreecommitdiffstats
path: root/desktop-widgets
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-09-29 23:19:11 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-10-03 10:01:13 -0700
commitf5fe6839c7672f775e35068f46fbb2d2e41b8bf5 (patch)
tree37fe93300f9fb809677d1ad3308ca0d76355b8b6 /desktop-widgets
parentf4ee8934243d6c924d810b5b2ec5a6c1f3b492f8 (diff)
downloadsubsurface-f5fe6839c7672f775e35068f46fbb2d2e41b8bf5.tar.gz
desktop: add trip selection dialog
A simple dialog to select a trip. Simply fill a QListWidget without the model/view rigmarole. So much less painful! Of course that means that the dialog has to be regenerated everytime it is used. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'desktop-widgets')
-rw-r--r--desktop-widgets/CMakeLists.txt3
-rw-r--r--desktop-widgets/tripselectiondialog.cpp47
-rw-r--r--desktop-widgets/tripselectiondialog.h23
-rw-r--r--desktop-widgets/tripselectiondialog.ui78
4 files changed, 151 insertions, 0 deletions
diff --git a/desktop-widgets/CMakeLists.txt b/desktop-widgets/CMakeLists.txt
index 5a1418d76..9531688d7 100644
--- a/desktop-widgets/CMakeLists.txt
+++ b/desktop-widgets/CMakeLists.txt
@@ -43,6 +43,7 @@ set (SUBSURFACE_UI
shifttimes.ui
tableview.ui
templateedit.ui
+ tripselectiodialog.ui
urldialog.ui
webservices.ui
tab-widgets/maintab.ui
@@ -130,6 +131,8 @@ set(SUBSURFACE_INTERFACE
tagwidget.h
textedit.cpp
textedit.h
+ tripselectiondialog.cpp
+ tripselectiondialog.h
updatemanager.cpp
updatemanager.h
)
diff --git a/desktop-widgets/tripselectiondialog.cpp b/desktop-widgets/tripselectiondialog.cpp
new file mode 100644
index 000000000..2623fdc10
--- /dev/null
+++ b/desktop-widgets/tripselectiondialog.cpp
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "tripselectiondialog.h"
+#include "core/trip.h"
+#include "core/qthelper.h"
+#include <QShortcut>
+#include <QPushButton>
+
+TripSelectionDialog::TripSelectionDialog(QWidget *parent) : QDialog(parent)
+{
+ ui.setupUi(this);
+ connect(ui.trips, &QListWidget::itemSelectionChanged, this, &TripSelectionDialog::selectionChanged);
+
+ QShortcut *close = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this);
+ connect(close, &QShortcut::activated, this, &QDialog::close);
+ QShortcut *quit = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this);
+ connect(quit, &QShortcut::activated, parent, &QWidget::close);
+
+ // We could use a model, but it seems barely worth the hassle.
+ QStringList list;
+ list.reserve(trip_table.nr);
+ for (int i = 0; i < trip_table.nr; ++i)
+ list.push_back(get_trip_string(trip_table.trips[i]));
+ ui.trips->addItems(list);
+}
+
+void TripSelectionDialog::selectionChanged()
+{
+ ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(selectedTrip() != nullptr);
+}
+
+dive_trip *TripSelectionDialog::selectedTrip() const
+{
+ // Accessing the selected index of a QListWidget is ridiculously cumbersome.
+ // Note that "currentItem" is a different beast.
+ QModelIndexList rows = ui.trips->selectionModel()->selectedRows();
+ if (rows.size() != 1)
+ return nullptr;
+ int idx = rows[0].row();
+ if (idx < 0 || idx >= trip_table.nr)
+ return nullptr;
+ return trip_table.trips[idx];
+}
+
+dive_trip *TripSelectionDialog::getTrip()
+{
+ return exec() ? selectedTrip() : nullptr;
+}
diff --git a/desktop-widgets/tripselectiondialog.h b/desktop-widgets/tripselectiondialog.h
new file mode 100644
index 000000000..9cef28e17
--- /dev/null
+++ b/desktop-widgets/tripselectiondialog.h
@@ -0,0 +1,23 @@
+// SPDX-License-Identifier: GPL-2.0
+#ifndef TRIPSELECTIONDIALOG_H
+#define TRIPSELECTIONDIALOG_H
+
+#include <QDialog>
+#include "ui_tripselectiondialog.h"
+
+struct dive_trip;
+
+class TripSelectionDialog : public QDialog {
+ Q_OBJECT
+private
+slots:
+ void selectionChanged();
+public:
+ TripSelectionDialog(QWidget *parent); // Must pass in MainWindow for QShortcut hackery.
+ dive_trip *getTrip(); // NULL if user canceled.
+private:
+ dive_trip *selectedTrip() const;
+ Ui::TripSelectionDialog ui;
+};
+
+#endif // TRIPSELECTIONDIALOG_H
diff --git a/desktop-widgets/tripselectiondialog.ui b/desktop-widgets/tripselectiondialog.ui
new file mode 100644
index 000000000..ae3946b04
--- /dev/null
+++ b/desktop-widgets/tripselectiondialog.ui
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TripSelectionDialog</class>
+ <widget class="QDialog" name="TripSelectionDialog">
+ <property name="windowModality">
+ <enum>Qt::WindowModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>560</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Select trip</string>
+ </property>
+ <property name="windowIcon">
+ <iconset>
+ <normalon>:subsurface-icon</normalon>
+ </iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QListWidget" name="trips">
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../subsurface.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>TripSelectionDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>TripSelectionDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>