Added more buttons to the images tab. Load images from the database and display thumbnails added. Added support for jpeg files. Rename pictures in the database to .png. Added temporary images_list, images_count and images_current variables to the product record.

Fri, 20 Jan 2023 16:44:08 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Fri, 20 Jan 2023 16:44:08 +0100
changeset 467
c5f6f3f1b714
parent 466
68ef2cc3e8d2
child 468
b21da6f583be

Added more buttons to the images tab. Load images from the database and display thumbnails added. Added support for jpeg files. Rename pictures in the database to .png. Added temporary images_list, images_count and images_current variables to the product record.

src/EditProduct.cpp file | annotate | diff | comparison | revisions
src/EditProduct.h file | annotate | diff | comparison | revisions
src/EditProductTab13.cpp file | annotate | diff | comparison | revisions
src/global.h file | annotate | diff | comparison | revisions
translations/bmsapp_en.ts file | annotate | diff | comparison | revisions
translations/bmsapp_nl.ts file | annotate | diff | comparison | revisions
ui/EditProduct.ui file | annotate | diff | comparison | revisions
--- a/src/EditProduct.cpp	Wed Jan 18 17:08:25 2023 +0100
+++ b/src/EditProduct.cpp	Fri Jan 20 16:44:08 2023 +0100
@@ -151,6 +151,8 @@
                 }
 	    }
 	}
+	product->images_count = -1;	/* Not yet loaded */
+	product->images_dirty = false;
 
     } else {
 	/* New product, set some defaults */
@@ -280,6 +282,8 @@
 	product->divide_type = product->divide_parts = product->divide_part = 0;
 	product->divide_size = 0;
 	product->divide_factor = 1;
+	product->images_count = -1;
+	product->images_dirty = false;
     }
 
     // Tab generic.
@@ -755,6 +759,11 @@
 
     /* All signals from tab Images */
     connect(ui->addImage, SIGNAL(clicked()), this, SLOT(addImage_clicked()));
+    connect(ui->delImage, SIGNAL(clicked()), this, SLOT(delImage_clicked()));
+    connect(ui->nextImage, SIGNAL(clicked()), this, SLOT(nextImage_clicked()));
+    connect(ui->prevImage, SIGNAL(clicked()), this, SLOT(prevImage_clicked()));
+    connect(ui->downloadImage, SIGNAL(clicked()), this, SLOT(downloadImage_clicked()));
+    connect(ui->printImage, SIGNAL(clicked()), this, SLOT(printImage_clicked()));
 
     setStage();
 
--- a/src/EditProduct.h	Wed Jan 18 17:08:25 2023 +0100
+++ b/src/EditProduct.h	Fri Jan 20 16:44:08 2023 +0100
@@ -259,6 +259,12 @@
     void taste_notes_changed();
 
     void addImage_clicked();
+    void delImage_clicked();
+    void nextImage_clicked();
+    void prevImage_clicked();
+    void downloadImage_clicked();
+    void printImage_clicked();
+    void selectImage_clicked(int val);
 
     /* Modified progress bars */
     void ferment_perc_mash_valueChanged(int value);
@@ -378,7 +384,8 @@
     bool block_yeast(int stage, int use);
     void check_waters();
     void images_Init();
-    bool images_loadFile(const QString &fileName);
+    void images_Thumbnails();
+    void images_Main(int id);
 };
 
 #endif
--- a/src/EditProductTab13.cpp	Wed Jan 18 17:08:25 2023 +0100
+++ b/src/EditProductTab13.cpp	Fri Jan 20 16:44:08 2023 +0100
@@ -19,17 +19,107 @@
 
 void EditProduct::images_Init()
 {
-	qDebug() << "images_Init()";
+    qDebug() << "images_Init()";
 
 	// Start spinner
-	// Clean old picture areas
-	// Load images data for this product uuid
-	// Show thumbnails on the left.
+
+    /*
+     * Clean old picture areas.
+     */
+
+    /*
+     * Load images data for this product uuid.
+     */
+    if (product->images_count < 0) {
+	QSqlQuery query;
+
+	qDebug() << "  loading data";
+	query.prepare("SELECT * FROM products_pics WHERE uuid=:uuid");
+	query.bindValue(":uuid", product->uuid);
+	query.exec();
+
+	if (query.lastError().isValid()) {
+            qWarning() << "images_init()" << query.lastError();
+            QMessageBox::warning(this, tr("Database error"), tr("MySQL error: %1\n%2\n%3")
+                .arg(query.lastError().nativeErrorCode()).arg(query.lastError().driverText()).arg(query.lastError().databaseText()));
+	}
+	product->images_count = 0;
+
+	while (query.next()) {
+	    Images i;
+	    qDebug() << product->images_count << query.value("pic_data").toByteArray().size();
+	    i.pic_type = query.value("pic_type").toInt();
+	    i.pic_data = query.value("pic_data").toByteArray();
+	    i.pic_comment = query.value("pic_comment").toString();
+	    i.filename = query.value("filename").toString();
+	    i.timestamp = query.value("timestamp").toDateTime();
+	    product->images_list.append(i);
+	    product->images_count++;
+	}
+	qDebug() << "  loaded" << product->images_count << product->images_list.size();
+	if (product->images_count < 1)
+	    product->images_current = -1;
+	else
+	    product->images_current = 0;
+    }
+
+    images_Thumbnails();
+    if (product->images_current >= 0) {
+    	ui->filmStrip->setCurrentRow(product->images_current);
+    }
+    images_Main(product->images_current);
+
 	// If any, show picture 1
 	// Stop spinner
 }
 
 
