Adding image management

Guido Lerch guido.lerch at gmail.com
Mon Oct 12 15:36:25 PDT 2015


Sorry but I felt I need to do this after I added images to my dives - I
love this feature!!!
This patch set is not complete and needs more testing but I wanted to
throw this out for feedback. I keep on testing as I did not test this fully.

What it should do is to allow the user to point to a location where
pictures are being
copied to automatically if the users wishes to do this.
For example, while testing I created a path on my drop box, so when I add
pictures
to my dives they are automatically (when selected in the preferences)
copied to my dropbox
location.
Now I can open my could storage from any of my computers and see my
pictures :-) if the
computer(s) sync with DropBox.

Most likely there are bugs which I will remove if you guys find this
useful, if not, it was
a good lesson for me to learn more about the code.

Sorry Dirk, no idea how I could have made the first patch smaller.

This is NOT DONE YET, I basically want to know if I should continue. Lot's
of checking is
still needed.

-- 
Best regards,
Guido
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.subsurface-divelog.org/pipermail/subsurface/attachments/20151013/d8539d0a/attachment-0001.html>
-------------- next part --------------
From 6c064ab0e04e046d2407a62630fcc9e3c0bd7a24 Mon Sep 17 00:00:00 2001
From: Guido Lerch <guido.lerch at gmail.com>
Date: Tue, 13 Oct 2015 00:20:05 +0200
Subject: [PATCH 1/2] Adding image management to preferences

Adding a feature where images can be managed by the application.
The user has to give a default path to the images, ideally something
accessible from several computers such as Box, DropBox or a NAS.

Signed-off-by: Guido Lerch <guido.lerch at gmail.com>
---
 pref.h                |   2 +
 qt-ui/preferences.cpp |  21 +++++
 qt-ui/preferences.h   |   4 +
 qt-ui/preferences.ui  | 235 ++++++++++++++++++++++++++++++++++++++++++++++----
 qthelper.cpp          |   5 ++
 5 files changed, 249 insertions(+), 18 deletions(-)

diff --git a/pref.h b/pref.h
index 84975aa..2705a45 100644
--- a/pref.h
+++ b/pref.h
@@ -118,6 +118,8 @@ struct preferences {
 	geocoding_prefs_t geocoding;
 	enum deco_mode deco_mode;
 	short conservatism_level;
+	bool manage_images;
+	char *image_location;
 };
 enum unit_system_values {
 	METRIC,
diff --git a/qt-ui/preferences.cpp b/qt-ui/preferences.cpp
index 6450c41..c47f364 100644
--- a/qt-ui/preferences.cpp
+++ b/qt-ui/preferences.cpp
@@ -250,6 +250,10 @@ void PreferencesDialog::setUiFromPrefs()
 	ui.first_item->setCurrentIndex(prefs.geocoding.category[0]);
 	ui.second_item->setCurrentIndex(prefs.geocoding.category[1]);
 	ui.third_item->setCurrentIndex(prefs.geocoding.category[2]);
+
+	// Images
+	ui.manage_images->setChecked(prefs.manage_images);
+	ui.image_location->setText(prefs.image_location);
 }
 
 void PreferencesDialog::restorePrefs()
@@ -430,6 +434,12 @@ void PreferencesDialog::syncSettings()
 	s.setValue("cat2", ui.third_item->currentIndex());
 	s.endGroup();
 
+	s.beginGroup("images");
+	s.setValue("manage", ui.manage_images->isChecked());
+	s.setValue("location", ui.image_location->text());
+
+	s.endGroup();
+
 	loadSettings();
 	emit settingsChanged();
 }
@@ -557,3 +567,14 @@ void PreferencesDialog::on_cloudDefaultFile_toggled(bool toggle)
 {
 	prefs.default_file_behavior = CLOUD_DEFAULT_FILE;
 }
