From a22a7606100874273076c7aec9e73971c468890c Mon Sep 17 00:00:00 2001
From: Pierre-Antoine Rouby <pierre-antoine.rouby@inrae.fr>
Date: Fri, 28 Jul 2023 09:56:47 +0200
Subject: [PATCH] About: Update about window and add VERSION file.

---
 .gitlab-ci.yml                        |  12 +++-
 VERSION                               |   1 +
 packages/linux.sh                     |   1 +
 packages/version.sh                   |  10 +++
 packages/windows.bat                  |   1 +
 src/VERSION                           |   1 +
 src/View/ASubWindow.py                |  25 +++++++
 src/View/About/Window.py              |  20 ++++++
 src/View/ui/about.ui                  |  90 +++++++++++++++++---------
 src/View/ui/ressources/Logo-INRAE.png | Bin 0 -> 8635 bytes
 10 files changed, 130 insertions(+), 31 deletions(-)
 create mode 100644 VERSION
 create mode 100755 packages/version.sh
 create mode 120000 src/VERSION
 create mode 100644 src/View/ui/ressources/Logo-INRAE.png

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5bb9624c..014dde47 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,8 +10,14 @@ stages:
 
 build:
   stage: build
+  tags:
+    - linux
   script:
-    - echo "TODO build pamhyr"
+    - cd packages
+    - ./version.sh "$CI_COMMIT_BRANCH" "$CI_COMMIT_TAG" "$CI_COMMIT_SHORT_SHA"
+  artifacts:
+    paths:
+      - VERSION
 
 build-lang:
   stage: build
@@ -45,6 +51,8 @@ linux-package:
   needs:
     - job: build-lang
       artifacts: true
+    - job: build
+      artifacts: true
   rules:
     - if: $CI_COMMIT_BRANCH == 'master' || $CI_COMMIT_TAG
   artifacts:
@@ -62,6 +70,8 @@ windows-package:
   needs:
     - job: build-lang
       artifacts: true
+    - job: build
+      artifacts: true
   rules:
     - if: $CI_COMMIT_BRANCH == 'master' || $CI_COMMIT_TAG
   artifacts:
