mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Start a user survey dialog
The idea is that a week after the user starts using Subsurface we ask them if they would like to submit a survey response. If you are running a development build, don't wait seven days. This patch doesn't do anything with the user's selections, doesn't submit anything to our server, etc. It's just a placeholder to tune what we should ask, etc. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
		
							parent
							
								
									64236388e4
								
							
						
					
					
						commit
						cdd3b3d9cd
					
				
					 6 changed files with 320 additions and 5 deletions
				
			
		|  | @ -24,7 +24,7 @@ | |||
| #include <fcntl.h> | ||||
| #include "divelistview.h" | ||||
| #include "starwidget.h" | ||||
| 
 | ||||
| #include "ssrf-version.h" | ||||
| #include "dive.h" | ||||
| #include "display.h" | ||||
| #include "divelist.h" | ||||
|  | @ -47,6 +47,7 @@ | |||
| #endif | ||||
| #include "divelogimportdialog.h" | ||||
| #include "divelogexportdialog.h" | ||||
| #include "usersurvey.h" | ||||
| #ifndef NO_USERMANUAL | ||||
| #include "usermanual.h" | ||||
| #endif | ||||
|  | @ -61,7 +62,8 @@ MainWindow::MainWindow() : QMainWindow(), | |||
| 	yearlyStatsModel(0), | ||||
| 	state(VIEWALL), | ||||
| 	updateManager(0), | ||||
| 	fakeDiveId(0) | ||||
| 	fakeDiveId(0), | ||||
| 	survey(0) | ||||
| { | ||||
| 	Q_ASSERT_X(m_Instance == NULL, "MainWindow", "MainWindow recreated!"); | ||||
| 	m_Instance = this; | ||||
|  | @ -814,10 +816,31 @@ void MainWindow::readSettings() | |||
| 	default_dive_computer_device = getSetting(s, "dive_computer_device"); | ||||
| 	s.endGroup(); | ||||
| 	loadRecentFiles(&s); | ||||
| 	checkSurvey(&s); | ||||
| } | ||||
| 
 | ||||
| #undef TOOLBOX_PREF_BUTTON | ||||
| 
 | ||||
| void MainWindow::checkSurvey(QSettings *s) | ||||
| { | ||||
| 	s->beginGroup("UserSurvey"); | ||||
| 	if (!s->contains("FirstUse42")) { | ||||
| 		QVariant value = QDate().currentDate(); | ||||
| 		s->setValue("FirstUse42", value); | ||||
| 	} else { | ||||
| 		// wait a week for production versions, but not at all for non-tagged builds
 | ||||
| 		QString ver(VERSION_STRING); | ||||
| 		int waitTime = ver.contains('-') ? -1 : 7; | ||||
| 		QDate firstUse42 = s->value("FirstUse42").toDate(); | ||||
| 		if (firstUse42.daysTo(QDate().currentDate()) > waitTime && !s->contains("SurveyDone")) { | ||||
| 			if (!survey) | ||||
| 				survey = new UserSurvey(this); | ||||
| 			survey->show(); | ||||
| 		} | ||||
| 	} | ||||
| 	s->endGroup(); | ||||
| } | ||||
| 
 | ||||
| void MainWindow::writeSettings() | ||||
| { | ||||
| 	QSettings settings; | ||||
|  |  | |||
|  | @ -79,6 +79,7 @@ public: | |||
| 	bool filesFromCommandLine() const; | ||||
| 	void setPlanNotes(const char *notes); | ||||
| 	void printPlan(); | ||||
| 	void checkSurvey(QSettings *s); | ||||
| private | ||||
| slots: | ||||
| 	/* file menu action */ | ||||
|  | @ -184,6 +185,7 @@ private: | |||
| 	bool plannerStateClean(); | ||||
| 	void createFakeDiveForAddAndPlan(); | ||||
| 	int fakeDiveId; | ||||
| 	QDialog *survey; | ||||
| }; | ||||
| 
 | ||||
| #endif // MAINWINDOW_H
 | ||||
|  |  | |||
							
								
								
									
										53
									
								
								qt-ui/usersurvey.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								qt-ui/usersurvey.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,53 @@ | |||
| #include <QShortcut> | ||||
| #include <QMessageBox> | ||||
| #include <QDebug> | ||||
| #include <QSettings> | ||||
| 
 | ||||
| #include "usersurvey.h" | ||||
| #include "ui_usersurvey.h" | ||||
| #include "ssrf-version.h" | ||||
| 
 | ||||
| #include "helpers.h" | ||||
| 
 | ||||
| UserSurvey::UserSurvey(QWidget *parent) : QDialog(parent), | ||||
| 	ui(new Ui::UserSurvey) | ||||
| { | ||||
| 	ui->setupUi(this); | ||||
| 	// fill in the system data
 | ||||
| } | ||||
| 
 | ||||
| UserSurvey::~UserSurvey() | ||||
| { | ||||
| 	delete ui; | ||||
| } | ||||
| 
 | ||||
| void UserSurvey::on_buttonBox_accepted() | ||||
| { | ||||
| 	// now we need to collect the data and submit it
 | ||||
| 	QSettings s; | ||||
| 	s.beginGroup("UserSurvey"); | ||||
| 	s.setValue("SurveyDone", "submitted"); | ||||
| 	hide(); | ||||
| } | ||||
| 
 | ||||
