diff --git a/src/core/containers/editors_container.py b/src/core/containers/editors_container.py index 6321323..f0a10df 100644 --- a/src/core/containers/editors_container.py +++ b/src/core/containers/editors_container.py @@ -8,74 +8,8 @@ from gi.repository import Gtk # Application imports from ..widgets.separator_widget import Separator from ..widgets.miniview_widget import MiniViewWidget -from ..widgets.base.notebook.editor_notebook import EditorNotebook +from .editors_paned import EditorsPaned -from ..widgets.controls.tab_bar import TabBar -from .fixed_box import FixedBox - - - -class EditorsPaned(Gtk.Paned): - def __init__(self): - super(EditorsPaned, self).__init__() - - self._setup_styling() - self._setup_signals() - self._subscribe_to_events() - self._load_widgets() - - self.show() - - - def _setup_styling(self): - self.set_wide_handle(True) - - def _setup_signals(self): - ... - - def _subscribe_to_events(self): - event_system.subscribe("update_paned_handle", self._update_paned_handle) - - def _load_widgets(self): - left_view = Gtk.Box() - right_view = Gtk.Box() - - left_view.add( TabBar() ) - left_view.add( FixedBox() ) - - right_view.add( TabBar() ) - right_view.add( FixedBox() ) - - left_view.set_orientation( Gtk.Orientation.VERTICAL ) - right_view.set_orientation( Gtk.Orientation.VERTICAL ) - - left_view.show() - right_view.show() - - self.add1(left_view) - self.add2(right_view) - - - - # self.add1(FixedBox()) - # self.add2(FixedBox()) - - - - # self.add1(EditorNotebook()) - # self.add2(EditorNotebook()) - - def _update_paned_handle(self): - rect = self.get_allocation() - pos = -1 - - try: - size = rect.width / 2 - pos = int(size) - except: - ... - - self.set_position(size) class EditorsContainer(Gtk.Box): diff --git a/src/core/containers/editors_paned.py b/src/core/containers/editors_paned.py new file mode 100644 index 0000000..da04f99 --- /dev/null +++ b/src/core/containers/editors_paned.py @@ -0,0 +1,52 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from ..widgets.base.notebook.editor_notebook import EditorNotebook +from ..widgets.base.webkit.editor import Editor + + + +class EditorsPaned(Gtk.Paned): + def __init__(self): + super(EditorsPaned, self).__init__() + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show() + + + def _setup_styling(self): + self.set_wide_handle(True) + + def _setup_signals(self): + ... + + def _subscribe_to_events(self): + event_system.subscribe("update_paned_handle", self._update_paned_handle) + + def _load_widgets(self): + self.add1( Editor() ) + self.add2( Editor() ) + + # self.add1( EditorNotebook() ) + # self.add2( EditorNotebook() ) + + def _update_paned_handle(self): + rect = self.get_allocation() + pos = -1 + + try: + size = rect.width / 2 + pos = int(size) + except: + ... + + self.set_position(size) diff --git a/src/core/controllers/base_controller.py b/src/core/controllers/base_controller.py index 9e68efe..96d355a 100644 --- a/src/core/controllers/base_controller.py +++ b/src/core/controllers/base_controller.py @@ -14,7 +14,6 @@ from ..mixins.signals_mixins import SignalsMixins from ..containers.core_widget import CoreWidget from .base_controller_data import BaseControllerData from .bridge_controller import BridgeController -from .files_controller import FilesController @@ -59,7 +58,6 @@ class BaseController(SignalsMixins, BaseControllerData): def _load_controllers(self): BridgeController() - FilesController() def load_glade_file(self): self.builder = Gtk.Builder() diff --git a/src/core/controllers/bridge_controller.py b/src/core/controllers/bridge_controller.py index 4a527c7..b068704 100644 --- a/src/core/controllers/bridge_controller.py +++ b/src/core/controllers/bridge_controller.py @@ -26,14 +26,17 @@ class BridgeController: def handle_bridge_event(self, event): match event.topic: case "save": - event_system.emit("handle_file_event", (event,)) + event_system.emit(f"handle_file_event_{event.originator}", (event,)) case "close": - event_system.emit("handle_file_event", (event,)) + event_system.emit(f"handle_file_event_{event.originator}", (event,)) + case "load_buffer": + event_system.emit(f"handle_file_event_{event.originator}", (event,)) + # case "add_tab": + # event_system.emit(f"add_tab_{event.originator}", (event,)) + case "error": content = base64.b64decode( event.content.encode() ).decode("utf-8") logger.info(content) case _: ... - - diff --git a/src/core/controllers/files_controller.py b/src/core/controllers/files_controller.py index d0a161e..9a6412c 100644 --- a/src/core/controllers/files_controller.py +++ b/src/core/controllers/files_controller.py @@ -12,8 +12,9 @@ from gi.repository import Gtk class FilesController: - def __init__(self): + def __init__(self, index): + self.INDEX = index self.opened_files = {} self._setup_signals() @@ -24,8 +25,8 @@ class FilesController: ... def _subscribe_to_events(self): - event_system.subscribe("set_pre_drop_dnd", self.set_pre_drop_dnd) - event_system.subscribe("handle_file_event", self.handle_file_event) + event_system.subscribe(f"set_pre_drop_dnd_{self.INDEX}", self.set_pre_drop_dnd) + event_system.subscribe(f"handle_file_event_{self.INDEX}", self.handle_file_event) def set_pre_drop_dnd(self, gfiles): keys = self.opened_files.keys() @@ -46,37 +47,38 @@ class FilesController: def handle_file_event(self, event): match event.topic: case "save": - content = base64.b64decode( event.content.encode() ).decode("utf-8") - self.save_session(event.target, content) + content = base64.b64decode( event.content.encode() ).decode("utf-8") + basename = self.save_session(event.target, content) + + if basename: + event_system.emit(f"updated_tab_{event.originator}", (event.target, basename,)) case "close": self.close_session(event.target) + case "load_buffer": + self.load_buffer(event.target) + event_system.emit(f"add_tab_{event.originator}", (event.target, "buffer",)) case _: return + def load_buffer(self, fhash): + self.opened_files[fhash] = {"file": None, "ftype": "buffer"} + def save_session(self, fhash, content): - keys = self.opened_files.keys() + ftype = self.opened_files[fhash]["ftype"] gfile = event_system.emit_and_await( "save_file_dialog", ("", None) - ) if not fhash in keys else self.opened_files[fhash]["file"] - - if not gfile: return + ) if fhash == "buffer" else self.opened_files[fhash]["file"] file_written = self.write_to_file(fhash, gfile, content) - if not fhash in keys and file_written: - self.insert_to_sessions(fhash, gfile) - event_system.emit( - "updated_tab", - ( - self.opened_files[fhash]["ftype"], - gfile.get_basename(), - ) - ) + if fhash == "buffer" and file_written: + self.update_session(fhash, gfile) + return gfile.get_basename() def close_session(self, target): del self.opened_files[target] - def insert_to_sessions(self, fhash, gfile): + def update_session(self, fhash, gfile): info = gfile.query_info("standard::*", 0, cancellable = None) ftype = info.get_content_type().replace("x-", "").split("/")[1] diff --git a/src/core/widgets/base/webkit/ace_editor.py b/src/core/widgets/base/webkit/ace_editor.py index e331f9d..6992107 100644 --- a/src/core/widgets/base/webkit/ace_editor.py +++ b/src/core/widgets/base/webkit/ace_editor.py @@ -15,10 +15,11 @@ from libs.data_types import Event class AceEditor(WebKit2.WebView): - def __init__(self): + def __init__(self, index): super(AceEditor, self).__init__() # self.get_context().set_sandbox_enabled(False) + self.INDEX = index self._load_settings() self._setup_styling() @@ -42,11 +43,11 @@ class AceEditor(WebKit2.WebView): ... def _subscribe_to_events(self): - event_system.subscribe("load_file", self.load_file) - - event_system.subscribe("updated_tab", self.updated_tab) - event_system.subscribe("ui_message", self.ui_message) - + event_system.subscribe(f"load_file_{self.INDEX}", self.load_file) + event_system.subscribe(f"new_session_{self.INDEX}", self.new_session) + event_system.subscribe(f"switch_session_{self.INDEX}", self.switch_session) + event_system.subscribe(f"close_session_{self.INDEX}", self.close_session) + event_system.subscribe(f"ui_message_{self.INDEX}", self.ui_message) def _load_settings(self): self.set_settings( WebkitUISettings() ) @@ -72,6 +73,7 @@ class AceEditor(WebKit2.WebView): try: event = Event( **json.loads(message) ) + event.originator = self.INDEX event_system.emit("handle_bridge_event", (event,)) except Exception as e: logger.info(e) @@ -80,8 +82,16 @@ class AceEditor(WebKit2.WebView): command = f"loadFile('{ftype}', '{fhash}', '{file}', '{content}')" self.run_javascript(command, None, None) - def updated_tab(self, ftype, fname): - command = f"updatedTab('{ftype}', '{fname}')" + def new_session(self): + command = f"newSession()" + self.run_javascript(command, None, None) + + def switch_session(self, fhash): + command = f"switchSession('{fhash}')" + self.run_javascript(command, None, None) + + def close_session(self, fhash): + command = f"closeSession('{fhash}')" self.run_javascript(command, None, None) def ui_message(self, message, mtype): diff --git a/src/core/widgets/base/webkit/editor.py b/src/core/widgets/base/webkit/editor.py new file mode 100644 index 0000000..1c83c73 --- /dev/null +++ b/src/core/widgets/base/webkit/editor.py @@ -0,0 +1,48 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from ....controllers.files_controller import FilesController +from ...controls.tab_bar import TabBar +from .fixed_box import FixedBox + + + +class Editor(Gtk.Box): + ccount = 0 + + def __new__(cls, *args, **kwargs): + obj = super(Editor, cls).__new__(cls) + cls.ccount += 1 + + return obj + + def __init__(self): + super(Editor, self).__init__() + + self.INDEX = self.ccount + + self._setup_styling() + self._setup_signals() + self._subscribe_to_events() + self._load_widgets() + + self.show() + + + def _setup_styling(self): + self.set_orientation( Gtk.Orientation.VERTICAL ) + + def _setup_signals(self): + ... + + def _subscribe_to_events(self): + FilesController(self.INDEX) + + def _load_widgets(self): + self.add( TabBar(self.INDEX) ) + self.add( FixedBox(self.INDEX) ) \ No newline at end of file diff --git a/src/core/containers/fixed_box.py b/src/core/widgets/base/webkit/fixed_box.py similarity index 81% rename from src/core/containers/fixed_box.py rename to src/core/widgets/base/webkit/fixed_box.py index 4e08257..d806492 100644 --- a/src/core/containers/fixed_box.py +++ b/src/core/widgets/base/webkit/fixed_box.py @@ -6,8 +6,8 @@ gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports -from ..widgets.base.webkit.dnd_box import DnDBox -from ..widgets.base.webkit.ace_editor import AceEditor +from .dnd_box import DnDBox +from .ace_editor import AceEditor @@ -17,8 +17,10 @@ class FixedBox(Gtk.Fixed): (aka our DnDBox) above the Webkit2.Webview to intercept and proxy accordingly. """ - def __init__(self): + def __init__(self, index): super(FixedBox, self).__init__() + + self.INDEX = index self._setup_styling() self._setup_signals() @@ -39,7 +41,7 @@ class FixedBox(Gtk.Fixed): ... def _load_widgets(self): - self.ace_editor = AceEditor() + self.ace_editor = AceEditor(self.INDEX) self.dnd_box = DnDBox() self.add( self.ace_editor ) diff --git a/src/core/widgets/controls/tab_bar.py b/src/core/widgets/controls/tab_bar.py index 4f78cba..dc8bb8b 100644 --- a/src/core/widgets/controls/tab_bar.py +++ b/src/core/widgets/controls/tab_bar.py @@ -11,9 +11,11 @@ from ..tab_header_widget import TabHeaderWidget class TabBar(Gtk.Notebook): - def __init__(self): + def __init__(self, index): super(TabBar, self).__init__() + self.INDEX = index + self.set_group_name("editor_widget") self._setup_styling() @@ -29,12 +31,10 @@ class TabBar(Gtk.Notebook): def _setup_signals(self): self.connect("switch-page", self._switch_page_update) - # self.connect("key-press-event", self._key_press_event) - # self.connect("key-release-event", self._key_release_event) - ... def _subscribe_to_events(self): - ... + event_system.subscribe(f"add_tab_{self.INDEX}", self.add_tab) + event_system.subscribe(f"update_tab_{self.INDEX}", self.update_tab) def _load_widgets(self): start_box = Gtk.Box() @@ -51,28 +51,50 @@ class TabBar(Gtk.Notebook): self.set_action_widget(start_box, 0) self.set_action_widget(end_box, 1) - self.add_tab_click(None) - def _switch_page_update(self, notebook, page, page_num): + print(page_num) ... def add_tab_click(self, widget): - container = Gtk.Box() - page_num = self.append_page(container, TabHeaderWidget(container, self._close_tab)) + event_system.emit(f"new_session_{self.INDEX}") + def add_tab(self, fhash, title = "[BAD TITLE]"): + container = Gtk.EventBox() + header = TabHeaderWidget(container, self._close_tab) + page_num = self.append_page(container, header) + + container.fhash = fhash + + header.label.set_label(title) self.set_tab_detachable(container, True) self.set_tab_reorderable(container, True) self.show_all() self.set_current_page(page_num) - + + def update_tab(self, fhash, title = "[BAD TITLE]"): + container = Gtk.EventBox() + header = TabHeaderWidget(container, self._close_tab) + page_num = self.append_page(container, header) + + header.label.set_label(title) + self.set_tab_detachable(container, True) + self.set_tab_reorderable(container, True) + + self.show_all() + self.set_current_page(page_num) + # Note: Need to get parent instead given we pass the close_tab method # from a potentially former notebook. def _close_tab(self, widget, container): notebook = container.get_parent() - page_num = notebook.page_num(container) - notebook.remove_page(page_num) + if notebook.get_n_pages() < 2: return + + page_num = notebook.page_num(container) + + event_system.emit(f"close_session_{self.INDEX}", (container.fhash)) + notebook.remove_page(page_num) # def close_tab(self, button, container, source_view, eve = None): @@ -91,6 +113,4 @@ class TabBar(Gtk.Notebook): # if notebook.NAME == "notebook_2" and notebook.get_n_pages() == 0: # notebook.hide() - # event_system.emit("focused_target_changed", ("notebook_1",)) - - + # event_system.emit("focused_target_changed", ("notebook_1",)) \ No newline at end of file diff --git a/src/core/widgets/tab_header_widget.py b/src/core/widgets/tab_header_widget.py index b3130be..4d079ef 100644 --- a/src/core/widgets/tab_header_widget.py +++ b/src/core/widgets/tab_header_widget.py @@ -37,20 +37,20 @@ class TabHeaderWidget(Gtk.Box): ... def _load_widgets(self): - label = Gtk.Label(label = "buffer") + self.label = Gtk.Label(label = "buffer") close = Gtk.Button() icon = Gtk.Image(stock = Gtk.STOCK_CLOSE) # TODO: Setup with settings and from file - label.set_xalign(0.0) - label.set_margin_left(25) - label.set_margin_right(25) - label.set_hexpand(True) + self.label.set_xalign(0.0) + self.label.set_margin_left(25) + self.label.set_margin_right(25) + self.label.set_hexpand(True) close.set_always_show_image(True) close.set_hexpand(False) close.set_image( Gtk.Image.new_from_icon_name("gtk-close", 4) ) close.connect("released", self.close_tab, *(self.content,)) - self.add(label) - self.add(close) + self.add(self.label) + self.add(close) \ No newline at end of file diff --git a/src/libs/data_types/event.py b/src/libs/data_types/event.py index 0b084b7..712d590 100644 --- a/src/libs/data_types/event.py +++ b/src/libs/data_types/event.py @@ -13,3 +13,4 @@ class Event: topic: str target: str content: str + originator: int = -1 \ No newline at end of file diff --git a/user_config/usr/share/newton/context_path/index.html b/user_config/usr/share/newton/context_path/index.html index 813b4ca..ab219b1 100644 --- a/user_config/usr/share/newton/context_path/index.html +++ b/user_config/usr/share/newton/context_path/index.html @@ -14,27 +14,7 @@
-@@ -43,12 +23,6 @@
-