SolarFM/src/versions/solarfm-0.0.1/solarfm/core/widgets/bottom_status_info_widget.py

106 lines
4.2 KiB
Python

# Python imports
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gio
# Application imports
class BottomStatusInfoException(Exception):
...
class BottomStatusInfoWidget:
"""docstring for BottomStatusInfoWidget."""
def __init__(self):
super(BottomStatusInfoWidget, self).__init__()
_GLADE_FILE = f"{settings.get_ui_widgets_path()}/bottom_status_info_ui.glade"
self._builder = Gtk.Builder()
self._builder.add_from_file(_GLADE_FILE)
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self._load_widgets()
def _setup_styling(self):
...
def _setup_signals(self):
...
def _subscribe_to_events(self):
event_system.subscribe("set_bottom_labels", self.set_bottom_labels)
def _load_widgets(self):
builder = settings.get_builder()
self.bottom_status_info = self._builder.get_object("bottom_status_info")
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")
builder.expose_object(f"bottom_status_info", self.bottom_status_info)
builder.expose_object(f"bottom_size_label", self.bottom_size_label)
builder.expose_object(f"bottom_file_count_label", self.bottom_file_count_label)
builder.expose_object(f"bottom_path_label", self.bottom_path_label)
builder.get_object("core_widget").add(self.bottom_status_info)
def set_bottom_labels(self, tab):
state = event_system.emit_and_await("get_current_state")
selected_files = state.icon_grid.get_selected_items()
current_directory = tab.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 = sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::free")) )
formatted_mount_size = sizeof_fmt( int(mount_file.get_attribute_as_string("filesystem::size")) )
# NOTE: Hides empty trash and other desired buttons based on context.
if settings.get_trash_files_path() == current_directory:
event_system.emit("show_trash_buttons")
else:
event_system.emit("hide_trash_buttons")
# If something selected
self.bottom_size_label.set_label(f"{formatted_mount_free} free / {formatted_mount_size}")
self.bottom_path_label.set_label(tab.get_current_directory())
if selected_files:
uris = event_system.emit_and_await("format_to_uris", (state.store, state.wid, state.tid, selected_files, True))
combined_size = 0
for uri in uris:
try:
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
except BottomStatusInfoException as e:
logger.debug(repr(e))
formatted_size = sizeof_fmt(combined_size)
if tab.is_hiding_hidden():
self.bottom_path_label.set_label(f" {len(uris)} / {tab.get_files_count()} ({formatted_size})")
else:
self.bottom_path_label.set_label(f" {len(uris)} / {tab.get_not_hidden_count()} ({formatted_size})")
return
# If nothing selected
if tab.is_hiding_hidden():
if tab.get_hidden_count() > 0:
self.bottom_file_count_label.set_label(f"{tab.get_not_hidden_count()} visible ({tab.get_hidden_count()} hidden)")
else:
self.bottom_file_count_label.set_label(f"{tab.get_files_count()} items")
else:
self.bottom_file_count_label.set_label(f"{tab.get_files_count()} items")