| void UserSurvey::on_buttonBox_rejected() | ||||
| { | ||||
| 	QMessageBox response(this); | ||||
| 	response.setText(tr("Should we ask you later?")); | ||||
| 	response.addButton(tr("Don't ask me again"), QMessageBox::RejectRole); | ||||
| 	response.addButton(tr("Ask Later"), QMessageBox::AcceptRole); | ||||
| 	response.setWindowTitle(tr("Ask again?")); // Not displayed on MacOSX as described in Qt API
 | ||||
| 	response.setIcon(QMessageBox::Question); | ||||
| 	response.setWindowModality(Qt::WindowModal); | ||||
| 	switch (response.exec()) { | ||||
| 	case QDialog::Accepted: | ||||
| 		// nothing to do here, we'll just ask again the next time they start
 | ||||
| 		break; | ||||
| 	case QDialog::Rejected: | ||||
| 		QSettings s; | ||||
| 		s.beginGroup("UserSurvey"); | ||||
| 		s.setValue("SurveyDone", "declined"); | ||||
| 		break; | ||||
| 	} | ||||
| 	hide(); | ||||
| } | ||||
							
								
								
									
										25
									
								
								qt-ui/usersurvey.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								qt-ui/usersurvey.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,25 @@ | |||
| #ifndef USERSURVEY_H | ||||
| #define USERSURVEY_H | ||||
| 
 | ||||
| #include <QDialog> | ||||
| 
 | ||||
| namespace Ui { | ||||
| 	class UserSurvey; | ||||
| } | ||||
| 
 | ||||
| class UserSurvey : public QDialog { | ||||
| 	Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
| 	explicit UserSurvey(QWidget *parent = 0); | ||||
| 	~UserSurvey(); | ||||
| 
 | ||||
| private | ||||
| slots: | ||||
| 	void on_buttonBox_accepted(); | ||||
| 	void on_buttonBox_rejected(); | ||||
| 
 | ||||
| private: | ||||
| 	Ui::UserSurvey *ui; | ||||
| }; | ||||
| #endif // USERSURVEY_H
 | ||||
							
								
								
									
										209
									
								
								qt-ui/usersurvey.ui
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								qt-ui/usersurvey.ui
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,209 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>UserSurvey</class> | ||||
|  <widget class="QDialog" name="UserSurvey"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>410</width> | ||||
|     <height>524</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>Dialog</string> | ||||
|   </property> | ||||
|   <widget class="QDialogButtonBox" name="buttonBox"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>40</x> | ||||
|      <y>490</y> | ||||
|      <width>341</width> | ||||
|      <height>32</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="orientation"> | ||||
|     <enum>Qt::Horizontal</enum> | ||||
|    </property> | ||||
|    <property name="standardButtons"> | ||||
|     <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QLabel" name="label"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>10</y> | ||||
|      <width>381</width> | ||||
|      <height>16</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="font"> | ||||
|     <font> | ||||
|      <pointsize>11</pointsize> | ||||
|     </font> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Subsurface User Survey</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QLabel" name="label_2"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>40</y> | ||||
|      <width>371</width> | ||||
|      <height>81</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>We would love to learn more about our users, their preferences and their usage habits. Please take a minute to fill out this form and submit it to the Subsurface team. Please select all options that apply to you.</string> | ||||
|    </property> | ||||
|    <property name="alignment"> | ||||
|     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> | ||||
|    </property> | ||||
|    <property name="wordWrap"> | ||||
|     <bool>true</bool> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="recreational"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>140</y> | ||||
|      <width>151</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Recreational DIver</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="tech"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>160</x> | ||||
|      <y>140</y> | ||||
|      <width>151</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Tech Diver</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="planning"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>160</y> | ||||
|      <width>211</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>Interested in dive planning</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="download"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>180</y> | ||||
|      <width>371</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>I am downloading dives from supported dive computer</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="import_2"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>200</y> | ||||
|      <width>371</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>I am importing dives from other software / sources</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="manual"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>220</y> | ||||
|      <width>371</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>I am manually entering dives</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QTextEdit" name="suggestions"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>270</y> | ||||
|      <width>371</width> | ||||
|      <height>101</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="html"> | ||||
|     <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> | ||||
| <html><head><meta name="qrichtext" content="1" /><style type="text/css"> | ||||
| p, li { white-space: pre-wrap; } | ||||
| </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> | ||||
| <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Suggestions and missing features</p></body></html></string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QCheckBox" name="companion"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>240</y> | ||||
|      <width>381</width> | ||||
|      <height>20</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="text"> | ||||
|     <string>I use the Android companion app to track dive locations</string> | ||||
|    </property> | ||||
|   </widget> | ||||
|   <widget class="QTextEdit" name="system"> | ||||
|    <property name="geometry"> | ||||
|     <rect> | ||||
|      <x>10</x> | ||||
|      <y>380</y> | ||||
|      <width>371</width> | ||||
|      <height>101</height> | ||||
|     </rect> | ||||
|    </property> | ||||
|    <property name="html"> | ||||
|     <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> | ||||
| <html><head><meta name="qrichtext" content="1" /><style type="text/css"> | ||||
| p, li { white-space: pre-wrap; } | ||||
| </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> | ||||
| <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Filled with some preferences (language, units, etc) plus system data (OS detailed version)</p></body></html></string> | ||||
|    </property> | ||||
|   </widget> | ||||
|  </widget> | ||||
|  <tabstops> | ||||
|   <tabstop>recreational</tabstop> | ||||
|   <tabstop>tech</tabstop> | ||||
|   <tabstop>planning</tabstop> | ||||
|   <tabstop>download</tabstop> | ||||
|   <tabstop>import_2</tabstop> | ||||
|   <tabstop>manual</tabstop> | ||||
|   <tabstop>companion</tabstop> | ||||
|   <tabstop>suggestions</tabstop> | ||||
|   <tabstop>system</tabstop> | ||||
|   <tabstop>buttonBox</tabstop> | ||||
|  </tabstops> | ||||
|  <resources/> | ||||
|  <connections/> | ||||
| </ui> | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue