From 42c29bbb461a9f9ba5bc2a47ac6270ec32abbcd3 Mon Sep 17 00:00:00 2001
From: Josep Marcello <13519164@std.stei.itb.ac.id>
Date: Tue, 20 Apr 2021 20:05:15 +0000
Subject: [PATCH] File input dialog

---
 src/app/ui/file_input_dialog.py | 48 +++++++++++++++++++++++++++
 src/app/ui/tambah_acara_ui.py   | 58 +++++++++++++++++++++------------
 2 files changed, 86 insertions(+), 20 deletions(-)
 create mode 100644 src/app/ui/file_input_dialog.py

diff --git a/src/app/ui/file_input_dialog.py b/src/app/ui/file_input_dialog.py
new file mode 100644
index 0000000..7d0f403
--- /dev/null
+++ b/src/app/ui/file_input_dialog.py
@@ -0,0 +1,48 @@
+from PyQt5 import QtWidgets
+
+
+class FileInput(QtWidgets.QWidget):
+    def __init__(self):
+        super().__init__()
+        self.title = 'Masukkan file-file gambar Anda'
+        self.left = 10
+        self.top = 10
+        self.width = 640
+        self.height = 480
+
+    def spawn(self, multiple: bool):
+        self.setWindowTitle(self.title)
+        self.setGeometry(self.left, self.top, self.width, self.height)
+        if multiple:
+            files = self.openFileNamesDialog()
+        else:
+            files = self.openFileNameDialog()
+
+        self.show()
+
+        return files
+
+    def openFileNameDialog(self):
+        options = QtWidgets.QFileDialog.Options()
+        options |= QtWidgets.QFileDialog.DontUseNativeDialog
+        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
+            self,
+            "QFileDialog.getOpenFileName()",
+            "",
+            "All Files (*);;Python Files (*.py)",
+            options=options)
+        if fileName:
+            print(fileName)
+
+    def openFileNamesDialog(self):
+        options = QtWidgets.QFileDialog.Options()
+        options |= QtWidgets.QFileDialog.DontUseNativeDialog
+        files, _ = QtWidgets.QFileDialog.getOpenFileNames(
+            self,
+            self.title,
+            "",
+            "Semua File (*);;File Gambar (*.png *.jpg *.jpeg)",
+            options=options)
+
+        if files:
+            return files
diff --git a/src/app/ui/tambah_acara_ui.py b/src/app/ui/tambah_acara_ui.py
index 9936164..a1c465f 100644
--- a/src/app/ui/tambah_acara_ui.py
+++ b/src/app/ui/tambah_acara_ui.py
@@ -2,6 +2,8 @@ from PyQt5 import uic, QtWidgets, QtGui, QtCore
 import sys, os
 from app.modules.tambah_acara import tambah_acara
 from app.db import init_db
+from file_input_dialog import FileInput
+
 
 class TambahAcaraWindow(QtWidgets.QMainWindow):
     def __init__(self, conn, id_penyelenggara, id_acara=None):
@@ -12,7 +14,8 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
             - kuota_pendaftar: int
             - waktu: datetime (year, month, date, hour, minute)
             - harga: int
-            - kategori: list[str], nilai yang boleh: Teknologi, Motivasi, Ekonomi, Kompetisi
+            - kategori: list[str], nilai yang boleh: Teknologi, Motivasi,
+                        Ekonomi, Kompetisi
             - foto: list[bytes] isi file foto
             - link: str
             - syarat: str
@@ -47,7 +50,11 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
             self.__get_data_from_db(data_acara=data_acara, cur=cur)
 
         self.__current_image_counter = 0
-        self.__photos = list() if data_acara['foto'] is None else data_acara['foto']
+        self.__photos =\
+            list() if data_acara['foto'] is None else data_acara['foto']
+        # self.__penyelenggara = data_acara['id_penyelenggara'] # ga boleh None
+        self.__penyelenggara = 1
+        self.__id_acara = data_acara['id_acara']
 
         # setting default image
         self.__default_img = QtGui.QImage()
@@ -86,11 +93,12 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
             data_acara['kategori'].append(kategori[0])
 
     def __set_image(self):
