Compare commits

...

2 Commits

13 changed files with 54 additions and 57 deletions

View File

@ -8,7 +8,7 @@ Additionally, if not building a .deb then just move the contents of user_config
Copy the share/solarfm folder to your user .config/ directory too. Copy the share/solarfm folder to your user .config/ directory too.
`pyrightconfig.json` `pyrightconfig.json`
<p>The pyrightconfig file needs to stay on same level as the .git folders in order to have settings detected when using pyright with lsp functionality.</p> <p>The pyrightconfig file needs to stay on same level as the .git folders in order to have settings detected when using pyright with lsp functionality. "pyrightconfig.json" can prompt IDEs such as Zed on settings to use and where imports are located- look at venvPath and venv. "venvPath" is parent path of "venv" where "venv" is just the name of the folder under the parent path that is the python created venv.
<h6>Install Setup</h6> <h6>Install Setup</h6>
``` ```
@ -32,4 +32,4 @@ A selected file in the active quad-pane will move to trash since it is the defau
![1 SolarFM single pane. ](images/pic1.png) ![1 SolarFM single pane. ](images/pic1.png)
![2 SolarFM double pane. ](images/pic2.png) ![2 SolarFM double pane. ](images/pic2.png)
![3 SolarFM triple pane. ](images/pic3.png) ![3 SolarFM triple pane. ](images/pic3.png)
![4 SolarFM quad pane. ](images/pic4.png) ![4 SolarFM quad pane. ](images/pic4.png)

View File

@ -48,7 +48,7 @@ class GrepPreviewWidget(Gtk.Box):
return bytes(f"\n<span foreground='{color}'>{target}</span>", "utf-8").decode("utf-8") return bytes(f"\n<span foreground='{color}'>{target}</span>", "utf-8").decode("utf-8")
def make_utf8_line_highlight(self, buffer, itr, i, color, target, query): def make_utf8_line_highlight(self, buffer, itr, i, color, target, query):
parts = re.split(r"(" + query + ")(?i)", target.replace("\n", "")) parts = re.split(r"(?i)(" + query + ")", target.replace("\n", ""))
for part in parts: for part in parts:
itr = buffer.get_end_iter() itr = buffer.get_end_iter()
@ -57,4 +57,4 @@ class GrepPreviewWidget(Gtk.Box):
else: else:
new_s = f"<span foreground='#000000' background='{color}'>{part}</span>" new_s = f"<span foreground='#000000' background='{color}'>{part}</span>"
_part = bytes(new_s, "utf-8").decode("utf-8") _part = bytes(new_s, "utf-8").decode("utf-8")
buffer.insert_markup(itr, _part, len(_part)) buffer.insert_markup(itr, _part, len(_part))

View File

@ -7,5 +7,7 @@
{ {
"root": "./src/versions/solarfm-0.0.1/solarfm" "root": "./src/versions/solarfm-0.0.1/solarfm"
} }
] ],
"venvPath": "/home/abaddon/Portable_Apps/py-venvs/pylsp-venv/",
"venv": "venv"
} }

View File

