Highlight current selection

This commit is contained in:
Jan Hamal Dvořák 2025-03-08 20:42:04 +01:00
parent fb2aa6be2e
commit 93f1aed506

View file

@ -11,6 +11,8 @@ from gi.repository import Gdk, Gtk # NOQA: E402
class MainWindow(Gtk.ApplicationWindow):
file_info_label: Gtk.Label
def __init__(self, *args: Any, **kwargs: Any):
super().__init__(*args, **kwargs)
@ -30,8 +32,8 @@ class MainWindow(Gtk.ApplicationWindow):
left_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
left_box.set_valign(Gtk.Align.CENTER)
left_box.set_halign(Gtk.Align.FILL)
left_label = Gtk.Label(label="Left Side")
left_box.append(left_label)
self.file_info_label = Gtk.Label(label="")
left_box.append(self.file_info_label)
# Right two-thirds (2/3 width)
right_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
@ -46,7 +48,9 @@ class MainWindow(Gtk.ApplicationWindow):
# Create list store and view
list_store = Gtk.StringList()
list_view = Gtk.ListView()
list_view.set_model(Gtk.SingleSelection.new(list_store))
selection_model = Gtk.SingleSelection.new(list_store)
selection_model.connect("selection-changed", self._on_selection_changed)
list_view.set_model(selection_model)
list_view.set_vexpand(True)
# Factory for list items
@ -65,39 +69,56 @@ class MainWindow(Gtk.ApplicationWindow):
self.set_child(main_box)
def _setup_list_item(self, factory: Gtk.SignalListItemFactory, list_item: Gtk.ListItem) -> None:
def _setup_list_item(self, factory: Gtk.SignalListItemFactory, list_item: Gtk.ListItem):
label = Gtk.Label()
label.set_halign(Gtk.Align.START)
list_item.set_child(label)
def _bind_list_item(self, factory: Gtk.SignalListItemFactory, list_item: Gtk.ListItem) -> None:
def _bind_list_item(self, factory: Gtk.SignalListItemFactory, list_item: Gtk.ListItem):
label = cast(Gtk.Label, list_item.get_child())
item = cast(Gtk.StringObject, list_item.get_item())
label.set_text(item.get_string())
def _on_selection_changed(
self,
selection_model: Gtk.SingleSelection,
position: int,
n_items: int,
):
if selection_model.get_selected() == Gtk.INVALID_LIST_POSITION:
self.file_info_label.set_text("")
else:
selected_item = selection_model.get_selected_item()
if selected_item:
string_obj = cast(Gtk.StringObject, selected_item)
self.file_info_label.set_text(string_obj.get_string())
def _populate_file_list(self, list_store: Gtk.StringList) -> None:
# TODO: Implement proper version sort (strverscmp equivalent)
directories: list[str] = [".."]
directories: list[str] = ["../"]
files: list[str] = []
with os.scandir(".") as it:
for entry in it:
if entry.name == ".." or not entry.name.startswith("."):
if entry.is_dir():
directories.append(entry.name)
directories.append(entry.name + "/")
else:
files.append(entry.name)
directories.sort(key=lambda x: x.lower())
files.sort(key=lambda x: x.lower())
for name in directories:
list_store.append(f"{name}/")
while list_store.get_n_items():
list_store.remove(0)
for name in files:
for name in directories + files:
list_store.append(name)
all = directories + files
self.file_info_label.set_text(all[0] if all else "")
class App(Gtk.Application):
def __init__(self):