-        self.image.setPixmap(
-            QtGui.QPixmap.fromImage(
-                self.__photos[self.__current_image_counter]
-            )
-        )
+        if len(self.__photos) == 0:
+            self.image.setPixmap(QtGui.QPixmap.fromImage(self.__default_img))
+        else:
+            self.image.setPixmap(
+                QtGui.QPixmap.fromImage(
+                    self.__photos[self.__current_image_counter]))
 
     def __next_image(self):
         try:
@@ -113,10 +121,7 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
         Fungsi untuk mengisi form data, foto, serta kategori acara
         '''
         # Ngeset foto
-        if data_acara['foto'] is None:
-            self.image.setPixmap(QtGui.QPixmap.fromImage(self.__default_img))
-        else:
-            self.__set_image
+        self.__set_image()
 
         # Ngeset isi form
         if data_acara['nama_acara'] is not None:
@@ -127,7 +132,9 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
 
         self.input_waktu.setMinimumDateTime(QtCore.QDateTime.currentDateTime())
         if data_acara['waktu'] is not None:
-            # ex: self.input_waktu.setDateTime(datetime.strptime('2100-05-12 23:59', '%Y-%m-%d %H:%M'))
+            # ex:
+            # self.input_waktu.setDateTime(
+            #   datetime.strptime('2100-05-12 23:59', '%Y-%m-%d %H:%M'))
             # asumsi udah pasti date time
             self.input_waktu.setDateTime(data_acara['waktu'])
         else:
@@ -140,8 +147,7 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
             self.input_link.setText(data_acara['link'])
 
         if data_acara['deskripsi'] is not None:
-            self.input_deskripsi.insertPlainText(
-                data_acara['deskripsi'])
+            self.input_deskripsi.insertPlainText(data_acara['deskripsi'])
 
         if data_acara['syarat'] is not None:
             self.input_syarat.insertPlainText(data_acara['syarat'])
@@ -181,7 +187,8 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
             kategori=self.__get_checked_kategori(),
             nama_acara=self.input_nama_acara.text(),
             kuota_pendaftar=self.input_kuota.value(),
-            waktu=self.input_waktu.dateTime().toPyDateTime().replace(microsecond=0),
+            waktu=self.input_waktu.dateTime().toPyDateTime().replace(
+                microsecond=0),
             harga=self.input_harga.value(),
             link=self.input_link.text(),
             deskripsi=self.input_deskripsi.toPlainText(),
@@ -191,21 +198,32 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
     def __save_data(self):
         if self.__is_form_valid():
             if tambah_acara(**self.__get_form_data(), conn=self.__conn):
-                self.close() # sekarang exit aja dlu
+                self.close()  # sekarang exit aja dlu
             else:
                 self.__alert(text="Gagal menambahkan data.",
                              info="Silakan hubungi pembuat aplikasi.",
                              title="Terjadi kegagalan")
         else:
             self.__alert(text="Ada data yang belum diisi.",
-                         info="Perhatikan, data dengan * merah adalah wajib dan minimal sebuah kategori terpilih.",
+                         info="Perhatikan, data dengan * merah adalah wajib\
+                               dan minimal sebuah kategori terpilih.",
                          title="Data acara kurang")
 
     def __input_image(self):
-        pass
+        dg = FileInput()
+        files = dg.spawn(multiple=True)
+        for file in files:
+            content = b''
+            with open(file, 'rb') as f:
+                content = f.read()
+            img = QtGui.QImage()
+            assert img.loadFromData(content)
+            self.__photos.append(img)
+        self.__set_image()
 
     def __is_form_valid(self):
-        return self.input_nama_acara is not None and self.input_nama_acara.text() != ""\
+        return self.input_nama_acara is not None\
+               and self.input_nama_acara.text() != ""\
                and self.input_waktu is not None\
                and self.input_harga is not None\
                and len(self.__get_checked_kategori()) != 0
@@ -217,4 +235,4 @@ class TambahAcaraWindow(QtWidgets.QMainWindow):
         msg.setInformativeText(info)
         msg.setWindowTitle(title)
         msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
-        msg.exec_()
\ No newline at end of file
+        msg.exec_()
-- 
GitLab