+/*
+ * Show thumbnails on the left.
+ */
+void EditProduct::images_Thumbnails()
+{
+    QList<QListWidgetItem*> items = ui->filmStrip->selectedItems();
+    foreach(QListWidgetItem * item, items) {
+	delete ui->filmStrip->takeItem(ui->filmStrip->row(item));
+    }
+
+    for (int i = 0; i < product->images_list.size(); i++) {
+	QListWidgetItem* newItem = new QListWidgetItem();
+	QString text = QCoreApplication::translate("PicType", g_prod_pic_types[product->images_list.at(i).pic_type]);
+	if (product->images_list.at(i).filename != "")
+	    text.append("\n" + product->images_list.at(i).filename);
+	if (product->images_list.at(i).pic_comment != "")
+	    text.append("\n" + product->images_list.at(i).pic_comment);
+	// product->images_list.at(i).timestamp
+	newItem->setText(text);
+	newItem->setBackground(QColor(0x45,0x53,0x64));
+
+	QPixmap outPixmap = QPixmap();
+	outPixmap.loadFromData(product->images_list.at(i).pic_data);
+	qDebug() << "  " << outPixmap.width() << "x" << outPixmap.height() << "size" << outPixmap.size() << product->images_list.at(i).filename;
+	if (outPixmap.width() > 320 || outPixmap.height() > 240)
+	    newItem->setIcon(QIcon(outPixmap.scaled(320, 240, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
+	else
+	    newItem->setIcon(QIcon(outPixmap));
+
+	ui->filmStrip->addItem(newItem);
+    }
+}
+
+
+void EditProduct::images_Main(int id)
+{
+    qDebug() << "  Main(" << id << ")";
+
+    ui->prevImage->setEnabled((product->images_count > 0 && product->images_current > 0) ? true:false);
+    ui->nextImage->setEnabled((product->images_count > 0 && (product->images_current + 1) < product->images_count) ? true:false);
+    ui->downloadImage->setEnabled((product->images_count > 0) ? true:false);
+    ui->printImage->setEnabled((product->images_count > 0) ? true:false);
+    ui->delImage->setEnabled((product->images_count > 0) ? true:false);
+}
+
+
 void EditProduct::addImage_clicked()
 {
     QString fileName;
@@ -42,7 +132,7 @@
     /* Only a few image formats are valid */
     QStringList mimeTypeFilters ({ "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml" });
     dialog1.setMimeTypeFilters(mimeTypeFilters);
-    dialog1.setNameFilter("Images (*.bmp *.BMP *.gif *.GIF *.jpg *.JPG *.png *.PNG *.svg *.SVG)");
+    dialog1.setNameFilter("Images (*.bmp *.BMP *.gif *.GIF *.jpg *.JPG *.jpeg *.JPEG *.png *.PNG *.svg *.SVG)");
     dialog1.setAcceptMode(QFileDialog::AcceptOpen);
 //    dialog1.setOption(QFileDialog::DontUseNativeDialog);
     if (dialog1.exec() != QDialog::Accepted)
@@ -66,7 +156,7 @@
 
     QBuffer buffer(&imageByteArray);
     buffer.open(QIODevice::WriteOnly);
-    newImage.save(&buffer, "PNG");
+    newImage.save(&buffer, "PNG");	/* Convert to lossless .png format. */
 
     /*
      * Now that we have selected a valid image, create a new dialog so
@@ -132,10 +222,10 @@
     query.prepare("INSERT INTO products_pics SET uuid=:uuid, pic_type=:pic_type, pic_data=:pic_data, "
 		  "pic_comment=:pic_comment, filename=:filename, timestamp=:timestamp");
     query.bindValue(":uuid", product->uuid);
-    query.bindValue(":pic_type", g_prod_pic_types[typeEdit->currentIndex()]);
+    query.bindValue(":pic_type", typeEdit->currentIndex());
     query.bindValue(":pic_data", imageByteArray);
     query.bindValue(":pic_comment", commentEdit->text());
-    query.bindValue(":filename", fi.fileName());
+    query.bindValue(":filename", fi.completeBaseName() + ".png");	/* The image is converted to .png */
     query.bindValue(":timestamp", fi.lastModified());
 
     query.exec();
@@ -151,3 +241,54 @@
 }
 
 
+void EditProduct::delImage_clicked()
+{
+    qDebug() << "delImage_clicked()" << product->images_current << ui->filmStrip->currentRow();
+}
+
+
+void EditProduct::nextImage_clicked()
+{
+    qDebug() << "nextImage_clicked()" << product->images_current << ui->filmStrip->currentRow();
+
+    if (product->images_count >= 0) {
+	if ((product->images_current + 1) < product->images_count) {
+	    product->images_current++;
+	    ui->filmStrip->setCurrentRow(product->images_current);
+	    images_Main(product->images_current);
+	}
+    }
+}
+
+
+void EditProduct::prevImage_clicked()
+{
+    qDebug() << "prevImage_clicked()" << product->images_current << ui->filmStrip->currentRow();
+
+    if (product->images_count >= 0) {
+	if (product->images_current > 0) {
+	    product->images_current--;
+	    ui->filmStrip->setCurrentRow(product->images_current);
+	    images_Main(product->images_current);
+	}
+    }
+}
+
+
+void EditProduct::downloadImage_clicked()
+{
+    qDebug() << "downloadImage_clicked()" << product->images_current << ui->filmStrip->currentRow();
+}
+
+
+void EditProduct::printImage_clicked()
+{
+    qDebug() << "printImage_clicked()" << product->images_current << ui->filmStrip->currentRow();
+}
+
+
+void EditProduct::selectImage_clicked(int val)
+{
+    qDebug() << "selectImage_clicked()" << val << product->images_current << ui->filmStrip->currentRow();
+}
+
--- a/src/global.h	Wed Jan 18 17:08:25 2023 +0100
+++ b/src/global.h	Fri Jan 20 16:44:08 2023 +0100
@@ -237,6 +237,16 @@
 };
 
 
+struct Images
+{
+    int		pic_type;
+    QByteArray	pic_data;
+    QString	pic_comment;
+    QString	filename;
+    QDateTime	timestamp;
+};
+
+
 struct Equipment
 {
     QString	name;
@@ -687,6 +697,10 @@
     double      ws_sodium;
     double      ws_magnesium;
     double      ws_total_alkalinity;
+    QList<Images>	images_list;	///< List of loaded images.
+    int		images_count;		///< -1 if not yet loaded.
+    int		images_current;		///< -1 or image in focus.
+    bool	images_dirty;
 };
 
 
--- a/translations/bmsapp_en.ts	Wed Jan 18 17:08:25 2023 +0100
+++ b/translations/bmsapp_en.ts	Fri Jan 20 16:44:08 2023 +0100
@@ -2336,12 +2336,14 @@
     </message>
     <message>
         <location filename="../ui/EditProduct.ui" line="55"/>
+        <location filename="../ui/EditProduct.ui" line="12246"/>
         <location filename="../src/EditProductTab9.cpp" line="552"/>
         <source>Save</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../ui/EditProduct.ui" line="75"/>
+        <location filename="../ui/EditProduct.ui" line="12195"/>
         <location filename="../src/EditProductTab3.cpp" line="74"/>
         <location filename="../src/EditProductTab3.cpp" line="162"/>
         <location filename="../src/EditProductTab4.cpp" line="56"/>
@@ -2857,7 +2859,7 @@
         <location filename="../ui/EditProduct.ui" line="3222"/>
         <location filename="../ui/EditProduct.ui" line="4072"/>
         <location filename="../ui/EditProduct.ui" line="4227"/>
-        <location filename="../ui/EditProduct.ui" line="12142"/>
+        <location filename="../ui/EditProduct.ui" line="12132"/>
         <location filename="../src/EditProductExport.cpp" line="866"/>
         <source>Add</source>
         <translation type="unfinished"></translation>
@@ -4098,12 +4100,23 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ui/EditProduct.ui" line="12161"/>
+        <location filename="../ui/EditProduct.ui" line="12212"/>
+        <source>Previous</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui/EditProduct.ui" line="12229"/>
+        <source>Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui/EditProduct.ui" line="12282"/>
         <source>Export</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../ui/EditProduct.ui" line="12178"/>
+        <location filename="../ui/EditProduct.ui" line="12263"/>
+        <location filename="../ui/EditProduct.ui" line="12299"/>
         <source>Print</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4138,48 +4151,48 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="303"/>
+        <location filename="../src/EditProduct.cpp" line="307"/>
         <source>%1, part %2 of %3</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="832"/>
+        <location filename="../src/EditProduct.cpp" line="841"/>
         <source>BMSapp - Add new product</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="834"/>
+        <location filename="../src/EditProduct.cpp" line="843"/>
         <source>BMSapp - Edit %1 - %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="850"/>
-        <location filename="../src/EditProduct.cpp" line="854"/>
+        <location filename="../src/EditProduct.cpp" line="859"/>
+        <location filename="../src/EditProduct.cpp" line="863"/>
         <source>Edit Product</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="850"/>
+        <location filename="../src/EditProduct.cpp" line="859"/>
         <source>Name empty or too short.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="854"/>
+        <location filename="../src/EditProduct.cpp" line="863"/>
         <source>No beerstyle selected.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="893"/>
+        <location filename="../src/EditProduct.cpp" line="902"/>
         <source>Delete product</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="917"/>
+        <location filename="../src/EditProduct.cpp" line="926"/>
         <source>Product changed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="917"/>
+        <location filename="../src/EditProduct.cpp" line="926"/>
         <source>The product has been modified. Save changes?</source>
         <translation type="unfinished"></translation>
     </message>
@@ -4304,7 +4317,7 @@
         <location filename="../src/EditProductTab5.cpp" line="399"/>
         <location filename="../src/EditProductTab6.cpp" line="896"/>
         <location filename="../src/EditProductTab7.cpp" line="306"/>
-        <location filename="../src/EditProduct.cpp" line="893"/>
+        <location filename="../src/EditProduct.cpp" line="902"/>
         <source>Delete %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -5225,30 +5238,49 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProductTab13.cpp" line="41"/>
+        <location filename="../src/EditProductTab13.cpp" line="121"/>
         <source>Open File</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProductTab13.cpp" line="61"/>
+        <location filename="../src/EditProductTab13.cpp" line="142"/>
         <source>Cannot load %1: %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProductTab13.cpp" line="89"/>
+        <location filename="../src/EditProductTab13.cpp" line="170"/>
         <source>Image here</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProductTab13.cpp" line="97"/>
+        <location filename="../src/EditProductTab13.cpp" line="180"/>
         <source>Image type:</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../src/EditProductTab13.cpp" line="110"/>
+        <location filename="../src/EditProductTab13.cpp" line="193"/>
         <source>Image comment:</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="200"/>
+        <source>The comment for this image.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="43"/>
+        <location filename="../src/EditProductTab13.cpp" line="225"/>
+        <source>Database error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="43"/>
+        <location filename="../src/EditProductTab13.cpp" line="225"/>
+        <source>MySQL error: %1
+%2
+%3</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>EditProfileFerment</name>
--- a/translations/bmsapp_nl.ts	Wed Jan 18 17:08:25 2023 +0100
+++ b/translations/bmsapp_nl.ts	Fri Jan 20 16:44:08 2023 +0100
@@ -2636,12 +2636,14 @@
     </message>
     <message>
         <location filename="../ui/EditProduct.ui" line="55"/>
+        <location filename="../ui/EditProduct.ui" line="12246"/>
         <location filename="../src/EditProductTab9.cpp" line="552"/>
         <source>Save</source>
         <translation>Bewaar</translation>
     </message>
     <message>
         <location filename="../ui/EditProduct.ui" line="75"/>
+        <location filename="../ui/EditProduct.ui" line="12195"/>
         <location filename="../src/EditProductTab3.cpp" line="74"/>
         <location filename="../src/EditProductTab3.cpp" line="162"/>
         <location filename="../src/EditProductTab4.cpp" line="56"/>
@@ -3056,7 +3058,7 @@
         <location filename="../ui/EditProduct.ui" line="3222"/>
         <location filename="../ui/EditProduct.ui" line="4072"/>
         <location filename="../ui/EditProduct.ui" line="4227"/>
-        <location filename="../ui/EditProduct.ui" line="12142"/>
+        <location filename="../ui/EditProduct.ui" line="12132"/>
         <location filename="../src/EditProductExport.cpp" line="866"/>
         <source>Add</source>
         <translation>Nieuw</translation>
@@ -4538,12 +4540,23 @@
         <translation>Plaatjes</translation>
     </message>
     <message>
-        <location filename="../ui/EditProduct.ui" line="12161"/>
+        <location filename="../ui/EditProduct.ui" line="12212"/>
+        <source>Previous</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui/EditProduct.ui" line="12229"/>
+        <source>Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../ui/EditProduct.ui" line="12282"/>
         <source>Export</source>
         <translation>Exporteer</translation>
     </message>
     <message>
-        <location filename="../ui/EditProduct.ui" line="12178"/>
+        <location filename="../ui/EditProduct.ui" line="12263"/>
+        <location filename="../ui/EditProduct.ui" line="12299"/>
         <source>Print</source>
         <translation>Print</translation>
     </message>
@@ -4563,7 +4576,7 @@
         <translation>Mout</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="834"/>
+        <location filename="../src/EditProduct.cpp" line="843"/>
         <source>BMSapp - Edit %1 - %2</source>
         <translation>BMSapp - Wijzig %1 - %2</translation>
     </message>
@@ -4611,15 +4624,17 @@
         <translation>Zuurstof</translation>
     </message>
     <message>
+        <location filename="../src/EditProductTab13.cpp" line="43"/>
+        <location filename="../src/EditProductTab13.cpp" line="225"/>
         <source>Database error</source>
-        <translation type="vanished">Database fout</translation>
+        <translation>Database fout</translation>
     </message>
     <message>
         <source>MySQL error: record %1 not found</source>
         <translation type="vanished">MySQL fout: record %1 niet gevonden</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="303"/>
+        <location filename="../src/EditProduct.cpp" line="307"/>
         <source>%1, part %2 of %3</source>
         <translation>%1, deel %2 van %3</translation>
     </message>
@@ -4628,7 +4643,7 @@
         <translation type="vanished">Koken %1 minuten</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="832"/>
+        <location filename="../src/EditProduct.cpp" line="841"/>
         <source>BMSapp - Add new product</source>
         <translation>BMSapp - Nieuw product</translation>
     </message>
@@ -4637,41 +4652,43 @@
         <translation type="vanished">BMSapp - Wijzig product %1</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="850"/>
-        <location filename="../src/EditProduct.cpp" line="854"/>
+        <location filename="../src/EditProduct.cpp" line="859"/>
+        <location filename="../src/EditProduct.cpp" line="863"/>
         <source>Edit Product</source>
         <translation>Wijzig Product</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="850"/>
+        <location filename="../src/EditProduct.cpp" line="859"/>
         <source>Name empty or too short.</source>
         <translation>De naam is leeg of te kort.</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="854"/>
+        <location filename="../src/EditProduct.cpp" line="863"/>
         <source>No beerstyle selected.</source>
         <translation>Geen bierstijl gekozen.</translation>
     </message>
     <message>
+        <location filename="../src/EditProductTab13.cpp" line="43"/>
+        <location filename="../src/EditProductTab13.cpp" line="225"/>
         <source>MySQL error: %1
 %2
 %3</source>
-        <translation type="vanished">MySQL fout: %1
+        <translation>MySQL fout: %1
 %2
 %3</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="893"/>
+        <location filename="../src/EditProduct.cpp" line="902"/>
         <source>Delete product</source>
         <translation>Verwijder product</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="917"/>
+        <location filename="../src/EditProduct.cpp" line="926"/>
         <source>Product changed</source>
         <translation>Product gewijzigd</translation>
     </message>
     <message>
-        <location filename="../src/EditProduct.cpp" line="917"/>
+        <location filename="../src/EditProduct.cpp" line="926"/>
         <source>The product has been modified. Save changes?</source>
         <translation>Het product is gewijzigd. Wijzigingen opslaan?</translation>
     </message>
@@ -4808,7 +4825,7 @@
         <location filename="../src/EditProductTab5.cpp" line="399"/>
         <location filename="../src/EditProductTab6.cpp" line="896"/>
         <location filename="../src/EditProductTab7.cpp" line="306"/>
-        <location filename="../src/EditProduct.cpp" line="893"/>
+        <location filename="../src/EditProduct.cpp" line="902"/>
         <source>Delete %1</source>
         <translation>Verwijder %1</translation>
     </message>
@@ -5825,29 +5842,34 @@
         <translation>Bevestig dat het proeven gedaan is en opmerkingen ingevuld zijn.</translation>
     </message>
     <message>
-        <location filename="../src/EditProductTab13.cpp" line="41"/>
+        <location filename="../src/EditProductTab13.cpp" line="121"/>
         <source>Open File</source>
-        <translation type="unfinished">Open bestand</translation>
-    </message>
-    <message>
-        <location filename="../src/EditProductTab13.cpp" line="61"/>
+        <translation>Open bestand</translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="142"/>
         <source>Cannot load %1: %2</source>
-        <translation type="unfinished">Kan niet laden %1: %2</translation>
-    </message>
-    <message>
-        <location filename="../src/EditProductTab13.cpp" line="89"/>
+        <translation>Kan niet laden %1: %2</translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="170"/>
         <source>Image here</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/EditProductTab13.cpp" line="97"/>
+        <translation>Plaatje hier</translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="180"/>
         <source>Image type:</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../src/EditProductTab13.cpp" line="110"/>
+        <translation>Soort plaatje:</translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="193"/>
         <source>Image comment:</source>
-        <translation type="unfinished"></translation>
+        <translation>Bijschrift:</translation>
+    </message>
+    <message>
+        <location filename="../src/EditProductTab13.cpp" line="200"/>
+        <source>The comment for this image.</source>
+        <translation>Het bijschrift of commentaar bij dit plaatje.</translation>
     </message>
 </context>
 <context>
--- a/ui/EditProduct.ui	Wed Jan 18 17:08:25 2023 +0100
+++ b/ui/EditProduct.ui	Fri Jan 20 16:44:08 2023 +0100
@@ -12119,20 +12119,10 @@
        <attribute name="title">
         <string>Images</string>
        </attribute>
-       <widget class="QListView" name="filmView">
-        <property name="geometry">
-         <rect>
-          <x>10</x>
-          <y>10</y>
-          <width>181</width>
-          <height>451</height>
-         </rect>
-        </property>
-       </widget>
        <widget class="QPushButton" name="addImage">
         <property name="geometry">
          <rect>
-          <x>60</x>
+          <x>950</x>
           <y>470</y>
           <width>80</width>
           <height>23</height>
@@ -12146,6 +12136,137 @@
           <normaloff>:/icons/silk/image_add.png</normaloff>:/icons/silk/image_add.png</iconset>
         </property>
        </widget>
+       <widget class="QListWidget" name="filmStrip">
+        <property name="geometry">
+         <rect>
+          <x>10</x>
+          <y>10</y>
+          <width>346</width>
+          <height>491</height>
+         </rect>
+        </property>
+        <property name="verticalScrollBarPolicy">
+         <enum>Qt::ScrollBarAlwaysOn</enum>
+        </property>
+        <property name="horizontalScrollBarPolicy">
+         <enum>Qt::ScrollBarAlwaysOff</enum>
+        </property>
+        <property name="tabKeyNavigation">
+         <bool>true</bool>
+        </property>
+        <property name="defaultDropAction">
+         <enum>Qt::IgnoreAction</enum>
+        </property>
+        <property name="iconSize">
+         <size>
+          <width>330</width>
+          <height>330</height>
+         </size>
+        </property>
+        <property name="textElideMode">
+         <enum>Qt::ElideRight</enum>
+        </property>
+        <property name="movement">
+         <enum>QListView::Static</enum>
+        </property>
+        <property name="resizeMode">
+         <enum>QListView::Fixed</enum>
+        </property>
+        <property name="layoutMode">
+         <enum>QListView::Batched</enum>
+        </property>
+        <property name="spacing">
+         <number>5</number>
+        </property>
+        <property name="viewMode">
+         <enum>QListView::IconMode</enum>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="delImage">
+        <property name="geometry">
+         <rect>
+          <x>1060</x>
+          <y>470</y>
+          <width>80</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Delete</string>
+        </property>
+        <property name="icon">
+         <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
+          <normaloff>:/icons/silk/image_delete.png</normaloff>:/icons/silk/image_delete.png</iconset>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="prevImage">
+        <property name="geometry">
+         <rect>
+          <x>390</x>
+          <y>470</y>
+          <width>80</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Previous</string>
+        </property>
+        <property name="icon">
+         <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
+          <normaloff>:/icons/silk/resultset_previous.png</normaloff>:/icons/silk/resultset_previous.png</iconset>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="nextImage">
+        <property name="geometry">
+         <rect>
+          <x>500</x>
+          <y>470</y>
+          <width>80</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Next</string>
+        </property>
+        <property name="icon">
+         <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
+          <normaloff>:/icons/silk/resultset_next.png</normaloff>:/icons/silk/resultset_next.png</iconset>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="downloadImage">
+        <property name="geometry">
+         <rect>
+          <x>670</x>
+          <y>470</y>
+          <width>80</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Save</string>
+        </property>
+        <property name="icon">
+         <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
+          <normaloff>:/icons/silk/disk.png</normaloff>:/icons/silk/disk.png</iconset>
+        </property>
+       </widget>
+       <widget class="QPushButton" name="printImage">
+        <property name="geometry">
+         <rect>
+          <x>780</x>
+          <y>470</y>
+          <width>80</width>
+          <height>23</height>
+         </rect>
+        </property>
+        <property name="text">
+         <string>Print</string>
+        </property>
+        <property name="icon">
+         <iconset resource="../../../../../../home/mbroek/MyProjects/bmsapp/resources/icons.qrc">
+          <normaloff>:/icons/silk/printer.png</normaloff>:/icons/silk/printer.png</iconset>
+        </property>
+       </widget>
       </widget>
      </widget>
      <widget class="QPushButton" name="exportButton">

mercurial