+
+void PreferencesDialog::on_chooseImageLocation_clicked()
+{
+	QString oldDirectory = ui.image_location->text();
+	QString choosenDirectory = QFileDialog::getExistingDirectory(this, tr("Open Image location"), oldDirectory, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+	if (!choosenDirectory.isEmpty())
+		ui.image_location->setText(choosenDirectory + "/");
+	QDir di(ui.image_location->text());
+	if (!di.exists())
+		di.mkpath(ui.image_location->text());
+}
diff --git a/qt-ui/preferences.h b/qt-ui/preferences.h
index 326b1f9..d1b45a5 100644
--- a/qt-ui/preferences.h
+++ b/qt-ui/preferences.h
@@ -41,6 +41,10 @@ slots:
 	void facebookDisconnect();
 	void cloudPinNeeded();
 	void passwordUpdateSuccessfull();
+private slots:
+
+	void on_chooseImageLocation_clicked();
+
 private:
 	explicit PreferencesDialog(QWidget *parent = 0, Qt::WindowFlags f = 0);
 	void setUiFromPrefs();
diff --git a/qt-ui/preferences.ui b/qt-ui/preferences.ui
index de2d79b..8ec9cfe 100644
--- a/qt-ui/preferences.ui
+++ b/qt-ui/preferences.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>711</width>
+    <width>836</width>
     <height>662</height>
    </rect>
   </property>
@@ -19,7 +19,16 @@
    </iconset>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout_2">
-   <property name="margin">
+   <property name="leftMargin">
+    <number>5</number>
+   </property>
+   <property name="topMargin">
+    <number>5</number>
+   </property>
+   <property name="rightMargin">
+    <number>5</number>
+   </property>
+   <property name="bottomMargin">
     <number>5</number>
    </property>
    <item>
@@ -164,7 +173,7 @@
         </sizepolicy>
        </property>
        <property name="currentIndex">
-        <number>4</number>
+        <number>0</number>
        </property>
        <widget class="QWidget" name="defaults_page">
         <property name="sizePolicy">
@@ -177,7 +186,16 @@
          <property name="spacing">
           <number>5</number>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -186,7 +204,16 @@
             <string>Lists and tables</string>
            </property>
            <layout class="QHBoxLayout" name="horizontalLayout_11">
-            <property name="margin">
+            <property name="leftMargin">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
              <number>5</number>
             </property>
             <item>
@@ -224,7 +251,16 @@
             <property name="verticalSpacing">
              <number>5</number>
             </property>
-            <property name="margin">
+            <property name="leftMargin">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
              <number>5</number>
             </property>
             <item row="0" column="0">
@@ -328,7 +364,16 @@
             <property name="verticalSpacing">
              <number>5</number>
             </property>
-            <property name="margin">
+            <property name="leftMargin">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
              <number>5</number>
             </property>
             <item row="0" column="0">
@@ -354,7 +399,16 @@
             <string>Animations</string>
            </property>
            <layout class="QHBoxLayout" name="horizontalLayout_7">
-            <property name="margin">
+            <property name="leftMargin">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
              <number>5</number>
             </property>
             <item>
@@ -393,7 +447,16 @@
             <property name="spacing">
              <number>5</number>
             </property>
-            <property name="margin">
+            <property name="leftMargin">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
              <number>5</number>
             </property>
             <item>
@@ -407,6 +470,79 @@
           </widget>
          </item>
          <item>
+          <widget class="QGroupBox" name="groupBox_13">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>0</width>
+             <height>100</height>
+            </size>
+           </property>
+           <property name="title">
+            <string>Images</string>
+           </property>
+           <widget class="QCheckBox" name="manage_images">
+            <property name="geometry">
+             <rect>
+              <x>10</x>
+              <y>20</y>
+              <width>201</width>
+              <height>20</height>
+             </rect>
+            </property>
+            <property name="toolTip">
+             <string>Manage my picture location for me by copying the images I add to a default location, ideally DropBox, Box or a local NAS.</string>
+            </property>
+            <property name="text">
+             <string>Manage my images for me.</string>
+            </property>
+           </widget>
+           <widget class="QLabel" name="label_31">
+            <property name="geometry">
+             <rect>
+              <x>10</x>
+              <y>50</y>
+              <width>59</width>
+              <height>16</height>
+             </rect>
+            </property>
+            <property name="text">
+             <string>Location</string>
+            </property>
+           </widget>
+           <widget class="QWidget" name="horizontalLayoutWidget">
+            <property name="geometry">
+             <rect>
+              <x>80</x>
+              <y>50</y>
+              <width>591</width>
+              <height>21</height>
+             </rect>
+            </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_2">
+             <property name="sizeConstraint">
+              <enum>QLayout::SetMinimumSize</enum>
+             </property>
+             <item>
+              <widget class="QLineEdit" name="image_location"/>
+             </item>
+             <item>
+              <widget class="QToolButton" name="chooseImageLocation">
+               <property name="text">
+                <string>...</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </widget>
+         </item>
+         <item>
           <spacer name="verticalSpacer_2">
            <property name="orientation">
             <enum>Qt::Vertical</enum>
@@ -432,7 +568,16 @@
          <property name="spacing">
           <number>5</number>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -733,7 +878,16 @@
          <property name="spacing">
           <number>5</number>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -1027,7 +1181,16 @@
          <property name="sizeConstraint">
           <enum>QLayout::SetNoConstraint</enum>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -1111,7 +1274,16 @@
          <property name="spacing">
           <number>5</number>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -1341,7 +1513,16 @@
             <property name="spacing">
              <number>5</number>
             </property>
-            <property name="margin">
+            <property name="leftMargin">
+             <number>5</number>
+            </property>
+            <property name="topMargin">
+             <number>5</number>
+            </property>
+            <property name="rightMargin">
+             <number>5</number>
+            </property>
+            <property name="bottomMargin">
              <number>5</number>
             </property>
             <item>
@@ -1390,7 +1571,16 @@
          <property name="spacing">
           <number>5</number>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -1437,7 +1627,16 @@
          <property name="spacing">
           <number>5</number>
          </property>
-         <property name="margin">
+         <property name="leftMargin">
+          <number>5</number>
+         </property>
+         <property name="topMargin">
+          <number>5</number>
+         </property>
+         <property name="rightMargin">
+          <number>5</number>
+         </property>
+         <property name="bottomMargin">
           <number>5</number>
          </property>
          <item>
@@ -1870,14 +2069,14 @@
   </connection>
  </connections>
  <buttongroups>
+  <buttongroup name="buttonGroup"/>
+  <buttongroup name="defaultFileGroup"/>
   <buttongroup name="verticalSpeed"/>
   <buttongroup name="buttonGroup_2"/>
   <buttongroup name="buttonGroup_3"/>
   <buttongroup name="buttonGroup_4"/>
-  <buttongroup name="defaultFileGroup"/>
   <buttongroup name="buttonGroup_5"/>
   <buttongroup name="buttonGroup_6"/>
   <buttongroup name="buttonGroup_7"/>
-  <buttongroup name="buttonGroup"/>
  </buttongroups>
 </ui>
diff --git a/qthelper.cpp b/qthelper.cpp
index a963ad7..da85ffe 100644
--- a/qthelper.cpp
+++ b/qthelper.cpp
@@ -1536,6 +1536,11 @@ void loadPreferences()
 	GET_ENUM("cat2", taxonomy_category, geocoding.category[2]);
 	s.endGroup();
 
+	s.beginGroup("images");
+	GET_BOOL("manage", manage_images);
+	GET_TXT("location", image_location);
+	s.endGroup();
+
 }
 
 extern "C" bool isCloudUrl(const char *filename)
