tools
This commit is contained in:
72
src/tools/simple_chat_pydantic/auto_scroll_area.py
Normal file
72
src/tools/simple_chat_pydantic/auto_scroll_area.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from typing import Optional
|
||||
from nicegui import ui
|
||||
|
||||
|
||||
class AutoScrollArea(ui.scroll_area):
|
||||
"""A scroll area that automatically scrolls to bottom when new content is added
|
||||
|
||||
Features:
|
||||
- Auto-scrolls to bottom when at bottom and new content arrives
|
||||
- Stops auto-scroll when user scrolls up manually
|
||||
- Resumes auto-scroll when user scrolls back to bottom
|
||||
"""
|
||||
|
||||
_auto_scroll_enabled: bool = True
|
||||
_auto_scroll_timer: Optional[ui.timer] = None
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Set up scroll monitoring
|
||||
# self._handle_scroll
|
||||
self.on_scroll(self._handle_scroll_event)
|
||||
self.on('wheel', self._handle_wheel, ['deltaY'])
|
||||
|
||||
# Create timer for auto-scrolling
|
||||
self._auto_scroll_timer = ui.timer(0.1, lambda: self.scroll_to(percent=1))
|
||||
self._auto_scroll_timer.activate()
|
||||
|
||||
def _scroll_event_test(self, e):
|
||||
print(e.vertical_percentage)
|
||||
|
||||
def _handle_scroll_event(self, event_data):
|
||||
"""Handle scroll events to detect when user is at bottom"""
|
||||
|
||||
if not self._auto_scroll_timer:
|
||||
print('no timer instantiated.')
|
||||
return
|
||||
|
||||
# If scrolled to bottom (100%), enable auto-scroll
|
||||
if event_data.vertical_percentage > 0.99: # Using 0.99 for some tolerance
|
||||
if not self._auto_scroll_timer.active:
|
||||
self._auto_scroll_timer.activate()
|
||||
|
||||
def _handle_wheel(self, event_data):
|
||||
"""Handle mouse wheel events to detect manual scrolling"""
|
||||
delta_y = event_data.args['deltaY']
|
||||
if not self._auto_scroll_timer:
|
||||
print('no timer instantiated.')
|
||||
return
|
||||
# If scrolling up (negative delta), disable auto-scroll
|
||||
if delta_y < 0:
|
||||
if self._auto_scroll_timer.active:
|
||||
self._auto_scroll_timer.deactivate()
|
||||
|
||||
def enable_auto_scroll(self):
|
||||
"""Manually enable auto-scrolling"""
|
||||
if self._auto_scroll_timer:
|
||||
if not self._auto_scroll_timer.active:
|
||||
self._auto_scroll_timer.activate()
|
||||
|
||||
def disable_auto_scroll(self):
|
||||
"""Manually disable auto-scrolling"""
|
||||
|
||||
if self._auto_scroll_timer:
|
||||
if self._auto_scroll_timer.active:
|
||||
self._auto_scroll_timer.deactivate()
|
||||
|
||||
def cleanup(self):
|
||||
"""Clean up timer when component is destroyed"""
|
||||
if self._auto_scroll_timer:
|
||||
self._auto_scroll_timer.deactivate()
|
||||
self._auto_scroll_timer = None
|
||||
Reference in New Issue
Block a user