180 lines
5.4 KiB
Python
180 lines
5.4 KiB
Python
# 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()
|