Launcher: make launcher scrollable (#2881)

This commit is contained in:
Silvris 2024-03-02 23:32:58 -06:00 committed by GitHub
parent ad3ffde785
commit 01cf60f48d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 16 deletions

View File

@ -161,7 +161,7 @@ def launch(exe, in_terminal=False):
def run_gui(): def run_gui():
from kvui import App, ContainerLayout, GridLayout, Button, Label from kvui import App, ContainerLayout, GridLayout, Button, Label, ScrollBox, Widget
from kivy.uix.image import AsyncImage from kivy.uix.image import AsyncImage
from kivy.uix.relativelayout import RelativeLayout from kivy.uix.relativelayout import RelativeLayout
@ -185,11 +185,16 @@ def run_gui():
self.container = ContainerLayout() self.container = ContainerLayout()
self.grid = GridLayout(cols=2) self.grid = GridLayout(cols=2)
self.container.add_widget(self.grid) self.container.add_widget(self.grid)
self.grid.add_widget(Label(text="General")) self.grid.add_widget(Label(text="General", size_hint_y=None, height=40))
self.grid.add_widget(Label(text="Clients")) self.grid.add_widget(Label(text="Clients", size_hint_y=None, height=40))
button_layout = self.grid # make buttons fill the window tool_layout = ScrollBox()
tool_layout.layout.orientation = "vertical"
self.grid.add_widget(tool_layout)
client_layout = ScrollBox()
client_layout.layout.orientation = "vertical"
self.grid.add_widget(client_layout)
def build_button(component: Component): def build_button(component: Component) -> Widget:
""" """
Builds a button widget for a given component. Builds a button widget for a given component.
@ -200,31 +205,26 @@ def run_gui():
None. The button is added to the parent grid layout. None. The button is added to the parent grid layout.
""" """
button = Button(text=component.display_name) button = Button(text=component.display_name, size_hint_y=None, height=40)
button.component = component button.component = component
button.bind(on_release=self.component_action) button.bind(on_release=self.component_action)
if component.icon != "icon": if component.icon != "icon":
image = AsyncImage(source=icon_paths[component.icon], image = AsyncImage(source=icon_paths[component.icon],
size=(38, 38), size_hint=(None, 1), pos=(5, 0)) size=(38, 38), size_hint=(None, 1), pos=(5, 0))
box_layout = RelativeLayout() box_layout = RelativeLayout(size_hint_y=None, height=40)
box_layout.add_widget(button) box_layout.add_widget(button)
box_layout.add_widget(image) box_layout.add_widget(image)
button_layout.add_widget(box_layout) return box_layout
else: return button
button_layout.add_widget(button)
for (tool, client) in itertools.zip_longest(itertools.chain( for (tool, client) in itertools.zip_longest(itertools.chain(
self._tools.items(), self._miscs.items(), self._adjusters.items()), self._clients.items()): self._tools.items(), self._miscs.items(), self._adjusters.items()), self._clients.items()):
# column 1 # column 1
if tool: if tool:
build_button(tool[1]) tool_layout.layout.add_widget(build_button(tool[1]))
else:
button_layout.add_widget(Label())
# column 2 # column 2
if client: if client:
build_button(client[1]) client_layout.layout.add_widget(build_button(client[1]))
else:
button_layout.add_widget(Label())
return self.container return self.container

13
kvui.py
View File

@ -38,11 +38,13 @@ from kivy.clock import Clock
from kivy.factory import Factory from kivy.factory import Factory
from kivy.properties import BooleanProperty, ObjectProperty from kivy.properties import BooleanProperty, ObjectProperty
from kivy.metrics import dp from kivy.metrics import dp
from kivy.effects.scroll import ScrollEffect
from kivy.uix.widget import Widget from kivy.uix.widget import Widget
from kivy.uix.button import Button from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout from kivy.uix.gridlayout import GridLayout
from kivy.uix.layout import Layout from kivy.uix.layout import Layout
from kivy.uix.textinput import TextInput from kivy.uix.textinput import TextInput
from kivy.uix.scrollview import ScrollView
from kivy.uix.recycleview import RecycleView from kivy.uix.recycleview import RecycleView
from kivy.uix.tabbedpanel import TabbedPanel, TabbedPanelItem from kivy.uix.tabbedpanel import TabbedPanel, TabbedPanelItem
from kivy.uix.boxlayout import BoxLayout from kivy.uix.boxlayout import BoxLayout
@ -118,6 +120,17 @@ class ServerToolTip(ToolTip):
pass pass
class ScrollBox(ScrollView):
layout: BoxLayout
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.layout = BoxLayout(size_hint_y=None)
self.layout.bind(minimum_height=self.layout.setter("height"))
self.add_widget(self.layout)
self.effect_cls = ScrollEffect
class HovererableLabel(HoverBehavior, Label): class HovererableLabel(HoverBehavior, Label):
pass pass