import sys import gi gi.require_version ( 'Gtk', '4.0' ) gi.require_version ( 'Adw', '1' ) from gi.repository import Gtk, Adw, GLib class MainWindow (Adw.Window): def __init__ (self, *args, **kwargs): super ().__init__ ( *args, **kwargs ) GLib.set_prgname ( 'Adwaita Examples by Afacanc38' ) GLib.set_application_name ( 'Adwaita Carousel' ) self.set_default_size (650, 500) self.set_size_request (400, 400) self.box_main = Gtk.Box ( orientation = Gtk.Orientation.VERTICAL, valign = Gtk.Align.FILL, vexpand = True ) self.set_content ( self.box_main ) self.hb = Gtk.HeaderBar () self.box_main.append ( self.hb ) # Carousel self.carousel = Adw.Carousel ( hexpand = True, vexpand = True, allow_scroll_wheel = True, allow_long_swipes = False ) self.box_main.append ( self.carousel ) # Indicator self.stk_indicator = Gtk.Stack ( transition_type = Gtk.StackTransitionType.CROSSFADE ) self.box_main.append ( self.stk_indicator ) self.carousel_dots = Adw.CarouselIndicatorDots ( carousel = self.carousel ) self.stk_indicator.add_titled ( self.carousel_dots, 'page0', 'page0' ) self.carousel_lines = Adw.CarouselIndicatorLines ( carousel = self.carousel ) self.stk_indicator.add_titled ( self.carousel_lines, 'page1', 'page1' ) # Page 1 self.page1 = Adw.StatusPage ( title = 'Carousel', description = 'A widget for paginated scrolling.', icon_name = 'go-next-symbolic', hexpand = True, vexpand = True, ) self.carousel.append ( self.page1 ) # Page 2 self.page2 = Gtk.Box ( hexpand = True, vexpand = True, halign = Gtk.Align.CENTER, valign = Gtk.Align.CENTER ) self.carousel.append ( self.page2 ) self.clamp = Adw.Clamp () self.page2.append ( self.clamp ) self.listbox = Gtk.ListBox ( selection_mode = Gtk.SelectionMode.NONE ) self.listbox.get_style_context ().add_class ( 'boxed-list' ) self.clamp.set_child ( self.listbox ) self.setting1 = Adw.ComboRow ( title = 'Indicator Style' ) self.strlist1 = Gtk.StringList () self.strlist1.append ( 'Dots' ) self.strlist1.append ( 'Lines' ) self.setting1.set_model ( self.strlist1 ) self.setting1.connect ( 'notify::selected-item', self.on_setting1_set ) self.listbox.append ( self.setting1 ) self.setting2 = Adw.ActionRow ( title = 'Long swipes' ) self.sw_long_swipe = Gtk.Switch ( valign = Gtk.Align.CENTER ) self.sw_long_swipe.connect ( 'notify::active', self.on_long_swipe_set ) self.setting2.add_suffix ( self.sw_long_swipe ) self.listbox.append ( self.setting2 ) self.setting3 = Adw.ActionRow ( title = 'Scroll with mouse wheel' ) self.sw_scroll_wheel = Gtk.Switch ( valign = Gtk.Align.CENTER ) self.sw_scroll_wheel.set_active (True) self.sw_scroll_wheel.connect ( 'notify::active', self.on_scroll_wheel_set ) self.setting3.add_suffix ( self.sw_scroll_wheel ) self.listbox.append ( self.setting3 ) for x in range(4): self.carousel.append ( Adw.StatusPage ( title = f'Page {x}', hexpand = True, vexpand = True, ) ) self.page4 = Gtk.Box ( orientation = Gtk.Orientation.VERTICAL, hexpand = True, vexpand = True, halign = Gtk.Align.CENTER, valign = Gtk.Align.CENTER ) self.carousel.append ( self.page4 ) self.page4_status = Adw.StatusPage ( title = 'Page 4', ) self.page4.append ( self.page4_status ) self.btn_go_first_page = Gtk.Button ( label = 'Return to the first page' ) self.btn_go_first_page.get_style_context ().add_class ( 'pill' ) self.btn_go_first_page.connect ( 'clicked', self.go_first_page ) self.btn_go_first_page.get_style_context ().add_class ( 'suggested-action' ) self.page4.append ( self.btn_go_first_page ) def on_setting1_set (self, widget, event): if "Dots" in self.setting1.get_selected_item ().get_string (): self.stk_indicator.set_visible_child (self.carousel_dots) if "Lines" in self.setting1.get_selected_item ().get_string (): self.stk_indicator.set_visible_child (self.carousel_lines) def on_long_swipe_set (self, widget, event): if self.sw_long_swipe.get_active (): self.carousel.set_allow_long_swipes (True) else: self.carousel.set_allow_long_swipes (False) def on_scroll_wheel_set (self, widget, event): if self.sw_scroll_wheel.get_active (): self.carousel.set_allow_scroll_wheel (True) else: self.carousel.set_allow_scroll_wheel (False) def go_first_page (self, widget): self.carousel.scroll_to (self.page1, True) class MyApp (Adw.Application): def __init__ (self, **kwargs): super ().__init__ (**kwargs) self.connect ( 'activate', self.on_activate ) def on_activate (self, app): self.win = MainWindow ( application = app ) self.win.present () app = MyApp ( application_id = 'io.github.afacanc38.adw-viewswitcher' ) app.run (sys.argv)