From 0b7f6f5af2efbcde280dc41f7210144f0d036648 Mon Sep 17 00:00:00 2001
From: daale010 <tim.vandaalen@wur.nl>
Date: Tue, 2 Nov 2021 11:56:38 +0100
Subject: [PATCH] icons are now loaded in exe and debugger

---
 gui/ui_files/MainMenu.py                      |   2 +-
 gui/ui_files/__pycache__.py                   |   2 +-
 gui/ui_files/createCollection.py              |   2 +-
 gui/ui_files/dataTransferState.py             |   2 +-
 gui/ui_files/icons.py                         |  10 ++++
 gui/ui_files/irodsIndexPopup.py               |   2 +-
 gui/ui_files/irodsLogin.py                    |   2 +-
 gui/ui_files/searchDialog.py                  |   2 +-
 gui/ui_files/tabBrowser.py                    |   6 ++-
 gui/ui_files/tabDataCompression.py            |   2 +-
 gui/ui_files/tabELNData.py                    |   2 +-
 gui/ui_files/tabFederations.py                |   2 +-
 gui/ui_files/tabInfo.py                       |   2 +-
 gui/ui_files/tabPage.py                       |   2 +-
 gui/ui_files/tabTicketAccess.py               |   8 ++--
 gui/ui_files/tabTicketCreate.py               |   2 +-
 gui/ui_files/tabUpDownload.py                 |   9 ++--
 {gui/icons => icons}/arrow-left.png           | Bin
 {gui/icons => icons}/arrow-right.png          | Bin
 {gui/icons => icons}/home.png                 | Bin
 {gui/icons => icons}/irods-basicGUI_Login.png | Bin
 {gui/icons => icons}/loading_circle.gif       | Bin
 {gui/icons => icons}/nosync.png               | Bin
 {gui/icons => icons}/syncing.png              | Bin
 pyinstaller_script.py                         |  43 +++++++++++++-----
 25 files changed, 69 insertions(+), 33 deletions(-)
 create mode 100644 gui/ui_files/icons.py
 rename {gui/icons => icons}/arrow-left.png (100%)
 rename {gui/icons => icons}/arrow-right.png (100%)
 rename {gui/icons => icons}/home.png (100%)
 rename {gui/icons => icons}/irods-basicGUI_Login.png (100%)
 rename {gui/icons => icons}/loading_circle.gif (100%)
 rename {gui/icons => icons}/nosync.png (100%)
 rename {gui/icons => icons}/syncing.png (100%)

diff --git a/gui/ui_files/MainMenu.py b/gui/ui_files/MainMenu.py
index cc330eb..6d78006 100644
--- a/gui/ui_files/MainMenu.py
+++ b/gui/ui_files/MainMenu.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\MainMenu.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\MainMenu.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/__pycache__.py b/gui/ui_files/__pycache__.py
index def971c..2b5b74d 100644
--- a/gui/ui_files/__pycache__.py
+++ b/gui/ui_files/__pycache__.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\__pycache__'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\__pycache__'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/createCollection.py b/gui/ui_files/createCollection.py
index 32b12b0..3ae10c7 100644
--- a/gui/ui_files/createCollection.py
+++ b/gui/ui_files/createCollection.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\createCollection.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\createCollection.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/dataTransferState.py b/gui/ui_files/dataTransferState.py
index 7d2211e..4eb9ff0 100644
--- a/gui/ui_files/dataTransferState.py
+++ b/gui/ui_files/dataTransferState.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\dataTransferState.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\dataTransferState.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/icons.py b/gui/ui_files/icons.py
new file mode 100644
index 0000000..855bc26
--- /dev/null
+++ b/gui/ui_files/icons.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\icons'
+#
+# Created by: PyQt5 UI code generator 5.15.4
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
diff --git a/gui/ui_files/irodsIndexPopup.py b/gui/ui_files/irodsIndexPopup.py
index e58f084..fc947a5 100644
--- a/gui/ui_files/irodsIndexPopup.py
+++ b/gui/ui_files/irodsIndexPopup.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\irodsIndexPopup.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\irodsIndexPopup.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/irodsLogin.py b/gui/ui_files/irodsLogin.py
index ef29b93..b37abdd 100644
--- a/gui/ui_files/irodsLogin.py
+++ b/gui/ui_files/irodsLogin.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\irodsLogin.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\irodsLogin.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/searchDialog.py b/gui/ui_files/searchDialog.py
index f483285..dbc1a8c 100644
--- a/gui/ui_files/searchDialog.py
+++ b/gui/ui_files/searchDialog.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\searchDialog.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\searchDialog.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabBrowser.py b/gui/ui_files/tabBrowser.py
index 273e3dd..62b6ac3 100644
--- a/gui/ui_files/tabBrowser.py
+++ b/gui/ui_files/tabBrowser.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabBrowser.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabBrowser.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
@@ -8,6 +8,8 @@
 # run again.  Do not edit this file unless you know what you are doing.
 
 
