Launcher: make launcher scrollable (#2881)
This commit is contained in:
parent
ad3ffde785
commit
01cf60f48d
32
Launcher.py
32
Launcher.py
|
@ -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
13
kvui.py
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue