From beadd27490f085e35e1d6182325ef472a902eab7 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Tue, 15 Oct 2019 02:10:46 -0500 Subject: [PATCH] Fixed Icon generation logic --- bin/pytop-0-0-1-x64.deb | Bin 23872 -> 23940 bytes src/Pytop/widgets/Grid.py | 8 +++---- src/Pytop/widgets/Icon.py | 48 +++++++++++++++++++++++--------------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/bin/pytop-0-0-1-x64.deb b/bin/pytop-0-0-1-x64.deb index d4ec8e7b8ad8fcc5eb0e9a619f4ac9c361e136bf..169c265915bc4f360fd53a5a5111c9a8059441d6 100644 GIT binary patch delta 3559 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 delta 3490 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 Qwz0%#`vL#}000D8TCMQA!2kdN diff --git a/src/Pytop/widgets/Grid.py b/src/Pytop/widgets/Grid.py index 4655d87..f56a4cb 100644 --- a/src/Pytop/widgets/Grid.py +++ b/src/Pytop/widgets/Grid.py @@ -20,8 +20,7 @@ from utils.FileHandler import FileHandler def threaded(fn): def wrapper(*args, **kwargs): - thread = threading.Thread(target=fn, args=args, kwargs=kwargs).start() - + threading.Thread(target=fn, args=args, kwargs=kwargs).start() return wrapper @@ -85,10 +84,9 @@ class Grid: desktop.sort() files.sort() - startVideoIcons = len(dirPaths) files = dirPaths + vids + images + desktop + files self.generateGridIcons(path, files) - self.fillVideoIcons(path, vids, startVideoIcons) + self.fillVideoIcons(path, vids, len(dirPaths)) @threaded @@ -103,7 +101,7 @@ class Grid: # Wait till we have a proper index... while len(self.store) < (start + 1): - time.sleep(.500) + time.sleep(.200) i = start for file in files: diff --git a/src/Pytop/widgets/Icon.py b/src/Pytop/widgets/Icon.py index be21542..af1eb42 100644 --- a/src/Pytop/widgets/Icon.py +++ b/src/Pytop/widgets/Icon.py @@ -30,6 +30,8 @@ class Icon: self.iconContainerWH = settings.returnContainerWH() self.systemIconImageWH = settings.returnSystemIconImageWH() self.viIconWH = settings.returnVIIconWH() + self.SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) + "/" + self.INTERNAL_ICON_PTH = self.SCRIPT_PTH + "../resources/icons/text.png" def createIcon(self, dir, file): @@ -38,30 +40,36 @@ class Icon: def createThumbnail(self, dir, file): fullPath = dir + "/" + file - # Video thumbnail - if file.lower().endswith(self.vidsList): - fileHash = hashlib.sha256(str.encode(fullPath)).hexdigest() - hashImgPth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png" + try: + # Video thumbnail + if file.lower().endswith(self.vidsList): + fileHash = hashlib.sha256(str.encode(fullPath)).hexdigest() + hashImgPth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png" - if isfile(hashImgPth) == False: - self.generateVideoThumbnail(fullPath, hashImgPth) + if isfile(hashImgPth) == False: + self.generateVideoThumbnail(fullPath, hashImgPth) - thumbnl = self.createScaledImage(hashImgPth, self.viIconWH) + thumbnl = self.createScaledImage(hashImgPth, self.viIconWH) - if thumbnl == None: # If no icon, try stock file icon... - thumbnl = gtk.Image.new_from_icon_name("gtk-file", gtk.IconSize.LARGE_TOOLBAR) + if thumbnl == None: # If no icon whatsoever, return internal default + thumbnl = gtk.Image.new_from_file(self.SCRIPT_PTH + "../resources/icons/video.png") - if thumbnl == None: # If no icon whatsoever, return internal default - thumbnl = gtk.Image.new_from_file("resources/icons/bin.png") + return thumbnl + except Exception as e: + print("Thumbnail generation issue:") + print(e) + return gtk.Image.new_from_file(self.SCRIPT_PTH + "../resources/icons/video.png") - return thumbnl def getIconImage(self, file, fullPath): try: thumbnl = None + # Video icon + if file.lower().endswith(self.vidsList): + thumbnl = gtk.Image.new_from_file(self.SCRIPT_PTH + "../resources/icons/video.png") # Image Icon - if file.lower().endswith(self.imagesList): + elif file.lower().endswith(self.imagesList): thumbnl = self.createScaledImage(fullPath, self.viIconWH) # .desktop file parsing elif fullPath.lower().endswith( ('.desktop',) ): @@ -70,16 +78,14 @@ class Icon: else: thumbnl = self.getSystemThumbnail(fullPath, self.systemIconImageWH[0]) - if thumbnl == None: # If no icon, try stock file icon... - thumbnl = gtk.Image.new_from_icon_name("gtk-file", gtk.IconSize.LARGE_TOOLBAR) - if thumbnl == None: # If no icon whatsoever, return internal default - thumbnl = gtk.Image.new_from_file("resources/icons/bin.png") + thumbnl = gtk.Image.new_from_file(self.INTERNAL_ICON_PTH) return thumbnl except Exception as e: + print("Icon generation issue:") print(e) - return gtk.Image.new_from_file("resources/icons/bin.png") + return gtk.Image.new_from_file(self.INTERNAL_ICON_PTH) def parseDesktopFiles(self, fullPath): @@ -132,6 +138,7 @@ class Icon: return self.createScaledImage(altIconPath, self.systemIconImageWH) except Exception as e: + print(".desktop icon generation issue:") print(e) return None @@ -140,7 +147,7 @@ class Icon: try: if os.path.exists(filename): gioFile = gio.File.new_for_path(filename) - info = gioFile.query_info('standard::icon' , 0 , gio.Cancellable()) + info = gioFile.query_info('standard::icon' , 0, gio.Cancellable()) icon = info.get_icon().get_names()[0] iconTheme = gtk.IconTheme.get_default() iconData = iconTheme.lookup_icon(icon , size , 0) @@ -152,6 +159,7 @@ class Icon: else: return None except Exception as e: + print("system icon generation issue:") print(e) return None @@ -162,6 +170,7 @@ class Icon: scaledPixBuf = pixbuf.scale_simple(wxh[0], wxh[1], 2) # 2 = BILINEAR and is best by default return gtk.Image.new_from_pixbuf(scaledPixBuf) except Exception as e: + print("Image Scaling Issue:") print(e) return None @@ -170,4 +179,5 @@ class Icon: proc = subprocess.Popen([self.thubnailGen, "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPath, "-o", hashImgPth]) proc.wait() except Exception as e: + print("Video thumbnail generation issue in thread:") print(e)