develop #11
| @@ -17,7 +17,6 @@ from .widgets.dialogs.about_widget import AboutWidget | ||||
| from .widgets.dialogs.appchooser_widget import AppchooserWidget | ||||
| from .widgets.dialogs.file_exists_widget import FileExistsWidget | ||||
| from .widgets.dialogs.new_file_widget import NewFileWidget | ||||
| from .widgets.dialogs.message_widget import MessageWidget | ||||
| from .widgets.dialogs.rename_widget import RenameWidget | ||||
| from .widgets.dialogs.save_load_widget import SaveLoadWidget | ||||
|  | ||||
| @@ -92,6 +91,7 @@ class Controller(UIMixin, SignalsMixins, Controller_Data): | ||||
|     #       after we're done cleaning and refactoring to use fewer mixins. | ||||
|     def _load_widgets(self): | ||||
|         BottomStatusInfoWidget() | ||||
|  | ||||
|         IOPopupWidget() | ||||
|         MessagePopupWidget() | ||||
|         PathMenuPopupWidget() | ||||
| @@ -104,7 +104,6 @@ class Controller(UIMixin, SignalsMixins, Controller_Data): | ||||
|         RenameWidget() | ||||
|         FileExistsWidget() | ||||
|         SaveLoadWidget() | ||||
|         self.message_dialog = MessageWidget() | ||||
|  | ||||
|  | ||||
|     def reload_plugins(self, widget=None, eve=None): | ||||
| @@ -187,4 +186,4 @@ class Controller(UIMixin, SignalsMixins, Controller_Data): | ||||
|         tab.execute([f"{tab.terminal_app}"], start_dir=tab.get_current_directory()) | ||||
|  | ||||
|     def go_to_path(self, path: str): | ||||
|         self.path_entry.set_text(path) | ||||
|         self.builder.get_object("path_entry").set_text(path) | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| # Python imports | ||||
| import sys | ||||
| import os | ||||
| import subprocess | ||||
| from dataclasses import dataclass | ||||
| @@ -10,12 +9,13 @@ gi.require_version('Gtk', '3.0') | ||||
| from gi.repository import Gtk | ||||
|  | ||||
| # Application imports | ||||
| from .widgets.dialogs.message_widget import MessageWidget | ||||
|  | ||||
| from shellfm.windows.controller import WindowController | ||||
| from plugins.plugins_controller import PluginsController | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @dataclass(slots=True) | ||||
| class State: | ||||
|     fm_controller: any = None | ||||
| @@ -52,11 +52,6 @@ class Controller_Data: | ||||
|         self.window3            = self.builder.get_object("window_3") | ||||
|         self.window4            = self.builder.get_object("window_4") | ||||
|  | ||||
|         self.path_entry              = self.builder.get_object("path_entry") | ||||
|         # 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.notebooks          = [self.window1, self.window2, self.window3, self.window4] | ||||
|         self.selected_files     = [] | ||||
|         self.to_copy_files      = [] | ||||
| @@ -75,19 +70,6 @@ class Controller_Data: | ||||
|         self.shift_down         = False | ||||
|         self.alt_down           = False | ||||
|  | ||||
|         # sys.excepthook = self.custom_except_hook | ||||
|         if settings.is_debug(): | ||||
|             self.window.set_interactive_debugging(True) | ||||
|  | ||||
|  | ||||
|     def custom_except_hook(self, exc_type, exc_value, exc_traceback): | ||||
|         if issubclass(exc_type, KeyboardInterrupt): | ||||
|             sys.__excepthook__(exc_type, exc_value, exc_traceback) | ||||
|             return | ||||
|  | ||||
|         logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)) | ||||
|  | ||||
|  | ||||
|  | ||||
|     def get_current_state(self) -> State: | ||||
|         ''' | ||||
| @@ -106,7 +88,7 @@ class Controller_Data: | ||||
|         state.tab            = self.get_fm_window(state.wid).get_tab_by_id(state.tid) | ||||
|         state.icon_grid      = self.builder.get_object(f"{state.wid}|{state.tid}|icon_grid") | ||||
|         state.store          = state.icon_grid.get_model() | ||||
|         state.message_dialog = self.message_dialog | ||||
|         state.message_dialog = MessageWidget() | ||||
|  | ||||
|         selected_files       = state.icon_grid.get_selected_items() | ||||
|         if selected_files: | ||||
|   | ||||
| @@ -15,6 +15,7 @@ class FileSystemActions(HandlerMixin, CRUDMixin): | ||||
|  | ||||
|     def __init__(self): | ||||
|         super(FileSystemActions, self).__init__() | ||||
|  | ||||
|         self._setup_styling() | ||||
|         self._setup_signals() | ||||
|         self._subscribe_to_events() | ||||
|   | ||||
| @@ -12,6 +12,9 @@ from gi.repository import Gio | ||||
| from ..widgets.io_widget import IOWidget | ||||
|  | ||||
|  | ||||
| class HandlerMixinException(Exception): | ||||
|     ... | ||||
|  | ||||
|  | ||||
|  | ||||
| class HandlerMixin: | ||||
| @@ -35,7 +38,7 @@ class HandlerMixin: | ||||
|                 file = Gio.File.new_for_path(path) | ||||
|                 if _target_path: | ||||
|                     if file.get_parent().get_path() == _target_path: | ||||
|                         raise Exception("Parent dir of target and file locations are the same! Won't copy or move!") | ||||
|                         raise HandlerMixinException("Parent dir of target and file locations are the same! Won't copy or move!") | ||||
|  | ||||
|                     if os.path.isdir(_target_path): | ||||
|                         info    = file.query_info("standard::display-name", 0, cancellable=None) | ||||
| @@ -153,7 +156,7 @@ class HandlerMixin: | ||||
|                 value     = file_name[(file_name.find(start)+len(start)):] | ||||
|                 int(value) | ||||
|                 file_name = file_name.split(start)[0] | ||||
|             except Exception as e: | ||||
|             except HandlerMixinException as e: | ||||
|                 pass | ||||
|  | ||||
|             target = Gio.File.new_for_path(f"{base_path}/{file_name}-copy{i}{extension}") | ||||
|   | ||||
| @@ -45,16 +45,14 @@ class PaneMixin: | ||||
|         state = self.run_flag_toggle(pane_index) | ||||
|         if self.is_pane1_hidden and self.is_pane2_hidden and self.is_pane3_hidden and self.is_pane4_hidden: | ||||
|             state = self.run_flag_toggle(pane_index) | ||||
|             self._save_state(state, pane_index) | ||||
|             self._set_fm_state(state, pane_index) | ||||
|             return | ||||
|  | ||||
|         child = pane.get_child1() if pane_index in [1, 3] else pane.get_child2() | ||||
|  | ||||
|         self.toggle_pane(child) | ||||
|         self._save_state(state, pane_index) | ||||
|         self._set_fm_state(state, pane_index) | ||||
|  | ||||
|     def _save_state(self, state, pane_index): | ||||
|     def _set_fm_state(self, state, pane_index): | ||||
|         window = self.fm_controller.get_window_by_index(pane_index - 1) | ||||
|         window.set_is_hidden(state) | ||||
|         if not settings.is_trace_debug(): | ||||
|             self.fm_controller.save_state() | ||||
|   | ||||
| @@ -18,6 +18,7 @@ class MessageWidget(Gtk.MessageDialog): | ||||
|  | ||||
|         self._setup_styling() | ||||
|         self._setup_signals() | ||||
|         self._subscribe_to_events() | ||||
|         self._load_widgets() | ||||
|  | ||||
|  | ||||
| @@ -27,6 +28,9 @@ class MessageWidget(Gtk.MessageDialog): | ||||
|     def _setup_signals(self): | ||||
|         ... | ||||
|  | ||||
|     def _subscribe_to_events(self): | ||||
|         ... | ||||
|  | ||||
|     def _load_widgets(self): | ||||
|         message_area = self.get_message_area() | ||||
|         message_area.get_children()[0].set_label("Alert!") | ||||
|   | ||||
| @@ -9,6 +9,9 @@ from gi.repository import Gtk | ||||
| # Application imports | ||||
|  | ||||
|  | ||||
| class SaveLoadWidgetException(Exception): | ||||
|     ... | ||||
|  | ||||
|  | ||||
|  | ||||
| class SaveLoadWidget: | ||||
| @@ -52,7 +55,7 @@ class SaveLoadWidget: | ||||
|         elif action == "load_session": | ||||
|             self.save_load_dialog.set_action(Gtk.FileChooserAction.OPEN) | ||||
|         else: | ||||
|             raise Exception(f"Unknown action given:  {action}") | ||||
|             raise SaveLoadWidgetException(f"Unknown action given:  {action}") | ||||
|  | ||||
|         self.save_load_dialog.set_current_folder(state.tab.get_current_directory()) | ||||
|         self.save_load_dialog.set_current_name("session.json") | ||||
|   | ||||
| @@ -1,7 +1,9 @@ | ||||
| # Python imports | ||||
| import datetime | ||||
| import inspect | ||||
| import traceback | ||||
| import sys | ||||
| import time | ||||
| import traceback | ||||
|  | ||||
| # Lib imports | ||||
| import gi | ||||
| @@ -26,6 +28,8 @@ class MessagePopupWidget(Gtk.Popover): | ||||
|  | ||||
|         self._message_buffer = None | ||||
|  | ||||
|         sys.excepthook = self.custom_except_hook | ||||
|  | ||||
|         self._setup_styling() | ||||
|         self._setup_signals() | ||||
|         self._load_widgets() | ||||
| @@ -35,7 +39,8 @@ class MessagePopupWidget(Gtk.Popover): | ||||
|         self.set_relative_to( self.builder.get_object(f"main_menu_bar") ) | ||||
|         self.set_modal(True) | ||||
|         self.set_position(Gtk.PositionType.BOTTOM) | ||||
|         self.set_size_request(620, 580) | ||||
|         self.set_hexpand(True) | ||||
|         self.set_vexpand(True) | ||||
|  | ||||
|     def _setup_signals(self): | ||||
|         event_system.subscribe("show_messages_popup", self.show_messages_popup) | ||||
| @@ -52,8 +57,6 @@ class MessagePopupWidget(Gtk.Popover): | ||||
|         button.connect("released", self.save_debug_alerts) | ||||
|         button.set_always_show_image(True) | ||||
|  | ||||
|         vbox.set_vexpand(True) | ||||
|         vbox.set_hexpand(True) | ||||
|         scroll_window.set_vexpand(True) | ||||
|         scroll_window.set_hexpand(True) | ||||
|         vbox.set_orientation(Gtk.Orientation.VERTICAL) | ||||
| @@ -61,9 +64,10 @@ class MessagePopupWidget(Gtk.Popover): | ||||
|         self.builder.expose_object(f"message_popup_widget", self) | ||||
|         self.builder.expose_object(f"message_text_view", message_text_view) | ||||
|  | ||||
|         vbox.add(button) | ||||
|         scroll_window.add(message_text_view) | ||||
|         vbox.add(button) | ||||
|         vbox.add(scroll_window) | ||||
|         vbox.show_all() | ||||
|         self.add(vbox) | ||||
|  | ||||
|  | ||||
| @@ -73,18 +77,30 @@ class MessagePopupWidget(Gtk.Popover): | ||||
|     def hide_messages_popup(self): | ||||
|         self.popup() | ||||
|  | ||||
|     def custom_except_hook(self, exc_type, exc_value, exc_traceback): | ||||
|         if issubclass(exc_type, KeyboardInterrupt): | ||||
|             sys.__excepthook__(exc_type, exc_value, exc_traceback) | ||||
|             return | ||||
|  | ||||
|         logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)) | ||||
|         self._exception_to_ui(exc_type, exc_value, exc_traceback) | ||||
|  | ||||
|     def _exception_to_ui(self, exc_type, exc_value, exc_traceback): | ||||
|         trace        = ''.join(traceback.format_tb(exc_traceback)) | ||||
|         current_time = datetime.datetime.now() | ||||
|         data         = f"{current_time}\nExec Type:  {exc_type}  <-->  Value:  {exc_value}\n\n{trace}\n\n" | ||||
|  | ||||
|     def custom_except_hook(self, exec_type, value, _traceback): | ||||
|         trace     = ''.join(traceback.format_tb(_traceback)) | ||||
|         data      = f"Exec Type:  {exec_type}  <-->  Value:  {value}\n\n{trace}\n\n\n\n" | ||||
|         start_itr = self._message_buffer.get_start_iter() | ||||
|         self._message_buffer.place_cursor(start_itr) | ||||
|         self.display_message(settings.get_error_color(), data) | ||||
|  | ||||
|     def display_message(self, type, text, seconds=None): | ||||
|         # start_itr = self._message_buffer.get_start_iter() | ||||
|         start_itr = self._message_buffer.get_iter_at_line(0) | ||||
|  | ||||
|         self._message_buffer.place_cursor(start_itr) | ||||
|         self._message_buffer.insert_at_cursor(text) | ||||
|         self.popup() | ||||
|  | ||||
|         if seconds: | ||||
|             self.popup() | ||||
|             self.hide_message_timeout(seconds) | ||||
|  | ||||
|     @threaded | ||||
|   | ||||
| @@ -52,6 +52,9 @@ class Window(Gtk.ApplicationWindow): | ||||
|         event_system.subscribe("tear_down", self._tear_down) | ||||
|  | ||||
|     def _load_widgets(self, args, unknownargs): | ||||
|         if settings.is_debug(): | ||||
|             self.set_interactive_debugging(True) | ||||
|  | ||||
|         self._controller = Controller(args, unknownargs) | ||||
|  | ||||
|         if not self._controller: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user