import flet as ft import logging from config import config, get_config class NoraAIChatUI: def __init__(self): self.page = None self.chat_history = ft.ListView(expand=True, spacing=10, padding=20) self.message_input = ft.TextField( label="اكتب رسالتك هنا...", multiline=True, min_lines=1, max_lines=3, expand=True ) self.system_info = ft.Text("", size=12, color=ft.colors.GREY_600) def build_ui(self): """بناء واجهة المستخدم""" return ft.Container( content=ft.Column([ # الهيدر ft.Container( content=ft.Column([ ft.Text( "🌟 نورا - المساعد الذكي المتطور", size=24, weight=ft.FontWeight.BOLD, color=ft.colors.BLUE_900 ), self.system_info, ]), padding=20, bgcolor=ft.colors.BLUE_50, border_radius=10, margin=10 ), # سجل المحادثة ft.Container( content=self.chat_history, expand=True, border=ft.border.all(1, ft.colors.GREY_300), border_radius=10, margin=10, padding=10 ), # منطقة الإدخال ft.Container( content=ft.Row([ self.message_input, ft.IconButton( icon=ft.Icons.SEND, icon_color=ft.colors.WHITE, bgcolor=ft.colors.BLUE_500, on_click=self.send_message ) ]), padding=20, bgcolor=ft.colors.GREY_50 ), # لوحة التحكم self.build_control_panel() ]), expand=True ) def build_control_panel(self): """بناء لوحة التحكم""" return ft.Container( content=ft.Row([ ft.TextButton("🔄 تحديث النظام", on_click=self.refresh_system), ft.TextButton("💾 حفظ المحادثة", on_click=self.save_chat), ft.TextButton("⚙️ الإعدادات", on_click=self.show_settings), ], alignment=ft.MainAxisAlignment.CENTER), padding=10, margin=10 ) def add_message(self, sender: str, message: str, is_user: bool = True): """إضافة رسالة إلى سجل المحادثة""" message_color = ft.colors.BLUE_700 if is_user else ft.colors.GREEN_700 alignment = ft.MainAxisAlignment.END if is_user else ft.MainAxisAlignment.START icon = "👤" if is_user else "🤖" message_widget = ft.Container( content=ft.Row([ ft.Text(icon, size=16), ft.Container( content=ft.Text(message, color=ft.colors.WHITE), padding=15, border_radius=15, bgcolor=message_color, expand=True ) ], alignment=alignment), margin=5 ) self.chat_history.controls.append(message_widget) self.chat_history.scroll_to(offset=-1, duration=300) async def send_message(self, e): """إرسال رسالة""" message = self.message_input.value.strip() if not message: return # إضافة رسالة المستخدم self.add_message("أنت", message, is_user=True) self.message_input.value = "" # محاكاة رد نورا (سيتم استبدالها بالاتصال بالنظام الفعلي) await self.simulate_nora_response(message) async def simulate_nora_response(self, user_message: str): """محاكاة رد نورا (ستستبدل بالاتصال بالنظام الفعلي)""" # إضافة رسالة محاكاة self.add_message("نورا", "🤔 أفكر في رد مناسب...", is_user=False) # محاكاة وقت المعالجة import asyncio await asyncio.sleep(1) # ردود محاكاة responses = [ "أهلاً بك! كيف يمكنني مساعدتك اليوم؟ 🌸", "هذا سؤال مثير للاهتمام! دعني أفكر فيه... 💭", "شكراً لمشاركتي هذا! لدي بعض الأفكار حول الموضوع. ✨", "أفهم ما تقصد. هل تريد أن أشرح أكثر؟ 🌟" ] import random response = random.choice(responses) # تحديث الرد النهائي self.chat_history.controls.pop() # إزالة رسالة "أفكر" self.add_message("نورا", response, is_user=False) async def refresh_system(self, e): """تحديث معلومات النظام""" cfg = get_config() system_status = f"النموذج: {cfg['preferred_models'][0]} | الذاكرة: {'مفعل' if cfg['enable_memory'] else 'معطل'}" self.system_info.value = system_status await self.page.update_async() async def save_chat(self, e): """حفظ المحادثة""" self.add_message("النظام", "💾 تم حفظ المحادثة بنجاح!", is_user=False) async def show_settings(self, e): """عرض إعدادات النظام""" # سيتم تطوير هذه الوظيفة لاحقاً self.add_message("النظام", "⚙️ شاشة الإعدادات قيد التطوير...", is_user=False) def start_flet(port=5000): """بدء واجهة Flet""" async def main(page: ft.Page): # إعدادات الصفحة page.title = "نورا - المساعد الذكي المتطور" page.theme_mode = ft.ThemeMode.LIGHT page.padding = 0 page.fonts = { "Arabic": "https://fonts.googleapis.com/css2?family=Tajawal:wght@400;500;700&display=swap" } page.theme = ft.Theme(font_family="Arabic") # تهيئة الواجهة ui = NoraAIChatUI() ui.page = page # إضافة الواجهة إلى الصفحة page.add(ui.build_ui()) # تحديث معلومات النظام await ui.refresh_system(None) # رسالة ترحيبية ui.add_message("نورا", "أهلاً وسهلاً! أنا نورا، مساعدتك الذكية. كيف يمكنني مساعدتك اليوم؟ 🌟", is_user=False) # تشغيل التطبيق try: ft.app( target=main, port=port, view=ft.WEB_BROWSER, assets_dir="assets" ) except Exception as e: logging.error(f"خطأ في تشغيل واجهة Flet: {e}") print(f"❌ فشل تشغيل الواجهة على المنفذ {port}") print(f"🔧 الخطأ: {e}")