Merge pull request 'multi window mess' (#648) from hsjobeki-main into main
All checks were successful
assets1 / test (push) Successful in 19s
checks / test (push) Successful in 28s
checks-impure / test (push) Successful in 1m3s

This commit is contained in:
clan-bot 2023-12-16 13:57:52 +00:00
commit 218e49770e
5 changed files with 140 additions and 22 deletions

View File

@ -34,27 +34,29 @@ class Application(Gtk.Application):
self.init_style()
self.windows = windows
initial = windows.__dict__[config.initial_window]
self.cbs = Callbacks(show_list=self.show_list, show_join=self.show_join)
if issubclass(initial, JoinWindow):
# see JoinWindow constructor
self.window = initial(
initial_values=InitialJoinValues(url=config.url or ""),
cbs=Callbacks(show_list=self.show_list, show_join=self.show_join),
cbs=self.cbs,
)
if issubclass(initial, OverviewWindow):
# see OverviewWindow constructor
self.window = initial()
self.window = initial(cbs=self.cbs)
def show_list(self) -> None:
prev = self.window
self.window = self.windows.__dict__["overview"]()
self.window = self.windows.__dict__["overview"](cbs=self.cbs)
self.do_activate()
prev.hide()
def show_join(self, initial_values: InitialJoinValues) -> None:
def show_join(self) -> None:
prev = self.window
self.window = self.windows.__dict__["join"]()
self.window = self.windows.__dict__["join"](
cbs=self.cbs, initial_values=InitialJoinValues(url="")
)
self.do_activate()
prev.hide()

View File

@ -12,4 +12,4 @@ class InitialJoinValues:
@dataclass
class Callbacks:
show_list: Callable[[], None]
show_join: Callable[[InitialJoinValues], None]
show_join: Callable[[], None]

View File

@ -88,6 +88,7 @@ class ClanList(Gtk.Box):
remount_list: Callable[[], None],
remount_edit: Callable[[], None],
set_selected: Callable[[VMBase | None], None],
show_join: Callable[[], None],
selected_vm: VMBase | None,
show_toolbar: bool = True,
) -> None:
@ -97,19 +98,15 @@ class ClanList(Gtk.Box):
self.remount_list_view = remount_list
self.set_selected = set_selected
self.show_toolbar = show_toolbar
self.show_join = show_join
# TODO: We should use somekind of useState hook here.
# that updates the list of VMs when the user changes something
# @hsjobeki reply: @qubasa: This is how to update data in the list store
# self.list_store.set_value(self.list_store.get_iter(path), 3, "new value")
# self.list_store[path][3] = "new_value"
# This class needs to take ownership of the data because it has access to the listStore only
self.selected_vm: VMBase | None = selected_vm
button_hooks = {
"on_start_clicked": self.on_start_clicked,
"on_stop_clicked": self.on_stop_clicked,
"on_edit_clicked": self.on_edit_clicked,
"on_join_clicked": self.on_join_clicked,
}
if show_toolbar:
self.toolbar = ClanListToolbar(**button_hooks)
@ -131,6 +128,10 @@ class ClanList(Gtk.Box):
def on_stop_clicked(self, widget: Gtk.Widget) -> None:
print("Stop clicked")
def on_join_clicked(self, widget: Gtk.Widget) -> None:
print("Join clicked")
self.show_join()
def on_edit_clicked(self, widget: Gtk.Widget) -> None:
print("Edit clicked")
self.remount_edit_view()
@ -154,6 +155,7 @@ class ClanListToolbar(Gtk.Toolbar):
on_start_clicked: Callable[[Gtk.Widget], None],
on_stop_clicked: Callable[[Gtk.Widget], None],
on_edit_clicked: Callable[[Gtk.Widget], None],
on_join_clicked: Callable[[Gtk.Widget], None],
) -> None:
super().__init__(orientation=Gtk.Orientation.HORIZONTAL)
@ -169,6 +171,10 @@ class ClanListToolbar(Gtk.Toolbar):
self.edit_button.connect("clicked", on_edit_clicked)
self.add(self.edit_button)
self.join_button = Gtk.ToolButton(label="New")
self.join_button.connect("clicked", on_join_clicked)
self.add(self.join_button)
def set_is_selected(self, s: bool) -> None:
if s:
self.edit_button.set_sensitive(True)

View File

