From 7d75395d5ae5d7333fbc1162a2e2b620d93b12aa Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Tue, 28 Dec 2021 20:27:39 -0600 Subject: [PATCH] Project structure cleanup; setting import changes --- README.md | 2 +- .../PyFM.sh => debs/clear_pycache_dirs.sh} | 6 +- src/debs/solarfm-0-0-1-x64/DEBIAN/control | 4 +- .../opt/SolarFM/__builtins__.py | 6 +- .../solarfm-0-0-1-x64/opt/SolarFM/__init__.py | 6 +- .../solarfm-0-0-1-x64/opt/SolarFM/__main__.py | 15 +- .../shellfm/windows/WindowController.py | 4 +- .../opt/SolarFM/shellfm/windows/view/Path.py | 11 +- .../opt/SolarFM/shellfm/windows/view/View.py | 4 +- .../shellfm/windows/view/utils/FileHandler.py | 10 +- .../shellfm/windows/view/utils/Launcher.py | 27 +- .../shellfm/windows/view/utils/Settings.py | 34 +- .../opt/SolarFM/signal_classes/Controller.py | 118 +- .../SolarFM/signal_classes/Controller_Data.py | 76 +- .../signal_classes/DBusControllerMixin.py | 11 +- .../signal_classes/KeyboardSignalsMixin.py | 54 +- .../SolarFM/signal_classes/ShowHideMixin.py | 93 +- .../signal_classes/mixins/PaneMixin.py | 8 +- .../SolarFM/signal_classes/mixins/TabMixin.py | 81 +- .../mixins/WidgetFileActionMixin.py | 427 ++++--- .../signal_classes/mixins/WidgetMixin.py | 37 +- .../signal_classes/mixins/WindowMixin.py | 154 ++- .../solarfm-0-0-1-x64/opt/SolarFM/solarfm | 18 - .../opt/SolarFM}/trasher/__init__.py | 0 .../opt/SolarFM}/trasher/trash.py | 0 .../opt/SolarFM}/trasher/xdgtrash.py | 0 .../opt/SolarFM/utils/Settings.py | 44 +- .../usr/share}/solarfm/Main_Window.glade | 0 .../usr/share/solarfm}/icons/archive.png | Bin .../usr/share/solarfm}/icons/audio.png | Bin .../usr/share/solarfm}/icons/bin.png | Bin .../usr/share/solarfm}/icons/dir.png | Bin .../usr/share/solarfm}/icons/doc.png | Bin .../usr/share/solarfm}/icons/pdf.png | Bin .../usr/share/solarfm}/icons/presentation.png | Bin .../share/solarfm/icons}/solarfm-64x64.png | Bin .../share/solarfm/icons}/solarfm.png | Bin .../usr/share/solarfm}/icons/spreadsheet.png | Bin .../usr/share/solarfm}/icons/text.png | Bin .../usr/share}/solarfm/icons/trash.png | Bin .../usr/share/solarfm}/icons/video.png | Bin .../usr/share/solarfm}/icons/web.png | Bin .../usr/share}/solarfm/settings.json | 0 .../usr/share}/solarfm/stylesheet.css | 0 .../solarfm-0.0.1/SolarFM/old/PyFM.py | 38 - .../SolarFM/old/resources/PyFM.glade | 1049 ----------------- .../SolarFM/old/resources/stylesheet.css | 88 -- .../SolarFM/old/utils/Dragging.py | 79 -- .../solarfm-0.0.1/SolarFM/old/utils/Events.py | 72 -- .../SolarFM/old/utils/FileHandler.py | 93 -- .../solarfm-0.0.1/SolarFM/old/utils/Grid.py | 214 ---- .../solarfm-0.0.1/SolarFM/old/utils/Icon.py | 167 --- .../SolarFM/old/utils/Settings.py | 139 --- .../SolarFM/old/utils/__init__.py | 6 - .../solarfm-0.0.1/SolarFM/{new => }/setup.py | 0 .../SolarFM/{new => }/solarfm.sh | 0 .../SolarFM/{new => }/solarfm.toml | 0 .../SolarFM/{new => }/solarfm/__builtins__.py | 0 .../SolarFM/{new => }/solarfm/__init__.py | 0 .../SolarFM/{new => }/solarfm/__main__.py | 0 .../{new => }/solarfm/shellfm/__init__.py | 0 .../solarfm/shellfm/windows/Window.py | 0 .../shellfm/windows/WindowController.py | 0 .../solarfm/shellfm/windows/__init__.py | 0 .../solarfm/shellfm/windows/view/Path.py | 0 .../solarfm/shellfm/windows/view/View.py | 0 .../solarfm/shellfm/windows/view/__init__.py | 0 .../shellfm/windows/view/icons/Icon.py | 0 .../shellfm/windows/view/icons/__init__.py | 0 .../view/icons/mixins/DesktopIconMixin.py | 0 .../view/icons/mixins/VideoIconMixin.py | 0 .../windows/view/icons/mixins/__init__.py | 0 .../view/icons/mixins/xdg/BaseDirectory.py | 0 .../windows/view/icons/mixins/xdg/Config.py | 0 .../view/icons/mixins/xdg/DesktopEntry.py | 0 .../view/icons/mixins/xdg/Exceptions.py | 0 .../view/icons/mixins/xdg/IconTheme.py | 0 .../windows/view/icons/mixins/xdg/IniFile.py | 0 .../windows/view/icons/mixins/xdg/Locale.py | 0 .../windows/view/icons/mixins/xdg/Menu.py | 0 .../view/icons/mixins/xdg/MenuEditor.py | 0 .../windows/view/icons/mixins/xdg/Mime.py | 0 .../view/icons/mixins/xdg/RecentFiles.py | 0 .../windows/view/icons/mixins/xdg/__init__.py | 0 .../windows/view/icons/mixins/xdg/util.py | 0 .../shellfm/windows/view/utils/FileHandler.py | 0 .../shellfm/windows/view/utils/Launcher.py | 0 .../shellfm/windows/view/utils/Settings.py | 31 +- .../shellfm/windows/view/utils/__init__.py | 0 .../solarfm/signal_classes/Controller.py | 0 .../solarfm/signal_classes/Controller_Data.py | 0 .../signal_classes/DBusControllerMixin.py | 0 .../signal_classes/KeyboardSignalsMixin.py | 0 .../solarfm/signal_classes/ShowHideMixin.py | 0 .../solarfm/signal_classes/__init__.py | 0 .../signal_classes/mixins/PaneMixin.py | 0 .../solarfm/signal_classes/mixins/TabMixin.py | 0 .../mixins/WidgetFileActionMixin.py | 0 .../signal_classes/mixins/WidgetMixin.py | 0 .../signal_classes/mixins/WindowMixin.py | 0 .../solarfm/signal_classes/mixins/__init__.py | 0 .../SolarFM/solarfm/trasher/__init__.py | 0 .../SolarFM/solarfm/trasher/trash.py | 46 + .../SolarFM/solarfm/trasher/xdgtrash.py | 161 +++ .../SolarFM/{new => }/solarfm/utils/Logger.py | 0 .../{new => }/solarfm/utils/Settings.py | 29 +- .../{new => }/solarfm/utils/__init__.py | 0 user_config/solarfm/ffmpegthumbnailer | Bin 23152 -> 0 bytes .../usr/share/solarfm}/Main_Window.glade | 892 ++++++++++++-- .../{ => usr/share}/solarfm/icons/archive.png | Bin .../{ => usr/share}/solarfm/icons/audio.png | Bin .../{ => usr/share}/solarfm/icons/bin.png | Bin .../{ => usr/share}/solarfm/icons/dir.png | Bin .../{ => usr/share}/solarfm/icons/doc.png | Bin .../{ => usr/share}/solarfm/icons/pdf.png | Bin .../share}/solarfm/icons/presentation.png | Bin .../share}/solarfm/icons/solarfm-64x64.png | Bin .../{ => usr/share}/solarfm/icons/solarfm.png | Bin .../share}/solarfm/icons/spreadsheet.png | Bin .../{ => usr/share}/solarfm/icons/text.png | Bin user_config/usr/share/solarfm/icons/trash.png | Bin 0 -> 989 bytes .../{ => usr/share}/solarfm/icons/video.png | Bin .../{ => usr/share}/solarfm/icons/web.png | Bin user_config/usr/share/solarfm/settings.json | 20 + .../usr/share/solarfm}/stylesheet.css | 35 +- 125 files changed, 1960 insertions(+), 2449 deletions(-) rename src/{versions/solarfm-0.0.1/SolarFM/old/PyFM.sh => debs/clear_pycache_dirs.sh} (64%) delete mode 100755 src/debs/solarfm-0-0-1-x64/opt/SolarFM/solarfm rename src/{versions/solarfm-0.0.1/SolarFM/new/solarfm => debs/solarfm-0-0-1-x64/opt/SolarFM}/trasher/__init__.py (100%) rename src/{versions/solarfm-0.0.1/SolarFM/new/solarfm => debs/solarfm-0-0-1-x64/opt/SolarFM}/trasher/trash.py (100%) rename src/{versions/solarfm-0.0.1/SolarFM/new/solarfm => debs/solarfm-0-0-1-x64/opt/SolarFM}/trasher/xdgtrash.py (100%) rename {user_config => src/debs/solarfm-0-0-1-x64/usr/share}/solarfm/Main_Window.glade (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/archive.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/audio.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/bin.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/dir.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/doc.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/pdf.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/presentation.png (100%) rename src/debs/solarfm-0-0-1-x64/{opt/SolarFM/resources => usr/share/solarfm/icons}/solarfm-64x64.png (100%) rename src/debs/solarfm-0-0-1-x64/{opt/SolarFM/resources => usr/share/solarfm/icons}/solarfm.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/spreadsheet.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/text.png (100%) rename {user_config => src/debs/solarfm-0-0-1-x64/usr/share}/solarfm/icons/trash.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/video.png (100%) rename src/{versions/solarfm-0.0.1/SolarFM/old/resources => debs/solarfm-0-0-1-x64/usr/share/solarfm}/icons/web.png (100%) rename {user_config => src/debs/solarfm-0-0-1-x64/usr/share}/solarfm/settings.json (100%) rename {user_config => src/debs/solarfm-0-0-1-x64/usr/share}/solarfm/stylesheet.css (100%) delete mode 100755 src/versions/solarfm-0.0.1/SolarFM/old/PyFM.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/resources/PyFM.glade delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/resources/stylesheet.css delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/Dragging.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/Events.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/FileHandler.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/Grid.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/Icon.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/Settings.py delete mode 100644 src/versions/solarfm-0.0.1/SolarFM/old/utils/__init__.py rename src/versions/solarfm-0.0.1/SolarFM/{new => }/setup.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm.sh (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm.toml (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/__builtins__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/__main__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/Window.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/WindowController.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/Path.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/View.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/Icon.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/DesktopIconMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/VideoIconMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/BaseDirectory.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/Config.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/DesktopEntry.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/Exceptions.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/IconTheme.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/IniFile.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/Locale.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/Menu.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/MenuEditor.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/Mime.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/RecentFiles.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/icons/mixins/xdg/util.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/utils/FileHandler.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/utils/Launcher.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/utils/Settings.py (74%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/shellfm/windows/view/utils/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/Controller.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/Controller_Data.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/DBusControllerMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/KeyboardSignalsMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/ShowHideMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/__init__.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/mixins/PaneMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/mixins/TabMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/mixins/WidgetFileActionMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/mixins/WidgetMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/mixins/WindowMixin.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/signal_classes/mixins/__init__.py (100%) create mode 100755 src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/__init__.py create mode 100755 src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/trash.py create mode 100755 src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/xdgtrash.py rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/utils/Logger.py (100%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/utils/Settings.py (71%) rename src/versions/solarfm-0.0.1/SolarFM/{new => }/solarfm/utils/__init__.py (100%) delete mode 100755 user_config/solarfm/ffmpegthumbnailer rename {src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources => user_config/usr/share/solarfm}/Main_Window.glade (69%) rename user_config/{ => usr/share}/solarfm/icons/archive.png (100%) rename user_config/{ => usr/share}/solarfm/icons/audio.png (100%) rename user_config/{ => usr/share}/solarfm/icons/bin.png (100%) rename user_config/{ => usr/share}/solarfm/icons/dir.png (100%) rename user_config/{ => usr/share}/solarfm/icons/doc.png (100%) rename user_config/{ => usr/share}/solarfm/icons/pdf.png (100%) rename user_config/{ => usr/share}/solarfm/icons/presentation.png (100%) rename user_config/{ => usr/share}/solarfm/icons/solarfm-64x64.png (100%) rename user_config/{ => usr/share}/solarfm/icons/solarfm.png (100%) rename user_config/{ => usr/share}/solarfm/icons/spreadsheet.png (100%) rename user_config/{ => usr/share}/solarfm/icons/text.png (100%) create mode 100644 user_config/usr/share/solarfm/icons/trash.png rename user_config/{ => usr/share}/solarfm/icons/video.png (100%) rename user_config/{ => usr/share}/solarfm/icons/web.png (100%) create mode 100644 user_config/usr/share/solarfm/settings.json rename {src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources => user_config/usr/share/solarfm}/stylesheet.css (66%) diff --git a/README.md b/README.md index c533e1f..bb1b1ce 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ SolarFM is a Gtk+ Python file manager.
Install Setup
``` -sudo apt-get install python3 wget ffmpegthumbnailer steamcmd +sudo apt-get install python3.8 wget python3-setproctitle python3-gi ffmpegthumbnailer steamcmd ``` # TODO diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/PyFM.sh b/src/debs/clear_pycache_dirs.sh similarity index 64% rename from src/versions/solarfm-0.0.1/SolarFM/old/PyFM.sh rename to src/debs/clear_pycache_dirs.sh index de59af8..7987a3d 100755 --- a/src/versions/solarfm-0.0.1/SolarFM/old/PyFM.sh +++ b/src/debs/clear_pycache_dirs.sh @@ -6,7 +6,7 @@ function main() { - # GTK_DEBUG=interactive python3 ./PyFM.py - python3 ./PyFM.py + find . -name "__pycache__" -exec rm -rf $1 {} \; + find . -name "*.pyc" -exec rm -rf $1 {} \; } -main $@; +main diff --git a/src/debs/solarfm-0-0-1-x64/DEBIAN/control b/src/debs/solarfm-0-0-1-x64/DEBIAN/control index 6be221d..50ac836 100644 --- a/src/debs/solarfm-0-0-1-x64/DEBIAN/control +++ b/src/debs/solarfm-0-0-1-x64/DEBIAN/control @@ -1,8 +1,8 @@ -Package: pytop64 +Package: solarfm64 Version: 0.0-1 Section: python Priority: optional Architecture: amd64 -Depends: ffmpegthumbnailer (>= 2.0.10-0.1) +Depends: python3.8, wget, ffmpegthumbnailer, python3-setproctitle, python3-gi, steamcmd Maintainer: Maxim Stewart <1itdominator@gmail.com> Description: SolarFM is a Gtk + Python file manager. diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__builtins__.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__builtins__.py index ef1affd..19540d8 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__builtins__.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__builtins__.py @@ -1,12 +1,14 @@ # Python imports import builtins -# Gtk imports +# Lib imports # Application imports from signal_classes.DBusControllerMixin import DBusControllerMixin + + class Builtins(DBusControllerMixin): """Docstring for __builtins__ extender""" @@ -15,8 +17,6 @@ class Builtins(DBusControllerMixin): # Where data may be any kind of data self._gui_events = [] self._fm_events = [] - self.monitor_events = True - self.keep_ipc_alive = True self.is_ipc_alive = False # Makeshift fake "events" type system FIFO diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__init__.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__init__.py index 14e08ac..ddaa127 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__init__.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__init__.py @@ -1,7 +1,7 @@ # Python imports import os, inspect, time -# Gtk imports +# Lib imports # Application imports from utils import Settings @@ -9,6 +9,8 @@ from signal_classes import Controller from __builtins__ import Builtins + + class Main(Builtins): def __init__(self, args, unknownargs): event_system.create_ipc_server() @@ -44,6 +46,6 @@ class Main(Builtins): methods = inspect.getmembers(c, predicate=inspect.ismethod) handlers.update(methods) except Exception as e: - pass + print(repr(e)) settings.builder.connect_signals(handlers) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__main__.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__main__.py index 91e7ad6..3105637 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__main__.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/__main__.py @@ -2,15 +2,15 @@ # Python imports -import argparse +import argparse, faulthandler, traceback from setproctitle import setproctitle import tracemalloc tracemalloc.start() -# Gtk imports -import gi, faulthandler, traceback +# Lib imports +import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk @@ -20,6 +20,9 @@ from __init__ import Main if __name__ == "__main__": try: + # import web_pdb + # web_pdb.set_trace() + setproctitle('solarfm') faulthandler.enable() # For better debug info parser = argparse.ArgumentParser() @@ -33,7 +36,5 @@ if __name__ == "__main__": Main(args, unknownargs) Gtk.main() except Exception as e: - print(repr(e)) - event_system.keep_ipc_alive = False - if debug: - traceback.print_exc() + traceback.print_exc() + quit() diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/WindowController.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/WindowController.py index 0cd271e..e8f75ad 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/WindowController.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/WindowController.py @@ -10,7 +10,7 @@ from . import Window def threaded(fn): def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() return wrapper @@ -28,7 +28,7 @@ class WindowController: @threaded def fm_event_observer(self): - while event_system.monitor_events: + while True: time.sleep(event_sleep_time) event = event_system.consume_fm_event() if event: diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/Path.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/Path.py index 91787b0..7c4cdc2 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/Path.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/Path.py @@ -21,13 +21,14 @@ class Path: self.load_directory() def pop_from_path(self): - self.path.pop() + if len(self.path) > 1: + self.path.pop() - if not self.go_past_home: - if self.get_home() not in self.get_path(): - self.set_to_home() + if not self.go_past_home: + if self.get_home() not in self.get_path(): + self.set_to_home() - self.load_directory() + self.load_directory() def set_path(self, path): if path == self.get_path(): diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/View.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/View.py index a4f1d73..9a0485b 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/View.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/View.py @@ -160,6 +160,7 @@ class View(Settings, FileHandler, Launcher, Icon, Path): images = self.hash_set(self.images), desktops = self.hash_set(self.desktop), ungrouped = self.hash_set(self.ungrouped) + hidden = self.hash_set(self.hidden) return { 'path_head': self.get_path(), @@ -169,7 +170,8 @@ class View(Settings, FileHandler, Launcher, Icon, Path): 'videos': videos, 'images': images, 'desktops': desktops, - 'ungrouped': ungrouped + 'ungrouped': ungrouped, + 'hidden': hidden } } diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/FileHandler.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/FileHandler.py index 57c69e3..d0f7396 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/FileHandler.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/FileHandler.py @@ -1,6 +1,12 @@ - +# Python imports import os, shutil, subprocess, threading +# Lib imports + +# Application imports + + + class FileHandler: def create_file(self, nFile, type): @@ -51,7 +57,7 @@ class FileHandler: def move_file(self, fFile, tFile): try: print(f"Moving: {fFile} --> {tFile}") - if os.path.exists(fFile) and os.path.exists(tFile): + if os.path.exists(fFile) and not os.path.exists(tFile): if not tFile.endswith("/"): tFile += "/" diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Launcher.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Launcher.py index 92a690e..22a14e3 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Launcher.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Launcher.py @@ -1,5 +1,5 @@ # System import -import os, subprocess, threading +import os, threading, subprocess # Lib imports @@ -8,6 +8,12 @@ import os, subprocess, threading # Apoplication imports +def threaded(fn): + def wrapper(*args, **kwargs): + threading.Thread(target=fn, args=args, kwargs=kwargs).start() + return wrapper + + class Launcher: def open_file_locally(self, file): lowerName = file.lower() @@ -35,11 +41,24 @@ class Launcher: else: command = ["xdg-open", file] - self.logger.debug(command) - DEVNULL = open(os.devnull, 'w') - subprocess.Popen(command, start_new_session=True, stdout=DEVNULL, stderr=DEVNULL, close_fds=True) + self.execute(command, use_shell=False) + def execute(self, command, start_dir=os.getenv("HOME"), use_os_system=None, use_shell=True): + self.logger.debug(command) + if use_os_system: + os.system(command) + else: + subprocess.Popen(command, cwd=start_dir, shell=use_shell, start_new_session=True, stdout=None, stderr=None, close_fds=True) + + def execute_and_return_thread_handler(self, command, start_dir=os.getenv("HOME"), use_shell=True): + DEVNULL = open(os.devnull, 'w') + return subprocess.Popen(command, cwd=start_dir, shell=use_shell, start_new_session=True, stdout=DEVNULL, stderr=DEVNULL, close_fds=True) + + @threaded + def app_chooser_exec(self, app_info, uris): + app_info.launch_uris_async(uris) + def remux_video(self, hash, file): remux_vid_pth = self.REMUX_FOLDER + "/" + hash + ".mp4" self.logger.debug(remux_vid_pth) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Settings.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Settings.py index 408bc42..d1229c2 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Settings.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/shellfm/windows/view/utils/Settings.py @@ -13,22 +13,23 @@ from os import path class Settings: logger = None + USR_SOLARFM = "/usr/share/solarfm" USER_HOME = path.expanduser('~') - CONFIG_PATH = USER_HOME + "/.config/solarfm" - CONFIG_FILE = CONFIG_PATH + "/settings.json" + CONFIG_PATH = f"{USER_HOME}/.config/solarfm" + CONFIG_FILE = f"{CONFIG_PATH}/settings.json" HIDE_HIDDEN_FILES = True GTK_ORIENTATION = 1 # HORIZONTAL (0) VERTICAL (1) - DEFAULT_ICONS = CONFIG_PATH + "/icons" - DEFAULT_ICON = DEFAULT_ICONS + "/text.png" - FFMPG_THUMBNLR = CONFIG_PATH + "/ffmpegthumbnailer" # Thumbnail generator binary - REMUX_FOLDER = USER_HOME + "/.remuxs" # Remuxed files folder + DEFAULT_ICONS = f"{CONFIG_PATH}/icons" + DEFAULT_ICON = f"{DEFAULT_ICONS}/text.png" + FFMPG_THUMBNLR = f"{CONFIG_PATH}/ffmpegthumbnailer" # Thumbnail generator binary + REMUX_FOLDER = f"{USER_HOME}/.remuxs" # Remuxed files folder STEAM_BASE_URL = "https://steamcdn-a.akamaihd.net/steam/apps/" - ICON_DIRS = ["/usr/share/pixmaps", "/usr/share/icons", USER_HOME + "/.icons" ,] - BASE_THUMBS_PTH = USER_HOME + "/.thumbnails" # Used for thumbnail generation - ABS_THUMBS_PTH = BASE_THUMBS_PTH + "/normal" # Used for thumbnail generation - STEAM_ICONS_PTH = BASE_THUMBS_PTH + "/steam_icons" + ICON_DIRS = ["/usr/share/pixmaps", "/usr/share/icons", f"{USER_HOME}/.icons" ,] + BASE_THUMBS_PTH = f"{USER_HOME}/.thumbnails" # Used for thumbnail generation + ABS_THUMBS_PTH = f"{BASE_THUMBS_PTH}/normal" # Used for thumbnail generation + STEAM_ICONS_PTH = f"{BASE_THUMBS_PTH}/steam_icons" CONTAINER_ICON_WH = [128, 128] VIDEO_ICON_WH = [128, 64] SYS_ICON_WH = [56, 56] @@ -69,6 +70,7 @@ class Settings: pdf_app = settings["pdf_app"] text_app = settings["text_app"] file_manager_app = settings["file_manager_app"] + terminal_app = settings["terminal_app"] remux_folder_max_disk_usage = settings["remux_folder_max_disk_usage"] # Filters @@ -81,14 +83,18 @@ class Settings: # Dir structure check - if path.isdir(REMUX_FOLDER) == False: + if not path.isdir(REMUX_FOLDER): os.mkdir(REMUX_FOLDER) - if path.isdir(BASE_THUMBS_PTH) == False: + if not path.isdir(BASE_THUMBS_PTH): os.mkdir(BASE_THUMBS_PTH) - if path.isdir(ABS_THUMBS_PTH) == False: + if not path.isdir(ABS_THUMBS_PTH): os.mkdir(ABS_THUMBS_PTH) - if path.isdir(STEAM_ICONS_PTH) == False: + if not path.isdir(STEAM_ICONS_PTH): os.mkdir(STEAM_ICONS_PTH) + + if not os.path.exists(DEFAULT_ICONS): + DEFAULT_ICONS = f"{USR_SOLARFM}/icons" + DEFAULT_ICON = f"{DEFAULT_ICONS}/text.png" diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller.py index acf2edc..5354c5e 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller.py @@ -1,11 +1,10 @@ # Python imports -import sys, traceback, threading, subprocess, signal, inspect, os, time +import sys, traceback, threading, signal, inspect, os, time -# Gtk imports +# Lib imports import gi gi.require_version('Gtk', '3.0') -from gi.repository import Gtk -from gi.repository import GLib +from gi.repository import Gtk, GLib # Application imports from .mixins import * @@ -14,14 +13,16 @@ from . import ShowHideMixin, KeyboardSignalsMixin, Controller_Data def threaded(fn): def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() return wrapper -class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFileActionMixin, \ - PaneMixin, WindowMixin): + + +class Controller(WidgetFileActionMixin, PaneMixin, WindowMixin, ShowHideMixin, \ + KeyboardSignalsMixin, Controller_Data): def __init__(self, args, unknownargs, _settings): - sys.excepthook = self.my_except_hook + # sys.excepthook = self.custom_except_hook self.settings = _settings self.setup_controller_data() @@ -44,15 +45,15 @@ class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFil def tear_down(self, widget=None, eve=None): - event_system.monitor_events = False event_system.send_ipc_message("close server") self.window_controller.save_state() time.sleep(event_sleep_time) Gtk.main_quit() + @threaded def gui_event_observer(self): - while event_system.monitor_events: + while True: time.sleep(event_sleep_time) event = event_system.consume_gui_event() if event: @@ -64,7 +65,7 @@ class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFil print(repr(e)) - def my_except_hook(self, exctype, value, _traceback): + def custom_except_hook(self, exctype, value, _traceback): trace = ''.join(traceback.format_tb(_traceback)) data = f"Exectype: {exctype} <--> Value: {value}\n\n{trace}\n\n\n\n" start_itr = self.message_buffer.get_start_iter() @@ -82,32 +83,59 @@ class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFil time.sleep(seconds) GLib.idle_add(self.message_widget.popdown) + def save_debug_alerts(self, widget=None, eve=None): + start_itr, end_itr = self.message_buffer.get_bounds() + save_location_prompt = Gtk.FileChooserDialog("Choose Save Folder", self.window, \ + action = Gtk.FileChooserAction.SAVE, \ + buttons = (Gtk.STOCK_CANCEL, \ + Gtk.ResponseType.CANCEL, \ + Gtk.STOCK_SAVE, \ + Gtk.ResponseType.OK)) + + text = self.message_buffer.get_text(start_itr, end_itr, False) + resp = save_location_prompt.run() + if (resp == Gtk.ResponseType.CANCEL) or (resp == Gtk.ResponseType.DELETE_EVENT): + pass + elif resp == Gtk.ResponseType.OK: + target = save_location_prompt.get_filename(); + with open(target, "w") as f: + f.write(text) + + save_location_prompt.destroy() - def do_edit_files(self, widget=None, eve=None): - self.to_rename_files = self.selected_files - self.rename_files() - - def execute(self, option, start_dir=os.getenv("HOME")): - DEVNULL = open(os.devnull, 'w') - command = option.split() - subprocess.Popen(command, cwd=start_dir, start_new_session=True, stdout=DEVNULL, stderr=DEVNULL) + def set_arc_buffer_text(self, widget=None, eve=None): + id = widget.get_active_id() + self.arc_command_buffer.set_text(self.arc_commands[int(id)]) - def do_action_from_menu_controls(self, imagemenuitem, eventbutton): - action = imagemenuitem.get_name() + def clear_children(self, widget): + for child in widget.get_children(): + widget.remove(child) + + def get_current_state(self): + wid, tid = self.window_controller.get_active_data() + view = self.get_fm_window(wid).get_view_by_id(tid) + iconview = self.builder.get_object(f"{wid}|{tid}|iconview") + store = iconview.get_model() + return wid, tid, view, iconview, store + + def do_action_from_menu_controls(self, widget, eventbutton): + action = widget.get_name() self.ctrlDown = True self.hide_context_menu() self.hide_new_file_menu() self.hide_edit_file_menu() - if action == "create": - self.create_file() - self.hide_new_file_menu() if action == "open": self.open_files() + if action == "open_with": + self.show_appchooser_menu() + if action == "execute": + self.execute_files() + if action == "execute_in_terminal": + self.execute_files(in_terminal=True) if action == "rename": - self.to_rename_files = self.selected_files self.rename_files() if action == "cut": self.to_copy_files.clear() @@ -117,34 +145,22 @@ class Controller(Controller_Data, ShowHideMixin, KeyboardSignalsMixin, WidgetFil self.copy_files() if action == "paste": self.paste_files() + if action == "archive": + self.show_archiver_dialogue() if action == "delete": - # self.delete_files() - self.trash_files() + self.delete_files() if action == "trash": self.trash_files() + if action == "go_to_trash": + self.builder.get_object("path_entry").set_text(self.trash_files_path) + if action == "restore_from_trash": + self.restore_trash_files() + if action == "empty_trash": + self.empty_trash() + + + if action == "create": + self.create_files() + self.hide_new_file_menu() self.ctrlDown = False - - - - - def generate_windows(self, data = None): - if data: - for j, value in enumerate(data): - i = j + 1 - isHidden = True if value[0]["window"]["isHidden"] == "True" else False - object = self.builder.get_object(f"tggl_notebook_{i}") - views = value[0]["window"]["views"] - self.window_controller.create_window() - object.set_active(True) - - for view in views: - self.create_new_view_notebook(None, i, view) - - if isHidden: - self.toggle_notebook_pane(object) - else: - for j in range(0, 4): - i = j + 1 - self.window_controller.create_window() - self.create_new_view_notebook(None, i, None) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller_Data.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller_Data.py index 8220192..ccace6d 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller_Data.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/Controller_Data.py @@ -1,9 +1,13 @@ # Python imports -# Gtk imports +# Lib imports +from gi.repository import GLib # Application imports from shellfm import WindowController +from trasher.xdgtrash import XDGTrash + + class Controller_Data: @@ -11,28 +15,67 @@ class Controller_Data: return callable(getattr(o, name, None)) def setup_controller_data(self): - self.window_controller = WindowController() - self.state = self.window_controller.load_state() + self.window_controller = WindowController() + self.trashman = XDGTrash() + self.trashman.regenerate() - self.builder = self.settings.builder - self.logger = self.settings.logger + self.state = self.window_controller.load_state() + self.builder = self.settings.builder + self.logger = self.settings.logger - self.window = self.settings.getMainWindow() - self.window1 = self.builder.get_object("window_1") - self.window2 = self.builder.get_object("window_2") - self.window3 = self.builder.get_object("window_3") - self.window4 = self.builder.get_object("window_4") - self.message_widget = self.builder.get_object("message_widget") - self.message_view = self.builder.get_object("message_view") - self.message_buffer = self.builder.get_object("message_buffer") + self.window = self.settings.getMainWindow() + self.window1 = self.builder.get_object("window_1") + self.window2 = self.builder.get_object("window_2") + self.window3 = self.builder.get_object("window_3") + self.window4 = self.builder.get_object("window_4") + self.message_widget = self.builder.get_object("message_widget") + self.message_view = self.builder.get_object("message_view") + self.message_buffer = self.builder.get_object("message_buffer") + self.arc_command_buffer = self.builder.get_object("arc_command_buffer") + + self.warning_alert = self.builder.get_object("warning_alert") + self.edit_file_menu = self.builder.get_object("edit_file_menu") + self.file_exists_dialog = self.builder.get_object("file_exists_dialog") + self.exists_file_label = self.builder.get_object("exists_file_label") + self.exists_file_field = self.builder.get_object("exists_file_field") + self.path_menu = self.builder.get_object("path_menu") + self.exists_file_rename_bttn = self.builder.get_object("exists_file_rename_bttn") self.bottom_size_label = self.builder.get_object("bottom_size_label") self.bottom_file_count_label = self.builder.get_object("bottom_file_count_label") self.bottom_path_label = self.builder.get_object("bottom_path_label") + self.trash_files_path = GLib.get_user_data_dir() + "/Trash/files" + self.trash_info_path = GLib.get_user_data_dir() + "/Trash/info" + + # In compress commands: + # %n: First selected filename/dir to archive + # %N: All selected filenames/dirs to archive, or (with %O) a single filename + # %o: Resulting single archive file + # %O: Resulting archive per source file/directory (use changes %N meaning) + # + # In extract commands: + # %x: Archive file to extract + # %g: Unique extraction target filename with optional subfolder + # %G: Unique extraction target filename, never with subfolder + # + # In list commands: + # %x: Archive to list + # + # Plus standard bash variables are accepted. + self.arc_commands = [ '$(which 7za || echo 7zr) a %o %N', + 'zip -r %o %N', + 'rar a -r %o %N', + 'tar -cvf %o %N', + 'tar -cvjf %o %N', + 'tar -cvzf %o %N', + 'tar -cvJf %o %N', + 'gzip -c %N > %O', + 'xz -cz %N > %O' + ] + self.notebooks = [self.window1, self.window2, self.window3, self.window4] self.selected_files = [] - self.to_rename_files = [] self.to_copy_files = [] self.to_cut_files = [] @@ -42,6 +85,11 @@ class Controller_Data: self.is_pane3_hidden = False self.is_pane4_hidden = False + self.is_searching = False + self.search_iconview = None + self.search_view = None + + self.skip_edit = False self.cancel_edit = False self.ctrlDown = False diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/DBusControllerMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/DBusControllerMixin.py index ce49ee7..c8f622f 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/DBusControllerMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/DBusControllerMixin.py @@ -2,24 +2,26 @@ import threading, socket, time from multiprocessing.connection import Listener, Client -# Gtk imports +# Lib imports # Application imports def threaded(fn): def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() return wrapper + + class DBusControllerMixin: @threaded def create_ipc_server(self): listener = Listener(('127.0.0.1', 4848), authkey=b'solarfm-ipc') self.is_ipc_alive = True - while event_system.keep_ipc_alive: + while True: conn = listener.accept() start_time = time.time() @@ -43,7 +45,6 @@ class DBusControllerMixin: break if msg == 'close server': conn.close() - event_system.keep_ipc_alive = False break # NOTE: Not perfect but insures we don't lockup the connection for too long. @@ -56,7 +57,7 @@ class DBusControllerMixin: def send_ipc_message(self, message="Empty Data..."): try: - conn = Client(('127.0.0.1', 4848), authkey=b'solar-ipc') + conn = Client(('127.0.0.1', 4848), authkey=b'solarfm-ipc') conn.send(message) conn.send('close connection') except Exception as e: diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/KeyboardSignalsMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/KeyboardSignalsMixin.py index 657753b..b397027 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/KeyboardSignalsMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/KeyboardSignalsMixin.py @@ -1,16 +1,25 @@ # Python imports +import re -# Gtk imports +# Lib imports import gi gi.require_version('Gtk', '3.0') gi.require_version('Gdk', '3.0') -from gi.repository import Gtk -from gi.repository import Gdk +from gi.repository import Gtk, Gdk # Application imports +valid_keyvalue_pat = re.compile(r"[a-z0-9A-Z-_\[\]\(\)\| ]") + + class KeyboardSignalsMixin: + def unset_keys_and_data(self, widget=None, eve=None): + self.ctrlDown = False + self.shiftDown = False + self.altDown = False + self.is_searching = False + def global_key_press_controller(self, eve, user_data): keyname = Gdk.keyval_name(user_data.keyval).lower() if "control" in keyname or "alt" in keyname or "shift" in keyname: @@ -36,6 +45,31 @@ class KeyboardSignalsMixin: if "alt" in keyname: self.altDown = False + + if self.ctrlDown and self.shiftDown and keyname == "t": + self.trash_files() + + + if re.fullmatch(valid_keyvalue_pat, keyname): + if not self.is_searching and not self.ctrlDown \ + and not self.shiftDown and not self.altDown: + focused_obj = self.window.get_focus() + if isinstance(focused_obj, Gtk.IconView): + self.is_searching = True + wid, tid, self.search_view, self.search_iconview, store = self.get_current_state() + self.popup_search_files(wid, keyname) + return + + + if (self.ctrlDown and keyname in ["1", "kp_1"]): + self.builder.get_object("tggl_notebook_1").released() + if (self.ctrlDown and keyname in ["2", "kp_2"]): + self.builder.get_object("tggl_notebook_2").released() + if (self.ctrlDown and keyname in ["3", "kp_3"]): + self.builder.get_object("tggl_notebook_3").released() + if (self.ctrlDown and keyname in ["4", "kp_4"]): + self.builder.get_object("tggl_notebook_4").released() + if self.ctrlDown and keyname == "q": self.tear_down() if (self.ctrlDown and keyname == "slash") or keyname == "home": @@ -67,12 +101,20 @@ class KeyboardSignalsMixin: if self.ctrlDown and keyname == "n": self.show_new_file_menu() + + + if keyname in ["alt_l", "alt_r"]: + top_main_menubar = self.builder.get_object("top_main_menubar") + if top_main_menubar.is_visible(): + top_main_menubar.hide() + else: + top_main_menubar.show() if keyname == "delete": - self.trash_files() + self.delete_files() if keyname == "f2": - self.do_edit_files() + self.rename_files() if keyname == "f4": wid, tid = self.window_controller.get_active_data() view = self.get_fm_window(wid).get_view_by_id(tid) dir = view.get_current_directory() - self.execute("terminator", dir) + view.execute(f"{view.terminal_app}", dir) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/ShowHideMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/ShowHideMixin.py index 886aa08..49b29d8 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/ShowHideMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/ShowHideMixin.py @@ -3,7 +3,8 @@ # Gtk imports import gi gi.require_version('Gtk', '3.0') -from gi.repository import Gtk +gi.require_version('Gdk', '3.0') +from gi.repository import Gtk, Gdk, Gio # Application imports @@ -12,23 +13,77 @@ class ShowHideMixin: def show_messages_popup(self, type, text, seconds=None): self.message_widget.popup() + def stop_file_searching(self, widget=None, eve=None): + self.is_searching = False + + + def show_exists_page(self, widget=None, eve=None): + response = self.file_exists_dialog.run() + self.file_exists_dialog.hide() + + if response == Gtk.ResponseType.OK: + return "rename" + if response == Gtk.ResponseType.ACCEPT: + return "rename_auto" + if response == Gtk.ResponseType.CLOSE: + return "rename_auto_all" + if response == Gtk.ResponseType.YES: + return "overwrite" + if response == Gtk.ResponseType.APPLY: + return "overwrite_all" + if response == Gtk.ResponseType.NO: + return "skip" + if response == Gtk.ResponseType.REJECT: + return "skip_all" + + def hide_exists_page_rename(self, widget=None, eve=None): + self.file_exists_dialog.response(Gtk.ResponseType.OK) + + def hide_exists_page_auto_rename(self, widget=None, eve=None): + self.file_exists_dialog.response(Gtk.ResponseType.ACCEPT) + + def hide_exists_page_auto_rename_all(self, widget=None, eve=None): + self.file_exists_dialog.response(Gtk.ResponseType.CLOSE) + + def show_about_page(self, widget=None, eve=None): about_page = self.builder.get_object("about_page") response = about_page.run() - if response == -4: + if (response == Gtk.ResponseType.CANCEL) or (response == Gtk.ResponseType.DELETE_EVENT): self.hide_about_page() def hide_about_page(self, widget=None, eve=None): - about_page = self.builder.get_object("about_page").hide() + self.builder.get_object("about_page").hide() + + + def show_archiver_dialogue(self, widget=None, eve=None): + wid, tid = self.window_controller.get_active_data() + view = self.get_fm_window(wid).get_view_by_id(tid) + archiver_dialogue = self.builder.get_object("archiver_dialogue") + archiver_dialogue.set_action(Gtk.FileChooserAction.SAVE) + archiver_dialogue.set_current_folder(view.get_current_directory()) + archiver_dialogue.set_current_name("arc.7z") + + response = archiver_dialogue.run() + if response == Gtk.ResponseType.OK: + self.archive_files(archiver_dialogue) + if (response == Gtk.ResponseType.CANCEL) or (response == Gtk.ResponseType.DELETE_EVENT): + pass + + archiver_dialogue.hide() + + def hide_archiver_dialogue(self, widget=None, eve=None): + self.builder.get_object("archiver_dialogue").hide() + def show_appchooser_menu(self, widget=None, eve=None): appchooser_menu = self.builder.get_object("appchooser_menu") appchooser_widget = self.builder.get_object("appchooser_widget") + response = appchooser_menu.run() - resp = appchooser_menu.run() - if resp == Gtk.ResponseType.CANCEL: + if response == Gtk.ResponseType.CANCEL: self.hide_appchooser_menu() - if resp == Gtk.ResponseType.OK: + if response == Gtk.ResponseType.OK: self.open_with_files(appchooser_widget) self.hide_appchooser_menu() @@ -36,7 +91,9 @@ class ShowHideMixin: self.builder.get_object("appchooser_menu").hide() def run_appchooser_launch(self, widget=None, eve=None): - self.builder.get_object("appchooser_select_btn").pressed() + dialog = widget.get_parent().get_parent() + dialog.response(Gtk.ResponseType.OK) + def show_context_menu(self, widget=None, eve=None): self.builder.get_object("context_menu").run() @@ -44,22 +101,34 @@ class ShowHideMixin: def hide_context_menu(self, widget=None, eve=None): self.builder.get_object("context_menu").hide() + def show_new_file_menu(self, widget=None, eve=None): self.builder.get_object("new_file_menu").run() def hide_new_file_menu(self, widget=None, eve=None): self.builder.get_object("new_file_menu").hide() + def show_edit_file_menu(self, widget=None, eve=None): - self.builder.get_object("edit_file_menu").run() + if widget: + widget.grab_focus() + + response = self.edit_file_menu.run() + if response == Gtk.ResponseType.CLOSE: + self.skip_edit = True + if response == Gtk.ResponseType.CANCEL: + self.cancel_edit = True def hide_edit_file_menu(self, widget=None, eve=None): self.builder.get_object("edit_file_menu").hide() + def hide_edit_file_menu_enter_key(self, widget=None, eve=None): + keyname = Gdk.keyval_name(eve.keyval).lower() + if "return" in keyname or "enter" in keyname: + self.builder.get_object("edit_file_menu").hide() + def hide_edit_file_menu_skip(self, widget=None, eve=None): - self.skip_edit = True - self.builder.get_object("edit_file_menu").hide() + self.edit_file_menu.response(Gtk.ResponseType.CLOSE) def hide_edit_file_menu_cancel(self, widget=None, eve=None): - self.cancel_edit = True - self.builder.get_object("edit_file_menu").hide() + self.edit_file_menu.response(Gtk.ResponseType.CANCEL) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/PaneMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/PaneMixin.py index 0f9c316..235736d 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/PaneMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/PaneMixin.py @@ -1,7 +1,13 @@ +# Python imports + +# Lib imports + +# Application imports -# # TODO: Should rewrite to try and support more windows more naturally + +# TODO: Should rewrite to try and support more windows more naturally class PaneMixin: """docstring for PaneMixin""" diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/TabMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/TabMixin.py index c0079ea..51960dd 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/TabMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/TabMixin.py @@ -1,11 +1,18 @@ # Python imports +import os # Lib imports +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') +from gi.repository import Gtk, Gdk # Application imports from . import WidgetMixin + + class TabMixin(WidgetMixin): """docstring for TabMixin""" @@ -46,6 +53,8 @@ class TabMixin(WidgetMixin): notebook.show_all() notebook.set_current_page(index) + ctx = notebook.get_style_context() + ctx.add_class("notebook-unselected-focus") notebook.set_tab_reorderable(scroll, True) self.load_store(view, store) self.set_window_title() @@ -106,15 +115,21 @@ class TabMixin(WidgetMixin): return notebook.get_children()[1].get_children()[0] def refresh_tab(data=None): - self, ids = data - wid, tid = ids.split("|") - notebook = self.builder.get_object(f"window_{wid}") - store, tab_label = self.get_store_and_label_from_notebook(notebook, f"{wid}|{tid}") - view = self.get_fm_window(wid).get_view_by_id(tid) - + wid, tid, view, iconview, store = self.get_current_state() view.load_directory() self.load_store(view, store) + def update_view(self, tab_label, view, store, wid, tid): + self.load_store(view, store) + self.set_path_text(wid, tid) + + char_width = len(view.get_end_of_path()) + tab_label.set_width_chars(char_width) + tab_label.set_label(view.get_end_of_path()) + self.set_window_title() + self.set_file_watcher(view) + self.window_controller.save_state() + def do_action_from_bar_controls(self, widget, eve=None): action = widget.get_name() wid, tid = self.window_controller.get_active_data() @@ -134,26 +149,56 @@ class TabMixin(WidgetMixin): self.window_controller.save_state() return if action == "path_entry": - path = widget.get_text() - dir = view.get_current_directory() + "/" - if path == dir : + focused_obj = self.window.get_focus() + dir = f"{view.get_current_directory()}/" + path = widget.get_text() + + if isinstance(focused_obj, Gtk.Entry): + button_box = self.path_menu.get_children()[0].get_children()[0].get_children()[0] + query = widget.get_text().replace(dir, "") + files = view.files + view.hidden + + self.clear_children(button_box) + show_path_menu = False + for file in files: + if os.path.isdir(f"{dir}{file}"): + if query.lower() in file.lower(): + button = Gtk.Button(label=file) + button.show() + button.connect("clicked", self.set_path_entry) + button_box.add(button) + show_path_menu = True + + if not show_path_menu: + self.path_menu.popdown() + else: + self.path_menu.popup() + widget.grab_focus_without_selecting() + widget.set_position(-1) + + if path.endswith(".") or path == dir: return traversed = view.set_path(path) if not traversed: return + self.update_view(tab_label, view, store, wid, tid) - self.load_store(view, store) - self.set_path_text(wid, tid) - - char_width = len(view.get_end_of_path()) - tab_label.set_width_chars(char_width) - tab_label.set_label(view.get_end_of_path()) - self.set_window_title() - self.set_file_watcher(view) - self.window_controller.save_state() + try: + widget.grab_focus_without_selecting() + widget.set_position(-1) + except Exception as e: + pass + def set_path_entry(self, button=None, eve=None): + wid, tid, view, iconview, store = self.get_current_state() + path = f"{view.get_current_directory()}/{button.get_label()}" + path_entry = self.builder.get_object("path_entry") + path_entry.set_text(path) + path_entry.grab_focus_without_selecting() + path_entry.set_position(-1) + self.path_menu.popdown() def keyboard_close_tab(self): wid, tid = self.window_controller.get_active_data() diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetFileActionMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetFileActionMixin.py index 5d9e2f7..96f503d 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetFileActionMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetFileActionMixin.py @@ -2,13 +2,38 @@ import os # Lib imports -from gi.repository import GObject, Gio +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, GObject, Gio # Application imports + class WidgetFileActionMixin: + def sizeof_fmt(self, num, suffix="B"): + for unit in ["", "K", "M", "G", "T", "Pi", "Ei", "Zi"]: + if abs(num) < 1024.0: + return f"{num:3.1f} {unit}{suffix}" + num /= 1024.0 + return f"{num:.1f} Yi{suffix}" + + def get_dir_size(self, sdir): + """Get the size of a directory. Based on code found online.""" + size = os.path.getsize(sdir) + + for item in os.listdir(sdir): + item = os.path.join(sdir, item) + + if os.path.isfile(item): + size = size + os.path.getsize(item) + elif os.path.isdir(item): + size = size + self.get_dir_size(item) + + return size + + def set_file_watcher(self, view): if view.get_dir_watcher(): watcher = view.get_dir_watcher() @@ -16,10 +41,15 @@ class WidgetFileActionMixin: if debug: print(f"Watcher Is Cancelled: {watcher.is_cancelled()}") - dir_watcher = Gio.File.new_for_path(view.get_current_directory()) \ - .monitor_directory(Gio.FileMonitorFlags.WATCH_MOVES, - Gio.Cancellable() - ) + cur_dir = view.get_current_directory() + # Temp updating too much with current events we are checking for. + # Seems to cause invalid iter errors in WidbetMixin > update_store + if cur_dir == "/tmp": + watcher = None + return + + dir_watcher = Gio.File.new_for_path(cur_dir) \ + .monitor_directory(Gio.FileMonitorFlags.WATCH_MOVES, Gio.Cancellable()) wid = view.get_wid() tid = view.get_tab_id() @@ -27,11 +57,12 @@ class WidgetFileActionMixin: view.set_dir_watcher(dir_watcher) def dir_watch_updates(self, file_monitor, file, other_file=None, eve_type=None, data=None): - if eve_type == Gio.FileMonitorEvent.CREATED or \ - eve_type == Gio.FileMonitorEvent.DELETED or \ - eve_type == Gio.FileMonitorEvent.RENAMED or \ - eve_type == Gio.FileMonitorEvent.MOVED_IN or \ - eve_type == Gio.FileMonitorEvent.MOVED_OUT: + if eve_type in [Gio.FileMonitorEvent.CREATED, Gio.FileMonitorEvent.DELETED, + Gio.FileMonitorEvent.RENAMED, Gio.FileMonitorEvent.MOVED_IN, + Gio.FileMonitorEvent.MOVED_OUT]: + if debug: + print(eve_type) + wid, tid = data[0].split("|") notebook = self.builder.get_object(f"window_{wid}") view = self.get_fm_window(wid).get_view_by_id(tid) @@ -46,104 +77,100 @@ class WidgetFileActionMixin: + def popup_search_files(self, wid, keyname): + entry = self.builder.get_object(f"win{wid}_search_field") + self.builder.get_object(f"win{wid}_search").popup() + entry.set_text(keyname) + entry.grab_focus_without_selecting() + entry.set_position(-1) - def create_file(self): - fname_field = self.builder.get_object("context_menu_fname") - file_name = fname_field.get_text().strip() - type = self.builder.get_object("context_menu_type_toggle").get_state() + def do_file_search(self, widget, eve=None): + query = widget.get_text() + self.search_iconview.unselect_all() + for i, file in enumerate(self.search_view.files): + if query and query in file.lower(): + path = Gtk.TreePath().new_from_indices([i]) + self.search_iconview.select_path(path) - wid, tid = self.window_controller.get_active_data() - view = self.get_fm_window(wid).get_view_by_id(tid) - target = f"{view.get_current_directory()}" + items = self.search_iconview.get_selected_items() + if len(items) == 1: + self.search_iconview.scroll_to_path(items[0], True, 0.5, 0.5) - if file_name != "": - file_name = "file://" + target + "/" + file_name - if type == True: # Create File - self.handle_file([file_name], "create_file", target) - else: # Create Folder - self.handle_file([file_name], "create_dir") - - fname_field.set_text("") def open_files(self): - wid, tid = self.window_controller.get_active_data() - view = self.get_fm_window(wid).get_view_by_id(tid) - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.selected_files, True) + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) for file in uris: view.open_file_locally(file) def open_with_files(self, appchooser_widget): - wid, tid = self.window_controller.get_active_data() - view = self.get_fm_window(wid).get_view_by_id(tid) - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.selected_files) - - f = Gio.File.new_for_uri(uris[0]) + wid, tid, view, iconview, store = self.get_current_state() app_info = appchooser_widget.get_app_info() - app_info.launch([f], None) + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) - def edit_files(self): - pass + view.app_chooser_exec(app_info, uris) + + def execute_files(self, in_terminal=False): + wid, tid, view, iconview, store = self.get_current_state() + paths = self.format_to_uris(store, wid, tid, self.selected_files, True) + current_dir = view.get_current_directory() + command = None + + for path in paths: + command = f"exec '{path}'" if not in_terminal else f"{view.terminal_app} -e '{path}'" + view.execute(command, start_dir=view.get_current_directory(), use_os_system=False) + + def archive_files(self, archiver_dialogue): + wid, tid, view, iconview, store = self.get_current_state() + paths = self.format_to_uris(store, wid, tid, self.selected_files, True) + + save_target = archiver_dialogue.get_filename(); + sItr, eItr = self.arc_command_buffer.get_bounds() + pre_command = self.arc_command_buffer.get_text(sItr, eItr, False) + pre_command = pre_command.replace("%o", save_target) + pre_command = pre_command.replace("%N", ' '.join(paths)) + command = f"{view.terminal_app} -e '{pre_command}'" + + view.execute(command, start_dir=None, use_os_system=True) def rename_files(self): rename_label = self.builder.get_object("file_to_rename_label") rename_input = self.builder.get_object("new_rename_fname") - wid, tid = self.window_controller.get_active_data() - view = self.get_fm_window(wid).get_view_by_id(tid) - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.to_rename_files) + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) - # The rename button hides the rename dialog box which lets the loop continue. - # Weirdly, the show at the end is needed to flow through all the list properly - # than auto chosing the first rename entry you do. for uri in uris: entry = uri.split("/")[-1] rename_label.set_label(entry) rename_input.set_text(entry) - if self.skip_edit: - self.skip_edit = False - self.show_edit_file_menu() - - # Yes...this step is required even with the above... =/ - self.show_edit_file_menu() + self.show_edit_file_menu(rename_input) if self.skip_edit: + self.skip_edit = False continue if self.cancel_edit: + self.cancel_edit = False break rname_to = rename_input.get_text().strip() - target = f"file://{view.get_current_directory()}/{rname_to}" - self.handle_file([uri], "edit", target) - - self.show_edit_file_menu() + target = f"{view.get_current_directory()}/{rname_to}" + self.handle_files([uri], "rename", target) self.skip_edit = False self.cancel_edit = False - self.hide_new_file_menu() - self.to_rename_files.clear() - - - + self.hide_edit_file_menu() + self.selected_files.clear() def cut_files(self): - wid, tid = self.window_controller.get_active_data() - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.selected_files) + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) self.to_cut_files = uris def copy_files(self): - wid, tid = self.window_controller.get_active_data() - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.selected_files) + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) self.to_copy_files = uris def paste_files(self): @@ -152,107 +179,209 @@ class WidgetFileActionMixin: target = f"{view.get_current_directory()}" if len(self.to_copy_files) > 0: - self.handle_file(self.to_copy_files, "copy", target) + self.handle_files(self.to_copy_files, "copy", target) elif len(self.to_cut_files) > 0: - self.handle_file(self.to_cut_files, "move", target) - - - - - def move_file(self, view, files, target): - self.handle_file([files], "move", target) + self.handle_files(self.to_cut_files, "move", target) def delete_files(self): - wid, tid = self.window_controller.get_active_data() - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - view = self.get_fm_window(wid).get_view_by_id(tid) - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.selected_files) - self.handle_file(uris, "delete") + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) + response = None + + self.warning_alert.format_secondary_text(f"Do you really want to delete the {len(uris)} file(s)?") + for uri in uris: + file = Gio.File.new_for_path(uri) + + if not response: + response = self.warning_alert.run() + self.warning_alert.hide() + if response == Gtk.ResponseType.YES: + type = file.query_file_type(flags=Gio.FileQueryInfoFlags.NONE) + + if type == Gio.FileType.DIRECTORY: + view.delete_file( file.get_path() ) + else: + file.delete(cancellable=None) + else: + break + def trash_files(self): - wid, tid = self.window_controller.get_active_data() - iconview = self.builder.get_object(f"{wid}|{tid}|iconview") - view = self.get_fm_window(wid).get_view_by_id(tid) - store = iconview.get_model() - uris = self.format_to_uris(store, wid, tid, self.selected_files) - self.handle_file(uris, "trash") + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) + for uri in uris: + self.trashman.trash(uri, False) + + def restore_trash_files(self): + wid, tid, view, iconview, store = self.get_current_state() + uris = self.format_to_uris(store, wid, tid, self.selected_files, True) + for uri in uris: + self.trashman.restore(filename=uri.split("/")[-1], verbose=False) + + def empty_trash(self): + self.trashman.empty(verbose=False) + def create_files(self): + fname_field = self.builder.get_object("context_menu_fname") + file_name = fname_field.get_text().strip() + type = self.builder.get_object("context_menu_type_toggle").get_state() + wid, tid = self.window_controller.get_active_data() + view = self.get_fm_window(wid).get_view_by_id(tid) + target = f"{view.get_current_directory()}" - # NOTE: Gio moves files by generating the target file path with name in it - # We can't just give a base target directory and run with it. - # Also, the display name is UTF-8 safe and meant for displaying in GUIs - def handle_file(self, paths, action, _target_path=None): - paths = self.preprocess_paths(paths) - target = None + if file_name: + path = f"{target}/{file_name}" + + if type == True: # Create File + self.handle_files([path], "create_file") + else: # Create Folder + self.handle_files([path], "create_dir") + + fname_field.set_text("") + + def move_files(self, files, target): + self.handle_files(files, "move", target) + + # NOTE: Gtk recommends using fail flow than pre check existence which is more + # race condition proof. They're right; but, they can't even delete + # directories properly. So... f**k them. I'll do it my way. + def handle_files(self, paths, action, _target_path=None): + target = None + _file = None + response = None + overwrite_all = False + rename_auto_all = False for path in paths: try: - f = Gio.File.new_for_uri(path) - - if action == "create_file": - f.create(Gio.FileCreateFlags.NONE, cancellable=None) - break - if action == "create_dir": - f.make_directory(cancellable=None) - break - + if "file://" in path: + path = path.split("file://")[1] + file = Gio.File.new_for_path(path) if _target_path: if os.path.isdir(_target_path): - info = f.query_info("standard::display-name", 0, cancellable=None) - _target = f"file://{_target_path}/{info.get_display_name()}" - target = Gio.File.new_for_uri(_target) + info = file.query_info("standard::display-name", 0, cancellable=None) + _target = f"{_target_path}/{info.get_display_name()}" + _file = Gio.File.new_for_path(_target) else: - target = Gio.File.new_for_uri(_target_path) - - # See if dragging to same directory then break - if action not in ["trash", "delete", "edit"] and \ - (f.get_parent().get_path() == target.get_parent().get_path()): - break - - type = f.query_file_type(flags=Gio.FileQueryInfoFlags.NONE, cancellable=None) - if not type == Gio.FileType.DIRECTORY: - if action == "delete": - f.delete(cancellable=None) - if action == "trash": - f.trash(cancellable=None) - if action == "copy": - f.copy(target, flags=Gio.FileCopyFlags.BACKUP, cancellable=None) - if action == "move" or action == "edit": - f.move(target, flags=Gio.FileCopyFlags.BACKUP, cancellable=None) + _file = Gio.File.new_for_path(_target_path) else: - # Yes, life is hopeless and there is no God. Blame Gio for this sinful shitshow. =/ + _file = Gio.File.new_for_path(path) + + + if _file.query_exists(): + if not overwrite_all and not rename_auto_all: + self.exists_file_label.set_label(_file.get_basename()) + self.exists_file_field.set_text(_file.get_basename()) + response = self.show_exists_page() + + if response == "overwrite_all": + overwrite_all = True + if response == "rename_auto_all": + rename_auto_all = True + + if response == "rename": + base_path = _file.get_parent().get_path() + new_name = self.exists_file_field.get_text().strip() + rfPath = f"{base_path}/{new_name}" + _file = Gio.File.new_for_path(rfPath) + + if response == "rename_auto" or rename_auto_all: + _file = self.rename_proc(_file) + + if response == "overwrite" or overwrite_all: + type = _file.query_file_type(flags=Gio.FileQueryInfoFlags.NONE) + + if type == Gio.FileType.DIRECTORY: + wid, tid = self.window_controller.get_active_data() + view = self.get_fm_window(wid).get_view_by_id(tid) + view.delete_file( _file.get_path() ) + else: + _file.delete(cancellable=None) + + if response == "skip": + continue + if response == "skip_all": + break + + if _target_path: + target = _file + else: + file = _file + + + if action == "create_file": + file.create(flags=Gio.FileCreateFlags.NONE, cancellable=None) + continue + if action == "create_dir": + file.make_directory(cancellable=None) + continue + + + type = file.query_file_type(flags=Gio.FileQueryInfoFlags.NONE) + if type == Gio.FileType.DIRECTORY: wid, tid = self.window_controller.get_active_data() view = self.get_fm_window(wid).get_view_by_id(tid) - fPath = f.get_path() - tPath = None + fPath = file.get_path() + tPath = target.get_path() state = True - if target: - tPath = target.get_path() - - - if action == "delete": - state = view.delete_file(fPath) - if action == "trash": - f.trash(cancellable=None) if action == "copy": - state = view.copy_file(fPath, tPath) - if action == "move" or action == "edit": - tPath = target.get_parent().get_path() - state = view.move_file(fPath, tPath) + view.copy_file(fPath, tPath) + if action == "move" or action == "rename": + view.move_file(fPath, tPath) + else: + if action == "copy": + file.copy(target, flags=Gio.FileCopyFlags.BACKUP, cancellable=None) + if action == "move" or action == "rename": + file.move(target, flags=Gio.FileCopyFlags.BACKUP, cancellable=None) - if not state: - raise GObject.GError("Failed to perform requested dir/file action!") except GObject.GError as e: raise OSError(e) - def preprocess_paths(self, paths): - if not isinstance(paths, list): - paths = [paths] - # Convert items such as pathlib paths to strings - paths = [path.__fspath__() if hasattr(path, "__fspath__") else path for path in paths] - return paths + self.exists_file_rename_bttn.set_sensitive(False) + + + + def rename_proc(self, gio_file): + full_path = gio_file.get_path() + base_path = gio_file.get_parent().get_path() + file_name = os.path.splitext(gio_file.get_basename())[0] + extension = os.path.splitext(full_path)[-1] + target = Gio.File.new_for_path(full_path) + start = "-copy" + + if debug: + print(f"Path: {full_path}") + print(f"Base Path: {base_path}") + print(f'Name: {file_name}') + print(f"Extension: {extension}") + + i = 2 + while target.query_exists(): + try: + value = file_name[(file_name.find(start)+len(start)):] + int(value) + file_name = file_name.split(start)[0] + except Exception as e: + pass + + target = Gio.File.new_for_path(f"{base_path}/{file_name}-copy{i}{extension}") + i += 1 + + return target + + + def exists_rename_field_changed(self, widget): + nfile_name = widget.get_text().strip() + ofile_name = self.exists_file_label.get_label() + + if nfile_name: + if nfile_name == ofile_name: + self.exists_file_rename_bttn.set_sensitive(False) + else: + self.exists_file_rename_bttn.set_sensitive(True) + else: + self.exists_file_rename_bttn.set_sensitive(False) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetMixin.py index 922df41..52b9a0d 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WidgetMixin.py @@ -6,22 +6,19 @@ import gi gi.require_version("Gtk", "3.0") gi.require_version('Gdk', '3.0') -from gi.repository import Gtk -from gi.repository import Gdk -from gi.repository import GLib -from gi.repository import Gio -from gi.repository import GdkPixbuf +from gi.repository import Gtk, Gdk, GLib, Gio, GdkPixbuf # Application imports def threaded(fn): def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() return wrapper + class WidgetMixin: def load_store(self, view, store, save_state=False): @@ -41,12 +38,22 @@ class WidgetMixin: @threaded def create_icon(self, i, view, store, dir, file): icon = view.create_icon(dir, file) - fpath = dir + "/" + file + fpath = f"{dir}/{file}" GLib.idle_add(self.update_store, (i, store, icon, view, fpath,)) + # NOTE: Might need to keep an eye on this throwing invalid iters when too + # many updates are happening to a folder. Example: /tmp def update_store(self, item): i, store, icon, view, fpath = item - itr = store.get_iter(i) + itr = None + + try: + itr = store.get_iter(i) + except Exception as e: + print(":Invalid Itr detected: (Potential race condition...)") + print(f"Index Requested: {i}") + print(f"Store Size: {len(store)}") + return if not icon: icon = self.get_system_thumbnail(fpath, view.SYS_ICON_WH[0]) @@ -76,14 +83,13 @@ class WidgetMixin: return None except Exception as e: print("System icon generation issue:") - print( repr(e) ) return None def create_tab_widget(self, view): - tab = Gtk.Box() + tab = Gtk.ButtonBox() label = Gtk.Label() tid = Gtk.Label() close = Gtk.Button() @@ -91,10 +97,7 @@ class WidgetMixin: label.set_label(f"{view.get_end_of_path()}") label.set_width_chars(len(view.get_end_of_path())) - label.set_margin_start(5) - label.set_margin_end(15) label.set_xalign(0.0) - # label.set_ellipsize(2) #PANGO_ELLIPSIZE_MIDDLE tid.set_label(f"{view.id}") close.add(icon) @@ -126,8 +129,8 @@ class WidgetMixin: grid.set_spacing(12) grid.set_column_spacing(18) - grid.connect("button_release_event", self.grid_icon_single_left_click) - grid.connect("item-activated", self.grid_icon_double_left_click) + grid.connect("button_release_event", self.grid_icon_single_click) + grid.connect("item-activated", self.grid_icon_double_click) grid.connect("selection-changed", self.grid_set_selected_items) grid.connect("drag-data-get", self.grid_on_drag_set) grid.connect("drag-data-received", self.grid_on_drag_data_received) @@ -175,8 +178,8 @@ class WidgetMixin: grid.set_headers_visible(False) grid.set_enable_tree_lines(False) - grid.connect("button_release_event", self.grid_icon_single_left_click) - grid.connect("row-activated", self.grid_icon_double_left_click) + grid.connect("button_release_event", self.grid_icon_single_click) + grid.connect("row-activated", self.grid_icon_double_click) grid.connect("drag-data-get", self.grid_on_drag_set) grid.connect("drag-data-received", self.grid_on_drag_data_received) grid.connect("drag-motion", self.grid_on_drag_motion) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WindowMixin.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WindowMixin.py index 9aab631..aa8687f 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WindowMixin.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/signal_classes/mixins/WindowMixin.py @@ -3,18 +3,58 @@ import copy from os.path import isdir, isfile -# Gtk imports +# Lib imports import gi -from gi.repository import Gdk +gi.require_version('Gdk', '3.0') +from gi.repository import Gdk, Gio # Application imports -from . import TabMixin -from . import WidgetMixin +from . import TabMixin, WidgetMixin + class WindowMixin(TabMixin): """docstring for WindowMixin""" + def generate_windows(self, data = None): + if data: + for j, value in enumerate(data): + i = j + 1 + isHidden = True if value[0]["window"]["isHidden"] == "True" else False + object = self.builder.get_object(f"tggl_notebook_{i}") + views = value[0]["window"]["views"] + self.window_controller.create_window() + object.set_active(True) + + for view in views: + self.create_new_view_notebook(None, i, view) + + if isHidden: + self.toggle_notebook_pane(object) + + try: + if not self.is_pane4_hidden: + icon_view = self.window4.get_children()[1].get_children()[0] + icon_view.event(Gdk.Event().new(type=Gdk.EventType.BUTTON_RELEASE)) + elif not self.is_pane3_hidden: + icon_view = self.window3.get_children()[1].get_children()[0] + icon_view.event(Gdk.Event().new(type=Gdk.EventType.BUTTON_RELEASE)) + elif not self.is_pane2_hidden: + icon_view = self.window2.get_children()[1].get_children()[0] + icon_view.event(Gdk.Event().new(type=Gdk.EventType.BUTTON_RELEASE)) + elif not self.is_pane1_hidden: + icon_view = self.window1.get_children()[1].get_children()[0] + icon_view.event(Gdk.Event().new(type=Gdk.EventType.BUTTON_RELEASE)) + except Exception as e: + print("\n: The saved session might be missing window data! :\nLocation: ~/.config/solarfm/session.json\nFix: Back it up and delete it to reset.\n") + print(repr(e)) + else: + for j in range(0, 4): + i = j + 1 + self.window_controller.create_window() + self.create_new_view_notebook(None, i, None) + + def get_fm_window(self, wid): return self.window_controller.get_window_by_nickname(f"window_{wid}") @@ -39,7 +79,43 @@ class WindowMixin(TabMixin): def set_bottom_labels(self, view): - self.bottom_size_label.set_label("TBD") + _wid, _tid, _view, iconview, store = self.get_current_state() + selected_files = iconview.get_selected_items() + current_directory = view.get_current_directory() + path_file = Gio.File.new_for_path( current_directory) + mount_file = path_file.query_filesystem_info(attributes="filesystem::*", cancellable=None) + formatted_mount_free = self.sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::free")) ) + formatted_mount_size = self.sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::size")) ) + + if self.trash_files_path == current_directory: + self.builder.get_object("restore_from_trash").show() + self.builder.get_object("empty_trash").show() + else: + self.builder.get_object("restore_from_trash").hide() + self.builder.get_object("empty_trash").hide() + + # If something selected + self.bottom_size_label.set_label(f"{formatted_mount_free} free / {formatted_mount_size}") + self.bottom_path_label.set_label(view.get_current_directory()) + if len(selected_files) > 0: + uris = self.format_to_uris(store, _wid, _tid, selected_files, True) + combined_size = 0 + for uri in uris: + file_info = Gio.File.new_for_path(uri).query_info(attributes="standard::size", + flags=Gio.FileQueryInfoFlags.NONE, + cancellable=None) + file_size = file_info.get_size() + combined_size += file_size + + formatted_size = self.sizeof_fmt(combined_size) + if view.hide_hidden: + self.bottom_path_label.set_label(f" {len(uris)} / {view.get_files_count()} ({formatted_size})") + else: + self.bottom_path_label.set_label(f" {len(uris)} / {view.get_not_hidden_count()} ({formatted_size})") + + return + + # If nothing selected if view.hide_hidden: if view.get_hidden_count() > 0: self.bottom_file_count_label.set_label(f"{view.get_not_hidden_count()} visible ({view.get_hidden_count()} hidden)") @@ -47,7 +123,7 @@ class WindowMixin(TabMixin): self.bottom_file_count_label.set_label(f"{view.get_files_count()} items") else: self.bottom_file_count_label.set_label(f"{view.get_files_count()} items") - self.bottom_path_label.set_label(view.get_current_directory()) + def set_window_title(self): @@ -57,10 +133,12 @@ class WindowMixin(TabMixin): dir = view.get_current_directory() for _notebook in self.notebooks: - ctx = _notebook.get_style_context() + ctx = _notebook.get_style_context() ctx.remove_class("notebook-selected-focus") + ctx.add_class("notebook-unselected-focus") - ctx = notebook.get_style_context() + ctx = notebook.get_style_context() + ctx.remove_class("notebook-unselected-focus") ctx.add_class("notebook-selected-focus") self.window.set_title("SolarFM ~ " + dir) @@ -74,16 +152,18 @@ class WindowMixin(TabMixin): def grid_set_selected_items(self, iconview): self.selected_files = iconview.get_selected_items() - def grid_icon_single_left_click(self, iconview, eve): + def grid_icon_single_click(self, iconview, eve): try: + self.path_menu.popdown() wid, tid = iconview.get_name().split("|") self.window_controller.set_active_data(wid, tid) self.set_path_text(wid, tid) self.set_window_title() + if eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 1: # l-click if self.single_click_open: # FIXME: need to find a way to pass the model index - self.grid_icon_double_left_click(iconview) + self.grid_icon_double_click(iconview) elif eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 3: # r-click self.show_context_menu() @@ -91,33 +171,29 @@ class WindowMixin(TabMixin): print(repr(e)) self.display_message(self.error, f"{repr(e)}") - def grid_icon_double_left_click(self, iconview, item, data=None): + def grid_icon_double_click(self, iconview, item, data=None): try: - wid, tid = self.window_controller.get_active_data() + if self.ctrlDown and self.shiftDown: + self.execute_files(in_terminal=True) + return + elif self.ctrlDown: + self.execute_files() + return + + + wid, tid, view, _iconview, store = self.get_current_state() notebook = self.builder.get_object(f"window_{wid}") - path_entry = self.builder.get_object(f"path_entry") tab_label = self.get_tab_label(notebook, iconview) - view = self.get_fm_window(wid).get_view_by_id(tid) - model = iconview.get_model() - - fileName = model[item][1] + fileName = store[item][1] dir = view.get_current_directory() - file = dir + "/" + fileName - refresh = True + file = f"{dir}/{fileName}" if isdir(file): view.set_path(file) - elif isfile(file): - refresh = False - view.open_file_locally(file) - - if refresh == True: - self.load_store(view, model) - tab_label.set_label(view.get_end_of_path()) - path_entry.set_text(view.get_current_directory()) - self.set_file_watcher(view) - self.set_bottom_labels(view) + self.update_view(tab_label, view, store, wid, tid) + else: + self.open_files() except Exception as e: self.display_message(self.error, f"{repr(e)}") @@ -128,9 +204,13 @@ class WindowMixin(TabMixin): wid, tid = action.split("|") store = iconview.get_model() treePaths = iconview.get_selected_items() + # NOTE: Need URIs as URI format for DnD to work. Will strip 'file://' + # further down call chain when doing internal fm stuff. uris = self.format_to_uris(store, wid, tid, treePaths) + uris_text = '\n'.join(uris) data.set_uris(uris) + data.set_text(uris_text, -1) def grid_on_drag_motion(self, iconview, drag_context, x, y, data): wid, tid = iconview.get_name().split("|") @@ -143,17 +223,13 @@ class WindowMixin(TabMixin): store, tab_label = self.get_store_and_label_from_notebook(notebook, f"{wid}|{tid}") view = self.get_fm_window(wid).get_view_by_id(tid) - uris = data.get_uris() - dest = view.get_current_directory() - + uris = data.get_uris() + dest = f"{view.get_current_directory()}" if len(uris) > 0: - if debug: - print(f"Target Move Path: {dest}") - - for uri in uris: - if debug: - print(f"URI: {uri}") - self.move_file(view, uri, dest) + self.move_files(uris, dest) + else: + uris = data.get_text().split("\n") + self.move_files(uris, dest) def create_new_view_notebook(self, widget=None, wid=None, path=None): self.create_tab(wid, path) diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/solarfm b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/solarfm deleted file mode 100755 index 40cd1fd..0000000 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/solarfm +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# . CONFIG.sh - -# 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() { - SCRIPTPATH="$( cd "$(dirname "")" >/dev/null 2>&1 ; pwd -P )" - cd "${SCRIPTPATH}" - echo "Working Dir: " $(pwd) - - source "/home/abaddon/Portable_Apps/py-venvs/flask-apps-venv/venv/bin/activate" - python ../solarfm "$@" -} -main "$@"; diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/trasher/__init__.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/trasher/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/trasher/__init__.py rename to src/debs/solarfm-0-0-1-x64/opt/SolarFM/trasher/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/trasher/trash.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/trasher/trash.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/trasher/trash.py rename to src/debs/solarfm-0-0-1-x64/opt/SolarFM/trasher/trash.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/trasher/xdgtrash.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/trasher/xdgtrash.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/trasher/xdgtrash.py rename to src/debs/solarfm-0-0-1-x64/opt/SolarFM/trasher/xdgtrash.py diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/utils/Settings.py b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/utils/Settings.py index 46296b1..3dc368f 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/utils/Settings.py +++ b/src/debs/solarfm-0-0-1-x64/opt/SolarFM/utils/Settings.py @@ -1,5 +1,6 @@ # Python imports import os +from os import path # Gtk imports import gi, cairo @@ -16,30 +17,47 @@ from . import Logger class Settings: def __init__(self): - self.SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) - self.gladefile = self.SCRIPT_PTH + "/../resources/Main_Window.glade" - self.cssFile = self.SCRIPT_PTH + '/../resources/stylesheet.css' - self.logger = Logger().get_logger() + self.logger = Logger().get_logger() + self.builder = gtk.Builder() - self.builder = gtk.Builder() - self.builder.add_from_file(self.gladefile) - self.mainWindow = None + self.SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) + self.USER_HOME = path.expanduser('~') + self.CONFIG_PATH = f"{self.USER_HOME}/.config/solarfm" + self.USR_SOLARFM = "/usr/share/solarfm" + + self.cssFile = f"{self.CONFIG_PATH}/stylesheet.css" + self.windows_glade = f"{self.CONFIG_PATH}/Main_Window.glade" + self.DEFAULT_ICONS = f"{self.CONFIG_PATH}/icons" + self.window_icon = f"{self.DEFAULT_ICONS}/solarfm.png" + self.main_window = None + + if not os.path.exists(self.windows_glade): + self.windows_glade = f"{self.USR_SOLARFM}/Main_Window.glade" + if not os.path.exists(self.cssFile): + self.cssFile = f"{self.USR_SOLARFM}/stylesheet.css" + if not os.path.exists(self.window_icon): + self.window_icon = f"{self.USR_SOLARFM}/icons/solarfm.png" + if not os.path.exists(self.DEFAULT_ICONS): + self.DEFAULT_ICONS = f"{self.USR_SOLARFM}/icons" + + self.builder.add_from_file(self.windows_glade) def createWindow(self): # Get window and connect signals - self.mainWindow = self.builder.get_object("Main_Window") + self.main_window = self.builder.get_object("Main_Window") self.setWindowData() def setWindowData(self): - screen = self.mainWindow.get_screen() + self.main_window.set_icon_from_file(self.window_icon) + screen = self.main_window.get_screen() visual = screen.get_rgba_visual() if visual != None and screen.is_composited(): - self.mainWindow.set_visual(visual) - self.mainWindow.set_app_paintable(True) - self.mainWindow.connect("draw", self.area_draw) + self.main_window.set_visual(visual) + self.main_window.set_app_paintable(True) + self.main_window.connect("draw", self.area_draw) # bind css file cssProvider = gtk.CssProvider() @@ -54,7 +72,7 @@ class Settings: cr.paint() cr.set_operator(cairo.OPERATOR_OVER) - def getMainWindow(self): return self.mainWindow + def getMainWindow(self): return self.main_window def getMonitorData(self): diff --git a/user_config/solarfm/Main_Window.glade b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/Main_Window.glade similarity index 100% rename from user_config/solarfm/Main_Window.glade rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/Main_Window.glade diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/archive.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/archive.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/archive.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/archive.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/audio.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/audio.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/audio.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/audio.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/bin.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/bin.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/bin.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/bin.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/dir.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/dir.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/dir.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/dir.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/doc.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/doc.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/doc.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/doc.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/pdf.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/pdf.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/pdf.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/pdf.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/presentation.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/presentation.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/presentation.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/presentation.png diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/solarfm-64x64.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm-64x64.png similarity index 100% rename from src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/solarfm-64x64.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm-64x64.png diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/solarfm.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm.png similarity index 100% rename from src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/solarfm.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/solarfm.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/spreadsheet.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/spreadsheet.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/spreadsheet.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/spreadsheet.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/text.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/text.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/text.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/text.png diff --git a/user_config/solarfm/icons/trash.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/trash.png similarity index 100% rename from user_config/solarfm/icons/trash.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/trash.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/video.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/video.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/video.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/video.png diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/web.png b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/web.png similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/old/resources/icons/web.png rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/icons/web.png diff --git a/user_config/solarfm/settings.json b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/settings.json similarity index 100% rename from user_config/solarfm/settings.json rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/settings.json diff --git a/user_config/solarfm/stylesheet.css b/src/debs/solarfm-0-0-1-x64/usr/share/solarfm/stylesheet.css similarity index 100% rename from user_config/solarfm/stylesheet.css rename to src/debs/solarfm-0-0-1-x64/usr/share/solarfm/stylesheet.css diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/PyFM.py b/src/versions/solarfm-0.0.1/SolarFM/old/PyFM.py deleted file mode 100755 index fefc784..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/PyFM.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/python3 - -# Gtk Imports -import gi, faulthandler, signal -gi.require_version('Gtk', '3.0') -gi.require_version('WebKit2', '4.0') - -from gi.repository import Gtk as gtk -from gi.repository import Gdk as gdk -from gi.repository import WebKit2 as webkit -from gi.repository import GLib - -# Python imports -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() - self.settings = Settings() - self.settings.attachBuilder(self.builder) - GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, gtk.main_quit) - self.builder.connect_signals(Events(self.settings)) - - window = self.settings.createWindow() - window.fullscreen() - window.show_all() - - -if __name__ == "__main__": - try: - main = Main() - gtk.main() - except Exception as e: - print(e) diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/PyFM.glade b/src/versions/solarfm-0.0.1/SolarFM/old/resources/PyFM.glade deleted file mode 100644 index 01aef11..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/resources/PyFM.glade +++ /dev/null @@ -1,1049 +0,0 @@ - - - - - - - - inode/directory - - - - False - bottom - - - True - False - vertical - - - 300 - 26 - True - True - gtk-edit - - - False - True - 0 - - - - - True - False - - - gtk-copy - True - True - True - True - True - - - False - True - 0 - - - - - gtk-cut - True - True - True - True - True - - - False - True - 1 - - - - - gtk-paste - True - True - True - True - True - - - False - True - 2 - - - - - gtk-delete - True - True - True - 65 - True - True - - - False - True - end - 3 - - - - - False - True - 1 - - - - - - - True - False - gtk-ok - - - 800 - 600 - False - 800 - 600 - desktop - False - center - - - - - - True - False - vertical - - - True - False - - - True - False - - - True - False - _File - True - - - True - False - - - gtk-new - True - False - True - True - - - - - gtk-open - True - False - True - True - - - - - gtk-save - True - False - True - True - - - - - gtk-save-as - True - False - True - True - - - - - True - False - - - - - gtk-quit - True - False - True - True - - - - - - - - - True - False - _Edit - True - - - True - False - - - gtk-cut - True - False - True - True - - - - - gtk-copy - True - False - True - True - - - - - gtk-paste - True - False - True - True - - - - - gtk-delete - True - False - True - True - - - - - - - - - True - False - _View - True - - - - - True - False - _Help - True - - - True - False - - - gtk-about - True - False - True - True - - - - - - - - - False - True - 0 - - - - - True - False - start - - - button - True - True - True - - - True - True - end - 0 - - - - - button - True - True - True - - - True - True - end - 1 - - - - - True - True - True - - - True - True - end - 2 - - - - - True - True - True - toggleViewChecked - True - - - True - True - end - 3 - - - - - False - True - 1 - - - - - False - True - 0 - - - - - True - True - vertical - 263 - True - - - True - True - True - - - True - False - vertical - - - True - False - start - - - - - - - - - - - - False - True - 0 - - - - - True - True - - - - - - True - False - page 1 - - - False - - - - - - - - True - False - page 2 - - - 1 - False - - - - - - - - True - False - page 3 - - - 2 - False - - - - - True - True - 1 - - - - - True - False - - - False - 6 - end - - - - - - - - - - - - False - False - 0 - - - - - False - 16 - - - - - - - - - - - - False - False - 0 - - - - - - - - False - True - 2 - - - - - False - True - - - - - True - False - vertical - - - True - False - start - - - - - - - - - - - - False - True - 0 - - - - - True - True - - - - - - True - False - page 1 - - - False - - - - - - - - True - False - page 2 - - - 1 - False - - - - - - - - True - False - page 3 - - - 2 - False - - - - - True - True - 1 - - - - - True - False - - - False - 6 - end - - - - - - - - - - - - False - False - 0 - - - - - False - 16 - - - - - - - - - - - - False - False - 0 - - - - - - - - False - True - 2 - - - - - True - True - - - - - False - True - - - - - True - True - 50 - True - - - True - False - vertical - - - True - False - start - - - - - - - - - - - - False - True - 0 - - - - - True - True - - - - - - True - False - page 1 - - - False - - - - - - - - True - False - page 2 - - - 1 - False - - - - - - - - True - False - page 3 - - - 2 - False - - - - - True - True - 1 - - - - - True - False - - - False - 6 - end - - - - - - - - - - - - False - False - 0 - - - - - False - 16 - - - - - - - - - - - - False - False - 0 - - - - - - - - False - True - 2 - - - - - False - True - - - - - True - False - vertical - - - True - False - start - - - - - - - - - - - - False - True - 0 - - - - - True - True - - - - - - True - False - page 1 - - - False - - - - - - - - True - False - page 2 - - - 1 - False - - - - - - - - True - False - page 3 - - - 2 - False - - - - - True - True - 1 - - - - - True - False - - - False - 6 - end - - - - - - - - - - - - False - False - 0 - - - - - False - 16 - - - - - - - - - - - - False - False - 0 - - - - - - - - False - True - 2 - - - - - True - True - - - - - True - True - - - - - True - True - 1 - - - - - - - False - True - True - bottom - - - True - False - vertical - - - True - False - - - gtk-home - True - True - True - True - True - - - - False - True - 0 - - - - - gtk-refresh - True - True - True - True - True - - - - False - True - 1 - - - - - True - True - edit-find-symbolic - False - False - - - - True - True - 2 - - - - - False - True - 0 - - - - - True - True - - - - - - - False - True - 1 - - - - - - diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/resources/stylesheet.css b/src/versions/solarfm-0.0.1/SolarFM/old/resources/stylesheet.css deleted file mode 100644 index 9addcfa..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/resources/stylesheet.css +++ /dev/null @@ -1,88 +0,0 @@ -viewport, -treeview, -treeview > header, -notebook > stack, -notebook > header { - background-color: rgba(0, 0, 0, 0.24); -} - - -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.2); - background-color: rgba(0, 0, 0, 0.2); -} - -cell { - margin: 0em; - padding: 0em; - /* float: left; */ -} - -cell:focus { - outline-style: solid; - outline-color: rgba(0, 232, 255, 0.64); -} - - -/* Ivonview and children default color */ -.view { - background-color: rgba(0, 0, 0, 0.22); - color: #ebebeb; -} - - -/* Hover over color when not selected */ -.view:hover { - box-shadow: inset 0 0 0 9999px alpha(rgba(0, 232, 255, 0.64), 0.54); -} - -/* Handles the icon selection hover and selected hover color. */ -.view:selected, -.view:selected:hover { - box-shadow: inset 0 0 0 9999px rgba(15, 134, 13, 0.49); -} - -/* Rubberband coloring */ -.rubberband, -rubberband, -flowbox rubberband, -treeview.view rubberband, -.content-view rubberband, -.content-view .rubberband, -XfdesktopIconView.view .rubberband { - border: 1px solid #6c6c6c; - background-color: rgba(21, 158, 167, 0.57); -} - -XfdesktopIconView.view:active { - background-color: rgba(172, 102, 21, 1); -} - - -XfdesktopIconView.view { - border-radius: 4px; - background-color: transparent; - color: white; - text-shadow: 0 1px 1px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); -} - -XfdesktopIconView.view:active { - box-shadow: none; - text-shadow: none; -} - -XfdesktopIconView.view .rubberband { - border-radius: 0; -} diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Dragging.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/Dragging.py deleted file mode 100644 index a0b2856..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Dragging.py +++ /dev/null @@ -1,79 +0,0 @@ -import os, gi - -gi.require_version('Gdk', '3.0') - -from gi.repository import Gdk -from gi.repository import GObject - - -class Dragging: - def __init__(self): - # higher values make movement more performant - # lower values make movement smoother - self.SENSITIVITY = 1 - self.desktop = None - self.EvMask = Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON1_MOTION_MASK - self.offsetx = 0 - self.offsety = 0 - self.px = 0 - self.py = 0 - self.maxx = 0 - self.maxy = 0 - - def connectEvents(self, desktop, widget): - self.desktop = desktop - widget.set_events(self.EvMask) - widget.connect("button_press_event", self.press_event) - widget.connect("motion_notify_event", self.draggingEvent) - widget.show() - - def press_event(self, w, event): - if event.button == 1: - p = w.get_parent() - # offset == distance of parent widget from edge of screen ... - self.offsetx, self.offsety = p.get_window().get_position() - # plus distance from pointer to edge of widget - self.offsetx += event.x - self.offsety += event.y - # self.maxx, self.maxy both relative to the parent - # note that we're rounding down now so that these max values don't get - # rounded upward later and push the widget off the edge of its parent. - self.maxx = self.RoundDownToMultiple(p.get_allocation().width - w.get_allocation().width, self.SENSITIVITY) - self.maxy = self.RoundDownToMultiple(p.get_allocation().height - w.get_allocation().height, self.SENSITIVITY) - - - def draggingEvent(self, widget, event): - # x_root,x_root relative to screen - # x,y relative to parent (fixed widget) - # self.px,self.py stores previous values of x,y - - # get starting values for x,y - x = event.x_root - self.offsetx - y = event.y_root - self.offsety - # make sure the potential coordinates x,y: - # 1) will not push any part of the widget outside of its parent container - # 2) is a multiple of self.SENSITIVITY - x = self.RoundToNearestMultiple(self.Max(self.Min(x, self.maxx), 0), self.SENSITIVITY) - y = self.RoundToNearestMultiple(self.Max(self.Min(y, self.maxy), 0), self.SENSITIVITY) - if x != self.px or y != self.py: - self.px = x - self.py = y - self.desktop.move(widget, x, y) - - def Min(self, a, b): - if b < a: - return b - return a - - def Max(self, a, b): - if b > a: - return b - return a - - def RoundDownToMultiple(self, i, m): - return i/m*m - - def RoundToNearestMultiple(self, i, m): - if i % m > m / 2: - return (i/m+1)*m - return i/m*m diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Events.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/Events.py deleted file mode 100644 index fbd3962..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Events.py +++ /dev/null @@ -1,72 +0,0 @@ - -# Gtk Imports - -# Python imports -from .Grid import Grid -from .Dragging import Dragging - -class Events: - def __init__(self, settings): - self.settings = settings - self.builder = self.settings.returnBuilder() - self.desktop = self.builder.get_object("Desktop") - self.webview = self.builder.get_object("webview") - self.desktopPath = self.settings.returnDesktopPath() - - self.settings.setDefaultWebviewSettings(self.webview, self.webview.get_settings()) - self.webview.load_uri(self.settings.returnWebHome()) - - # Add filter to allow only folders to be selected - selectedDirDialog = self.builder.get_object("selectedDirDialog") - filefilter = self.builder.get_object("Folders") - selectedDirDialog.add_filter(filefilter) - selectedDirDialog.set_filename(self.desktopPath) - - self.grid = None - self.setIconViewDir(selectedDirDialog) - - def setIconViewDir(self, widget, data=None): - newPath = widget.get_filename() - Grid(self.desktop, self.settings, newPath) - - - - # File control events - def createFile(self): - pass - - def updateFile(self, widget, data=None): - newName = widget.get_text().strip() - if data and data.keyval == 65293: # Enter key event - self.grid.updateFile(newName) - elif data == None: # Save button 'event' - self.grid.updateFile(newName) - - def deleteFile(self, widget, data=None): - self.grid.deleteFile() - - def copyFile(self): - pass - - def cutFile(self): - pass - - def pasteFile(self): - pass - - # Webview events - def showWebview(self, widget): - self.builder.get_object("webViewer").popup() - - def loadHome(self, widget): - self.webview.load_uri(self.settings.returnWebHome()) - - def runSearchWebview(self, widget, data=None): - if data.keyval == 65293: - self.webview.load_uri(widget.get_text().strip()) - - def refreshPage(self, widget, data=None): - self.webview.load_uri(self.webview.get_uri()) - - def setUrlBar(self, widget, data=None): - self.builder.get_object("webviewSearch").set_text(widget.get_uri()) diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/FileHandler.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/FileHandler.py deleted file mode 100644 index c4dfa3b..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/FileHandler.py +++ /dev/null @@ -1,93 +0,0 @@ - -import os, shutil, subprocess, threading - - -def threaded(fn): - def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() - return wrapper - -class FileHandler: - def __init__(self): - # 'Filters' - self.office = ('.doc', '.docx', '.xls', '.xlsx', '.xlt', '.xltx' '.xlm', '.ppt', 'pptx', '.pps', '.ppsx', '.odt', '.rtf') - self.vids = ('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm') - self.txt = ('.txt', '.text', '.sh', '.cfg', '.conf') - self.music = ('.psf', '.mp3', '.ogg' , '.flac') - self.images = ('.png', '.jpg', '.jpeg', '.gif') - self.pdf = ('.pdf') - - # Args - self.MEDIAPLAYER = "mpv"; - self.IMGVIEWER = "mirage"; - self.MUSICPLAYER = "/opt/deadbeef/bin/deadbeef"; - self.OFFICEPROG = "libreoffice"; - self.TEXTVIEWER = "leafpad"; - self.PDFVIEWER = "evince"; - self.FILEMANAGER = "spacefm"; - self.MPLAYER_WH = " -xy 1600 -geometry 50%:50% "; - self.MPV_WH = " -geometry 50%:50% "; - - @threaded - def openFile(self, file): - print("Opening: " + file) - if file.lower().endswith(self.vids): - subprocess.Popen([self.MEDIAPLAYER, self.MPV_WH, file]) - elif file.lower().endswith(self.music): - subprocess.Popen([self.MUSICPLAYER, file]) - elif file.lower().endswith(self.images): - subprocess.Popen([self.IMGVIEWER, file]) - elif file.lower().endswith(self.txt): - subprocess.Popen([self.TEXTVIEWER, file]) - elif file.lower().endswith(self.pdf): - subprocess.Popen([self.PDFVIEWER, file]) - elif file.lower().endswith(self.office): - subprocess.Popen([self.OFFICEPROG, file]) - else: - subprocess.Popen(['xdg-open', file]) - - - def createFile(self, newFileName): - pass - - def updateFile(self, oldFileName, newFileName): - try: - print("Renaming...") - print(oldFileName + " --> " + newFileName) - os.rename(oldFileName, newFileName) - return 0 - except Exception as e: - print("An error occured renaming the file:") - print(e) - return 1 - - def deleteFile(self, toDeleteFile): - try: - print("Deleting...") - print(toDeleteFile) - if os.path.exists(toDeleteFile): - if os.path.isfile(toDeleteFile): - os.remove(toDeleteFile) - elif os.path.isdir(toDeleteFile): - shutil.rmtree(toDeleteFile) - else: - print("An error occured deleting the file:") - return 1 - else: - print("The folder/file does not exist") - return 1 - except Exception as e: - print("An error occured deleting the file:") - print(e) - return 1 - - return 0 - - def copyFile(self): - pass - - def cutFile(self): - pass - - def pasteFile(self): - pass diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Grid.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/Grid.py deleted file mode 100644 index 392de55..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Grid.py +++ /dev/null @@ -1,214 +0,0 @@ - - -# Gtk Imports -import gi -gi.require_version('Gtk', '3.0') -gi.require_version('Gdk', '3.0') - -from gi.repository import Gtk as gtk -from gi.repository import Gdk as gdk -from gi.repository import GLib as glib -from gi.repository import GdkPixbuf - -# Python imports -import os, threading, time -from os.path import isdir, isfile, join -from os import listdir -from .Icon import Icon -from .FileHandler import FileHandler - - -def threaded(fn): - def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() - return wrapper - -class Grid: - def __init__(self, desktop, settings, newPath): - self.desktop = desktop - self.settings = settings - self.filehandler = FileHandler() - - self.store = gtk.ListStore(GdkPixbuf.Pixbuf, str) - self.usrHome = settings.returnUserHome() - self.builder = settings.returnBuilder() - self.ColumnSize = settings.returnColumnSize() - self.currentPath = "" - self.selectedFile = "" - - 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,)) - self.desktop.connect("selection-changed", self.setIconSelectionArray, (self.desktop,)) - - self.vidsList = settings.returnVidsExtensionList() - self.imagesList = settings.returnImagesExtensionList() - self.gtkLock = False # Thread checks for gtkLock - self.threadLock = False # Gtk checks for thread lock - self.helperThread = None # Helper thread object - self.toWorkPool = [] # Thread fills pool and gtk empties it - self.copyCutArry = [] - - self.setIconViewDir(newPath) - - def setIconViewDir(self, path): - self.store.clear() - - self.currentPath = path - dirPaths = ['.', '..'] - vids = [] - images = [] - desktop = [] - files = [] - - for f in listdir(path): - file = join(path, f) - if self.settings.isHideHiddenFiles(): - if f.startswith('.'): - continue - if isfile(file): - if file.lower().endswith(self.vidsList): - vids.append(f) - elif file.lower().endswith(self.imagesList): - images.append(f) - elif file.lower().endswith((".desktop",)): - desktop.append(f) - else: - files.append(f) - else: - dirPaths.append(f) - - dirPaths.sort() - vids.sort() - images.sort() - desktop.sort() - files.sort() - files = dirPaths + vids + images + desktop + files - - if self.helperThread: - self.helperThread.terminate() - self.helperThread = None - - # Run helper thread... - self.threadLock = True - self.helperThread = threading.Thread(target=self.generateDirectoryGridIcon, args=(path, files)).start() - glib.idle_add(self.addToGrid, (file,)) # This must stay in the main thread b/c - # gtk isn't thread safe/aware So, we - # make a sad lil thread hot potato 'game' - # out of this process. - - - # @threaded - def generateDirectoryGridIcon(self, dirPath, files): - # NOTE: We'll be passing pixbuf after retreval to keep Icon.py file more - # universaly usable. We can just remove get_pixbuf to get a gtk.Image type - for file in files: - image = Icon(self.settings).createIcon(dirPath, file) - self.toWorkPool.append([image.get_pixbuf(), file]) - self.threadLock = False - self.gtkLock = True - - - def addToGrid(self, args): - # NOTE: Returning true tells gtk to check again in the future when idle. - # False ends checks and "continues normal flow" - files = args[0] - - if len(self.toWorkPool) > 0: - for dataSet in self.toWorkPool: - self.store.append(dataSet) - - if len(self.store) == len(files): # Confirm processed all files and cleanup - self.gtkLock = False - self.threadLock = False - self.toWorkPool.clear() - return False - # Check again when idle; If nothing else is updating, this function - # gets called immediatly. So, we play hot potato by passing lock to Thread - else: - self.toWorkPool.clear() - self.gtkLock = False - self.threadLock = True - time.sleep(.005) # Fixes refresh and up icon not being added. - return True - - def setIconSelectionArray(self, widget, data=None): - pass - # os.system('cls||clear') - # print(data) - - def iconLeftClickEventManager(self, widget, item): - try: - model = widget.get_model() - fileName = model[item][1] - dir = self.currentPath - file = dir + "/" + fileName - - if fileName == ".": - self.setIconViewDir(dir) - elif fileName == "..": - parentDir = os.path.abspath(os.path.join(dir, os.pardir)) - self.currentPath = parentDir - self.setIconViewDir(parentDir) - elif isdir(file): - self.currentPath = file - self.setIconViewDir(self.currentPath) - elif isfile(file): - self.filehandler.openFile(file) - except Exception as e: - print(e) - - def iconRightClickEventManager(self, widget, eve, params): - try: - if eve.type == gdk.EventType.BUTTON_PRESS and eve.button == 3: - popover = self.builder.get_object("iconControlsWindow") - popover.show_all() - popover.popup() - # # NOTE: Need to change name of listview box... - # children = widget.get_children()[0].get_children() - # fileName = children[1].get_text() - # dir = self.currentPath - # file = dir + "/" + fileName - # - # input = self.builder.get_object("iconRenameInput") - # popover = self.builder.get_object("iconControlsWindow") - # self.selectedFile = file # Used for return to caller - # - # input.set_text(fileName) - # popover.set_relative_to(widget) - # popover.set_position(gtk.PositionType.RIGHT) - # popover.show_all() - # popover.popup() - except Exception as e: - print(e) - - - # Passthrough file control events - def createFile(arg): - pass - - def updateFile(self, file): - newName = self.currentPath + "/" + file - status = self.filehandler.updateFile(self.selectedFile, newName) - - if status == 0: - self.selectedFile = newName - self.setIconViewDir(self.currentPath) - - def deleteFile(self): - status = self.filehandler.deleteFile(self.selectedFile) - - if status == 0: - self.selectedFile = "" - self.setIconViewDir(self.currentPath) - - def copyFile(self): - pass - - def cutFile(self): - pass - - def pasteFile(self): - pass diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Icon.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/Icon.py deleted file mode 100644 index 826e408..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Icon.py +++ /dev/null @@ -1,167 +0,0 @@ - -# Gtk Imports -import gi -gi.require_version('Gtk', '3.0') -gi.require_version('Gdk', '3.0') - -from gi.repository import Gtk as gtk -from gi.repository import Gio as gio -from gi.repository import GdkPixbuf -from xdg.DesktopEntry import DesktopEntry - -# Python Imports -import os, subprocess, hashlib, threading - -from os.path import isdir, isfile, join - - - -def threaded(fn): - def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() - return wrapper - -class Icon: - def __init__(self, settings): - self.settings = settings - self.thubnailGen = settings.getThumbnailGenerator() - self.vidsList = settings.returnVidsExtensionList() - self.imagesList = settings.returnImagesExtensionList() - self.GTK_ORIENTATION = settings.returnIconImagePos() - self.usrHome = settings.returnUserHome() - self.iconContainerWH = settings.returnContainerWH() - self.systemIconImageWH = settings.returnSystemIconImageWH() - self.viIconWH = settings.returnVIIconWH() - - - def createIcon(self, dir, file): - fullPath = dir + "/" + file - return self.getIconImage(file, fullPath) - - - def getIconImage(self, file, fullPath): - try: - thumbnl = None - - # 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) - - thumbnl = self.createIconImageBuffer(hashImgPth, self.viIconWH) - # Image Icon - elif file.lower().endswith(self.imagesList): - thumbnl = self.createIconImageBuffer(fullPath, self.viIconWH) - # .desktop file parsing - elif fullPath.lower().endswith( ('.desktop',) ): - thumbnl = self.parseDesktopFiles(fullPath) - # System icons - 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") - - return thumbnl - except Exception as e: - print(e) - return gtk.Image.new_from_file("resources/icons/bin.png") - - - def parseDesktopFiles(self, fullPath): - try: - xdgObj = DesktopEntry(fullPath) - icon = xdgObj.getIcon() - iconsDirs = "/usr/share/icons" - altIconPath = "" - - if "steam" in icon: - steamIconsDir = self.usrHome + "/.thumbnails/steam_icons/" - name = xdgObj.getName() - fileHash = hashlib.sha256(str.encode(name)).hexdigest() - - if isdir(steamIconsDir) == False: - os.mkdir(steamIconsDir) - - hashImgPth = steamIconsDir + fileHash + ".jpg" - if isfile(hashImgPth) == True: - # Use video sizes since headers are bigger - return self.createIconImageBuffer(hashImgPth, self.viIconWH) - - execStr = xdgObj.getExec() - parts = execStr.split("steam://rungameid/") - id = parts[len(parts) - 1] - - # NOTE: Can try this logic instead... - # if command exists use it instead of header image - # if "steamcmd app_info_print id": - # proc = subprocess.Popen(["steamcmd", "app_info_print", id]) - # proc.wait() - # else: - # use the bottom logic - - imageLink = "https://steamcdn-a.akamaihd.net/steam/apps/" + id + "/header.jpg" - proc = subprocess.Popen(["wget", "-O", hashImgPth, imageLink]) - proc.wait() - - # Use video sizes since headers are bigger - return self.createIconImageBuffer(hashImgPth, self.viIconWH) - elif os.path.exists(icon): - return self.createIconImageBuffer(icon, self.systemIconImageWH) - else: - for (dirpath, dirnames, filenames) in os.walk(iconsDirs): - for file in filenames: - appNM = "application-x-" + icon - if appNM in file: - altIconPath = dirpath + "/" + file - break - - return self.createIconImageBuffer(altIconPath, self.systemIconImageWH) - except Exception as e: - print(e) - return None - - - def getSystemThumbnail(self, filename, size): - try: - iconPath = None - if os.path.exists(filename): - file = gio.File.new_for_path(filename) - info = file.query_info('standard::icon' , 0 , gio.Cancellable()) - icon = info.get_icon().get_names()[0] - iconTheme = gtk.IconTheme.get_default() - iconFile = iconTheme.lookup_icon(icon , size , 0) - - if iconFile != None: - iconPath = iconFile.get_filename() - return self.createIconImageBuffer(iconPath, self.systemIconImageWH) - else: - return None - else: - return None - except Exception as e: - print(e) - return None - - - def createIconImageBuffer(self, path, wxh): - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(path, wxh[0], wxh[1], False) - except Exception as e: - return None - - return gtk.Image.new_from_pixbuf(pixbuf) - - - def generateVideoThumbnail(self, fullPath, hashImgPth): - try: - proc = subprocess.Popen([self.thubnailGen, "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPath, "-o", hashImgPth]) - proc.wait() - except Exception as e: - print(e) diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Settings.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/Settings.py deleted file mode 100644 index 4e72f11..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/Settings.py +++ /dev/null @@ -1,139 +0,0 @@ - -# Gtk Imports -import gi, cairo, os -gi.require_version('Gtk', '3.0') -gi.require_version('Gdk', '3.0') - -from gi.repository import Gtk as gtk -from gi.repository import Gdk as gdk - -class Settings: - def __init__(self): - self.builder = None - self.hideHiddenFiles = True - - - self.GTK_ORIENTATION = 1 # HORIZONTAL (0) VERTICAL (1) - self.THUMB_GENERATOR = "ffmpegthumbnailer" - self.DEFAULTCOLOR = gdk.RGBA(0.0, 0.0, 0.0, 0.0) # ~#00000000 - self.MOUSEOVERCOLOR = gdk.RGBA(0.0, 0.9, 1.0, 0.64) # ~#00e8ff - self.SELECTEDCOLOR = gdk.RGBA(0.4, 0.5, 0.1, 0.84) - - self.ColumnSize = 8 - self.usrHome = os.path.expanduser('~') - self.desktopPath = self.usrHome + "/Desktop" - self.webHome = 'http://webfm.com/' - self.iconContainerWxH = [128, 128] - self.systemIconImageWxH = [72, 72] - self.viIconWxH = [256, 128] - self.vidsExtensionList = ('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm') - self.imagesExtensionList = ('.png', '.jpg', '.jpeg', '.gif', '.ico', '.tga') - - - def attachBuilder(self, builder): - self.builder = builder - self.builder.add_from_file("resources/PyFM.glade") - - def createWindow(self): - # Get window and connect signals - window = self.builder.get_object("Window") - window.connect("delete-event", gtk.main_quit) - self.setWindowData(window) - return window - - def setWindowData(self, window): - screen = window.get_screen() - visual = screen.get_rgba_visual() - if visual != None and screen.is_composited(): - window.set_visual(visual) - - # bind css file - cssProvider = gtk.CssProvider() - cssProvider.load_from_path('resources/stylesheet.css') - screen = gdk.Screen.get_default() - styleContext = gtk.StyleContext() - styleContext.add_provider_for_screen(screen, cssProvider, gtk.STYLE_PROVIDER_PRIORITY_USER) - - window.set_app_paintable(True) - monitors = self.getMonitorData(screen) - window.resize(monitors[0].width, monitors[0].height) - - def getMonitorData(self, screen): - monitors = [] - for m in range(screen.get_n_monitors()): - monitors.append(screen.get_monitor_geometry(m)) - - for monitor in monitors: - print(str(monitor.width) + "x" + str(monitor.height) + "+" + str(monitor.x) + "+" + str(monitor.y)) - - return monitors - - - def returnBuilder(self): return self.builder - def returnUserHome(self): return self.usrHome - def returnDesktopPath(self): return self.usrHome + "/Desktop" - def returnIconImagePos(self): return self.GTK_ORIENTATION - def getThumbnailGenerator(self): return self.THUMB_GENERATOR - def returnColumnSize(self): return self.ColumnSize - def returnContainerWH(self): return self.iconContainerWxH - def returnSystemIconImageWH(self): return self.systemIconImageWxH - def returnVIIconWH(self): return self.viIconWxH - def returnWebHome(self): return self.webHome - def isHideHiddenFiles(self): return self.hideHiddenFiles - def returnVidsExtensionList(self): return self.vidsExtensionList - def returnImagesExtensionList(self): return self.imagesExtensionList - - def setDefaultWebviewSettings(self, widget, settings=None): - # Usability - settings.set_property('enable-fullscreen', True) - settings.set_property('print-backgrounds', True) - settings.set_property('enable-frame-flattening', False) - settings.set_property('enable-plugins', True) - settings.set_property('enable-java', False) - settings.set_property('enable-resizable-text-areas', True) - settings.set_property('zoom-text-only', False) - settings.set_property('enable-smooth-scrolling', True) - settings.set_property('enable-back-forward-navigation-gestures', False) - settings.set_property('media-playback-requires-user-gesture', False) - settings.set_property('enable-tabs-to-links', True) - settings.set_property('enable-caret-browsing', False) - - # Security - settings.set_property('user-agent','Mozilla/5.0 (X11; Generic; Linux x86-64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Safari/605.1.15') - settings.set_property('enable-private-browsing', False) - settings.set_property('enable-xss-auditor', True) - settings.set_property('enable-hyperlink-auditing', False) - settings.set_property('enable-site-specific-quirks', True) - settings.set_property('enable-offline-web-application-cache', True) - settings.set_property('enable-page-cache', True) - settings.set_property('allow-modal-dialogs', False) - settings.set_property('enable-html5-local-storage', True) - settings.set_property('enable-html5-database', True) - settings.set_property('allow-file-access-from-file-urls', False) - settings.set_property('allow-universal-access-from-file-urls', False) - settings.set_property('enable-dns-prefetching', False) - - # Media stuff - # settings.set_property('hardware-acceleration-policy', 'on-demand') - settings.set_property('enable-webgl', False) - settings.set_property('enable-webaudio', True) - settings.set_property('enable-accelerated-2d-canvas', True) - settings.set_property('auto-load-images', True) - settings.set_property('enable-media-capabilities', True) - settings.set_property('enable-media-stream', True) - settings.set_property('enable-mediasource', True) - settings.set_property('enable-encrypted-media', True) - settings.set_property('media-playback-allows-inline', True) - - # JS - settings.set_property('enable-javascript', True) - settings.set_property('enable-javascript-markup', True) - settings.set_property('javascript-can-access-clipboard', False) - settings.set_property('javascript-can-open-windows-automatically', False) - - # Debugging - settings.set_property('enable-developer-extras', False) - settings.set_property('enable-write-console-messages-to-stdout', False) - settings.set_property('draw-compositing-indicators', False) - settings.set_property('enable-mock-capture-devices', False) - settings.set_property('enable-spatial-navigation', False) diff --git a/src/versions/solarfm-0.0.1/SolarFM/old/utils/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/old/utils/__init__.py deleted file mode 100644 index e291f0f..0000000 --- a/src/versions/solarfm-0.0.1/SolarFM/old/utils/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -from utils.Dragging import Dragging -from utils.Settings import Settings -from utils.Events import Events -from utils.Grid import Grid -from utils.Icon import Icon -from utils.FileHandler import FileHandler diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/setup.py b/src/versions/solarfm-0.0.1/SolarFM/setup.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/setup.py rename to src/versions/solarfm-0.0.1/SolarFM/setup.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm.sh b/src/versions/solarfm-0.0.1/SolarFM/solarfm.sh similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm.sh rename to src/versions/solarfm-0.0.1/SolarFM/solarfm.sh diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm.toml b/src/versions/solarfm-0.0.1/SolarFM/solarfm.toml similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm.toml rename to src/versions/solarfm-0.0.1/SolarFM/solarfm.toml diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/__builtins__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/__builtins__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/__builtins__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/__main__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/__main__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/__main__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/Window.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/Window.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/Window.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/Window.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/WindowController.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/WindowController.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/WindowController.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/WindowController.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/Path.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/Path.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/Path.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/Path.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/View.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/View.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/View.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/View.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/Icon.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/Icon.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/Icon.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/Icon.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/DesktopIconMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/DesktopIconMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/DesktopIconMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/DesktopIconMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/VideoIconMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/VideoIconMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/VideoIconMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/VideoIconMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/BaseDirectory.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/BaseDirectory.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/BaseDirectory.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/BaseDirectory.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Config.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Config.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Config.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Config.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/DesktopEntry.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/DesktopEntry.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/DesktopEntry.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/DesktopEntry.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Exceptions.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Exceptions.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Exceptions.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Exceptions.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/IconTheme.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/IconTheme.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/IconTheme.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/IconTheme.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/IniFile.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/IniFile.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/IniFile.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/IniFile.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Locale.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Locale.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Locale.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Locale.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Menu.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Menu.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Menu.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Menu.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/MenuEditor.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/MenuEditor.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/MenuEditor.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/MenuEditor.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Mime.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Mime.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/Mime.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/Mime.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/RecentFiles.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/RecentFiles.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/RecentFiles.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/RecentFiles.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/util.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/util.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/icons/mixins/xdg/util.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/icons/mixins/xdg/util.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/FileHandler.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/FileHandler.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/FileHandler.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/FileHandler.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/Launcher.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/Launcher.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/Launcher.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/Launcher.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/Settings.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/Settings.py similarity index 74% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/Settings.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/Settings.py index 088cde0..d1229c2 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/Settings.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/Settings.py @@ -13,22 +13,23 @@ from os import path class Settings: logger = None + USR_SOLARFM = "/usr/share/solarfm" USER_HOME = path.expanduser('~') - CONFIG_PATH = USER_HOME + "/.config/solarfm" - CONFIG_FILE = CONFIG_PATH + "/settings.json" + CONFIG_PATH = f"{USER_HOME}/.config/solarfm" + CONFIG_FILE = f"{CONFIG_PATH}/settings.json" HIDE_HIDDEN_FILES = True GTK_ORIENTATION = 1 # HORIZONTAL (0) VERTICAL (1) - DEFAULT_ICONS = CONFIG_PATH + "/icons" - DEFAULT_ICON = DEFAULT_ICONS + "/text.png" - FFMPG_THUMBNLR = CONFIG_PATH + "/ffmpegthumbnailer" # Thumbnail generator binary - REMUX_FOLDER = USER_HOME + "/.remuxs" # Remuxed files folder + DEFAULT_ICONS = f"{CONFIG_PATH}/icons" + DEFAULT_ICON = f"{DEFAULT_ICONS}/text.png" + FFMPG_THUMBNLR = f"{CONFIG_PATH}/ffmpegthumbnailer" # Thumbnail generator binary + REMUX_FOLDER = f"{USER_HOME}/.remuxs" # Remuxed files folder STEAM_BASE_URL = "https://steamcdn-a.akamaihd.net/steam/apps/" ICON_DIRS = ["/usr/share/pixmaps", "/usr/share/icons", f"{USER_HOME}/.icons" ,] - BASE_THUMBS_PTH = USER_HOME + "/.thumbnails" # Used for thumbnail generation - ABS_THUMBS_PTH = BASE_THUMBS_PTH + "/normal" # Used for thumbnail generation - STEAM_ICONS_PTH = BASE_THUMBS_PTH + "/steam_icons" + BASE_THUMBS_PTH = f"{USER_HOME}/.thumbnails" # Used for thumbnail generation + ABS_THUMBS_PTH = f"{BASE_THUMBS_PTH}/normal" # Used for thumbnail generation + STEAM_ICONS_PTH = f"{BASE_THUMBS_PTH}/steam_icons" CONTAINER_ICON_WH = [128, 128] VIDEO_ICON_WH = [128, 64] SYS_ICON_WH = [56, 56] @@ -82,14 +83,18 @@ class Settings: # Dir structure check - if path.isdir(REMUX_FOLDER) == False: + if not path.isdir(REMUX_FOLDER): os.mkdir(REMUX_FOLDER) - if path.isdir(BASE_THUMBS_PTH) == False: + if not path.isdir(BASE_THUMBS_PTH): os.mkdir(BASE_THUMBS_PTH) - if path.isdir(ABS_THUMBS_PTH) == False: + if not path.isdir(ABS_THUMBS_PTH): os.mkdir(ABS_THUMBS_PTH) - if path.isdir(STEAM_ICONS_PTH) == False: + if not path.isdir(STEAM_ICONS_PTH): os.mkdir(STEAM_ICONS_PTH) + + if not os.path.exists(DEFAULT_ICONS): + DEFAULT_ICONS = f"{USR_SOLARFM}/icons" + DEFAULT_ICON = f"{DEFAULT_ICONS}/text.png" diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/shellfm/windows/view/utils/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/shellfm/windows/view/utils/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/Controller.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/Controller.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller_Data.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/Controller_Data.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/Controller_Data.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/Controller_Data.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/DBusControllerMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/DBusControllerMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/DBusControllerMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/DBusControllerMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/KeyboardSignalsMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/KeyboardSignalsMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/KeyboardSignalsMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/KeyboardSignalsMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/ShowHideMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/ShowHideMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/ShowHideMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/ShowHideMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/PaneMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/PaneMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/PaneMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/PaneMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/TabMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/TabMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/TabMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/TabMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetFileActionMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/WidgetFileActionMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetFileActionMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/WidgetFileActionMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/WidgetMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WidgetMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/WidgetMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WindowMixin.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/WindowMixin.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/WindowMixin.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/WindowMixin.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/signal_classes/mixins/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/signal_classes/mixins/__init__.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/trash.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/trash.py new file mode 100755 index 0000000..be29701 --- /dev/null +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/trash.py @@ -0,0 +1,46 @@ +# Python imports +import os + +# Lib imports + +# Application imports + + + + +class Trash(object): + """Base Trash class.""" + + def size_dir(self, sdir): + """Get the size of a directory. Based on code found online.""" + size = os.path.getsize(sdir) + + for item in os.listdir(sdir): + item = os.path.join(sdir, item) + + if os.path.isfile(item): + size = size + os.path.getsize(item) + elif os.path.isdir(item): + size = size + size_dir(item) + + return size + + def regenerate(self): + """Regenerate the trash and recreate metadata.""" + pass # Some backends don’t need regeneration. + + def empty(self, verbose): + """Empty the trash.""" + raise NotImplementedError(_('Backend didn’t implement this functionality')) + + def list(self, human=True): + """List the trash contents.""" + raise NotImplementedError(_('Backend didn’t implement this functionality')) + + def trash(self, filepath, verbose): + """Move specified file to trash.""" + raise NotImplementedError(_('Backend didn’t implement this functionality')) + + def restore(self, filename, verbose): + """Restore a file from trash.""" + raise NotImplementedError(_('Backend didn’t \ implement this functionality')) diff --git a/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/xdgtrash.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/xdgtrash.py new file mode 100755 index 0000000..02ff013 --- /dev/null +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/trasher/xdgtrash.py @@ -0,0 +1,161 @@ +from .trash import Trash +import shutil +import os +import os.path +import datetime +import sys +import logging + +try: + import configparser +except ImportError: + import ConfigParser as configparser + + + + +class XDGTrash(Trash): + """XDG trash backend.""" + def __init__(self): + self.trashdir = None + self.filedir = None + self.infodir = None + + if os.getenv('XDG_DATA_HOME') is None: + self.trashdir = os.path.expanduser('~/.local/share/Trash') + else: + self.trashdir = os.getenv('XDG_DATA_HOME') + '/Trash' + + try: + if not os.path.exists(self.trashdir): + os.mkdir(self.trashdir) + except OSError: + self.trashdir = os.path.join('tmp' 'TRASH') + raise('Couldn’t access the proper directory, temporary trash is in in /tmp/TRASH') + + self.filedir = self.trashdir + '/files/' + self.infodir = self.trashdir + '/info/' + + def regenerate(self): + """Regenerate the trash and recreate metadata.""" + print('Regenerating the trash and recreating metadata...') + zerosize = False + + if not os.path.exists(self.trashdir): + os.mkdir(self.trashdir) + zerosize = True + + if ((not os.path.exists(self.filedir)) or + (not os.path.exists(self.infodir))): + os.mkdir(self.filedir) + os.mkdir(self.infodir) + zerosize = True + if not zerosize: + trashsize = (self.size_dir(self.filedir) + self.size_dir(self.infodir)) + else: + trashsize = 0 + + infofile = '[Cached]\nSize=' + str(trashsize) + '\n' + fh = open(os.path.join(self.trashdir, 'metadata'), 'w') + fh.write(infofile) + fh.close() + + def empty(self, verbose): + """Empty the trash.""" + print('emptying (verbose={})'.format(verbose)) + shutil.rmtree(self.filedir) + shutil.rmtree(self.infodir) + self.regenerate() + if verbose: + sys.stderr.write(_('emptied the trash\n')) + + def list(self, human=True): + """List the trash contents.""" + if human: + print('listing contents (on stdout; human=True)') + else: + print('listing contents (return; human=False)') + dirs = [] + files = [] + for f in os.listdir(self.filedir): + if os.path.isdir(self.filedir + f): + dirs.append(f) + else: + files.append(f) + + dirs.sort() + files.sort() + + allfiles = [] + for i in dirs: + allfiles.append(i + '/') + for i in files: + allfiles.append(i) + if human: + if allfiles != []: + print('\n'.join(allfiles)) + else: + return allfiles + + def trash(self, filepath, verbose): + """Move specified file to trash.""" + print('trashing file {} (verbose={})'.format(filepath, verbose)) + # Filename alteration, a big mess. + filename = os.path.basename(filepath) + fileext = os.path.splitext(filename) + + tomove = filename + collision = True + i = 1 + + while collision: + if os.path.lexists(self.filedir + tomove): + tomove = fileext[0] + ' ' + str(i) + fileext[1] + i = i + 1 + else: + collision = False + + infofile = """[Trash Info] +Path={} +DeletionDate={} +""".format(os.path.realpath(filepath), + datetime.datetime.now().strftime('%Y-%m-%dT%H:%m:%S')) + + os.rename(filepath, self.filedir + tomove) + + f = open(os.path.join(self.infodir, tomove + '.trashinfo'), 'w') + f.write(infofile) + f.close() + + self.regenerate() + + if verbose: + sys.stderr.write(_('trashed \'{}\'\n').format(filename)) + + def restore(self, filename, verbose, tocwd=False): + """Restore a file from trash.""" + print('restoring file {} (verbose={}, tocwd={})'.format(filename, verbose, tocwd)) + info = configparser.ConfigParser() + if os.path.exists(os.path.join(self.filedir, filename)): + info.read(os.path.join(self.infodir, filename + '.trashinfo')) + restname = os.path.basename(info.get('Trash Info', 'Path')) + + if tocwd: + restdir = os.path.abspath('.') + else: + restdir = os.path.dirname(info.get('Trash Info', 'Path')) + + restfile = os.path.join(restdir, restname) + if not os.path.exists(restdir): + raise TMError('restore', 'nodir', _('no such directory: {}' + ' -- cannot restore').format(restdir)) + os.rename(os.path.join(self.filedir, filename), restfile) + os.remove(os.path.join(self.infodir, filename + '.trashinfo')) + self.regenerate() + print('restored {} to {}'.format(filename, restfile)) + if verbose: + sys.stderr.write(_('restored {} to {}\n').format(filename, restfile)) + + else: + print('couldn\'t find {} in trash'.format(filename)) + raise TMError('restore', 'nofile', _('no such file in trash')) diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/Logger.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/Logger.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/Logger.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/Logger.py diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/Settings.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/Settings.py similarity index 71% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/Settings.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/Settings.py index 53f3d14..3dc368f 100644 --- a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/Settings.py +++ b/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/Settings.py @@ -17,21 +17,30 @@ from . import Logger class Settings: def __init__(self): - self.SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) - self.USER_HOME = path.expanduser('~') - self.CONFIG_PATH = self.USER_HOME + "/.config/solarfm" - - self.cssFile = self.CONFIG_PATH + '/stylesheet.css' - self.windows_glade = self.CONFIG_PATH + "/Main_Window.glade" - self.logger = Logger().get_logger() self.builder = gtk.Builder() - self.builder.add_from_file(self.windows_glade) - self.DEFAULT_ICONS = self.CONFIG_PATH + "/icons" - self.window_icon = self.DEFAULT_ICONS + "/solarfm.png" + self.SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) + self.USER_HOME = path.expanduser('~') + self.CONFIG_PATH = f"{self.USER_HOME}/.config/solarfm" + self.USR_SOLARFM = "/usr/share/solarfm" + + self.cssFile = f"{self.CONFIG_PATH}/stylesheet.css" + self.windows_glade = f"{self.CONFIG_PATH}/Main_Window.glade" + self.DEFAULT_ICONS = f"{self.CONFIG_PATH}/icons" + self.window_icon = f"{self.DEFAULT_ICONS}/solarfm.png" self.main_window = None + if not os.path.exists(self.windows_glade): + self.windows_glade = f"{self.USR_SOLARFM}/Main_Window.glade" + if not os.path.exists(self.cssFile): + self.cssFile = f"{self.USR_SOLARFM}/stylesheet.css" + if not os.path.exists(self.window_icon): + self.window_icon = f"{self.USR_SOLARFM}/icons/solarfm.png" + if not os.path.exists(self.DEFAULT_ICONS): + self.DEFAULT_ICONS = f"{self.USR_SOLARFM}/icons" + + self.builder.add_from_file(self.windows_glade) diff --git a/src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/__init__.py b/src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/__init__.py similarity index 100% rename from src/versions/solarfm-0.0.1/SolarFM/new/solarfm/utils/__init__.py rename to src/versions/solarfm-0.0.1/SolarFM/solarfm/utils/__init__.py diff --git a/user_config/solarfm/ffmpegthumbnailer b/user_config/solarfm/ffmpegthumbnailer deleted file mode 100755 index 0b6e6e2a3f7a9a9f54d4b2bdc0c939cfc80cd36a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23152 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 diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/Main_Window.glade b/user_config/usr/share/solarfm/Main_Window.glade similarity index 69% rename from src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/Main_Window.glade rename to user_config/usr/share/solarfm/Main_Window.glade index a146017..9878a5a 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/Main_Window.glade +++ b/user_config/usr/share/solarfm/Main_Window.glade @@ -398,7 +398,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False end - + gtk-cancel True True @@ -448,10 +448,174 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe - button1 + button31 appchooser_select_btn + + $(which 7za || echo 7zr) a %o %N + + + False + True + center + dialog + center + True + True + + + False + vertical + 2 + + + False + end + + + gtk-cancel + True + True + True + True + + + True + True + 0 + + + + + gtk-ok + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + vertical + + + True + False + True + + + True + False + Compress Commands: + 0.20000000298023224 + + + + + + False + True + 0 + + + + + + + + True + False + Archive Format: + 1 + + + + + + False + True + 2 + + + + + True + False + 0 + 0 + + 7Zip (*.7z) + Zip (*.zip *.ZIP) + RAR (*.rar *.RAR) + Tar (*.tar) + Tar bzip2 (*.tar.bz2) + Tar Gzip (*.tar.gz *.tgz) + Tar xz (*.tar.xz *.txz) + Gzip (*.gz) + XZ (*.xz) + + + + + False + True + 3 + + + + + False + True + 0 + + + + + 72 + True + True + arc_command_buffer + + + True + True + 1 + + + + + False + True + 2 + + + + + + button21 + button22 + + + + True + False + gtk-save-as + True False @@ -459,8 +623,15 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False + popup + False + True center + True splashscreen + True + True + False center @@ -496,6 +667,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe 26 True True + True gtk-edit New File/Dir Name... @@ -564,7 +736,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False - True + False 1 @@ -603,12 +775,309 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe + + True + False + gtk-execute + + + 120 + False + popup + False + True + center + True + splashscreen + True + True + True + False + center + + + False + 5 + 5 + 5 + 5 + vertical + 2 + + + False + end + + + Overwrite + True + True + True + + + True + True + 0 + + + + + Overwrite (All) + True + True + True + + + True + True + 1 + + + + + Skip + True + True + True + + + True + True + 2 + + + + + Skip (All) + True + True + True + + + True + True + 3 + + + + + False + False + 0 + + + + + True + False + vertical + + + True + False + Filename already exists. Please rename or select an action. + 0.10000000149011612 + + + + + + False + True + 0 + + + + + True + False + + + True + False + Filename: + + + False + True + 0 + + + + + True + False + + + True + True + 1 + + + + + False + True + 1 + + + + + + + + True + True + + + + False + True + 3 + + + + + True + False + 20 + top + start + + + + + + Rename + True + False + True + True + + + + True + True + 1 + True + + + + + Auto Rename + True + True + True + + + + True + True + 2 + True + + + + + Auto Rename All + True + True + True + + + + True + True + 3 + True + + + + + False + True + 4 + + + + + True + True + 1 + + + + + + button5 + button6 + button7 + button8 + + + True False gtk-justify-center + + 320 + False + True + bottom + + + True + False + vertical + + + gtk-save-as + True + True + True + True + + + + False + True + 0 + + + + + 600 + True + True + True + in + False + + + message_view + True + True + True + False + False + message_buffer + + + + + False + True + 1 + + + + + True False @@ -632,12 +1101,16 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False + popup + False True center + True splashscreen + True True + False center - False @@ -648,14 +1121,14 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False end - + Skip + skip_renames True True True skip_img True - True @@ -664,13 +1137,13 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe - + gtk-cancel + cancel_renames True True True True - True @@ -730,8 +1203,10 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe 26 True True + True gtk-edit To: + False @@ -765,6 +1240,10 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe + + button1 + button2 + True @@ -797,8 +1276,8 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe center 1670 830 - solarfm.png center + @@ -808,7 +1287,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe vertical top - + True False @@ -1137,7 +1616,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe True True Path... - + True @@ -1190,7 +1669,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe notebook1 True True - True + True 5 5 5 @@ -1228,6 +1707,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe notebook2 True True + True 5 5 5 @@ -1279,6 +1759,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe notebook3 True True + True 5 5 5 @@ -1316,6 +1797,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe notebook4 True True + True 5 5 5 @@ -1415,39 +1897,135 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe - - 320 + + 240 + 420 False - True - controll_box + path_entry bottom + False - 600 True True - True in False - - message_view + True - True - True - False - False - message_buffer + False + + + True + False + vertical + start + + + + + + + False + 5 + 5 + 5 + 5 + window_1 + bottom + none + + + + 52 + True + True + + + + + + + False + 5 + 5 + 5 + 5 + window_2 + bottom + none + + + + 96 + True + True + + + + + + + False + 5 + 5 + 5 + 5 + window_3 + none + + + + 96 + True + True + + + + + + + False + 5 + 5 + 5 + 5 + window_4 + none + + + + 96 + True + True + + + + + True False user-trash + + True + False + user-trash + False False @@ -1506,7 +2084,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False True - 4 + 11 @@ -1529,12 +2107,13 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe Open With + open_with True True True open_with_img True - + False @@ -1542,6 +2121,38 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe 1 + + + gtk-execute + execute + True + True + True + True + + + + False + True + 2 + + + + + Execute in Terminal + execute_in_terminal + True + True + True + exec_in_term_img + + + + False + True + 3 + + Rename @@ -1550,14 +2161,106 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe True True Rename... + 20 rename_img2 True - + False True - 2 + 4 + + + + + gtk-cut + cut + True + True + True + Cut... + True + True + + + + False + True + 5 + + + + + gtk-copy + copy + True + True + True + Copy... + True + True + + + + False + True + 6 + + + + + gtk-paste + paste + True + True + True + Paste... + True + True + + + + False + True + 7 + + + + + Go To Trash + go_to_trash + True + True + True + Go To Trash... + trash_img2 + True + + + + False + True + end + 8 + + + + + Archive + archive + True + True + True + Archive... + archive_img + True + + + + False + True + 9 @@ -1576,61 +2279,7 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe False True end - 3 - - - - - gtk-cut - cut - True - True - True - Cut... - True - True - - - - False - True - 4 - - - - - gtk-copy - copy - True - True - True - Copy... - True - True - - - - False - True - 5 - - - - - gtk-paste - paste - True - True - True - Paste... - True - True - - - - False - True - 6 + 11 @@ -1650,4 +2299,79 @@ SolarFM is developed on Atom, git, and using Python 3+ with Gtk GObject introspe + + False + False + True + center + True + dialog + True + True + True + False + False + center + warning + Warning! + + + False + 5 + 5 + 5 + 5 + vertical + 2 + + + False + True + end + + + gtk-no + True + True + True + True + + + True + True + 0 + + + + + gtk-yes + True + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + + button4 + button3 + + + diff --git a/user_config/solarfm/icons/archive.png b/user_config/usr/share/solarfm/icons/archive.png similarity index 100% rename from user_config/solarfm/icons/archive.png rename to user_config/usr/share/solarfm/icons/archive.png diff --git a/user_config/solarfm/icons/audio.png b/user_config/usr/share/solarfm/icons/audio.png similarity index 100% rename from user_config/solarfm/icons/audio.png rename to user_config/usr/share/solarfm/icons/audio.png diff --git a/user_config/solarfm/icons/bin.png b/user_config/usr/share/solarfm/icons/bin.png similarity index 100% rename from user_config/solarfm/icons/bin.png rename to user_config/usr/share/solarfm/icons/bin.png diff --git a/user_config/solarfm/icons/dir.png b/user_config/usr/share/solarfm/icons/dir.png similarity index 100% rename from user_config/solarfm/icons/dir.png rename to user_config/usr/share/solarfm/icons/dir.png diff --git a/user_config/solarfm/icons/doc.png b/user_config/usr/share/solarfm/icons/doc.png similarity index 100% rename from user_config/solarfm/icons/doc.png rename to user_config/usr/share/solarfm/icons/doc.png diff --git a/user_config/solarfm/icons/pdf.png b/user_config/usr/share/solarfm/icons/pdf.png similarity index 100% rename from user_config/solarfm/icons/pdf.png rename to user_config/usr/share/solarfm/icons/pdf.png diff --git a/user_config/solarfm/icons/presentation.png b/user_config/usr/share/solarfm/icons/presentation.png similarity index 100% rename from user_config/solarfm/icons/presentation.png rename to user_config/usr/share/solarfm/icons/presentation.png diff --git a/user_config/solarfm/icons/solarfm-64x64.png b/user_config/usr/share/solarfm/icons/solarfm-64x64.png similarity index 100% rename from user_config/solarfm/icons/solarfm-64x64.png rename to user_config/usr/share/solarfm/icons/solarfm-64x64.png diff --git a/user_config/solarfm/icons/solarfm.png b/user_config/usr/share/solarfm/icons/solarfm.png similarity index 100% rename from user_config/solarfm/icons/solarfm.png rename to user_config/usr/share/solarfm/icons/solarfm.png diff --git a/user_config/solarfm/icons/spreadsheet.png b/user_config/usr/share/solarfm/icons/spreadsheet.png similarity index 100% rename from user_config/solarfm/icons/spreadsheet.png rename to user_config/usr/share/solarfm/icons/spreadsheet.png diff --git a/user_config/solarfm/icons/text.png b/user_config/usr/share/solarfm/icons/text.png similarity index 100% rename from user_config/solarfm/icons/text.png rename to user_config/usr/share/solarfm/icons/text.png diff --git a/user_config/usr/share/solarfm/icons/trash.png b/user_config/usr/share/solarfm/icons/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..c6514b98b5644a1398e5b94566627683bdf8313c GIT binary patch literal 989 zcmV<310wv1P)15yzTLCe34-$-L*zeV%iVi<#7%{pXzDkMHky2mk=z;1Ymqjw*`_ z;l=cX!@yxS)3eMo)!7q(s1S;8XDeoIfk&q@7uoI?s zN^{=g#zud^U7~af3UN1l@tmQLOr|QHWPuroi5&@B4xE5LwSSN~G+$j==zSl}UMNQg zyH_50>t(Oi+-x&5w89uZw-ptSj&|nuPG2fiPCt#GwwmD#Jm6oxx$^wCcxirh-cQ9a ziluU6K|Pn5D~^E<4p7JT?N5^#IMVgKv(20OG$aWqB{-E1 z9oKKm#x_8Yf!EY3G??PhH00od3`|8Cr#dh|?Xc^Z-nF9>;EQ2fnv!5>XX9e5(~w%Q zWxxzw@&_hiR$9Lcoc|vHx!)lO6-mr}?nq6T47i&p1j1BE6+d+ySi293cx+=BS^bPd z2pc)RW6($#nyaDBQ#bUD)T*xo(~>w=@g&O4P0907%sO^H(WGl-(aW~-b3x1wa&{7m zuWn2M!9yrPfv)`{h@?zgx|KUDMpnH#&O}b58kogEan(fp3IGm{0yF@Eai?E1TUpQI zP%w=Iic?7KIfYR^3~mA204Ox%tPdgo9_IQMM*@lfDHI}T5|U27TT;IPe*mD6XwTM& zhIg`@LxX@qgMnb0tVSaItJ7O4fL$Dd0pPc<&*3~0q)-r0(BKH6aSoNuc<)UB0GrMp z6mp=g$)0LI{yHl_Lcst-1y5iV&y7F1{N=AVPXJ(u4pd6_>+}0v$EYsS1=O&N8hVrM zpZ|RC94JwwF%&23;_5K`+J-nN-|HR00000 LNkvXXu0mjfZ-lz6 literal 0 HcmV?d00001 diff --git a/user_config/solarfm/icons/video.png b/user_config/usr/share/solarfm/icons/video.png similarity index 100% rename from user_config/solarfm/icons/video.png rename to user_config/usr/share/solarfm/icons/video.png diff --git a/user_config/solarfm/icons/web.png b/user_config/usr/share/solarfm/icons/web.png similarity index 100% rename from user_config/solarfm/icons/web.png rename to user_config/usr/share/solarfm/icons/web.png diff --git a/user_config/usr/share/solarfm/settings.json b/user_config/usr/share/solarfm/settings.json new file mode 100644 index 0000000..c9f246f --- /dev/null +++ b/user_config/usr/share/solarfm/settings.json @@ -0,0 +1,20 @@ +{ + "settings": { + "base_of_home": "", + "hide_hidden_files": "true", + "thumbnailer_path": "ffmpegthumbnailer", + "go_past_home": "true", + "lock_folder": "false", + "locked_folders": "venv::::flasks", + "mplayer_options": "-quiet -really-quiet -xy 1600 -geometry 50%:50%", + "music_app": "/opt/deadbeef/bin/deadbeef", + "media_app": "mpv", + "image_app": "mirage", + "office_app": "libreoffice", + "pdf_app": "evince", + "text_app": "leafpad", + "file_manager_app": "solarfm", + "terminal_app": "terminator", + "remux_folder_max_disk_usage": "8589934592" + } +} diff --git a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/stylesheet.css b/user_config/usr/share/solarfm/stylesheet.css similarity index 66% rename from src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/stylesheet.css rename to user_config/usr/share/solarfm/stylesheet.css index 44b70dc..c0383f6 100644 --- a/src/debs/solarfm-0-0-1-x64/opt/SolarFM/resources/stylesheet.css +++ b/user_config/usr/share/solarfm/stylesheet.css @@ -14,32 +14,51 @@ treeview.view, notebook > header > tabs > tab:checked { /* Neon Blue 00e8ff */ - background-color: rgba(0, 232, 255, 0.25); + background-color: rgba(0, 232, 255, 0.2); /* Dark Bergundy */ /* background-color: rgba(116, 0, 0, 0.25); */ - color: rgba(255, 255, 255, 0.5); + color: rgba(255, 255, 255, 0.8); } #message_view { font: 16px "Monospace"; } +.view:selected, +.view:selected:hover { + box-shadow: inset 0 0 0 9999px rgba(21, 158, 167, 0.34); + color: rgba(255, 255, 255, 0.5); +} + +.alert-border { + border: 2px solid rgba(116, 0, 0, 0.64); +} + +.search-border { + border: 2px solid rgba(136, 204, 39, 1); +} + .notebook-selected-focus { /* Neon Blue 00e8ff border */ - border: 2px solid rgba(0, 232, 255, 0.25); + border: 2px solid rgba(0, 232, 255, 0.34); /* Dark Bergundy */ /* border: 2px solid rgba(116, 0, 0, 0.64); */ } - -.view:selected, -.view:selected:hover { - box-shadow: inset 0 0 0 9999px rgba(21, 158, 167, 0.57); - color: rgba(255, 255, 255, 0.5);; +.notebook-unselected-focus { + /* Neon Blue 00e8ff border */ + /* border: 2px solid rgba(0, 232, 255, 0.25); */ + /* Dark Bergundy */ + /* border: 2px solid rgba(116, 0, 0, 0.64); */ + /* Snow White */ + border: 2px solid rgba(255, 255, 255, 0.24); } + + + /* * { background: rgba(0, 0, 0, 0.14); color: rgba(255, 255, 255, 1);