Aded context menu to tabs widget; registered other widgets to registery
This commit is contained in:
@@ -38,6 +38,8 @@ class BaseContainer(Gtk.Box):
|
|||||||
event_system.subscribe("remove-transparency", self._remove_transparency)
|
event_system.subscribe("remove-transparency", self._remove_transparency)
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("base-container", self)
|
||||||
|
|
||||||
self.add( HeaderContainer() )
|
self.add( HeaderContainer() )
|
||||||
self.add( BodyContainer() )
|
self.add( BodyContainer() )
|
||||||
self.add( FooterContainer() )
|
self.add( FooterContainer() )
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ class BodyContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("body-container", self)
|
||||||
|
|
||||||
self.add( LeftContainer() )
|
self.add( LeftContainer() )
|
||||||
self.add( CenterContainer() )
|
self.add( CenterContainer() )
|
||||||
self.add( RightContainer() )
|
self.add( RightContainer() )
|
||||||
@@ -38,6 +38,8 @@ class CenterContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("center-container", self)
|
||||||
|
|
||||||
glade_box = widget_registery.get_object("glade_box")
|
glade_box = widget_registery.get_object("glade_box")
|
||||||
button = Gtk.Button(label = "Click Me!")
|
button = Gtk.Button(label = "Click Me!")
|
||||||
|
|
||||||
|
|||||||
@@ -43,15 +43,7 @@ class CodeContainer(Gtk.Box):
|
|||||||
self.add( self._create_editor_widget(code_base) )
|
self.add( self._create_editor_widget(code_base) )
|
||||||
|
|
||||||
def _create_tabs_widgets(self, code_base: CodeBase):
|
def _create_tabs_widgets(self, code_base: CodeBase):
|
||||||
scrolled_window = Gtk.ScrolledWindow()
|
return code_base.get_tabs_widget()
|
||||||
viewport = Gtk.Viewport()
|
|
||||||
|
|
||||||
scrolled_window.set_overlay_scrolling(False)
|
|
||||||
|
|
||||||
viewport.add( code_base.get_tabs_widget() )
|
|
||||||
scrolled_window.add( viewport )
|
|
||||||
|
|
||||||
return scrolled_window
|
|
||||||
|
|
||||||
def _create_editor_widget(self, code_base: CodeBase):
|
def _create_editor_widget(self, code_base: CodeBase):
|
||||||
editors_container = Gtk.Box()
|
editors_container = Gtk.Box()
|
||||||
|
|||||||
@@ -36,4 +36,6 @@ class FooterContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("footer-container", self)
|
||||||
|
|
||||||
self.add( CodeContainer() )
|
self.add( CodeContainer() )
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ class HeaderContainer(Gtk.Box):
|
|||||||
event_system.subscribe("tggl-top-main-menubar", self.tggl_top_main_menubar)
|
event_system.subscribe("tggl-top-main-menubar", self.tggl_top_main_menubar)
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("header-container", self)
|
||||||
|
|
||||||
button = Gtk.Button(label = "Interactive Debug")
|
button = Gtk.Button(label = "Interactive Debug")
|
||||||
button.connect("clicked", self._interactive_debug)
|
button.connect("clicked", self._interactive_debug)
|
||||||
|
|
||||||
|
|||||||
@@ -35,4 +35,4 @@ class LeftContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
...
|
widget_registery.expose_object("left-container", self)
|
||||||
|
|||||||
@@ -36,5 +36,7 @@ class RightContainer(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
widget_registery.expose_object("right-container", self)
|
||||||
|
|
||||||
vte_widget = VteWidget()
|
vte_widget = VteWidget()
|
||||||
self.add( vte_widget )
|
self.add( vte_widget )
|
||||||
@@ -16,10 +16,10 @@ def execute(
|
|||||||
):
|
):
|
||||||
logger.debug("Command: Update Info Bar")
|
logger.debug("Command: Update Info Bar")
|
||||||
file = view.command.get_file(view)
|
file = view.command.get_file(view)
|
||||||
buffer = file.buffer
|
|
||||||
|
|
||||||
if not file: return
|
if not file: return
|
||||||
|
|
||||||
|
buffer = file.buffer
|
||||||
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
iter = buffer.get_iter_at_mark( buffer.get_insert() )
|
||||||
line = iter.get_line() + 1
|
line = iter.get_line() + 1
|
||||||
column = iter.get_line_offset()
|
column = iter.get_line_offset()
|
||||||
|
|||||||
@@ -20,14 +20,12 @@ class TabsController(ControllerBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TabsController, self).__init__()
|
super(TabsController, self).__init__()
|
||||||
|
|
||||||
self.active_view: SourceView = None
|
|
||||||
self.tabs_widget: TabsWidget = TabsWidget()
|
self.tabs_widget: TabsWidget = TabsWidget()
|
||||||
self.tabs_widget.message = self.message
|
self.tabs_widget.message = self.message
|
||||||
|
|
||||||
|
|
||||||
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
def _controller_message(self, event: Code_Event_Types.CodeEvent):
|
||||||
if isinstance(event, Code_Event_Types.FocusedViewEvent):
|
if isinstance(event, Code_Event_Types.FocusedViewEvent):
|
||||||
self.active_view = event.view
|
|
||||||
self.tabs_widget.view_changed(
|
self.tabs_widget.view_changed(
|
||||||
event.view.get_buffer()
|
event.view.get_buffer()
|
||||||
)
|
)
|
||||||
@@ -53,13 +51,12 @@ class TabsController(ControllerBase):
|
|||||||
break
|
break
|
||||||
|
|
||||||
def add_tab(self, event: Code_Event_Types.AddedNewFileEvent):
|
def add_tab(self, event: Code_Event_Types.AddedNewFileEvent):
|
||||||
box = Gtk.Separator()
|
|
||||||
tab = TabWidget()
|
tab = TabWidget()
|
||||||
|
|
||||||
tab.file = event.file
|
tab.file = event.file
|
||||||
|
|
||||||
tab.label.set_label(event.file.fname)
|
tab.label.set_label(event.file.fname)
|
||||||
|
|
||||||
self.tabs_widget.append_page(box, tab)
|
self.tabs_widget.append_page(Gtk.Separator(), tab)
|
||||||
tab.show_all()
|
tab.show_all()
|
||||||
|
|
||||||
def remove_tab(self, event: Code_Event_Types.RemovedFileEvent):
|
def remove_tab(self, event: Code_Event_Types.RemovedFileEvent):
|
||||||
|
|||||||
@@ -15,7 +15,11 @@ class TabWidget(Gtk.Box):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(TabWidget, self).__init__()
|
super(TabWidget, self).__init__()
|
||||||
|
|
||||||
|
self.file = None
|
||||||
|
|
||||||
self._close_tab = None
|
self._close_tab = None
|
||||||
|
self._handler_id = None
|
||||||
|
self._eve_handler_id = None
|
||||||
|
|
||||||
self._setup_styling()
|
self._setup_styling()
|
||||||
self._setup_signals()
|
self._setup_signals()
|
||||||
@@ -33,13 +37,15 @@ class TabWidget(Gtk.Box):
|
|||||||
...
|
...
|
||||||
|
|
||||||
def _load_widgets(self):
|
def _load_widgets(self):
|
||||||
|
self.event_box = Gtk.EventBox()
|
||||||
self.label = Gtk.Label()
|
self.label = Gtk.Label()
|
||||||
self.close_btn = Gtk.Button()
|
self.close_bttn = Gtk.Button()
|
||||||
icon = Gtk.Image(stock = Gtk.STOCK_CLOSE)
|
icon = Gtk.Image(stock = Gtk.STOCK_CLOSE)
|
||||||
|
|
||||||
|
self.event_box.set_above_child(True)
|
||||||
ctx = self.label.get_style_context()
|
ctx = self.label.get_style_context()
|
||||||
ctx.add_class("tab-label")
|
ctx.add_class("tab-label")
|
||||||
ctx = self.close_btn.get_style_context()
|
ctx = self.close_bttn.get_style_context()
|
||||||
ctx.add_class("tab-close-bttn")
|
ctx.add_class("tab-close-bttn")
|
||||||
|
|
||||||
self.label.set_xalign(0.0)
|
self.label.set_xalign(0.0)
|
||||||
@@ -47,14 +53,16 @@ class TabWidget(Gtk.Box):
|
|||||||
self.label.set_margin_right(25)
|
self.label.set_margin_right(25)
|
||||||
self.label.set_hexpand(True)
|
self.label.set_hexpand(True)
|
||||||
|
|
||||||
self.close_btn.add(icon)
|
self.close_bttn.add(icon)
|
||||||
self.add(self.label)
|
self.event_box.add(self.label)
|
||||||
self.add(self.close_btn)
|
self.add(self.event_box)
|
||||||
|
self.add(self.close_bttn)
|
||||||
|
|
||||||
self.show_all()
|
self.show_all()
|
||||||
|
|
||||||
def clear_signals_and_data(self):
|
def clear_signals_and_data(self):
|
||||||
self.close_btn.disconnect(self._handler_id)
|
self.close_bttn.disconnect(self._handler_id)
|
||||||
|
self.event_box.disconnect(self._eve_handler_id)
|
||||||
self._close_tab = None
|
self._close_tab = None
|
||||||
self._handler_id = None
|
self._handler_id = None
|
||||||
|
|
||||||
@@ -64,8 +72,8 @@ class TabWidget(Gtk.Box):
|
|||||||
child.destroy()
|
child.destroy()
|
||||||
|
|
||||||
def set_close_signal(self, callback):
|
def set_close_signal(self, callback):
|
||||||
self._handler_id = self.close_btn.connect(
|
self._handler_id = self.close_bttn.connect(
|
||||||
'button-release-event',
|
'clicked',
|
||||||
callback,
|
callback,
|
||||||
self.file
|
self.file
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
# Lib imports
|
# Lib imports
|
||||||
import gi
|
import gi
|
||||||
gi.require_version('Gtk', '3.0')
|
gi.require_version('Gtk', '3.0')
|
||||||
|
gi.require_version('Gdk', '3.0')
|
||||||
from gi.repository import Gtk
|
from gi.repository import Gtk
|
||||||
|
from gi.repository import Gdk
|
||||||
|
|
||||||
# Application imports
|
# Application imports
|
||||||
from libs.event_factory import Event_Factory, Code_Event_Types
|
from libs.event_factory import Event_Factory, Code_Event_Types
|
||||||
@@ -23,7 +25,7 @@ class TabsWidget(Gtk.Notebook):
|
|||||||
|
|
||||||
|
|
||||||
def _setup_styling(self):
|
def _setup_styling(self):
|
||||||
...
|
self.set_scrollable(True)
|
||||||
|
|
||||||
def _setup_signals(self):
|
def _setup_signals(self):
|
||||||
self.connect("page-added", self._page_added)
|
self.connect("page-added", self._page_added)
|
||||||
@@ -40,14 +42,16 @@ class TabsWidget(Gtk.Notebook):
|
|||||||
tab = self.get_tab_label(page_widget)
|
tab = self.get_tab_label(page_widget)
|
||||||
tab.set_close_signal(self._close_tab)
|
tab.set_close_signal(self._close_tab)
|
||||||
|
|
||||||
|
self._bind_tab_menu(tab, page_widget)
|
||||||
|
|
||||||
page_widget.show()
|
page_widget.show()
|
||||||
self.set_tab_detachable(page_widget, True)
|
self.set_tab_detachable(page_widget, True)
|
||||||
self.set_tab_reorderable(page_widget, True)
|
self.set_tab_reorderable(page_widget, True)
|
||||||
|
|
||||||
def _close_tab(self, tab, eve, file):
|
def _close_tab(self, button, file):
|
||||||
event = Event_Factory.create_event(
|
event = Event_Factory.create_event(
|
||||||
"remove_file",
|
"remove_file",
|
||||||
buffer = tab.get_parent().file.buffer
|
buffer = file.buffer
|
||||||
)
|
)
|
||||||
|
|
||||||
self.message(event)
|
self.message(event)
|
||||||
@@ -73,3 +77,75 @@ class TabsWidget(Gtk.Notebook):
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.handler_unblock(self.switch_page_id)
|
self.handler_unblock(self.switch_page_id)
|
||||||
|
|
||||||
|
def _bind_tab_menu(self, tab, page_widget):
|
||||||
|
def do_context_menu(tab, eve, page_widget):
|
||||||
|
if eve.type == Gdk.EventType.BUTTON_RELEASE and eve.button == 3: # r-click
|
||||||
|
menu = self.create_menu(page_widget)
|
||||||
|
menu.popup_at_pointer(eve)
|
||||||
|
|
||||||
|
tab._eve_handler_id = \
|
||||||
|
tab.event_box.connect(
|
||||||
|
"button-release-event",
|
||||||
|
do_context_menu,
|
||||||
|
page_widget
|
||||||
|
)
|
||||||
|
|
||||||
|
def create_menu(self, page_widget) -> Gtk.Menu:
|
||||||
|
context_menu = Gtk.Menu()
|
||||||
|
|
||||||
|
close_item = Gtk.MenuItem(label = "Close Tab")
|
||||||
|
close_left_item = Gtk.MenuItem(label = "Close Tabs Left")
|
||||||
|
close_right_item = Gtk.MenuItem(label = "Close Tabs Right")
|
||||||
|
close_other_item = Gtk.MenuItem(label = "Close Other Tabs")
|
||||||
|
close_all_item = Gtk.MenuItem(label = "Close All Tabs")
|
||||||
|
|
||||||
|
close_item.connect("activate", self.close_item, page_widget)
|
||||||
|
close_left_item.connect("activate", self.close_left_items, page_widget)
|
||||||
|
close_right_item.connect("activate", self.close_right_items, page_widget)
|
||||||
|
close_other_item.connect("activate", self.close_other_items, page_widget)
|
||||||
|
close_all_item.connect("activate", self.close_all_items, page_widget)
|
||||||
|
|
||||||
|
context_menu.append(close_item)
|
||||||
|
context_menu.append(close_left_item)
|
||||||
|
context_menu.append(close_right_item)
|
||||||
|
context_menu.append(close_other_item)
|
||||||
|
context_menu.append(close_all_item)
|
||||||
|
|
||||||
|
context_menu.show_all()
|
||||||
|
|
||||||
|
return context_menu
|
||||||
|
|
||||||
|
|
||||||
|
def close_item(self, menu_item, page_widget):
|
||||||
|
tab = self.get_tab_label(page_widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|
||||||
|
def close_left_items(self, menu_item, page_widget):
|
||||||
|
children = self.get_children()
|
||||||
|
i = children.index(page_widget)
|
||||||
|
|
||||||
|
if i == 0: return
|
||||||
|
|
||||||
|
for widget in children[ : i]:
|
||||||
|
tab = self.get_tab_label(widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|
||||||
|
def close_right_items(self, menu_item, page_widget):
|
||||||
|
children = self.get_children()
|
||||||
|
i = children.index(page_widget) + 1
|
||||||
|
|
||||||
|
if i == len(children): return
|
||||||
|
|
||||||
|
for widget in children[i : ]:
|
||||||
|
tab = self.get_tab_label(widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|
||||||
|
def close_other_items(self, menu_item, page_widget):
|
||||||
|
self.close_left_items(menu_item, page_widget)
|
||||||
|
self.close_right_items(menu_item, page_widget)
|
||||||
|
|
||||||
|
def close_all_items(self, menu_item, page_widget):
|
||||||
|
for widget in children[ : ]:
|
||||||
|
tab = self.get_tab_label(widget)
|
||||||
|
tab.close_bttn.clicked()
|
||||||
|
|||||||
Reference in New Issue
Block a user