From a56f159378c81eca1138264cc7aa46526a3f53c8 Mon Sep 17 00:00:00 2001 From: Keplyx Date: Sun, 6 May 2018 21:47:33 +0200 Subject: [PATCH] Changed logo --- assets/css/sidenav.css | 3 +- assets/css/style.css | 22 +- assets/images/coms/logo.png | Bin 22318 -> 0 bytes assets/images/logo-site-accueil.svg | 523 +++++++++++++++++++++++++++ assets/scripts/sidenavScript.js | 8 +- favicon.ico | Bin 16958 -> 4286 bytes includes/top_bar.html | 3 +- photos.php | 2 +- photos/compress_photos.py | 524 +++++++++++++++++++++------- 9 files changed, 934 insertions(+), 151 deletions(-) delete mode 100644 assets/images/coms/logo.png create mode 100644 assets/images/logo-site-accueil.svg diff --git a/assets/css/sidenav.css b/assets/css/sidenav.css index 2f0bd26..66f0f6c 100644 --- a/assets/css/sidenav.css +++ b/assets/css/sidenav.css @@ -39,8 +39,7 @@ } .sidenav a:hover { - color: #c5af86; - text-shadow: 0 0 5px #c5af86; + color: #1a5dad; margin-left: 20px; } diff --git a/assets/css/style.css b/assets/css/style.css index 6a176fb..1dfae49 100644 --- a/assets/css/style.css +++ b/assets/css/style.css @@ -97,16 +97,7 @@ a { } a:hover, a:focus { - text-shadow: 0 0 4px #cccccc; -} - -footer a { - color: #F2F2F2; - text-decoration: underline; -} - -em, cite { - font-style: italic; + text-shadow: 0 0 4px #1a5dad; } strong { @@ -205,7 +196,16 @@ Full-Width Styles #menu_title { border-bottom: none; - margin-left: 30px; + line-height: 40px; + height: 40px; + margin: 5px; +} + +#menu_icon { + width: 40px; + height: 40px; + padding: 0; + margin: 5px; } #title { diff --git a/assets/images/coms/logo.png b/assets/images/coms/logo.png deleted file mode 100644 index 6e076bd5ae7b7185dd6f44510c23f258d05e751d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22318 zcmeFZXFSz!{6BsiCr)K13CTeyk}^X$vbT?n%wuPSGP93{nY}_rwyd&898n>AZyMII z<5-8o?>g%H`2TPG?*Hz5yF(A}bG@(YwXf&v`8uIm8j6(Xn9e~U5K3hwIc*383Vww` z;AG$j?%5C?{D8UMSJr`pf4*?55C{YTQI?a@d1kuSc(&3+J{e;YO+u%n1ie6Nh2U~S zd=`?0y1fXc5D1aIP1!y)_FYkwhke;){3f@t$I5{8K=r2I9S>1~Dl^#8d4VzZY^4jC zq-V|GY-i(OO84321e*7bJu*~hhf2lwrhInA9#Qu;=#}^sd8{#|PaKx)4V8WtgF$J~ z5EueN0!Kpr_t*cG!~Yt=|9fXBP&8}sW~d`0fzKs18#y-)&#H)axk{u2MAv;5u6aRN zTdXTt*jS&reX=54(|_D#<7DDlGwm_yct;va0*?=YkRd~v;@-!1WIP`s#048sJI~ptx z-+_+�&~Z=PXcFV+Ok^u@3{cQvZ^_7o+#> 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 diff --git a/assets/images/logo-site-accueil.svg b/assets/images/logo-site-accueil.svg new file mode 100644 index 0000000..9583617 --- /dev/null +++ b/assets/images/logo-site-accueil.svg @@ -0,0 +1,523 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/scripts/sidenavScript.js b/assets/scripts/sidenavScript.js index 2010a03..5ddd655 100644 --- a/assets/scripts/sidenavScript.js +++ b/assets/scripts/sidenavScript.js @@ -70,12 +70,12 @@ manager.on('swipe', function(e) { // Animate hamburger on hover hamburger.hover(function(){ - $("#bar1").css("background-color", "#c5af86"); - $("#bar2-1").css("background-color", "#73b795"); - $("#bar2-2").css("background-color", "#73b795"); + $("#bar1").css("background-color", "#1a5dad"); + $("#bar2-1").css("background-color", "#ee293d"); + $("#bar2-2").css("background-color", "#ee293d"); $("#bar2-1").css("left", "-5px"); $("#bar2-2").css("right", "-5px"); - $("#bar3").css("background-color", "#c5af86"); + $("#bar3").css("background-color", "#1a5dad"); }, function(){ $("#bar1").css("background-color", "white"); $("#bar2-1").css("background-color", "white"); diff --git a/favicon.ico b/favicon.ico index 78bb04fadca8e59d85afd0f8f72926660c55fa42..1f3eb3878665299927575d8a7789fc5208266a9b 100644 GIT binary patch literal 4286 zcmbtYdr*{B6#p9kux5Hq6D7M_5Ee0Ij!aHXO$9|pY6vxg1iLF>kq!beq~Qxv6BVVT z0g*>p4Qg)7@@kPs1e$_4GHJX*DhQ%jhyeiwmdELyyL&&r{rGm-)sMN{d(S=R{LVS| z+;cB*+#Te{)s@5F+;{hL+(R74d5}g(oHuDmzuiw0=yZ3!TDC4<>3l3-CA&zPfwT#8 z!|_F}$~jZ3lm{X2?cyyl^^o38`I-xUmE@RLY+#s+aBDK zO-roVMdBk*MqQ5JYr+>f5 zTq%Artu*d=p=_;GKIoLP6tSGW^TG{oLj7~b#T%cpppm@ZFN}dUMDYZ{GK%r)GNPb- z>nj$rVji4he5B|$XcNM-N%(RZ?>Fm~LBfh%ko0C8WQIn7Hr&HPcTwb%7IP-&Xs=bt zvM~m(QGb-1R8&Bo*F`n>GLm3SI)das+e8uZB-6ir%3?F;r&0%OS%ceXfByanF ztK<2rcKO20)Fg}z8R%Z5$L2wNXbYtJ2SL&M?r?LU2b#49X>GjT-3rWa)Z1Q`1I8P} zgeEvErt{v9>y(uWcwbN_Y3vT=>DKU@PA9|6^b{cG^{!T)AMLvG?M~=w z8-TU(KG`oHF~&?r&b76n^=ZmtbmQ46chkw_Xz({Y0#hqpLf1LC*{^q&l{$p;98any? zWcZb&CgX=bqP#wO8T`222U7f$ugWNZ2 zSq`%YW%2y=HJ^tIscM=pIRB&aIFH?;OQk$bn*Eekvo`lCE zGpcC(83y(h+g>yC$g{Lc*}K9uHolcQt5qr>d#x9#RV(3Ch&!APT?{N2P%q|7?H3!N zfaEO2A@9k&&MV&`%I2d*5f9#jcL1ru zUkZ7|+Ahm}Z`Li{n0vZW?LTGEc%g#|B~Dz}y$+MDeDl0drG`DRDl!@og{0 zlbT~3^fAj@_0gUdI+^|!eKxISY>u|EHz3+V>4LvcXq{8KI7?w!qv0MAJ(!bL&jrI5 z##g2=TC3@OLGLWg5qz^_ zBV+j`e9Pf`lGQbPbVJPo0FHwxj`JGlIF})gyRVbu7S?dw0&JgGEjag48 O(TTbd1F;YjvHu4Z$Ej5S literal 16958 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 diff --git a/includes/top_bar.html b/includes/top_bar.html index 1120d92..ec8592a 100644 --- a/includes/top_bar.html +++ b/includes/top_bar.html @@ -5,5 +5,6 @@
- + + \ No newline at end of file diff --git a/photos.php b/photos.php index 0aa849c..eab87b5 100644 --- a/photos.php +++ b/photos.php @@ -181,7 +181,7 @@ function getTotalPhotoCount($path) function isValidImage($imagePath) { $ext = pathinfo($imagePath, PATHINFO_EXTENSION); - return !is_dir($imagePath) && ($ext == "jpg" || $ext == "jpeg" || $ext == "png"); + return !is_dir($imagePath) && ($ext == "jpg" || $ext == "JPG" || $ext == "jpeg" || $ext == "JPEG" || $ext == "png" || $ext == "PNG"); } /** diff --git a/photos/compress_photos.py b/photos/compress_photos.py index 2ff4a90..8568e90 100644 --- a/photos/compress_photos.py +++ b/photos/compress_photos.py @@ -1,156 +1,416 @@ -#!/usr/bin/python - +#!/usr/bin/python3 import os import sys -from zipfile import ZipFile, ZIP_DEFLATED -from PIL import Image + +from PyQt5.QtCore import QThreadPool, Qt, pyqtSlot +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QMainWindow, QAction, QDesktopWidget, QWidget, QFrame, QLineEdit, QListWidget, QVBoxLayout, \ + QLabel, QPushButton, QGridLayout, QMessageBox, QFileDialog, QDialog, QTabWidget, QApplication, QCheckBox, \ + QProgressBar + +from compresser import Compresser +from scanner import Scanner +from utils import create_file_dialog -def get_images(path): - """ - get images in the folder specified and all its sub folders (hidden and empty folders are ignored) +class MainWindow(QMainWindow): - :param path: directory to get images in - :return: images list - """ - file_list = [] - for root, dirs, files in os.walk(path): - if is_directory_valid(root, files): - for fn in files: - if is_file_valid_image(fn): - file_list.append(os.path.join(root, fn)) - return file_list + def __init__(self, parent=None): + super(MainWindow, self).__init__(parent) + self.resize(1000, 600) + self.center() + self.main_widget = MainWidgets() + self.setCentralWidget(self.main_widget) + self.create_menu_bar() + self.setWindowTitle('Compression de Photos') + self.setWindowIcon(QIcon('icon.png')) + + def create_menu_bar(self): + main_menu = self.menuBar() + file_menu = main_menu.addMenu("Fichier") + help_menu = main_menu.addMenu("Aide") + + exit_button = QAction('Quitter', self) + exit_button.setShortcut('Ctrl+Q') + exit_button.setStatusTip('Quitter le logiciel') + exit_button.triggered.connect(self.close) + file_menu.addAction(exit_button) + + about_button = QAction('À Propos', self) + about_button.setShortcut('Ctrl+H') + about_button.setStatusTip('Voir les informations du logiciel') + about_button.triggered.connect(self.display_help_dialog) + help_menu.addAction(about_button) + + def center(self): + rectangle = self.frameGeometry() + center_point = QDesktopWidget().availableGeometry().center() + rectangle.moveCenter(center_point) + self.move(rectangle.topLeft()) + + def display_help_dialog(self): + dialog = HelpDialog(self) + dialog.exec_() + dialog.deleteLater() -def compress_images(images): - """ - Compress images to a 140x105 format, cropping in the middle if needed - :param images: list o images paths to compress - :return: - """ - size = 140, 105 # 4/3 format - print("Creating thumbnails", end="") - for current_img in images: - print(".", end="") - # If height is higher we resize vertically, if not we resize horizontally - img = Image.open(current_img) - # Get current and desired ratio for the images - img_ratio = img.size[0] / float(img.size[1]) - ratio = size[0] / float(size[1]) - # The image is scaled/cropped vertically or horizontally depending on the ratio - if ratio > img_ratio: - img = img.resize((size[0], round(size[0] * img.size[1] / img.size[0])), Image.BILINEAR) - # Crop in the middle - box = (0, round((img.size[1] - size[1]) / 2), img.size[0], round((img.size[1] + size[1]) / 2)) - img = img.crop(box) - elif ratio < img_ratio: - img = img.resize((round(size[1] * img.size[0] / img.size[1]), size[1]), Image.BILINEAR) - # Crop in the middle - box = (round((img.size[0] - size[0]) / 2), 0, round((img.size[0] + size[0]) / 2), img.size[1]) - img = img.crop(box) +class MainWidgets(QWidget): + + def __init__(self): + super().__init__() + self.dir_select_group = QFrame() + self.dir_path_line_edit = QLineEdit(os.path.dirname(__file__)) + self.dir_selection_button = QPushButton("Selectionner") + self.dir_thumb_path_line_edit = QLineEdit(os.path.dirname(__file__) + "_thumb") + self.dir_thumb_selection_button = QPushButton("Selectionner") + self.scan_progress_bar = QProgressBar() + self.scan_progress_text = QLabel("Scan") + self.dir_list_group = QFrame() + self.directories_list = QListWidget() + self.scan_button = QPushButton("Scanner") + self.stop_scan_button = QPushButton("Stop") + self.compress_button = QPushButton("Compresser") + self.stop_compress_button = QPushButton("Stop") + self.list_title = QLabel("0 images dans 0 dossiers :") + self.delete_button = QPushButton("Enlever sélectionné") + self.enable_zip_radio_button = QCheckBox("Créer .zip") + self.enable_thumb_radio_button = QCheckBox("Créer miniatures") + self.enable_compress_radio_button = QCheckBox("Compresser photos") + self.compress_progress_bar = QProgressBar() + self.compress_progress_text = QLabel("Compression") + self.zip_progress_bar = QProgressBar() + self.zip_progress_text = QLabel("Création de .zip") + self.thumb_progress_bar = QProgressBar() + self.thumb_progress_text = QLabel("Création de miniatures") + self.image_list = [] + self.main_layout = QGridLayout() + self.scanner = Scanner("") + self.compresser = Compresser([], [], "", "", True, True, True) + self.thread_pool = QThreadPool() + self.init_ui() + + def init_ui(self): + self.setLayout(self.main_layout) + + subtitle = QLabel("Cet utilitaire permet de créer un fichier compressé des images du dossier sélectionné (et " + "tout ses sous dossiers)\nainsi que la miniatures de images présentes") + subtitle.setAlignment(Qt.AlignCenter) + + y = 0 + self.main_layout.addWidget(subtitle, y, 0, 1, 20) + y += 1 + self.main_layout.addWidget(QLabel("Dossier parent :"), y, 0, 1, 1) + self.dir_path_line_edit.textChanged.connect(self.directories_list.clear) + self.main_layout.addWidget(self.dir_path_line_edit, y, 1, 1, 18) + self.dir_selection_button.clicked.connect(self.open_dir) + self.main_layout.addWidget(self.dir_selection_button, y, 19, 1, 1) + + y += 1 + self.main_layout.addWidget(QLabel("Dossier miniatures :"), y, 0, 1, 1) + self.dir_thumb_path_line_edit.textChanged.connect(self.directories_list.clear) + self.main_layout.addWidget(self.dir_thumb_path_line_edit, y, 1, 1, 18) + self.dir_thumb_selection_button.clicked.connect(self.open_thumb_dir) + self.main_layout.addWidget(self.dir_thumb_selection_button, y, 19, 1, 1) + + y += 1 + self.scan_button.clicked.connect(self.scan_click) + self.main_layout.addWidget(self.scan_button, y, 5, 1, 10) + self.stop_scan_button.clicked.connect(self.stop_scan) + self.stop_scan_button.setEnabled(False) + self.main_layout.addWidget(self.stop_scan_button, y, 15, 1, 1) + + y += 1 + self.main_layout.addWidget(self.scan_progress_text, y, 0, 1, 20) + self.scan_progress_bar.setTextVisible(False) + + y += 1 + self.main_layout.addWidget(self.scan_progress_bar, y, 0, 1, 20) + + y += 1 + self.main_layout.addWidget(self.list_title, y, 0, 1, 20) + + y += 1 + self.main_layout.addWidget(self.directories_list, y, 0, 10, 19) + self.delete_button.clicked.connect(self.dir_list_delete_selected) + self.main_layout.addWidget(self.delete_button, y, 19, 1, 1) + + y += 1 + self.enable_compress_radio_button.toggled.connect(self.set_compress_enabled) + self.enable_compress_radio_button.setChecked(True) + self.main_layout.addWidget(self.enable_compress_radio_button, y, 19, 1, 1) + + y += 1 + self.enable_zip_radio_button.toggled.connect(self.set_zip_enabled) + self.enable_zip_radio_button.setChecked(True) + self.main_layout.addWidget(self.enable_zip_radio_button, y, 19, 1, 1) + + y += 1 + self.enable_thumb_radio_button.toggled.connect(self.set_thumb_enabled) + self.enable_thumb_radio_button.setChecked(True) + self.main_layout.addWidget(self.enable_thumb_radio_button, y, 19, 1, 1) + + y += 7 + self.compress_button.clicked.connect(self.compress_click) + self.main_layout.addWidget(self.compress_button, y, 5, 1, 10) + self.stop_compress_button.clicked.connect(self.stop_compress) + self.stop_compress_button.setEnabled(False) + self.main_layout.addWidget(self.stop_compress_button, y, 15, 1, 1) + + y += 1 + self.main_layout.addWidget(self.compress_progress_text, y, 0, 1, 20) + + y += 1 + self.compress_progress_bar.setTextVisible(False) + self.main_layout.addWidget(self.compress_progress_bar, y, 0, 1, 20) + + y += 1 + self.main_layout.addWidget(self.zip_progress_text, y, 0, 1, 20) + + y += 1 + self.zip_progress_bar.setTextVisible(False) + self.main_layout.addWidget(self.zip_progress_bar, y, 0, 1, 20) + + y += 1 + self.main_layout.addWidget(self.thumb_progress_text, y, 0, 1, 20) + + y += 1 + self.thumb_progress_bar.setTextVisible(False) + self.main_layout.addWidget(self.thumb_progress_bar, y, 0, 1, 20) + + def dir_list_delete_selected(self): + for selected_item in self.directories_list.selectedItems(): + self.directories_list.takeItem(self.directories_list.row(selected_item)) + + def get_dir_list(self): + items = [] + for index in range(self.directories_list.count()): + items.append(self.directories_list.item(index).text()) + return items + + def set_compress_enabled(self, enabled): + self.compress_progress_bar.setHidden(not enabled) + self.compress_progress_text.setEnabled(enabled) + + def set_zip_enabled(self, enabled): + self.zip_progress_bar.setHidden(not enabled) + self.zip_progress_text.setEnabled(enabled) + + def set_thumb_enabled(self, enabled): + self.thumb_progress_bar.setHidden(not enabled) + self.thumb_progress_text.setEnabled(enabled) + + def set_ui_enabled(self, enabled, is_scan): + self.dir_path_line_edit.setEnabled(enabled) + self.dir_thumb_path_line_edit.setEnabled(enabled) + self.stop_compress_button.setEnabled(enabled) + self.stop_scan_button.setEnabled(enabled) + self.compress_button.setEnabled(enabled) + self.scan_button.setEnabled(enabled) + self.delete_button.setEnabled(enabled) + self.enable_zip_radio_button.setEnabled(enabled) + self.enable_compress_radio_button.setEnabled(enabled) + self.enable_thumb_radio_button.setEnabled(enabled) + self.dir_selection_button.setEnabled(enabled) + self.dir_thumb_selection_button.setEnabled(enabled) + self.stop_scan_button.setEnabled((not enabled) and is_scan) + self.stop_compress_button.setEnabled((not enabled) and (not is_scan)) + + def scan_click(self): + self.directories_list.clear() + # Start scan thread + self.set_ui_enabled(False, True) + self.scanner = Scanner(self.dir_path_line_edit.text()) + self.scanner.signals.scanned_dir_signal.connect(self.add_dir_to_list) + self.scanner.signals.scan_finished_signal.connect(self.scan_finished) + self.scanner.signals.scanned_dir_finished.connect(self.reset_progress_scan) + self.scanner.signals.scanned_images_signal.connect(self.add_progress_scan) + self.scanner.signals.new_scan_task_started.connect(self.scan_progress_text.setText) + self.thread_pool.start(self.scanner) + + def stop_scan(self): + self.scanner.stop() + + def add_dir_to_list(self, directory): + self.directories_list.addItem(directory) + + def scan_finished(self, dir_list, image_list): + self.set_ui_enabled(True, True) + self.image_list = image_list + self.list_title.setText( + str(len(self.image_list)) + " images dans " + str(len(self.get_dir_list())) + " dossiers :") + self.reset_progress_compress() + self.reset_progress_zip() + self.reset_progress_thumb() + if self.scanner.is_aborted(): + QMessageBox.warning(self, "Scan Annulé", "Scan des dossiers stoppé\n" + str(len(dir_list)) + " dossier et " + + str(len(self.image_list)) + " images trouvés") else: - img = img.resize((size[0], size[1]), Image.BILINEAR) - # If the scale is the same, we do not need to crop - filename = get_new_path(current_img) - if not os.path.exists(os.path.dirname(filename)): - try: - os.makedirs(os.path.dirname(filename)) - except OSError: - sys.exit("Fatal : Directory '" + os.path.dirname(filename) + "' does not exist and cannot be created") + QMessageBox.information(self, "Scan Terminé", + "Scan des dossiers terminé\n" + str(len(dir_list)) + " dossier et " + + str(len(self.image_list)) + " images trouvés") - img.save(filename, "JPEG") - print("done") - print("Thumbnails saved in 'photos_thumb' directory") + def compress_click(self): + if self.directories_list.count() == 0: + QMessageBox.warning(self, "Erreur", "Aucun dossier trouvé\nVeuillez vérifier le dossier parent") + elif (not self.enable_compress_radio_button.checkState()) and (not self.enable_zip_radio_button.checkState()) \ + and (not self.enable_thumb_radio_button.checkState()): + QMessageBox.warning(self, "Erreur", "Aucune action sélectionnée") + else: + self.show_confirmation_dialog() + + def show_confirmation_dialog(self): + msg = str(len(self.get_dir_list())) + " dossiers contenant " + str(len(self.image_list)) + \ + " images selectionnés\n\nActions à réaliser :" + if self.enable_compress_radio_button.checkState(): + msg += "\nCompression des images" + if self.enable_zip_radio_button.checkState(): + msg += "\nCréation de .zip" + if self.enable_thumb_radio_button.checkState(): + msg += "\nCréation de miniatures" + msg += "\n\nÊtes-vous sûr de vouloir continuer ?" + confirmation_dialog = QMessageBox.question(self, 'Confirmation', msg, + QMessageBox.Yes | QMessageBox.No, QMessageBox.No) + if confirmation_dialog == QMessageBox.Yes: + # Start compress thread + self.reset_progress_compress() + self.reset_progress_zip() + self.reset_progress_thumb() + self.set_ui_enabled(False, False) + self.compresser = Compresser(self.get_dir_list(), self.image_list, self.dir_path_line_edit.text(), + self.dir_thumb_path_line_edit.text(), + self.enable_compress_radio_button.checkState(), + self.enable_zip_radio_button.checkState(), + self.enable_thumb_radio_button.checkState()) + self.compresser.signals.finished_signal.connect(self.compress_finished) + self.compresser.signals.new_compress_task_started.connect(self.compress_progress_text.setText) + self.compresser.signals.new_zip_task_started.connect(self.zip_progress_text.setText) + self.compresser.signals.new_thumb_task_started.connect(self.thumb_progress_text.setText) + self.compresser.signals.compress_done.connect(self.add_progress_compress) + self.compresser.signals.zip_done.connect(self.add_progress_zip) + self.compresser.signals.thumb_done.connect(self.add_progress_thumb) + self.thread_pool.start(self.compresser) + + def stop_compress(self): + self.compresser.stop() + + def reset_progress_scan(self): + self.scan_progress_text.setText("Scan") + self.scan_progress_bar.setMinimum(0) + self.scan_progress_bar.setMaximum(len(self.get_dir_list())) + self.scan_progress_bar.setValue(0) + + def reset_progress_compress(self): + self.compress_progress_text.setText("Compression") + self.compress_progress_bar.setMinimum(0) + self.compress_progress_bar.setMaximum(len(self.image_list)) + self.compress_progress_bar.setValue(0) + + def reset_progress_zip(self): + self.zip_progress_text.setText("Création de .zip") + self.zip_progress_bar.setMinimum(0) + self.zip_progress_bar.setMaximum(len(self.get_dir_list())) + self.zip_progress_bar.setValue(0) + + def reset_progress_thumb(self): + self.thumb_progress_text.setText("Création de miniatures") + self.thumb_progress_bar.setMinimum(0) + self.thumb_progress_bar.setMaximum(len(self.image_list)) + self.thumb_progress_bar.setValue(0) + + def add_progress_scan(self): + self.scan_progress_bar.setValue(self.scan_progress_bar.value() + 1) + + def add_progress_compress(self): + self.compress_progress_bar.setValue(self.compress_progress_bar.value() + 1) + + def add_progress_zip(self): + self.zip_progress_bar.setValue(self.zip_progress_bar.value() + 1) + + def add_progress_thumb(self): + self.thumb_progress_bar.setValue(self.thumb_progress_bar.value() + 1) + + def compress_finished(self): + self.set_ui_enabled(True, False) + if self.compresser.is_aborted(): + QMessageBox.warning(self, "Annulé", "Compression stoppée") + else: + QMessageBox.information(self, "Terminé", "Compression terminée") + + def open_dir(self): + dialog = create_file_dialog() + dialog.selectFile(self.dir_path_line_edit.text()) + if dialog.exec_(): + self.dir_path_line_edit.setText(dialog.selectedFiles()[0]) + + def open_thumb_dir(self): + dialog = create_file_dialog() + dialog.selectFile(self.dir_thumb_path_line_edit.text()) + if dialog.exec_(): + self.dir_thumb_path_line_edit.setText(dialog.selectedFiles()[0]) -def get_new_path(img): - """ - Replace the original path to the thumbnail one (replace 'photos' by 'photos_thumb') - :param img: original path - :return: modified path - """ - return img.replace("/photos/", "/photos_thumb/", 1) +class HelpDialog(QDialog): + def __init__(self, parent=None): + QDialog.__init__(self, parent) + self.resize(300, 100) + self.main_layout = QVBoxLayout() + self.setLayout(self.main_layout) + title = QLabel("Compression de photos") + font = title.font() + font.setBold(True) + font.setPixelSize(20) + title.setFont(font) + title.setAlignment(Qt.AlignCenter) + self.main_layout.addWidget(title) -def zip_dir(path): - """ - Compress images in the specified directory and sub-directories - Create one zip per folder + self.tabs = QTabWidget() + self.tab1 = QWidget() + self.tab2 = QWidget() - :param path: directory to get files in - :return: - """ - for root, dirs, files in os.walk(path): - if is_directory_valid(root, files): - print("Compressing '" + root + "'", end="") - with ZipFile(os.path.join(root, get_current_dir(root)) + ".zip", "w", ZIP_DEFLATED) as zip_file: - for fn in files: - if not fn.endswith("zip") and is_file_valid_image(fn): - print(".", end="") - absolute_file_name = os.path.join(root, fn) - zippped_file_name = absolute_file_name[len(root)+len(os.sep):] # XXX: relative path - zip_file.write(absolute_file_name, zippped_file_name) - print("done") - print("COMPRESSION FINISHED") + self.tabs.addTab(self.tab1, "À Propos") + self.tabs.addTab(self.tab2, "Librairies") + self.create_about_tab() + self.create_libs_tab() + self.main_layout.addWidget(self.tabs) + def create_about_tab(self): + self.tab1.layout = QVBoxLayout(self) + author = QLabel("(c) 2018 Arnaud VERGNET") + author.setAlignment(Qt.AlignCenter) + self.tab1.layout.addWidget(author) -def is_directory_valid(path, files): - """ - Check if the given path is not hidden or without images - :param files: files in the folder - :param path: Path to check - :return: True if path contains a hidden folder or is empty, False otherwise - """ - directories = path.split(os.sep) - valid = len(files) > 0 - for dn in directories: # check if directory or one of its parent are not hidden - if dn.startswith(".") or not valid: - valid = False - break - if valid: - valid_files = [] - for fn in files: # check if directory contains valid images - if is_file_valid_image(fn): - valid_files.append(fn) - valid = len(valid_files) > 0 - return valid + github = QLabel("Disponible sur GitHub sous license GPLv3") + github.setAlignment(Qt.AlignCenter) + self.tab1.layout.addWidget(github) + gh_link = QLabel() + gh_link.setOpenExternalLinks(True) + gh_link.setText("https://github.com/Keplyx") + gh_link.setAlignment(Qt.AlignCenter) + self.tab1.layout.addWidget(gh_link) + self.tab1.setLayout(self.tab1.layout) -def is_file_valid_image(file): - return file.endswith("png") or file.endswith("jpg") or file.endswith("jpeg") + def create_libs_tab(self): + self.tab2.layout = QVBoxLayout(self) + qt_lib = QLabel("Qt5") + qt_lib.setAlignment(Qt.AlignCenter) + self.tab2.layout.addWidget(qt_lib) + python_lib = QLabel("python3 avec PyQt5") + python_lib.setAlignment(Qt.AlignCenter) + self.tab2.layout.addWidget(python_lib) -def get_current_dir(path): - """ - Get the name of the current directory - :param path: Path to search the name in - :return: directory name - """ - return os.path.basename(os.path.normpath(path)) + self.tab2.setLayout(self.tab2.layout) - -def get_confirmation(path): - """ - Tell the user which folders will be compressed, and asks for confirmation - :param path: Root path for search - :return: True if user confirmed, False otherwise - """ - print("The following folders will be compressed (hidden and empty folders are ignored):") - for root, dirs, files in os.walk(path): - if is_directory_valid(root, files): - print(root) - confirmation = input("Are you sure you want to proceed? [Y/n]") - return confirmation == "Y" or confirmation == "y" + @pyqtSlot() + def on_click(self): + for currentQTableWidgetItem in self.tableWidget.selectedItems(): + print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) if __name__ == '__main__': - # Get path from arguments or use the script's path - if len(sys.argv) > 1: - directory = sys.argv[1] - else: - directory = os.path.dirname(os.path.realpath(__file__)) - if get_confirmation(directory): - zip_dir(directory) - compress_images(get_images(directory)) - else: - print("Compression aborted") + app = QApplication(sys.argv) + main_window = MainWindow() + main_window.show() + sys.exit(app.exec_())