import gi import os import libs.functions as fn from ui.FlowBox import FlowBox, FlowBoxInstalled from ui.Stack import Stack from libs.Kernel import Kernel, InstalledKernel, CommunityKernel gi.require_version("Gtk", "4.0") from gi.repository import Gtk, Gio, Gdk base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) class KernelStack: def __init__( self, manager_gui, **kwargs, ): super().__init__(**kwargs) self.manager_gui = manager_gui self.flowbox_stacks = [] self.search_entries = [] def add_installed_kernels_to_stack(self, reload): vbox_header = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) vbox_header.set_name("vbox_header") lbl_heading = Gtk.Label(xalign=0.5, yalign=0.5) lbl_heading.set_name("label_flowbox_message") lbl_heading.set_text("%s" % "Installed kernels".upper()) lbl_padding = Gtk.Label(xalign=0.0, yalign=0.0) lbl_padding.set_text(" ") grid_banner_img = Gtk.Grid() image_settings = Gtk.Image.new_from_file( os.path.join(base_dir, "images/48x48/akm-install.png") ) image_settings.set_icon_size(Gtk.IconSize.LARGE) image_settings.set_halign(Gtk.Align.START) grid_banner_img.attach(image_settings, 0, 1, 1, 1) grid_banner_img.attach_next_to( lbl_padding, image_settings, Gtk.PositionType.RIGHT, 1, 1, ) grid_banner_img.attach_next_to( lbl_heading, lbl_padding, Gtk.PositionType.RIGHT, 1, 1, ) vbox_header.append(grid_banner_img) label_installed_desc = Gtk.Label(xalign=0, yalign=0) label_installed_desc.set_text("Installed Linux kernel and modules") label_installed_desc.set_name("label_stack_desc") label_installed_count = Gtk.Label(xalign=0, yalign=0) label_installed_count.set_name("label_stack_count") vbox_search_entry = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) search_entry_installed = Gtk.SearchEntry() search_entry_installed.set_name("search_entry_installed") search_entry_installed.set_placeholder_text("Search installed kernels...") search_entry_installed.connect("search_changed", self.flowbox_filter_installed) vbox_search_entry.append(search_entry_installed) if reload is True: if self.manager_gui.vbox_installed_kernels is not None: for widget in self.manager_gui.vbox_installed_kernels: if widget.get_name() == "label_stack_count": widget.set_markup( "%s Installed kernels" % len(self.manager_gui.installed_kernels) ) if widget.get_name() == "scrolled_window_installed": self.manager_gui.vbox_installed_kernels.remove(widget) scrolled_window_installed = Gtk.ScrolledWindow() scrolled_window_installed.set_name("scrolled_window_installed") scrolled_window_installed.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC ) scrolled_window_installed.set_propagate_natural_height(True) scrolled_window_installed.set_propagate_natural_width(True) self.flowbox_installed = FlowBoxInstalled( installed_kernels=self.manager_gui.installed_kernels, manager_gui=self.manager_gui, ) vbox_installed_flowbox = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=12 ) # vbox_installed_flowbox.set_halign(align=Gtk.Align.FILL) vbox_installed_flowbox.append(self.flowbox_installed) scrolled_window_installed.set_child(vbox_installed_flowbox) self.manager_gui.vbox_installed_kernels.append(scrolled_window_installed) if self.manager_gui.vbox_active_installed_kernel is not None: self.manager_gui.vbox_installed_kernels.reorder_child_after( self.manager_gui.vbox_active_installed_kernel, scrolled_window_installed, ) else: self.manager_gui.vbox_installed_kernels = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=5 ) self.manager_gui.vbox_installed_kernels.set_name("vbox_installed_kernels") self.manager_gui.vbox_active_installed_kernel = Gtk.Box( orientation=Gtk.Orientation.HORIZONTAL, spacing=5 ) self.manager_gui.vbox_active_installed_kernel.set_name("vbox_active_kernel") label_active_installed_kernel = Gtk.Label(xalign=0.5, yalign=0.5) label_active_installed_kernel.set_name("label_active_kernel") label_active_installed_kernel.set_selectable(True) label_active_installed_kernel.set_markup( "Active kernel: %s" % self.manager_gui.active_kernel ) label_active_installed_kernel.set_halign(Gtk.Align.START) self.manager_gui.vbox_active_installed_kernel.append( label_active_installed_kernel ) scrolled_window_installed = Gtk.ScrolledWindow() scrolled_window_installed.set_name("scrolled_window_installed") scrolled_window_installed.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC ) scrolled_window_installed.set_propagate_natural_height(True) scrolled_window_installed.set_propagate_natural_width(True) label_installed_count.set_markup( "%s Installed kernels" % len(self.manager_gui.installed_kernels) ) self.flowbox_installed = FlowBoxInstalled( installed_kernels=self.manager_gui.installed_kernels, manager_gui=self.manager_gui, ) vbox_installed_flowbox = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=12 ) # vbox_installed_flowbox.set_halign(align=Gtk.Align.FILL) vbox_installed_flowbox.append(self.flowbox_installed) scrolled_window_installed.set_child(vbox_installed_flowbox) # self.manager_gui.vbox_installed_kernels.append(label_installed_title) self.manager_gui.vbox_installed_kernels.append(vbox_header) self.manager_gui.vbox_installed_kernels.append(label_installed_desc) self.manager_gui.vbox_installed_kernels.append(label_installed_count) self.manager_gui.vbox_installed_kernels.append(vbox_search_entry) self.manager_gui.vbox_installed_kernels.append(scrolled_window_installed) self.manager_gui.vbox_installed_kernels.append( self.manager_gui.vbox_active_installed_kernel ) self.manager_gui.stack.add_titled( self.manager_gui.vbox_installed_kernels, "Installed", "Installed" ) def add_official_kernels_to_stack(self, reload): if reload is True: self.flowbox_stacks.clear() for kernel in fn.supported_kernels_dict: vbox_flowbox = None stack_child = self.manager_gui.stack.get_child_by_name(kernel) if stack_child is not None: for stack_widget in stack_child: if stack_widget.get_name() == "scrolled_window_official": scrolled_window_official = stack_widget vbox_flowbox = ( scrolled_window_official.get_child().get_child() ) for widget in vbox_flowbox: widget.remove_all() self.flowbox_official_kernel = FlowBox( kernel, self.manager_gui.active_kernel, self.manager_gui, "official", ) self.flowbox_stacks.append(self.flowbox_official_kernel) vbox_flowbox.append(self.flowbox_official_kernel) # while self.manager_gui.default_context.pending(): # self.manager_gui.default_context.iteration(True) else: for kernel in fn.supported_kernels_dict: self.manager_gui.vbox_kernels = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=5 ) self.manager_gui.vbox_kernels.set_name("stack_%s" % kernel) hbox_sep_kernels = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=10 ) hsep_kernels = Gtk.Separator(orientation=Gtk.Orientation.VERTICAL) vbox_active_kernel = Gtk.Box( orientation=Gtk.Orientation.HORIZONTAL, spacing=5 ) vbox_active_kernel.set_name("vbox_active_kernel") label_active_kernel = Gtk.Label(xalign=0.5, yalign=0.5) label_active_kernel.set_name("label_active_kernel") label_active_kernel.set_selectable(True) label_active_kernel.set_markup( "Active kernel: %s" % self.manager_gui.active_kernel ) label_active_kernel.set_halign(Gtk.Align.START) label_bottom_padding = Gtk.Label(xalign=0, yalign=0) label_bottom_padding.set_text(" ") hbox_sep_kernels.append(hsep_kernels) self.flowbox_official_kernel = FlowBox( kernel, self.manager_gui.active_kernel, self.manager_gui, "official" ) self.flowbox_stacks.append(self.flowbox_official_kernel) vbox_flowbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) vbox_flowbox.set_name("vbox_flowbox_%s" % kernel) # vbox_flowbox.set_halign(align=Gtk.Align.FILL) vbox_flowbox.append(self.flowbox_official_kernel) scrolled_window_official = Gtk.ScrolledWindow() scrolled_window_official.set_name("scrolled_window_official") scrolled_window_official.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC ) scrolled_window_official.set_propagate_natural_height(True) scrolled_window_official.set_propagate_natural_width(True) label_title = Gtk.Label(xalign=0.5, yalign=0.5) label_title.set_text(kernel.upper()) label_title.set_name("label_stack_kernel") label_desc = Gtk.Label(xalign=0, yalign=0) label_desc.set_text(fn.supported_kernels_dict[kernel][0]) label_desc.set_name("label_stack_desc") label_count = Gtk.Label(xalign=0, yalign=0) label_count.set_markup( "%s Available kernels" % self.flowbox_official_kernel.kernel_count ) label_count.set_name("label_stack_count") vbox_search_entry = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=5 ) search_entry_official = Gtk.SearchEntry() search_entry_official.set_name(kernel) search_entry_official.set_placeholder_text( "Search %s kernels..." % kernel ) search_entry_official.connect( "search_changed", self.flowbox_filter_official ) self.search_entries.append(search_entry_official) vbox_search_entry.append(search_entry_official) vbox_active_kernel.append(label_active_kernel) vbox_header = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) vbox_header.set_name("vbox_header") lbl_heading = Gtk.Label(xalign=0.5, yalign=0.5) lbl_heading.set_name("label_flowbox_message") lbl_heading.set_text( "%s - Verified and official kernels" % kernel.upper() ) lbl_padding = Gtk.Label(xalign=0.0, yalign=0.0) lbl_padding.set_text(" ") grid_banner_img = Gtk.Grid() image_settings = Gtk.Image.new_from_file( os.path.join(base_dir, "images/48x48/akm-verified.png") ) image_settings.set_icon_size(Gtk.IconSize.LARGE) image_settings.set_halign(Gtk.Align.START) grid_banner_img.attach(image_settings, 0, 1, 1, 1) grid_banner_img.attach_next_to( lbl_padding, image_settings, Gtk.PositionType.RIGHT, 1, 1, ) grid_banner_img.attach_next_to( lbl_heading, lbl_padding, Gtk.PositionType.RIGHT, 1, 1, ) vbox_header.append(grid_banner_img) # vbox_kernels.append(label_title) self.manager_gui.vbox_kernels.append(vbox_header) # self.manager_gui.vbox_kernels.append(label_title) self.manager_gui.vbox_kernels.append(label_desc) self.manager_gui.vbox_kernels.append(label_count) self.manager_gui.vbox_kernels.append(vbox_search_entry) self.manager_gui.vbox_kernels.append(hbox_sep_kernels) scrolled_window_official.set_child(vbox_flowbox) self.manager_gui.vbox_kernels.append(scrolled_window_official) self.manager_gui.vbox_kernels.append(vbox_active_kernel) kernel_sidebar_title = None if kernel == "linux": kernel_sidebar_title = "Linux" elif kernel == "linux-lts": kernel_sidebar_title = "Linux-LTS" elif kernel == "linux-zen": kernel_sidebar_title = "Linux-ZEN" elif kernel == "linux-hardened": kernel_sidebar_title = "Linux-Hardened" elif kernel == "linux-rt": kernel_sidebar_title = "Linux-RT" elif kernel == "linux-rt-lts": kernel_sidebar_title = "Linux-RT-LTS" self.manager_gui.stack.add_titled( self.manager_gui.vbox_kernels, kernel, kernel_sidebar_title ) def flowbox_filter_official(self, search_entry): def filter_func(fb_child, text): if search_entry.get_name() == fb_child.get_name().split(" ")[0]: if text in fb_child.get_name(): return True else: return False else: return True text = search_entry.get_text() for flowbox in self.flowbox_stacks: flowbox.set_filter_func(filter_func, text) def flowbox_filter_community(self, search_entry): def filter_func(fb_child, text): if search_entry.get_name() == "search_entry_community": if text in fb_child.get_name(): return True else: return False else: return True text = search_entry.get_text() self.flowbox_community.set_filter_func(filter_func, text) def flowbox_filter_installed(self, search_entry): def filter_func(fb_child, text): if search_entry.get_name() == "search_entry_installed": if text in fb_child.get_name(): return True else: return False else: return True text = search_entry.get_text() self.flowbox_installed.set_filter_func(filter_func, text) def add_community_kernels_to_stack(self, reload): vbox_active_kernel = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) vbox_active_kernel.set_name("vbox_active_kernel") vbox_kernels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) hbox_sep_kernels = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) hsep_kernels = Gtk.Separator(orientation=Gtk.Orientation.VERTICAL) hbox_sep_kernels.append(hsep_kernels) label_active_kernel = Gtk.Label(xalign=0.5, yalign=0.5) label_active_kernel.set_name("label_active_kernel") label_active_kernel.set_selectable(True) label_active_kernel.set_markup( "Active kernel: %s" % self.manager_gui.active_kernel ) label_active_kernel.set_halign(Gtk.Align.START) label_count = Gtk.Label(xalign=0, yalign=0) label_count.set_name("label_stack_count") vbox_search_entry = None search_entry_community = Gtk.SearchEntry() search_entry_community.set_name("search_entry_community") search_entry_community.set_placeholder_text( "Search %s kernels..." % "community based" ) search_entry_community.connect("search_changed", self.flowbox_filter_community) hbox_warning_message = Gtk.Box( orientation=Gtk.Orientation.HORIZONTAL, spacing=5 ) hbox_warning_message.set_name("hbox_warning_message") label_pacman_warning = Gtk.Label(xalign=0, yalign=0) label_pacman_warning.set_name("label_community_warning") image_warning = Gtk.Image.new_from_file( os.path.join(base_dir, "images/48x48/akm-warning.png") ) image_warning.set_name("image_warning") image_warning.set_icon_size(Gtk.IconSize.LARGE) image_warning.set_halign(Gtk.Align.CENTER) hbox_warning = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=5) hbox_warning.set_name("hbox_warning") hbox_warning.append(image_warning) # hbox_warning.append(label_pacman_warning) label_warning = Gtk.Label(xalign=0, yalign=0) label_warning.set_name("label_community_warning") if ( self.manager_gui.community_kernels is not None and len(self.manager_gui.community_kernels) == 0 ): label_warning.set_markup( f"Cannot find any supported unofficial pacman repository's\n" f"Add the Chaotic-AUR pacman repository to access Community based kernels" ) else: label_warning.set_markup( f"These kernels are user produced content\n" f"These kernels may not work on your hardware\n" f"Any use of the provided files is at your own risk" ) hbox_warning.append(label_warning) if reload is True: vbox_flowbox = None stack_child = self.manager_gui.stack.get_child_by_name("Community Kernels") if stack_child is not None: for stack_widget in stack_child: if stack_widget.get_name() == "hbox_warning": for w in stack_widget: if w.get_name() == "label_community_warning": if len(self.manager_gui.community_kernels) == 0: w.set_markup( f"Cannot find any supported unofficial pacman repository's\n" f"Add the Chaotic-AUR pacman repository to access Community based kernels" ) else: w.set_markup( f"These kernels are user produced content\n" f"These kernels may not work on your hardware\n" f"Any use of the provided files is at your own risk" ) break if stack_widget.get_name() == "label_stack_count": stack_widget.set_markup( "%s Available kernels" % len(self.manager_gui.community_kernels) ) if stack_widget.get_name() == "vbox_search_entry": if len(self.manager_gui.community_kernels) == 0: for search_entry in stack_widget: search_entry.set_visible(False) else: for search_entry in stack_widget: search_entry.set_visible(True) if stack_widget.get_name() == "scrolled_window_community": scrolled_window_community = stack_widget vbox_flowbox = scrolled_window_community.get_child().get_child() for widget in vbox_flowbox: widget.remove_all() # scrolled_window_community.hide() # vbox_search_entry = Gtk.Box( # orientation=Gtk.Orientation.VERTICAL, spacing=5 # ) # # vbox_search_entry.append(search_entry_community) # widget.append(vbox_search_entry) if ( self.manager_gui.community_kernels is not None and len(self.manager_gui.community_kernels) > 0 ): self.flowbox_community = FlowBox( self.manager_gui.community_kernels, self.manager_gui.active_kernel, self.manager_gui, "community", ) vbox_flowbox.append(self.flowbox_community) # while self.manager_gui.default_context.pending(): # # fn.time.sleep(0.1) # self.manager_gui.default_context.iteration(True) else: self.flowbox_community = None vbox_flowbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) # vbox_flowbox.set_halign(align=Gtk.Align.FILL) if len(self.manager_gui.community_kernels) == 0: label_count.set_markup("%s Available kernels" % 0) else: self.flowbox_community = FlowBox( self.manager_gui.community_kernels, self.manager_gui.active_kernel, self.manager_gui, "community", ) vbox_flowbox.append(self.flowbox_community) label_count.set_markup( "%s Available kernels" % self.flowbox_community.kernel_count ) vbox_search_entry = Gtk.Box( orientation=Gtk.Orientation.VERTICAL, spacing=5 ) vbox_search_entry.set_name("vbox_search_entry") vbox_search_entry.append(search_entry_community) if reload is False: scrolled_window_community = Gtk.ScrolledWindow() scrolled_window_community.set_name("scrolled_window_community") scrolled_window_community.set_policy( Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC ) scrolled_window_community.set_propagate_natural_height(True) scrolled_window_community.set_propagate_natural_width(True) label_title = Gtk.Label(xalign=0.5, yalign=0.5) label_title.set_text("Community Kernels") label_title.set_name("label_stack_kernel") label_desc = Gtk.Label(xalign=0, yalign=0) label_desc.set_text("Community Linux kernel and modules") label_desc.set_name("label_stack_desc") vbox_active_kernel.append(label_active_kernel) vbox_header = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5) vbox_header.set_name("vbox_header") lbl_heading = Gtk.Label(xalign=0.5, yalign=0.5) lbl_heading.set_name("label_flowbox_message") lbl_heading.set_text( "%s - Unofficial kernels" % "Community based".upper() ) lbl_padding = Gtk.Label(xalign=0.0, yalign=0.0) lbl_padding.set_text(" ") grid_banner_img = Gtk.Grid() image_settings = Gtk.Image.new_from_file( os.path.join(base_dir, "images/48x48/akm-community.png") ) image_settings.set_icon_size(Gtk.IconSize.LARGE) image_settings.set_halign(Gtk.Align.START) grid_banner_img.attach(image_settings, 0, 1, 1, 1) grid_banner_img.attach_next_to( lbl_padding, image_settings, Gtk.PositionType.RIGHT, 1, 1, ) grid_banner_img.attach_next_to( lbl_heading, lbl_padding, Gtk.PositionType.RIGHT, 1, 1, ) vbox_header.append(grid_banner_img) vbox_kernels.append(vbox_header) vbox_kernels.append(label_desc) vbox_kernels.append(hbox_warning) vbox_kernels.append(label_count) if vbox_search_entry is not None: vbox_kernels.append(vbox_search_entry) vbox_kernels.append(hbox_sep_kernels) scrolled_window_community.set_child(vbox_flowbox) vbox_kernels.append(scrolled_window_community) vbox_kernels.append(vbox_active_kernel) self.manager_gui.stack.add_titled( vbox_kernels, "Community Kernels", "Community" )