@ -1,12 +1,105 @@
from collections.abc import Callable
from typing import Any
import gi
from clan_vm_manager import assets
from ..interfaces import Callbacks, InitialJoinValues
gi.require_version("Gtk", "3.0")
from gi.repository import Gio, Gtk
from gi.repository import GdkPixbuf, Gio, Gtk
class Trust(Gtk.Box):
def __init__(self, url: str, show_next: Callable[[], None]) -> None:
super().__init__()
self.show_next = show_next
icon = Gtk.Image.new_from_pixbuf(
GdkPixbuf.Pixbuf.new_from_file_at_scale(
filename=str(assets.loc / "placeholder.jpeg"),
width=256,
height=256,
preserve_aspect_ratio=True,
)
)
layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, expand=True)
layout.set_border_width(20)
upper = Gtk.Box(orientation="vertical")
upper.set_spacing(20)
upper.add(Gtk.Label(label="Clan URL"))
upper.add(icon)
self.entry = Gtk.Entry(text=str(url))
# self.entry.set_editable(False) ?
upper.add(self.entry)
lower = Gtk.Box(orientation="vertical")
lower.set_spacing(20)
trust_button = Gtk.Button(label="Trust")
trust_button.connect("clicked", self.on_trust)
lower.add(trust_button)
layout.pack_start(upper, expand=True, fill=True, padding=0)
layout.pack_end(lower, expand=True, fill=True, padding=0)
self.set_center_widget(layout)
# self.show_all()
def on_trust(self, widget: Gtk.Widget) -> None:
print("trusted")
print(self.entry.get_text())
self.show_next()
class Details(Gtk.Box):
def __init__(self, url: str, show_next: Callable[[], None]) -> None:
super().__init__()
self.show_next = show_next
icon = Gtk.Image.new_from_pixbuf(
GdkPixbuf.Pixbuf.new_from_file_at_scale(
filename=str(assets.loc / "placeholder.jpeg"),
width=256,
height=256,
preserve_aspect_ratio=True,
)
)
layout = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, expand=True)
layout.set_border_width(20)
upper = Gtk.Box(orientation="vertical")
upper.set_spacing(20)
upper.add(icon)
label = Gtk.Label(label=str(url))
upper.add(label)
description = Gtk.TextBuffer()
description.set_text("Lorem ipsum")
text_view = Gtk.TextView.new_with_buffer(description)
text_view.set_editable(False)
upper.add(text_view)
lower = Gtk.Box(orientation="horizontal", expand=True)
lower.set_spacing(20)
layout.pack_start(upper, expand=True, fill=True, padding=0)
layout.add(lower)
join_button = Gtk.Button(label="Join")
join_button.connect("clicked", self.on_join)
layout.add(join_button)
self.add(layout)
def on_join(self, widget: Gtk.Widget) -> None:
print("join")
self.show_next()
class JoinWindow(Gtk.ApplicationWindow):
@ -21,22 +114,37 @@ class JoinWindow(Gtk.ApplicationWindow):
vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6, expand=True)
self.add(vbox)
button = Gtk.ToolButton()
button.set_icon_name("go-previous")
button.connect("clicked", self.switch)
toolbar = Gtk.Toolbar(orientation=Gtk.Orientation.HORIZONTAL)
toolbar.add(button)
vbox.add(toolbar)
self.stack = Gtk.Stack()
self.stack.add_titled(Gtk.Label(str(initial_values.url)), "join", "Join")
self.stack.add_titled(
Details(str(initial_values.url), show_next=self.show_details),
"details",
"Details",
)
self.stack.add_titled(
Trust(str(initial_values.url), show_next=self.show_details),
"trust",
"Trust",
)
vbox.add(self.stack)
vbox.add(Gtk.Entry(text=str(initial_values.url)))
button = Gtk.Button(
label="To List",
)
button.connect("clicked", self.switch)
vbox.add(button)
# vbox.add(Gtk.Entry(text=str(initial_values.url)))
# Must be called AFTER all components were added
self.show_all()
def show_details(self) -> None:
self.stack.set_visible_child_name("details")
def switch(self, widget: Gtk.Widget) -> None:
self.cbs.show_list()

View File

@ -8,12 +8,13 @@ gi.require_version("Gtk", "3.0")
from gi.repository import Gio, Gtk
from ..interfaces import Callbacks
from ..ui.clan_join_page import ClanJoinPage
from ..ui.clan_select_list import ClanEdit, ClanList
class OverviewWindow(Gtk.ApplicationWindow):
def __init__(self) -> None:
def __init__(self, cbs: Callbacks) -> None:
super().__init__()
# Initialize the main window
self.set_title("cLAN Manager")
@ -33,6 +34,7 @@ class OverviewWindow(Gtk.ApplicationWindow):
"remount_list": self.remount_list_view,
"remount_edit": self.remount_edit_view,
"set_selected": self.set_selected,
"show_join": cbs.show_join,
}
clan_list = ClanList(**self.list_hooks, selected_vm=None) # type: ignore
# Add named stacks