Files
Python-With-Gtk-Template/plugins/code/ui/tabs_bar/tabs_widget.py

180 lines
5.4 KiB
Python
Raw Normal View History

# Python imports
# Lib imports
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
# Application imports
from libs.event_factory import Event_Factory, Code_Event_Types
from .tab_widget import TabWidget
class TabsWidget(Gtk.Notebook):
def __init__(self):
super(TabsWidget, self).__init__()
self._setup_styling()
self._setup_signals()
self._subscribe_to_events()
self._load_widgets()
self.show()
def _setup_styling(self):
self.set_scrollable(True)
def _setup_signals(self):
self.connect("page-added", self._page_added)
self.switch_page_id = \
self.connect_after("switch-page", self._switch_page)
def _subscribe_to_events(self):
...
def _load_widgets(self):
...
def _page_added(self, notebook, page_widget, page_num):
tab = self.get_tab_label(page_widget)
tab.set_close_signal(self._close_tab)
self._bind_tab_menu(tab, page_widget)
page_widget.show()
self.set_tab_detachable(page_widget, True)
self.set_tab_reorderable(page_widget, True)
def _close_tab(self, button, file):
event = Event_Factory.create_event(
"remove_file",
buffer = file.buffer
)
self.emit(event)
def _switch_page(self, notebook, page_widget, page_num):
tab = self.get_tab_label(page_widget)
event = Event_Factory.create_event(
"set_active_file",
buffer = tab.file.buffer
)
self.emit(event)
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 view_changed(self, buffer):
for page_widget in self.get_children():
tab = self.get_tab_label(page_widget)
if not buffer == tab.file.buffer: continue
self.handler_block(self.switch_page_id)
self.set_current_page(
self.page_num(page_widget)
)
self.handler_unblock(self.switch_page_id)
break
def modified_changed(self, buffer):
for page_widget in self.get_children():
tab = self.get_tab_label(page_widget)
if not buffer == tab.file.buffer: continue
ctx = tab.label.get_style_context()
ctx.remove_class("file-deleted")
if buffer.get_modified():
ctx.add_class("file-changed")
else:
ctx.remove_class("file-changed")
break
def externally_deleted(self, buffer):
for page_widget in self.get_children():
tab = self.get_tab_label(page_widget)
if not buffer == tab.file.buffer: continue
ctx = tab.label.get_style_context()
ctx.add_class("file-deleted")
break
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):
children = self.get_children()
for widget in children[ : ]:
tab = self.get_tab_label(widget)
tab.close_bttn.clicked()