SolarFM/src/versions/solarfm-0.0.1/solarfm/core/mixins/ui/tab_mixin.py

208 lines
7.4 KiB
Python
Raw Normal View History

2021-10-10 06:45:55 +00:00
# Python imports
2021-12-12 06:03:51 +00:00
import os
2021-10-10 06:45:55 +00:00
# Lib imports
2021-12-12 06:03:51 +00:00
import gi
gi.require_version('Gtk', '3.0')
2022-02-20 05:15:02 +00:00
from gi.repository import Gtk
2021-10-10 06:45:55 +00:00
# Application imports
2022-03-13 23:42:00 +00:00
from .grid_mixin import GridMixin
2021-10-10 06:45:55 +00:00
2022-03-13 23:42:00 +00:00
class TabMixin(GridMixin):
2021-10-10 06:45:55 +00:00
"""docstring for TabMixin"""
def create_tab(self, wid=None, tid=None, path=None):
2022-03-08 01:18:55 +00:00
if not wid:
wid, tid = self.fm_controller.get_active_wid_and_tid()
2022-03-08 01:18:55 +00:00
2021-10-10 06:45:55 +00:00
notebook = self.builder.get_object(f"window_{wid}")
path_entry = self.builder.get_object(f"path_entry")
tab = self.fm_controller.add_tab_for_window_by_nickname(f"window_{wid}")
tab.logger = logger
2021-10-10 06:45:55 +00:00
tab.set_wid(wid)
if not path:
if wid and tid:
_tab = self.get_fm_window(wid).get_tab_by_id(tid)
tab.set_path(_tab.get_current_directory())
else:
tab.set_path(path)
2021-10-10 06:45:55 +00:00
tab_widget = self.create_tab_widget(tab)
2022-07-07 17:51:51 +00:00
scroll, store = self.create_scroll_and_store(tab, wid)
index = notebook.append_page(scroll, tab_widget)
notebook.set_tab_detachable(scroll, True)
2021-10-10 06:45:55 +00:00
2022-03-08 01:18:55 +00:00
self.fm_controller.set_wid_and_tid(wid, tab.get_id())
path_entry.set_text(tab.get_current_directory())
2021-10-10 06:45:55 +00:00
notebook.show_all()
notebook.set_current_page(index)
ctx = notebook.get_style_context()
ctx.add_class("notebook-unselected-focus")
notebook.set_tab_reorderable(scroll, True)
self.load_store(tab, store)
self.set_window_title()
self.set_file_watcher(tab)
2021-11-22 22:24:44 +00:00
def close_tab(self, button, eve=None):
notebook = button.get_parent().get_parent()
if notebook.get_n_pages() == 1:
return
wid = int(notebook.get_name()[-1])
tid = self.get_id_from_tab_box(button.get_parent())
scroll = self.builder.get_object(f"{wid}|{tid}")
page = notebook.page_num(scroll)
tab = self.get_fm_window(wid).get_tab_by_id(tid)
watcher = tab.get_dir_watcher()
2021-10-10 06:45:55 +00:00
watcher.cancel()
self.get_fm_window(wid).delete_tab_by_id(tid)
2021-10-10 06:45:55 +00:00
notebook.remove_page(page)
if not settings.is_trace_debug():
self.fm_controller.save_state()
self.set_window_title()
2021-10-10 06:45:55 +00:00
# NOTE: Not actually getting called even tho set in the glade file...
def on_tab_dnded(self, notebook, page, x, y):
...
2021-11-23 03:18:14 +00:00
def on_tab_reorder(self, child, page_num, new_index):
wid, tid = page_num.get_name().split("|")
window = self.get_fm_window(wid)
tab = None
2021-11-23 03:18:14 +00:00
for i, tab in enumerate(window.get_all_tabs()):
if tab.get_id() == tid:
_tab = window.get_tab_by_id(tid)
watcher = _tab.get_dir_watcher()
2021-11-23 03:18:14 +00:00
watcher.cancel()
window.get_all_tabs().insert(new_index, window.get_all_tabs().pop(i))
2021-11-23 03:18:14 +00:00
tab = window.get_tab_by_id(tid)
self.set_file_watcher(tab)
if not settings.is_trace_debug():
self.fm_controller.save_state()
2021-11-23 03:18:14 +00:00
def on_tab_switch_update(self, notebook, content=None, index=None):
2021-11-21 20:50:32 +00:00
self.selected_files.clear()
2021-11-21 03:00:34 +00:00
wid, tid = content.get_children()[0].get_name().split("|")
2022-03-08 01:18:55 +00:00
self.fm_controller.set_wid_and_tid(wid, tid)
self.set_path_text(wid, tid)
self.set_window_title()
def get_id_from_tab_box(self, tab_box):
return tab_box.get_children()[2].get_text()
def get_tab_label(self, notebook, icon_grid):
return notebook.get_tab_label(icon_grid.get_parent()).get_children()[0]
2021-11-21 03:00:34 +00:00
def get_tab_close(self, notebook, icon_grid):
return notebook.get_tab_label(icon_grid.get_parent()).get_children()[1]
def get_tab_icon_grid_from_notebook(self, notebook):
2021-11-21 03:00:34 +00:00
return notebook.get_children()[1].get_children()[0]
2021-11-15 03:40:05 +00:00
def refresh_tab(data=None):
2022-03-07 03:27:47 +00:00
state = self.get_current_state()
state.tab.load_directory()
self.load_store(state.tab, state.store)
def update_tab(self, tab_label, tab, store, wid, tid):
self.load_store(tab, store)
2021-12-06 23:21:19 +00:00
self.set_path_text(wid, tid)
char_width = len(tab.get_end_of_path())
2021-12-06 23:21:19 +00:00
tab_label.set_width_chars(char_width)
tab_label.set_label(tab.get_end_of_path())
2021-12-06 23:21:19 +00:00
self.set_window_title()
self.set_file_watcher(tab)
if not settings.is_trace_debug():
self.fm_controller.save_state()
2021-12-06 23:21:19 +00:00
2021-10-10 06:45:55 +00:00
def do_action_from_bar_controls(self, widget, eve=None):
action = widget.get_name()
wid, tid = self.fm_controller.get_active_wid_and_tid()
2021-10-10 06:45:55 +00:00
notebook = self.builder.get_object(f"window_{wid}")
store, tab_label = self.get_store_and_label_from_notebook(notebook, f"{wid}|{tid}")
tab = self.get_fm_window(wid).get_tab_by_id(tid)
2021-10-10 06:45:55 +00:00
if action == "create_tab":
dir = tab.get_current_directory()
self.create_tab(wid, None, dir)
if not settings.is_trace_debug():
self.fm_controller.save_state()
2021-10-10 06:45:55 +00:00
return
if action == "go_up":
tab.pop_from_path()
if action == "go_home":
tab.set_to_home()
if action == "refresh_tab":
tab.load_directory()
if action == "path_entry":
2021-12-12 06:03:51 +00:00
focused_obj = self.window.get_focus()
dir = f"{tab.get_current_directory()}/"
2021-12-12 06:03:51 +00:00
path = widget.get_text()
if isinstance(focused_obj, Gtk.Entry):
path_menu_buttons = self.builder.get_object("path_menu_buttons")
query = widget.get_text().replace(dir, "")
files = tab.get_files() + tab.get_hidden()
2021-12-12 06:03:51 +00:00
self.clear_children(path_menu_buttons)
2021-12-12 06:03:51 +00:00
show_path_menu = False
2023-02-21 01:18:45 +00:00
for file, hash, size in files:
2021-12-12 06:27:48 +00:00
if os.path.isdir(f"{dir}{file}"):
if query.lower() in file.lower():
button = Gtk.Button(label=file)
button.show()
button.connect("clicked", self.set_path_entry)
path_menu_buttons.add(button)
2021-12-12 06:27:48 +00:00
show_path_menu = True
if not show_path_menu:
event_system.emit("hide_path_menu")
2021-12-12 06:27:48 +00:00
else:
event_system.emit("show_path_menu")
2021-12-12 06:03:51 +00:00
widget.grab_focus_without_selecting()
widget.set_position(-1)
2021-12-12 06:27:48 +00:00
if path.endswith(".") or path == dir:
2021-11-21 03:00:34 +00:00
return
if not tab.set_path(path):
return
2021-10-10 06:45:55 +00:00
self.update_tab(tab_label, tab, store, wid, tid)
2021-12-12 06:03:51 +00:00
try:
widget.grab_focus_without_selecting()
widget.set_position(-1)
except Exception as e:
pass
def set_path_entry(self, button=None, eve=None):
2022-03-07 03:27:47 +00:00
state = self.get_current_state()
path = f"{state.tab.get_current_directory()}/{button.get_label()}"
2021-12-12 06:03:51 +00:00
path_entry = self.builder.get_object("path_entry")
path_entry.set_text(path)
path_entry.grab_focus_without_selecting()
path_entry.set_position(-1)
event_system.emit("hide_path_menu")
2021-11-15 03:40:05 +00:00
def show_hide_hidden_files(self):
wid, tid = self.fm_controller.get_active_wid_and_tid()
tab = self.get_fm_window(wid).get_tab_by_id(tid)
tab.set_hiding_hidden(not tab.is_hiding_hidden())
tab.load_directory()
self.builder.get_object("refresh_tab").released()