I’m trying to use Flowbox with multiple selection mode. Selection works but I can’t unselect the selection. I couldn’t find anything about unselecting. Any ideas?
import gi
import sys
gi.require_version("Gtk", "4.0")
gi.require_version("Adw", "1")
from gi.repository import Gtk, Adw, Gio
import picture_finder
class MyApp(Adw.Application):
def __init__(self, application_id="my_app", flags=Gio.ApplicationFlags.DEFAULT_FLAGS, version="1.0"):
super().__init__(application_id=application_id, flags=flags)
def do_activate(self) -> None:
win = self.props.active_window
if not win:
win = MyWindow(application=self)
win.present()
class MyWindow(Adw.ApplicationWindow):
__gtype_name__ = "MyWindow"
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.pictures = []
self.set_title("Adw Example")
self.set_default_size(600, 400)
self.header_bar = Adw.HeaderBar()
self.toolbar_view = Adw.ToolbarView()
# Use Gtk.FlowBox for selectable items
self.flow_box = Gtk.FlowBox()
self.flow_box.set_valign(Gtk.Align.START)
self.flow_box.set_max_children_per_line(3)
self.flow_box.set_selection_mode(Gtk.SelectionMode.MULTIPLE)
self.flow_box.connect("selected-children-changed", self.on_flowbox_selection_changed)
# Primary menu setup
primary_menu = Gio.Menu()
primary_menu.append("Preferences", "app.preferences")
primary_menu_button = Gtk.MenuButton(primary=True, icon_name="open-menu-symbolic")
primary_menu_button.set_menu_model(primary_menu)
self.header_bar.pack_end(primary_menu_button)
# Navigation split view setup
self.nav_split_view = Adw.NavigationSplitView()
overlay_content = Adw.NavigationPage()
overlay_content.set_title("Overlay")
overlay_sidebar = Adw.NavigationPage()
overlay_sidebar.set_title("Sidebar")
overlay_sidebar.set_child(Gtk.Label(label="Sidebar Content"))
self.nav_split_view.set_content(overlay_content)
self.nav_split_view.set_sidebar(overlay_sidebar)
# Action bar setup
self.action_bar = Gtk.ActionBar()
action_bar_button = Gtk.Button(label="Select Folder")
action_bar_button.connect("clicked", self.on_file_dialog_button_clicked)
self.action_bar.pack_start(action_bar_button)
# Toolbar view setup
self.toolbar_view.add_top_bar(self.header_bar)
self.toolbar_view.set_content(self.nav_split_view)
self.toolbar_view.add_bottom_bar(self.action_bar)
# Add scrolled window for the flow box
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
scrolled_window.set_child(self.flow_box)
# Set content
overlay_content.set_child(scrolled_window)
self.set_content(self.toolbar_view)
def on_file_dialog_button_clicked(self, button):
file_dialog = Gtk.FileDialog()
def on_file_dialog_response(dialog, result):
try:
file = dialog.select_folder_finish(result)
print(file.get_path())
if file:
self.pictures = picture_finder.PictureLister(file.get_path()).get_picture_list()
for pic in self.pictures:
image = Gtk.Image.new_from_file(pic)
image.set_pixel_size(300)
self.flow_box.append(image)
except Exception as e:
print(f"Error: {e}")
file_dialog.select_folder(callback=on_file_dialog_response)
def on_flowbox_selection_changed(self, flowbox):
# Get all selected children
selected_children = flowbox.get_selected_children()
if selected_children:
for child in selected_children:
index = child.get_index()
print(f"Selected image: {self.pictures[index]}")
else:
print("No images selected")
if __name__ == "__main__":
app = MyApp()
app.run(sys.argv)