-- 
2.3.8 (Apple Git-58)

-------------- next part --------------
From e6f3c8bb2cc6474d1e60151153d236f8567c1298 Mon Sep 17 00:00:00 2001
From: Guido Lerch <guido.lerch at gmail.com>
Date: Tue, 13 Oct 2015 00:24:45 +0200
Subject: [PATCH 2/2] Adding image management

Implementing that images are copied from their origin to the location
set in the preferences.
My motivation was that I added images to my files and then found that
I cannot see them in my other computer.
I know there is a function to find moved images but I found this implementation
a lot more intuitive, sorry.
I am not done but whanted to toss this over the wall for feedback.

Error checking, full testing is not done yet. I tried to implement this without
changing any existing functionality.

Signed-off-by: Guido Lerch <guido.lerch at gmail.com>
---
 dive.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/dive.c b/dive.c
index 1810109..a9532ad 100644
--- a/dive.c
+++ b/dive.c
@@ -3297,6 +3297,13 @@ bool picture_check_valid(char *filename, int shift_time)
 
 void dive_create_picture(struct dive *dive, char *filename, int shift_time, bool match_all)
 {
+	char *new_filename;
+	if (prefs.manage_images) {
+		copy_image_and_overwrite(filename, prefs.image_location, get_file_name(filename));
+		new_filename = strdup(strcat(prefs.image_location,get_file_name(filename)));
+	} else {
+		new_filename = strdup(filename);
+	}
 	timestamp_t timestamp = picture_get_timestamp(filename);
 	if (!new_picture_for_dive(dive, filename))
 		return;
@@ -3304,12 +3311,13 @@ void dive_create_picture(struct dive *dive, char *filename, int shift_time, bool
 		return;
 
 	struct picture *picture = alloc_picture();
-	picture->filename = strdup(filename);
+	picture->filename = strdup(new_filename);
 	picture->offset.seconds = timestamp - dive->when + shift_time;
 	picture_load_exif_data(picture);
 
 	dive_add_picture(dive, picture);
 	dive_set_geodata_from_picture(dive, picture);
+	free(new_filename);
 }
 
 void dive_add_picture(struct dive *dive, struct picture *newpic)
-- 
2.3.8 (Apple Git-58)



More information about the subsurface mailing list