@ -110,26 +110,30 @@ class HandlerMixin:
tab.move_file(fPath, tPath) tab.move_file(fPath, tPath)
else: else:
io_widget = IOWidget(action, file) io_widget = IOWidget(action, file)
io_list = self._builder.get_object("io_list")
io_list.add(io_widget)
io_list.show_all()
if action == "copy": if action == "copy":
file.copy_async(destination=target, file.copy_async(destination=target,
flags=Gio.FileCopyFlags.BACKUP, flags=Gio.FileCopyFlags.BACKUP,
io_priority=98, io_priority=45,
cancellable=io_widget.cancle_eve, cancellable=io_widget.cancle_eve,
progress_callback=io_widget.update_progress, progress_callback=io_widget.update_progress,
callback=io_widget.finish_callback) callback=io_widget.finish_callback)
self._builder.get_object("io_list").add(io_widget)
if action == "move" or action == "rename": if action == "move" or action == "rename":
file.move_async(destination=target, file.move_async(destination=target,
flags=Gio.FileCopyFlags.BACKUP, flags=Gio.FileCopyFlags.BACKUP,
io_priority=98, io_priority=45,
cancellable=io_widget.cancle_eve, cancellable=io_widget.cancle_eve,
progress_callback=None,
# NOTE: progress_callback here causes seg fault when set # NOTE: progress_callback here causes seg fault when set
progress_callback=None,
callback=io_widget.finish_callback) callback=io_widget.finish_callback)
self._builder.get_object("io_list").add(io_widget) io_widget = None
io_list = None
except GObject.GError as e: except GObject.GError as e:
raise OSError(e) raise OSError(e)
@ -162,4 +166,4 @@ class HandlerMixin:
target = Gio.File.new_for_path(f"{base_path}/{file_name}-copy{i}{extension}") target = Gio.File.new_for_path(f"{base_path}/{file_name}-copy{i}{extension}")
i += 1 i += 1
return target return target

View File

@ -56,8 +56,9 @@ class GridMixin:
def update_store(self, i, store, icon): def update_store(self, i, store, icon):
itr = store.get_iter(i) itr = store.get_iter(i)
GLib.idle_add(self.insert_store, store, itr, icon) GLib.idle_add(self.insert_store, store, itr, icon.copy())
itr = None itr = None
del icon
@daemon_threaded @daemon_threaded
def make_and_load_icon(self, i, store, tab, dir, file): def make_and_load_icon(self, i, store, tab, dir, file):

View File

@ -264,15 +264,16 @@ class TabMixin(GridMixin):
path_menu_buttons.add(button) path_menu_buttons.add(button)
show_path_menu = True show_path_menu = True
path_menu_buttons = None query = None
query = None files = None
files = None
if not show_path_menu: if not show_path_menu:
path_menu_buttons = None
event_system.emit("hide_path_menu") event_system.emit("hide_path_menu")
else: else:
event_system.emit("show_path_menu") event_system.emit("show_path_menu")
buttons = path_menu_buttons.get_children() buttons = path_menu_buttons.get_children()
path_menu_buttons = None
if len(buttons) == 1: if len(buttons) == 1:
self.slowed_focus(buttons[0]) self.slowed_focus(buttons[0])
@ -311,4 +312,4 @@ class TabMixin(GridMixin):
self.builder.get_object("refresh_tab").released() self.builder.get_object("refresh_tab").released()
wid, tid = None, None wid, tid = None, None
tab = None tab = None

View File

@ -130,6 +130,10 @@ class WindowMixin(TabMixin):
self.update_tab(tab_label, state.tab, state.icon_grid.get_store(), state.wid, state.tid) self.update_tab(tab_label, state.tab, state.icon_grid.get_store(), state.wid, state.tid)
else: else:
event_system.emit("open_files") event_system.emit("open_files")
state = None
notebook = None
tab_label = None
except WindowException as e: except WindowException as e:
traceback.print_exc() traceback.print_exc()
self.display_message(settings.theming.error_color, f"{repr(e)}") self.display_message(settings.theming.error_color, f"{repr(e)}")
@ -197,4 +201,4 @@ class WindowMixin(TabMixin):
Gtk.drag_finish(drag_context, False, False, time) Gtk.drag_finish(drag_context, False, False, time)
def create_new_tab_notebook(self, widget=None, wid=None, path=None): def create_new_tab_notebook(self, widget=None, wid=None, path=None):
self.create_tab(wid, None, path) self.create_tab(wid, None, path)

View File