diff --git a/VERSION b/VERSION
new file mode 100644
index 00000000..5664e303
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+git
diff --git a/packages/linux.sh b/packages/linux.sh
index 1cd72d28..9924eb0b 100755
--- a/packages/linux.sh
+++ b/packages/linux.sh
@@ -35,6 +35,7 @@ cp -r ../src/View/ui/*.ui dist/pamhyr/View/ui/
 mkdir -p dist/pamhyr/lang
 cp -r ../src/lang/*.qm dist/pamhyr/lang/
 
+cp ../VERSION dist/pamhyr/
 
 echo " *** MAKE SRC PACKAGE"
 
diff --git a/packages/version.sh b/packages/version.sh
new file mode 100755
index 00000000..aa769b83
--- /dev/null
+++ b/packages/version.sh
@@ -0,0 +1,10 @@
+#! /bin/sh
+
+# ./version BRANCH TAG COMMIT
+
+if [ -z $2 ];
+then
+    echo "$1-$3" > ../VERSION
+else
+    echo "$2" > ../VERSION
+fi
diff --git a/packages/windows.bat b/packages/windows.bat
index 42c46ba0..c5d150df 100644
--- a/packages/windows.bat
+++ b/packages/windows.bat
@@ -15,6 +15,7 @@ copy /y ..\src\View\ui\ressources\ dist\pamhyr\View\ui\ressources
 copy /y ..\src\View\ui\Widgets\*.ui dist\pamhyr\View\ui\Widgets
 copy /y ..\src\View\ui\*.ui dist\pamhyr\View\ui\
 copy /y ..\src\lang\*.qm dist\pamhyr\lang\
+copy /y ..\VERSION dist\pamhyr\
 
 rem Make installer
 "C:\Program Files (x86)\NSIS\makensis.exe" pamhyr.nsi
diff --git a/src/VERSION b/src/VERSION
new file mode 120000
index 00000000..6ff19de4
--- /dev/null
+++ b/src/VERSION
@@ -0,0 +1 @@
+../VERSION
\ No newline at end of file
diff --git a/src/View/ASubWindow.py b/src/View/ASubWindow.py
index 478993cf..17ae4a07 100644
--- a/src/View/ASubWindow.py
+++ b/src/View/ASubWindow.py
@@ -19,6 +19,7 @@ from PyQt5.QtWidgets import (
     QRadioButton, QComboBox, QFileDialog,
     QMessageBox, QTableView, QAction,
     QDateTimeEdit, QWidget, QPlainTextEdit,
+    QLabel,
 )
 from PyQt5.QtCore import (
     QTime, QDateTime,
@@ -130,6 +131,30 @@ class ASubWindowFeatures(object):
 
         return qtype
 
+    def get_label_text(self, name:str):
+        """Get text of label component
+
+        Args:
+            label: The label component name
+
+        Returns:
+            Text
+        """
+        return self.find(QLabel, name).text()
+
+    def set_label_text(self, name:str, text:str):
+        """Set text of label component
+
+        Args:
+            text_edit: The label component name
+            text: The text
+
+        Returns:
+            Nothing
+        """
+        self.find(QLabel, name).setText(text)
+
+
     def set_line_edit_text(self, name:str, text:str):
         """Set text of line edit component
 
diff --git a/src/View/About/Window.py b/src/View/About/Window.py
index 9f84ad86..2ff5f3ce 100644
--- a/src/View/About/Window.py
+++ b/src/View/About/Window.py
@@ -1,8 +1,28 @@
 # -*- coding: utf-8 -*-
 
+import os
+import logging
+
 from View.ASubWindow import ASubWindow
 
+logger = logging.getLogger()
+
 class AboutWindow(ASubWindow):
     def __init__(self, title="About", parent=None):
         super(AboutWindow, self).__init__(name=title, ui="about", parent=parent)
         self.ui.setWindowTitle(title)
+
+        with open(
+                os.path.abspath(
+                    os.path.join(
+                        os.path.dirname(__file__),
+                        "..", "..", "VERSION"
+                    )
+                ), "r"
+        ) as f:
+            version = f.readline()
+            logger.info(version)
+
+            label = self.get_label_text("label_version")
+            label = label.replace("@version", version.strip())
+            self.set_label_text("label_version", label)
diff --git a/src/View/ui/about.ui b/src/View/ui/about.ui
index 6b4f6957..25d11617 100644
--- a/src/View/ui/about.ui
+++ b/src/View/ui/about.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>362</width>
-    <height>98</height>
+    <width>553</width>
+    <height>262</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -15,44 +15,74 @@
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
-    <layout class="QHBoxLayout" name="horizontalLayout">
+    <layout class="QVBoxLayout" name="verticalLayout">
      <item>
-      <widget class="QLabel" name="label">
+      <widget class="QLabel" name="label_logo">
        <property name="text">
         <string/>
        </property>
        <property name="pixmap">
-        <pixmap>ressources/logoCemagref.gif</pixmap>
+        <pixmap>ressources/Logo-INRAE.png</pixmap>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_title">
+       <property name="font">
+        <font>
+         <pointsize>16</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>About PAMHYR</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_copyright">
+       <property name="text">
+        <string>© Pierre-Antoine ROUBY - INRAE -2023</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_version">
+       <property name="text">
+        <string>Version: @version</string>
        </property>
-       <property name="scaledContents">
-        <bool>true</bool>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_license">
+       <property name="text">
+        <string>License: GPLv3+</string>
        </property>
       </widget>
      </item>
      <item>
-      <layout class="QVBoxLayout" name="verticalLayout">
-       <item>
-        <widget class="QLabel" name="label_2">
-         <property name="font">
-          <font>
-           <pointsize>16</pointsize>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
-         <property name="text">
-          <string>PamHyr</string>
-         </property>
-        </widget>
-       </item>
-       <item>
-        <widget class="QLabel" name="label_3">
-         <property name="text">
-          <string>Version en  developpement:</string>
-         </property>
-        </widget>
-       </item>
-      </layout>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>&lt;a href=&quot;https://gitlab.irstea.fr/theophile.terraz/pamhyr&quot;&gt;Source code&lt;/a&gt;</string>
+       </property>
+       <property name="textFormat">
+        <enum>Qt::RichText</enum>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
      </item>
     </layout>
    </item>
diff --git a/src/View/ui/ressources/Logo-INRAE.png b/src/View/ui/ressources/Logo-INRAE.png
new file mode 100644
index 0000000000000000000000000000000000000000..0cd93142e9ad2127cf167eac4acf97afed6be74b
GIT binary patch
literal 8635
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

literal 0
HcmV?d00001

-- 
GitLab