defined SideBar GUI with KivyLang

This commit is contained in:
Emendir
2025-02-05 19:49:58 +01:00
parent 8762110dea
commit c0ae9a4fd4
4 changed files with 77 additions and 49 deletions

View File

@@ -1,5 +1 @@
## Next Steps
- [ ] Message Class:
- [ ] methods for metadata: author, recipient?
- [ ] message content format
- [ ] research existing standards

4
__main__.py Normal file
View File

@@ -0,0 +1,4 @@
import sys
import os
os.chdir(os.path.join(os.path.dirname(__file__), "src"))
os.system(f"{sys.executable} -m endra_app")

View File

@@ -1,32 +1,30 @@
# side_bar.py
from loguru import logger
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.lang import Builder
from endra import Profile
from endra import Profile, Correspondence
import os
# Load the KV file
KV_FILE= os.path.join(os.path.dirname(__file__), "style.kv")
KV_FILE = os.path.join(os.path.dirname(__file__), "style.kv")
Builder.load_file(KV_FILE)
class CorrespondenceHeader(BoxLayout):
def __init__(self, label_text, **kwargs):
super().__init__(**kwargs)
self.orientation = 'horizontal'
self.size_hint_y = None
self.height = 50
# Create widgets
class CorrespondenceHeaderView(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.label = self.ids.label
self.button1 = self.ids.button1
self.button2 = self.ids.button2
class CorrespondenceHeaderController(CorrespondenceHeader):
def __init__(self, label_text, **kwargs):
super().__init__(label_text, **kwargs)
self.label.text = label_text
class CorrespondenceHeader(CorrespondenceHeaderView):
def __init__(self, correspondence:Correspondence, **kwargs):
super().__init__(**kwargs)
self.label.text = correspondence.id
# Bind events
self.label.bind(on_touch_down=self.on_label_click)
self.button1.bind(on_press=self.on_button1_click)
@@ -41,52 +39,53 @@ class CorrespondenceHeaderController(CorrespondenceHeader):
def on_button2_click(self, instance):
print(f"Button 2 in '{self.label.text}' clicked!")
from loguru import logger
class SideBar(BoxLayout):
def __init__(self, profile:Profile|None,**kwargs):
class SideBarView(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.scroll_view = self.ids.scroll_view
self.scroll_layout = self.ids.scroll_layout
self.add_corresp_btn = self.ids.add_corresp_btn
self.scroll_layout.bind(
minimum_height=self.scroll_layout.setter('height')
)
class SideBar(SideBarView):
def __init__(self, profile: Profile | None, **kwargs):
super().__init__(**kwargs)
self.profile = profile
self.orientation = 'vertical'
self.size_hint = (0.3, 1)
# Add scroll view
self.scroll_view = ScrollView(size_hint=(1, 1))
self.scroll_layout = GridLayout(cols=1, spacing=10, size_hint_y=None)
self.scroll_layout.bind(minimum_height=self.scroll_layout.setter('height'))
self.scroll_view.add_widget(self.scroll_layout)
self.add_widget(self.scroll_view)
# Add button for testing
self.add_widget(Button(text='Add Widget', size_hint=(1, None), height=50, on_press=self.create_correspondence))
self.add_corresp_btn.bind(on_press=self.create_correspondence)
self.reload_correspondences()
def reload_correspondences(self):
logger.info("Reloading correspondences...")
self.remove_all_widgets()
if self.profile:
for correspondence_id in self.profile.get_active_correspondences():
self.add_widget_to_scroll(correspondence_id)
self.add_widget_to_scroll(self.profile.get_correspondence(correspondence_id))
def create_correspondence(self, instance=None):
logger.info("Creating correspondence...")
self.profile.create_correspondence()
self.reload_correspondences()
def add_widget_to_scroll(self, correspondence_name:str):
widget = CorrespondenceHeaderController(label_text=correspondence_name)
def add_widget_to_scroll(self, correspondence):
widget = CorrespondenceHeader(correspondence=correspondence)
self.scroll_layout.add_widget(widget)
def remove_widget_from_scroll(self, index):
if 0 <= index < len(self.scroll_layout.children):
self.scroll_layout.remove_widget(self.scroll_layout.children[index])
self.scroll_layout.remove_widget(
self.scroll_layout.children[index])
def remove_all_widgets(self):
while(len(self.scroll_layout.children)):
while (len(self.scroll_layout.children)):
self.scroll_layout.remove_widget(self.scroll_layout.children[0])

View File

@@ -1,4 +1,4 @@
<CorrespondenceHeader>:
<CorrespondenceHeaderView>:
orientation: 'horizontal'
size_hint_y: None
height: 50
@@ -6,7 +6,7 @@
padding: 5
canvas.before:
Color:
rgba: 0.9, 0.9, 0.9, 1 # Background color (light gray)
rgba: 0.1, 0.1, 0.1, 1 # background colour
Rectangle:
size: self.size
pos: self.pos
@@ -15,11 +15,11 @@
id: button1
text: "Button 1"
size_hint: 0.2, 1
background_color: 0.2, 0.6, 1, 1 # Light blue button
background_color: 0.2, 0.6, 1, 1
Label:
id: label
font_size: 16
color: 0, 0, 0, 1 # Black text
color: 0.9, 0.9, 0.9, 1
size_hint: 0.6, 1
@@ -27,4 +27,33 @@
id: button2
text: "Button 2"
size_hint: 0.2, 1
background_color: 0.8, 0.3, 0.3, 1
<SideBarView>
orientation: 'vertical'
size_hint_x: 0.3
size_hint_y: 1
spacing: 5
padding: 5
canvas.before:
Color:
rgba: 0.2, 0.2, 0.2, 1 # background colour
Rectangle:
size: self.size
pos: self.pos
ScrollView:
id: scroll_view
size_hint: 1, 1
GridLayout:
id: scroll_layout
cols: 1
spacing: 10
size_hint_y: None
Button:
id: add_corresp_btn
text: "Add Widget"
size_hint: 1, None
height: 50
background_color: 0.8, 0.3, 0.3, 1 # Light red button