From 7fed50ecbe2893ae03ec1946dfb2b7c5f6f2d3f0 Mon Sep 17 00:00:00 2001
From: Renaldi Arlin <13519114@std.stei.itb.ac.id>
Date: Wed, 21 Apr 2021 15:47:16 +0700
Subject: [PATCH] Added add and change photo function

---
 src/app/ui/edit_account.py | 80 +++++++++++++++++++++++++++++++++-----
 1 file changed, 71 insertions(+), 9 deletions(-)

diff --git a/src/app/ui/edit_account.py b/src/app/ui/edit_account.py
index 571a78e..8639c7a 100644
--- a/src/app/ui/edit_account.py
+++ b/src/app/ui/edit_account.py
@@ -10,13 +10,33 @@ import re
 from PyQt5 import QtCore, QtGui, QtWidgets
 from app.modules.auth import *
 from app.ui.util_ui import *
+from app.ui.file_input_dialog import FileInput
 
 EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+")
 
+def choose_image():
+    dg = FileInput()
+    file = dg.spawn(multiple=False)
+    with open(file, 'rb') as f:
+        return f.read()
+
+def convert_bytes_to_qimage(byte):
+    img = QtGui.QImage()
+    assert img.loadFromData(byte)
+    return img
+
+def convert_qimage_to_bytes(qimage):
+    bytes_array = QtCore.QByteArray()
+    buffer = QtCore.QBuffer(bytes_array)
+    buffer.open(QtCore.QIODevice.WriteOnly)
+    qimage.save(buffer, "png", quality=50)
+
+    return bytes(bytes_array)
 class Ui_EditMember(object):
     def __init__(self, conn, id_member):
         self.conn = conn
         self.id_member = id_member
+        self.image = None
 
     def setupUi(self, EditMember):
         EditMember.setObjectName("EditMember")
@@ -100,7 +120,6 @@ class Ui_EditMember(object):
         self.pic_profile = QtWidgets.QLabel(EditMember)
         self.pic_profile.setGeometry(QtCore.QRect(170, 20, 100, 100))
         self.pic_profile.setText("")
-        self.pic_profile.setPixmap(QtGui.QPixmap("src/app/ui/assets/Images/default_user.png"))
         self.pic_profile.setScaledContents(True)
         self.pic_profile.setObjectName("pic_profile")
         self.button_change = QtWidgets.QPushButton(EditMember)
@@ -108,6 +127,7 @@ class Ui_EditMember(object):
         self.button_change.setObjectName("button_change")
 
         self.retranslateUi(EditMember)
+        self.button_change.clicked.connect(self.change_image_handle)
         self.buttonBox.accepted.connect(self.okHandle)
         self.buttonBox.rejected.connect(EditMember.reject)
         QtCore.QMetaObject.connectSlotsByName(EditMember)
@@ -135,6 +155,12 @@ class Ui_EditMember(object):
         self.textEdit_no_telp.setText(data["no_telp"])
         self.lineEdit_password.setText(data["password"])
         self.textEdit_deskripsi.setText(data["desc"])
+        if data["foto_profil"] == None:
+            self.image = None
+            self.pic_profile.setPixmap(QtGui.QPixmap("src/app/ui/assets/Images/default_user.png"))
+        else:
+            self.image = convert_bytes_to_qimage(data["foto_profil"])
+            self.pic_profile.setPixmap(QtGui.QPixmap.fromImage(self.image))
 
         categories = [val[0] for val in get_kategori_member(self.conn, self.id_member)]
         for kategori in categories:
@@ -146,7 +172,16 @@ class Ui_EditMember(object):
                 self.checkBox_ekonomi.setChecked(True)
             elif kategori == "Kompetisi":
                 self.checkBox_kompetisi.setChecked(True)
-        
+    
+    def change_image_handle(self):
+        pixmap = QtGui.QPixmap()
+        try:
+            qimage = convert_bytes_to_qimage(choose_image())
+            self.image = qimage
+            self.pic_profile.setPixmap(QtGui.QPixmap.fromImage(qimage))
+        except:
+            callInfoDialog("Failed importing image")
+
     def okHandle(self):
         nama_dpn = self.textEdit_nama_depan.toPlainText() if len(self.textEdit_nama_depan.toPlainText()) > 0 else None
         nama_blkg = self.textEdit_nama_belakang.toPlainText() if len(self.textEdit_nama_belakang.toPlainText()) > 0 else None
@@ -154,7 +189,8 @@ class Ui_EditMember(object):
         password = self.lineEdit_password.text()
         no_telp = self.textEdit_no_telp.toPlainText() if len(self.textEdit_no_telp.toPlainText()) > 0 else None
         desc = self.textEdit_deskripsi.toPlainText() if len(self.textEdit_deskripsi.toPlainText()) > 0 else None
-        
+        foto = convert_qimage_to_bytes(self.image) if self.image else None
+
         try:
             if (not EMAIL_REGEX.match(email)):
                 raise Exception("Invalid email")
@@ -170,7 +206,7 @@ class Ui_EditMember(object):
                 list_kategori.append("Kompetisi")
             
             edit_kategori_member(self.conn, self.id_member, list_kategori)
-            edit_account_member(self.conn, self.id_member, nama_dpn, nama_blkg, None, email, password, no_telp, desc)
+            edit_account_member(self.conn, self.id_member, nama_dpn, nama_blkg, foto, email, password, no_telp, desc)
             callInfoDialog("Successfully edited account")
 
             self.Dialog.close()
@@ -182,6 +218,7 @@ class Ui_EditPenyelenggara(object):
     def __init__(self, conn, id_penyelenggara):
         self.conn = conn
         self.id_penyelenggara = id_penyelenggara
+        self.image = None
 
     def setupUi(self, EditPenyelenggara):
         EditPenyelenggara.setObjectName("EditPenyelenggara")
@@ -253,8 +290,6 @@ class Ui_EditPenyelenggara(object):
         
         self.pic_profile = QtWidgets.QLabel(EditPenyelenggara)
         self.pic_profile.setGeometry(QtCore.QRect(170, 10, 100, 100))
-        self.pic_profile.setText("")
-        self.pic_profile.setPixmap(QtGui.QPixmap("src/app/ui/assets/Images/default_user.png"))
         self.pic_profile.setScaledContents(True)
         self.pic_profile.setObjectName("pic_profile")
 
@@ -263,6 +298,7 @@ class Ui_EditPenyelenggara(object):
         self.button_change.setObjectName("button_change")
 
         self.retranslateUi(EditPenyelenggara)
+        self.button_change.clicked.connect(self.change_image_handle)
         self.buttonBox.accepted.connect(self.okHandle)
         self.buttonBox.rejected.connect(EditPenyelenggara.reject)
         QtCore.QMetaObject.connectSlotsByName(EditPenyelenggara)
@@ -285,7 +321,23 @@ class Ui_EditPenyelenggara(object):
         self.textEdit_email.setText(data["email"])
         self.lineEdit_password.setText(data["password"])
         self.textEdit_deskripsi.setText(data["desc"])
+        if data["foto_profil"] == None:
+            self.image = None
+            self.pic_profile.setPixmap(QtGui.QPixmap("src/app/ui/assets/Images/default_user.png"))
+        else:
+            self.image = convert_bytes_to_qimage(data["foto_profil"])
+            self.pic_profile.setPixmap(QtGui.QPixmap.fromImage(self.image))
 
+    def change_image_handle(self):
+        pixmap = QtGui.QPixmap()
+        try:
+            qimage = convert_bytes_to_qimage(choose_image())
+            self.image = qimage
+            self.pic_profile.setPixmap(QtGui.QPixmap.fromImage(qimage))
+        except:
+            callInfoDialog("Failed importing image")
+            self.pic_profile.setPixmap(QtGui.QPixmap("src/app/ui/assets/Images/default_user.png"))
+    
     def okHandle(self):
         nama_org = self.textEdit_nama_org.toPlainText() if len(self.textEdit_nama_org.toPlainText()) > 0 else None
         pj = self.textEdit_pj.toPlainText() if len(self.textEdit_pj.toPlainText()) > 0 else None
@@ -293,12 +345,22 @@ class Ui_EditPenyelenggara(object):
         password = self.lineEdit_password.text()
         no_wa = self.textEdit_no_wa.toPlainText() if len(self.textEdit_no_wa.toPlainText()) > 0 else None
         desc = self.textEdit_deskripsi.toPlainText() if len(self.textEdit_deskripsi.toPlainText()) > 0 else None
-        
+        foto = convert_qimage_to_bytes(self.image) if self.image else None
+
         try:
             if (not EMAIL_REGEX.match(email)):
                 raise Exception("Invalid email")
-            edit_account_penyelenggara(self.conn, self.id_penyelenggara, nama_org, pj, None, None, email, password, no_wa, desc)
+            edit_account_penyelenggara(self.conn, self.id_penyelenggara, nama_org, pj, foto, None, email, password, no_wa, desc)
             callInfoDialog("Successfully edited account")
             self.Dialog.close()
         except Exception as err:
-            callInfoDialog(str(err))
\ No newline at end of file
+            callInfoDialog(str(err))
+
+    def change_image_handle(self):
+        pixmap = QtGui.QPixmap()
+        try:
+            qimage = convert_bytes_to_qimage(choose_image())
+            self.image = qimage
+            self.pic_profile.setPixmap(QtGui.QPixmap.fromImage(qimage))
+        except:
+            callInfoDialog("Failed importing image")
\ No newline at end of file
-- 
GitLab