From 87730119251e252d64d181aed1924c61fe837609 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Sun, 16 Jun 2019 04:28:58 -0500 Subject: [PATCH] Using treeview instead of grid --- README.md | 1 - bin/pytop-0-0-1-x64.deb | Bin 19164 -> 19836 bytes src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.py | 7 +- src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.sh | 12 ++ .../opt/Pytop/resources/PyTop.glade | 178 +++++++++++------- .../opt/Pytop/resources/stylesheet.css | 12 ++ .../pytop-0-0-1-x64/opt/Pytop/utils/Events.py | 10 +- .../pytop-0-0-1-x64/opt/Pytop/utils/Grid.py | 85 ++++++--- .../pytop-0-0-1-x64/opt/Pytop/utils/Icon.py | 14 +- src/versions/pytop-0.0.1/Pytop/PyTop.py | 7 +- src/versions/pytop-0.0.1/Pytop/PyTop.sh | 12 ++ .../pytop-0.0.1/Pytop/resources/PyTop.glade | 178 +++++++++++------- .../Pytop/resources/stylesheet.css | 12 ++ .../pytop-0.0.1/Pytop/utils/Events.py | 10 +- src/versions/pytop-0.0.1/Pytop/utils/Grid.py | 85 ++++++--- src/versions/pytop-0.0.1/Pytop/utils/Icon.py | 14 +- 16 files changed, 404 insertions(+), 233 deletions(-) create mode 100755 src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.sh create mode 100755 src/versions/pytop-0.0.1/Pytop/PyTop.sh diff --git a/README.md b/README.md index ee3dc3a..57303ad 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ Need python 3 # TODO diff --git a/bin/pytop-0-0-1-x64.deb b/bin/pytop-0-0-1-x64.deb index e752683218d00fe75c2b2653d727e333e1c58b89..75e21a34ece815e0637afa98c867668b9bc16ea7 100644 GIT binary patch delta 17822 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�Jj5q_d5R5dr~c;FYN4#%P?C&V{!- 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 AJOBUy diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.py b/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.py index f427990..ba52412 100755 --- a/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.py +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 # Gtk Imports -import gi +import gi, faulthandler gi.require_version('Gtk', '3.0') gi.require_version('WebKit2', '4.0') @@ -15,6 +15,7 @@ from utils import Settings, Events gdk.threads_init() class Main: def __init__(self): + faulthandler.enable() webkit.WebView() # Needed for glade file to load... self.builder = gtk.Builder() @@ -27,10 +28,6 @@ class Main: window.show_all() - - - - if __name__ == "__main__": main = Main() gtk.main() diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.sh b/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.sh new file mode 100755 index 0000000..6cf9f3f --- /dev/null +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/PyTop.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# set -o xtrace ## To debug scripts +# set -o errexit ## To exit on error +# set -o errunset ## To exit if a variable is referenced but not set + + +function main() { + # GTK_DEBUG=interactive python3 ./PyTop.py + python3 ./PyTop.py +} +main $@; diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/PyTop.glade b/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/PyTop.glade index 9bebfe5..f7d25bb 100644 --- a/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/PyTop.glade +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/PyTop.glade @@ -22,23 +22,53 @@ main + 1 False + right True False vertical - - 300 - 26 + True - True - gtk-edit + False + + + 300 + 26 + True + True + gtk-edit + + + + False + True + 0 + + + + + gtk-save + True + True + True + True + True + + + + False + True + 1 + + False @@ -52,12 +82,14 @@ False - gtk-copy + gtk-delete True True True + 65 True True + False @@ -65,6 +97,9 @@ 0 + + + gtk-cut @@ -77,19 +112,15 @@ False True - 1 + 2 - - - - gtk-delete + gtk-copy True True True - 65 True True @@ -109,6 +140,12 @@ + + True + False + gtk-go-up + 3 + True False @@ -138,35 +175,6 @@ True False - - - True - True - edit-find-symbolic - False - False - - - True - True - 0 - - - - - True - False - select-folder - Folders - Directory Chooser - - - - False - True - 1 - - True @@ -176,12 +184,57 @@ True + + False + True + 0 + + + + + True + True + edit-find-symbolic + False + False + + + True + True + 1 + + + + + True + True + True + Up + upImage + True + + False True 2 + + + True + False + select-folder + Folders + Directory Chooser + + + + False + True + 3 + + False @@ -193,6 +246,7 @@ True False + True False @@ -210,38 +264,16 @@ True False - + True - False - vertical - 10 - 10 - - - - - - - - - - - - - - - - - - - - - - - - - - + True + False + False + True + both + + + @@ -262,7 +294,7 @@ True True popOutBttn - left + bottom True diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/stylesheet.css b/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/stylesheet.css index 5a93664..e0240db 100644 --- a/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/stylesheet.css +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/resources/stylesheet.css @@ -11,3 +11,15 @@ notebook > header { background-color: rgba(0, 0, 0, 0.24); border-color: rgba(0, 232, 255, 0.64); } + +box, +iconview { + background-color: rgba(0, 0, 0, 0.2); + background: rgba(0, 0, 0, 0.2); +} + +treeview, +treeview.view { + background: rgba(0, 0, 0, 0.64); + background-color: rgba(0, 0, 0, 0.64); +} diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Events.py b/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Events.py index 4615ba6..988dda0 100644 --- a/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Events.py +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Events.py @@ -28,7 +28,15 @@ class Events: def setIconViewDir(self, widget, data=None): newPath = widget.get_filename() - Grid(self.desktop, self.settings, newPath) + self.grid = Grid(self.desktop, self.settings, newPath) + + def dirUp(self, widget, data=None): + newPath = self.grid.returnParentDir() + self.grid = Grid(self.desktop, self.settings, newPath) + + def iconLeftClickEventManager(self, widget, eve, item): + self.grid.iconLeftClickEventManager(widget, eve, item) + def showGridControlMenu(self, widget, data=None): popover = self.builder.get_object("gridControlMenu") diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Grid.py b/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Grid.py index e750f85..c213e6e 100644 --- a/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Grid.py +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Grid.py @@ -8,7 +8,7 @@ gi.require_version('Gdk', '3.0') from gi.repository import Gtk as gtk from gi.repository import Gdk as gdk from gi.repository import GdkPixbuf -from gi.repository import GObject as gobject +from gi.repository import GLib # Python imports import os, threading @@ -18,8 +18,6 @@ from .Icon import Icon from .FileHandler import FileHandler -gdk.threads_init() - def threaded(fn): def wrapper(*args, **kwargs): threading.Thread(target=fn, args=args, kwargs=kwargs).start() @@ -31,27 +29,42 @@ class Grid: self.settings = settings self.filehandler = FileHandler() - self.store = gtk.ListStore(GdkPixbuf.Pixbuf, str) + self.store = gtk.TreeStore(str, GdkPixbuf.Pixbuf) self.usrHome = settings.returnUserHome() self.builder = self.settings.returnBuilder() self.ColumnSize = self.settings.returnColumnSize() self.currentPath = "" self.selectedFile = "" - + self.treeViewCol = None self.desktop.set_model(self.store) - self.desktop.set_pixbuf_column(0) - self.desktop.set_text_column(1) - self.desktop.connect("item-activated", self.iconLeftClickEventManager) - self.desktop.connect("button_press_event", self.iconRightClickEventManager, (self.desktop,)) + + if len(self.desktop.get_columns()) == 0: + self.treeViewCol = gtk.TreeViewColumn("Files") + # Create a column cell to display text + colCellText = gtk.CellRendererText() + # Create a column cell to display an image + colCellImg = gtk.CellRendererPixbuf() + # Add the cells to the column + self.treeViewCol.pack_start(colCellImg, False) + self.treeViewCol.pack_start(colCellText, True) + # Bind the text cell to column 0 of the tree's model + self.treeViewCol.add_attribute(colCellText, "text", 0) + # Bind the image cell to column 1 of the tree's model + self.treeViewCol.add_attribute(colCellImg, "pixbuf", 1) + # Append the columns to the TreeView + self.desktop.append_column(self.treeViewCol) + else: + self.treeViewCol = self.desktop.get_column(0) self.setIconViewDir(newPath) - @threaded + def setIconViewDir(self, path): + # self.treeViewCol.clear() self.store.clear() self.currentPath = path - dirPaths = ['.', '..'] + paths = ['.', '..'] files = [] for f in listdir(path): @@ -62,42 +75,49 @@ class Grid: if isfile(file): files.append(f) else: - dirPaths.append(f) + paths.append(f) - dirPaths.sort() + paths.sort() files.sort() - files = dirPaths + files + files = paths + files self.generateDirectoryGrid(path, files) - def generateDirectoryGrid(self, dirPath, files): + @threaded + def generateDirectoryGrid(self, path, files): fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files) tickCount = 0.0 - row = 0 - col = 0 - x = 0 - y = 0 loadProgress = self.builder.get_object('loadProgress') loadProgress.set_text("Loading...") loadProgress.set_fraction(0.0) - for file in files: - imgBuffer = Icon(self.settings).createIcon(dirPath, file) - gobject.idle_add(self.addToGrid, (imgBuffer, file,)) - tickCount += fractionTick + imgBuffer = self.getImgBuffer(path, file) + GLib.idle_add(self.addToGrid, (imgBuffer, file,)) + # tickCount += fractionTick loadProgress.set_fraction(tickCount) - loadProgress.set_text("Finished...") - def addToGrid(self, args): - self.store.append([args[0], args[1]]) + def getImgBuffer(self, path, file): + return Icon(self.settings).createIcon(path, file) + + def addToGrid(self, args, parent=None): + # NOTE: Converting to pixbuf after retreval to keep Icon.py more universal. + # We can just remove get_pixbuf to get a gtk image. + # We probably need a settings check to chose a set type... + self.store.append(parent, [args[1], args[0].get_pixbuf()]) + + + def iconLeftClickEventManager(self, widget, eve, item): + tree_selection = self.desktop.get_selection() + (model, pathlist) = tree_selection.get_selected_rows() + fileName = None + dir = self.currentPath + for path in pathlist : + tree_iter = model.get_iter(path) + fileName = model.get_value(tree_iter,0) - def iconLeftClickEventManager(self, widget, item): try: - model = widget.get_model() - fileName = model[item][1] - dir = self.currentPath - file = dir + "/" + fileName + file = dir + "/" + fileName if fileName == ".": self.setIconViewDir(dir) @@ -135,6 +155,9 @@ class Grid: print(e) + def returnParentDir(self): + return os.path.abspath(os.path.join(self.currentPath, os.pardir)) + # Passthrough file control events def createFile(arg): pass diff --git a/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Icon.py b/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Icon.py index a0c22c1..d6a377a 100644 --- a/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Icon.py +++ b/src/debs/pytop-0-0-1-x64/opt/Pytop/utils/Icon.py @@ -57,12 +57,14 @@ class Icon: elif file.lower().endswith(imagesList): thumbnl = self.createIconImageBuffer(fullPathFile, self.viIconWxH) else: - thumbPth = self.getSystemThumbnail(fullPathFile, self.systemIconImageWxH[0]) - thumbnl = self.createIconImageBuffer(thumbPth, self.systemIconImageWxH) + try: + thumbPth = self.getSystemThumbnail(fullPathFile, self.systemIconImageWxH[0]) + thumbnl = self.createIconImageBuffer(thumbPth, self.systemIconImageWxH) + except Exception as e: + print(e) + thumbnl = gtk.Image(stock = gtk.STOCK_DIALOG_ERROR) - # NOTE: Returning pixbuf through retreval to keep this file more universaly usable. - # We can just remove get_pixbuf to get a gtk image - return thumbnl.get_pixbuf() + return thumbnl def createIconImageBuffer(self, path, wxh): pixbuf = None @@ -76,7 +78,7 @@ class Icon: except Exception as e: print(e) - return gtk.Image() + return gtk.Image(stock = gtk.STOCK_DIALOG_ERROR) def getSystemThumbnail(self, filename,size): final_filename = "" diff --git a/src/versions/pytop-0.0.1/Pytop/PyTop.py b/src/versions/pytop-0.0.1/Pytop/PyTop.py index f427990..ba52412 100755 --- a/src/versions/pytop-0.0.1/Pytop/PyTop.py +++ b/src/versions/pytop-0.0.1/Pytop/PyTop.py @@ -1,7 +1,7 @@ #!/usr/bin/python3 # Gtk Imports -import gi +import gi, faulthandler gi.require_version('Gtk', '3.0') gi.require_version('WebKit2', '4.0') @@ -15,6 +15,7 @@ from utils import Settings, Events gdk.threads_init() class Main: def __init__(self): + faulthandler.enable() webkit.WebView() # Needed for glade file to load... self.builder = gtk.Builder() @@ -27,10 +28,6 @@ class Main: window.show_all() - - - - if __name__ == "__main__": main = Main() gtk.main() diff --git a/src/versions/pytop-0.0.1/Pytop/PyTop.sh b/src/versions/pytop-0.0.1/Pytop/PyTop.sh new file mode 100755 index 0000000..6cf9f3f --- /dev/null +++ b/src/versions/pytop-0.0.1/Pytop/PyTop.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# set -o xtrace ## To debug scripts +# set -o errexit ## To exit on error +# set -o errunset ## To exit if a variable is referenced but not set + + +function main() { + # GTK_DEBUG=interactive python3 ./PyTop.py + python3 ./PyTop.py +} +main $@; diff --git a/src/versions/pytop-0.0.1/Pytop/resources/PyTop.glade b/src/versions/pytop-0.0.1/Pytop/resources/PyTop.glade index 9bebfe5..f7d25bb 100644 --- a/src/versions/pytop-0.0.1/Pytop/resources/PyTop.glade +++ b/src/versions/pytop-0.0.1/Pytop/resources/PyTop.glade @@ -22,23 +22,53 @@ main + 1 False + right True False vertical - - 300 - 26 + True - True - gtk-edit + False + + + 300 + 26 + True + True + gtk-edit + + + + False + True + 0 + + + + + gtk-save + True + True + True + True + True + + + + False + True + 1 + + False @@ -52,12 +82,14 @@ False - gtk-copy + gtk-delete True True True + 65 True True + False @@ -65,6 +97,9 @@ 0 + + + gtk-cut @@ -77,19 +112,15 @@ False True - 1 + 2 - - - - gtk-delete + gtk-copy True True True - 65 True True @@ -109,6 +140,12 @@ + + True + False + gtk-go-up + 3 + True False @@ -138,35 +175,6 @@ True False - - - True - True - edit-find-symbolic - False - False - - - True - True - 0 - - - - - True - False - select-folder - Folders - Directory Chooser - - - - False - True - 1 - - True @@ -176,12 +184,57 @@ True + + False + True + 0 + + + + + True + True + edit-find-symbolic + False + False + + + True + True + 1 + + + + + True + True + True + Up + upImage + True + + False True 2 + + + True + False + select-folder + Folders + Directory Chooser + + + + False + True + 3 + + False @@ -193,6 +246,7 @@ True False + True False @@ -210,38 +264,16 @@ True False - + True - False - vertical - 10 - 10 - - - - - - - - - - - - - - - - - - - - - - - - - - + True + False + False + True + both + + + @@ -262,7 +294,7 @@ True True popOutBttn - left + bottom True diff --git a/src/versions/pytop-0.0.1/Pytop/resources/stylesheet.css b/src/versions/pytop-0.0.1/Pytop/resources/stylesheet.css index 5a93664..e0240db 100644 --- a/src/versions/pytop-0.0.1/Pytop/resources/stylesheet.css +++ b/src/versions/pytop-0.0.1/Pytop/resources/stylesheet.css @@ -11,3 +11,15 @@ notebook > header { background-color: rgba(0, 0, 0, 0.24); border-color: rgba(0, 232, 255, 0.64); } + +box, +iconview { + background-color: rgba(0, 0, 0, 0.2); + background: rgba(0, 0, 0, 0.2); +} + +treeview, +treeview.view { + background: rgba(0, 0, 0, 0.64); + background-color: rgba(0, 0, 0, 0.64); +} diff --git a/src/versions/pytop-0.0.1/Pytop/utils/Events.py b/src/versions/pytop-0.0.1/Pytop/utils/Events.py index 4615ba6..988dda0 100644 --- a/src/versions/pytop-0.0.1/Pytop/utils/Events.py +++ b/src/versions/pytop-0.0.1/Pytop/utils/Events.py @@ -28,7 +28,15 @@ class Events: def setIconViewDir(self, widget, data=None): newPath = widget.get_filename() - Grid(self.desktop, self.settings, newPath) + self.grid = Grid(self.desktop, self.settings, newPath) + + def dirUp(self, widget, data=None): + newPath = self.grid.returnParentDir() + self.grid = Grid(self.desktop, self.settings, newPath) + + def iconLeftClickEventManager(self, widget, eve, item): + self.grid.iconLeftClickEventManager(widget, eve, item) + def showGridControlMenu(self, widget, data=None): popover = self.builder.get_object("gridControlMenu") diff --git a/src/versions/pytop-0.0.1/Pytop/utils/Grid.py b/src/versions/pytop-0.0.1/Pytop/utils/Grid.py index e750f85..c213e6e 100644 --- a/src/versions/pytop-0.0.1/Pytop/utils/Grid.py +++ b/src/versions/pytop-0.0.1/Pytop/utils/Grid.py @@ -8,7 +8,7 @@ gi.require_version('Gdk', '3.0') from gi.repository import Gtk as gtk from gi.repository import Gdk as gdk from gi.repository import GdkPixbuf -from gi.repository import GObject as gobject +from gi.repository import GLib # Python imports import os, threading @@ -18,8 +18,6 @@ from .Icon import Icon from .FileHandler import FileHandler -gdk.threads_init() - def threaded(fn): def wrapper(*args, **kwargs): threading.Thread(target=fn, args=args, kwargs=kwargs).start() @@ -31,27 +29,42 @@ class Grid: self.settings = settings self.filehandler = FileHandler() - self.store = gtk.ListStore(GdkPixbuf.Pixbuf, str) + self.store = gtk.TreeStore(str, GdkPixbuf.Pixbuf) self.usrHome = settings.returnUserHome() self.builder = self.settings.returnBuilder() self.ColumnSize = self.settings.returnColumnSize() self.currentPath = "" self.selectedFile = "" - + self.treeViewCol = None self.desktop.set_model(self.store) - self.desktop.set_pixbuf_column(0) - self.desktop.set_text_column(1) - self.desktop.connect("item-activated", self.iconLeftClickEventManager) - self.desktop.connect("button_press_event", self.iconRightClickEventManager, (self.desktop,)) + + if len(self.desktop.get_columns()) == 0: + self.treeViewCol = gtk.TreeViewColumn("Files") + # Create a column cell to display text + colCellText = gtk.CellRendererText() + # Create a column cell to display an image + colCellImg = gtk.CellRendererPixbuf() + # Add the cells to the column + self.treeViewCol.pack_start(colCellImg, False) + self.treeViewCol.pack_start(colCellText, True) + # Bind the text cell to column 0 of the tree's model + self.treeViewCol.add_attribute(colCellText, "text", 0) + # Bind the image cell to column 1 of the tree's model + self.treeViewCol.add_attribute(colCellImg, "pixbuf", 1) + # Append the columns to the TreeView + self.desktop.append_column(self.treeViewCol) + else: + self.treeViewCol = self.desktop.get_column(0) self.setIconViewDir(newPath) - @threaded + def setIconViewDir(self, path): + # self.treeViewCol.clear() self.store.clear() self.currentPath = path - dirPaths = ['.', '..'] + paths = ['.', '..'] files = [] for f in listdir(path): @@ -62,42 +75,49 @@ class Grid: if isfile(file): files.append(f) else: - dirPaths.append(f) + paths.append(f) - dirPaths.sort() + paths.sort() files.sort() - files = dirPaths + files + files = paths + files self.generateDirectoryGrid(path, files) - def generateDirectoryGrid(self, dirPath, files): + @threaded + def generateDirectoryGrid(self, path, files): fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files) tickCount = 0.0 - row = 0 - col = 0 - x = 0 - y = 0 loadProgress = self.builder.get_object('loadProgress') loadProgress.set_text("Loading...") loadProgress.set_fraction(0.0) - for file in files: - imgBuffer = Icon(self.settings).createIcon(dirPath, file) - gobject.idle_add(self.addToGrid, (imgBuffer, file,)) - tickCount += fractionTick + imgBuffer = self.getImgBuffer(path, file) + GLib.idle_add(self.addToGrid, (imgBuffer, file,)) + # tickCount += fractionTick loadProgress.set_fraction(tickCount) - loadProgress.set_text("Finished...") - def addToGrid(self, args): - self.store.append([args[0], args[1]]) + def getImgBuffer(self, path, file): + return Icon(self.settings).createIcon(path, file) + + def addToGrid(self, args, parent=None): + # NOTE: Converting to pixbuf after retreval to keep Icon.py more universal. + # We can just remove get_pixbuf to get a gtk image. + # We probably need a settings check to chose a set type... + self.store.append(parent, [args[1], args[0].get_pixbuf()]) + + + def iconLeftClickEventManager(self, widget, eve, item): + tree_selection = self.desktop.get_selection() + (model, pathlist) = tree_selection.get_selected_rows() + fileName = None + dir = self.currentPath + for path in pathlist : + tree_iter = model.get_iter(path) + fileName = model.get_value(tree_iter,0) - def iconLeftClickEventManager(self, widget, item): try: - model = widget.get_model() - fileName = model[item][1] - dir = self.currentPath - file = dir + "/" + fileName + file = dir + "/" + fileName if fileName == ".": self.setIconViewDir(dir) @@ -135,6 +155,9 @@ class Grid: print(e) + def returnParentDir(self): + return os.path.abspath(os.path.join(self.currentPath, os.pardir)) + # Passthrough file control events def createFile(arg): pass diff --git a/src/versions/pytop-0.0.1/Pytop/utils/Icon.py b/src/versions/pytop-0.0.1/Pytop/utils/Icon.py index a0c22c1..d6a377a 100644 --- a/src/versions/pytop-0.0.1/Pytop/utils/Icon.py +++ b/src/versions/pytop-0.0.1/Pytop/utils/Icon.py @@ -57,12 +57,14 @@ class Icon: elif file.lower().endswith(imagesList): thumbnl = self.createIconImageBuffer(fullPathFile, self.viIconWxH) else: - thumbPth = self.getSystemThumbnail(fullPathFile, self.systemIconImageWxH[0]) - thumbnl = self.createIconImageBuffer(thumbPth, self.systemIconImageWxH) + try: + thumbPth = self.getSystemThumbnail(fullPathFile, self.systemIconImageWxH[0]) + thumbnl = self.createIconImageBuffer(thumbPth, self.systemIconImageWxH) + except Exception as e: + print(e) + thumbnl = gtk.Image(stock = gtk.STOCK_DIALOG_ERROR) - # NOTE: Returning pixbuf through retreval to keep this file more universaly usable. - # We can just remove get_pixbuf to get a gtk image - return thumbnl.get_pixbuf() + return thumbnl def createIconImageBuffer(self, path, wxh): pixbuf = None @@ -76,7 +78,7 @@ class Icon: except Exception as e: print(e) - return gtk.Image() + return gtk.Image(stock = gtk.STOCK_DIALOG_ERROR) def getSystemThumbnail(self, filename,size): final_filename = ""