@ -65,19 +65,20 @@ class IOWidget(Gtk.Box):
logger.info(f"Canceling: [{self._action}] of {self._basename} ...") logger.info(f"Canceling: [{self._action}] of {self._basename} ...")
eve.cancel() eve.cancel()
def update_progress(self, current, total, eve=None): def update_progress(self, current, total, eve = None):
self.progress.set_fraction(current/total) self.progress.set_fraction(current/total)
def finish_callback(self, file, task=None, eve=None): def finish_callback(self, file, task = None, eve = None):
if task.had_error():
logger.info(f"{self._action} of {self._basename} cancelled/failed...")
return
if self._action == "move" or self._action == "rename": if self._action == "move" or self._action == "rename":
status = self._file.move_finish(task) status = self._file.move_finish(task)
if self._action == "copy": if self._action == "copy":
status = self._file.copy_finish(task) status = self._file.copy_finish(task)
if status: self.delete_self()
self.delete_self()
else:
logger.info(f"{self._action} of {self._basename} failed...")
def delete_self(self, widget=None, eve=None): def delete_self(self, widget = None, eve = None):
self.get_parent().remove(self) self.get_parent().remove(self)

View File

@ -29,16 +29,16 @@ class PathMenuPopupWidget(Gtk.Popover):
self.set_relative_to(path_entry) self.set_relative_to(path_entry)
self.set_modal(False) self.set_modal(False)
self.set_position(Gtk.PositionType.BOTTOM) self.set_position(Gtk.PositionType.BOTTOM)
self.set_size_request(240, 420) self.set_size_request(480, 420)
def _setup_signals(self): def _setup_signals(self):
event_system.subscribe("show_path_menu", self.show_path_menu) event_system.subscribe("show_path_menu", self.show_path_menu)
event_system.subscribe("hide_path_menu", self.hide_path_menu) event_system.subscribe("hide_path_menu", self.hide_path_menu)
def _load_widgets(self): def _load_widgets(self):
path_menu_buttons = Gtk.ButtonBox() scroll_window = Gtk.ScrolledWindow()
scroll_window = Gtk.ScrolledWindow() view_port = Gtk.Viewport()
view_port = Gtk.Viewport() path_menu_buttons = Gtk.Box()
scroll_window.set_vexpand(True) scroll_window.set_vexpand(True)
scroll_window.set_hexpand(True) scroll_window.set_hexpand(True)
@ -47,12 +47,13 @@ class PathMenuPopupWidget(Gtk.Popover):
self.builder.expose_object(f"path_menu_buttons", path_menu_buttons) self.builder.expose_object(f"path_menu_buttons", path_menu_buttons)
view_port.add(path_menu_buttons) view_port.add(path_menu_buttons)
scroll_window.add(view_port) scroll_window.add(view_port)
scroll_window.show_all()
self.add(scroll_window) self.add(scroll_window)
scroll_window.show_all()
def show_path_menu(self, widget=None, eve=None):
def show_path_menu(self, widget = None, eve = None):
self.popup() self.popup()
def hide_path_menu(self, widget=None, eve=None): def hide_path_menu(self, widget = None, eve = None):
self.popdown() self.popdown()

View File

@ -1,5 +1,4 @@
# Python imports # Python imports
import time
import signal import signal
# Lib imports # Lib imports
@ -123,4 +122,4 @@ class Window(Gtk.ApplicationWindow):
Gtk.main_quit() Gtk.main_quit()
def main(self): def main(self):
Gtk.main() Gtk.main()

View File

@ -113,4 +113,4 @@ class Launcher:
if not os.path.islink(fp): # Skip if it is symbolic link if not os.path.islink(fp): # Skip if it is symbolic link
total_size += os.path.getsize(fp) total_size += os.path.getsize(fp)
return total_size return total_size

View File

@ -20,9 +20,10 @@ function main() {
files[$size]="${target}" files[$size]="${target}"
done done
G_SLICE=always-malloc export G_SLICE=always-malloc
G_DEBUG=gc-friendly export G_DEBUG=gc-friendly
GOBJECT_DEBUG=instance-count export GOBJECT_DEBUG=instance-count
python /opt/solarfm.zip "${files[@]}" export GSK_RENDERER=cairo
python /opt/solarfm.zip "$@"
} }
main "$@"; main "$@";

View File

@ -1,17 +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() {
call_path=`pwd`
cd "${call_path}"
echo "Working Dir: " $(pwd)
python /opt/solarfm.zip "$@"
}
main "$@";