+from os.path import dirname, realpath
+from sys import argv
 from PyQt5 import QtCore, QtGui, QtWidgets
 
 
@@ -76,7 +78,7 @@ class Ui_tabBrowser(object):
         self.homeButton = QtWidgets.QPushButton(tabBrowser)
         self.homeButton.setText("")
         icon = QtGui.QIcon()
-        icon.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.homeButton.setIcon(icon)
         self.homeButton.setObjectName("homeButton")
         self.gridLayout.addWidget(self.homeButton, 0, 2, 1, 1)
diff --git a/gui/ui_files/tabDataCompression.py b/gui/ui_files/tabDataCompression.py
index 5f984e9..13a494e 100644
--- a/gui/ui_files/tabDataCompression.py
+++ b/gui/ui_files/tabDataCompression.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabDataCompression.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabDataCompression.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabELNData.py b/gui/ui_files/tabELNData.py
index bbe273b..451a596 100644
--- a/gui/ui_files/tabELNData.py
+++ b/gui/ui_files/tabELNData.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabELNData.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabELNData.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabFederations.py b/gui/ui_files/tabFederations.py
index c48c08f..58e8717 100644
--- a/gui/ui_files/tabFederations.py
+++ b/gui/ui_files/tabFederations.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabFederations.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabFederations.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabInfo.py b/gui/ui_files/tabInfo.py
index 663ea0c..ca36e7c 100644
--- a/gui/ui_files/tabInfo.py
+++ b/gui/ui_files/tabInfo.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabInfo.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabInfo.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabPage.py b/gui/ui_files/tabPage.py
index 818d860..933b5c2 100644
--- a/gui/ui_files/tabPage.py
+++ b/gui/ui_files/tabPage.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabPage.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabPage.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabTicketAccess.py b/gui/ui_files/tabTicketAccess.py
index 2dc02a9..2335515 100644
--- a/gui/ui_files/tabTicketAccess.py
+++ b/gui/ui_files/tabTicketAccess.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabTicketAccess.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabTicketAccess.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
@@ -8,6 +8,8 @@
 # run again.  Do not edit this file unless you know what you are doing.
 
 
+from os.path import dirname, realpath
+from sys import argv
 from PyQt5 import QtCore, QtGui, QtWidgets
 
 
@@ -92,7 +94,7 @@ class Ui_tabTicketAccess(object):
         self.homeButton = QtWidgets.QPushButton(tabTicketAccess)
         self.homeButton.setText("")
         icon = QtGui.QIcon()
-        icon.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.homeButton.setIcon(icon)
         self.homeButton.setObjectName("homeButton")
         self.horizontalLayout_5.addWidget(self.homeButton)
@@ -129,7 +131,7 @@ class Ui_tabTicketAccess(object):
         self.downloadButton = QtWidgets.QPushButton(tabTicketAccess)
         self.downloadButton.setText("")
         icon1 = QtGui.QIcon()
-        icon1.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon1.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.downloadButton.setIcon(icon1)
         self.downloadButton.setIconSize(QtCore.QSize(30, 30))
         self.downloadButton.setObjectName("downloadButton")
diff --git a/gui/ui_files/tabTicketCreate.py b/gui/ui_files/tabTicketCreate.py
index 61095b9..d8ef0dc 100644
--- a/gui/ui_files/tabTicketCreate.py
+++ b/gui/ui_files/tabTicketCreate.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabTicketCreate.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabTicketCreate.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
diff --git a/gui/ui_files/tabUpDownload.py b/gui/ui_files/tabUpDownload.py
index 7c61871..570fd10 100644
--- a/gui/ui_files/tabUpDownload.py
+++ b/gui/ui_files/tabUpDownload.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Form implementation generated from reading ui file 'D:\irods-clients\gui\ui_files\tabUpDownload.ui'
+# Form implementation generated from reading ui file 'D:\irods-clientsb\gui\ui_files\tabUpDownload.ui'
 #
 # Created by: PyQt5 UI code generator 5.15.4
 #
@@ -8,6 +8,8 @@
 # run again.  Do not edit this file unless you know what you are doing.
 
 
+from os.path import dirname, realpath
+from sys import argv
 from PyQt5 import QtCore, QtGui, QtWidgets
 
 
@@ -131,7 +133,8 @@ class Ui_tabUpDownload(object):
         self.UploadButton.setMinimumSize(QtCore.QSize(100, 0))
         self.UploadButton.setText("")
         icon = QtGui.QIcon()
-        icon.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        print(dirname(realpath(argv[0])) + "/icons/arrow-right.png")
+        icon.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/arrow-right.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.UploadButton.setIcon(icon)
         self.UploadButton.setIconSize(QtCore.QSize(50, 50))
         self.UploadButton.setObjectName("UploadButton")
@@ -145,7 +148,7 @@ class Ui_tabUpDownload(object):
         self.DownloadButton.setMinimumSize(QtCore.QSize(100, 0))
         self.DownloadButton.setText("")
         icon1 = QtGui.QIcon()
-        icon1.addPixmap(QtGui.QPixmap("D:\\irods-clients\\gui\\ui_files\\../icons/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        icon1.addPixmap(QtGui.QPixmap(dirname(realpath(argv[0])) + "/icons/arrow-left.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
         self.DownloadButton.setIcon(icon1)
         self.DownloadButton.setIconSize(QtCore.QSize(50, 50))
         self.DownloadButton.setObjectName("DownloadButton")
diff --git a/gui/icons/arrow-left.png b/icons/arrow-left.png
similarity index 100%
rename from gui/icons/arrow-left.png
rename to icons/arrow-left.png
diff --git a/gui/icons/arrow-right.png b/icons/arrow-right.png
similarity index 100%
rename from gui/icons/arrow-right.png
rename to icons/arrow-right.png
diff --git a/gui/icons/home.png b/icons/home.png
similarity index 100%
rename from gui/icons/home.png
rename to icons/home.png
diff --git a/gui/icons/irods-basicGUI_Login.png b/icons/irods-basicGUI_Login.png
similarity index 100%
rename from gui/icons/irods-basicGUI_Login.png
rename to icons/irods-basicGUI_Login.png
diff --git a/gui/icons/loading_circle.gif b/icons/loading_circle.gif
similarity index 100%
rename from gui/icons/loading_circle.gif
rename to icons/loading_circle.gif
diff --git a/gui/icons/nosync.png b/icons/nosync.png
similarity index 100%
rename from gui/icons/nosync.png
rename to icons/nosync.png
diff --git a/gui/icons/syncing.png b/icons/syncing.png
similarity index 100%
rename from gui/icons/syncing.png
rename to icons/syncing.png
diff --git a/pyinstaller_script.py b/pyinstaller_script.py
index 269bfd8..c6be3ac 100644
--- a/pyinstaller_script.py
+++ b/pyinstaller_script.py
@@ -28,6 +28,26 @@ def ui_to_py(ui_folder):
         print(f"Converting {filename} to .py")
         run_cmd(f"""python -m PyQt5.uic.pyuic -x {ui_file} -o {filename +".py"}""")
 
+        # Find and replace the pixelmap references... They are hardcoded
+        with open(filename +".py") as file:
+            lines = file.readlines()
+            modified_lines = {}
+            for linenum, line in enumerate(lines):
+                if """QtGui.QPixmap(\"""" in line: 
+                    abs_fchar = line.find("\"")
+                    abs_lchar = line.find(".", abs_fchar) + 2
+
+                    new_line = line[0:abs_fchar] + "dirname(realpath(argv[0])) + \"" + line[abs_lchar:]
+                    modified_lines[linenum] = new_line
+
+        if len(modified_lines) > 0:
+            for linenum, text in modified_lines.items():
+                lines[(linenum)] = text
+            lines.insert(10, "from sys import argv\n")
+            lines.insert(10, "from os.path import dirname, realpath\n")
+            with open(filename +".py", 'w') as file:
+                file.writelines(lines)
+
 
 # Remove the locally stored .py versions of the files
 def remove_pyui_files(ui_folder):
@@ -46,7 +66,7 @@ def replace_folder(source, destination):
 
 
 if __name__ == "__main__":
-    icons_folder = f"{getcwd()}{sep}gui{sep}icons{sep}"
+    icons_folder = f"{getcwd()}{sep}icons"
     ui_folder = f"{getcwd()}{sep}gui{sep}ui_files{sep}"
     rules_folder = f"{getcwd()}{sep}rules"
     venv = f"{getcwd()}{sep}venv"
@@ -57,23 +77,28 @@ if __name__ == "__main__":
     else: # Linux
         cmd_sep = ";"
 
-    # Step 1: Pyinstallers includes all dependencies in the environment, so we use a venv
-    # Step 1a, Ensure the folder for the venv exists 
+    # Step 1 Convert .ui files to .py files
+    # Remove py files if they already exist, recompiling is the best way to ensure they are up to date
+    remove_pyui_files(ui_folder)
+    ui_to_py(ui_folder)
+
+    # Step 2: Pyinstallers includes all dependencies in the environment, so we use a venv
+    # Step 2a, Ensure the folder for the venv exists 
     if (not path.exists(venv)) or (not path.isdir(venv)):
         mkdir(venv)
     
-    # Step 1b, Create the venv if needed
+    # Step 2b, Create the venv if needed
     venv_activate = venv + f"{sep}Scripts{sep}activate.bat"
     if (not path.exists(venv_activate)) or (not path.isfile(venv_activate)):
         run_cmd(f"python -m venv {venv}")
         run_cmd(f"{venv_activate} {cmd_sep} pip install -r requirements.txt")
 
-    # Step 2, Activate venv and tun pyinstaller
+    # Step 3, Activate venv and tun pyinstaller
     run_cmd(f"{venv_activate} {cmd_sep} pyinstaller -F --clean {getcwd()}{sep}irods-iBridgesGui.py")
     dist_folder = f"{getcwd()}{sep}dist"
 
 
-    # Step 3, Copy rules, icons folder to dist folder, replace if exists.
+    # Step 4, Copy rules, icons folder to dist folder, replace if exists.
     dist_icons = f"{dist_folder}{sep}icons"
     dist_rules = f"{dist_folder}{sep}rules"
     replace_folder(icons_folder, dist_icons)
@@ -81,12 +106,6 @@ if __name__ == "__main__":
     
 
 
-    # Step 5 Convert .ui files to .py files
-    # Remove py files if they already exist, recompiling is the best way to ensure they are up to date
-    remove_pyui_files(ui_folder)
-    ui_to_py(ui_folder)
-
-
     confirmation = input("Do you want to cleanup the build environment (Y/N): ")
     if confirmation[0].upper() == 'Y':
         #remove_pyui_files(ui_folder)
-- 
GitLab