#!/usr/bin/env python3 """ EU-Utility - Core Functionality Demo Demonstrates all the implemented core features: - Dashboard Widgets (System Status, Quick Actions, Recent Activity, Plugin Grid) - Widget Gallery (Add, configure, remove widgets) - Enhanced Activity Bar (Pinned plugins, app drawer, search) - Enhanced Settings Panel (Full persistence via SQLite) - Data Layer (SQLite storage, preferences, activity logging) Usage: python core_functionality_demo.py """ import sys from pathlib import Path # Add parent to path sys.path.insert(0, str(Path(__file__).parent.parent)) from PyQt6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QStackedWidget ) from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QColor # Import our new core components from core.data import get_sqlite_store, PluginState from core.widgets import ( SystemStatusWidget, QuickActionsWidget, RecentActivityWidget, PluginGridWidget, DashboardWidgetManager ) from core.dashboard_enhanced import EnhancedDashboard, DashboardContainer from core.activity_bar_enhanced import EnhancedActivityBar from core.ui.settings_panel import EnhancedSettingsPanel class DemoWindow(QMainWindow): """Main demo window showcasing all core functionality.""" def __init__(self): super().__init__() self.setWindowTitle("EU-Utility Core Functionality Demo") self.setMinimumSize(1200, 800) # Initialize data store self.data_store = get_sqlite_store() self._log_session_start() self._setup_ui() self._create_demo_data() def _setup_ui(self): """Setup the demo UI.""" # Central widget central = QWidget() self.setCentralWidget(central) layout = QHBoxLayout(central) layout.setContentsMargins(20, 20, 20, 20) layout.setSpacing(20) # Sidebar navigation sidebar = self._create_sidebar() layout.addWidget(sidebar) # Main content area self.content = QStackedWidget() self.content.setStyleSheet(""" QStackedWidget { background-color: #1a1f2e; border-radius: 12px; } """) layout.addWidget(self.content, 1) # Add demo pages self._add_demo_pages() def _create_sidebar(self) -> QWidget: """Create sidebar navigation.""" sidebar = QWidget() sidebar.setFixedWidth(200) sidebar.setStyleSheet(""" QWidget { background-color: #252b3d; border-radius: 12px; } """) layout = QVBoxLayout(sidebar) layout.setSpacing(10) layout.setContentsMargins(15, 20, 15, 20) # Title title = QLabel("🎮 EU-Utility") title.setStyleSheet("font-size: 18px; font-weight: bold; color: #ff8c42;") layout.addWidget(title) version = QLabel("v2.1.0 - Core Demo") version.setStyleSheet("color: rgba(255, 255, 255, 100); font-size: 11px;") layout.addWidget(version) layout.addSpacing(20) # Navigation buttons nav_items = [ ("📊 Dashboard", 0), ("🎨 Widget Gallery", 1), ("📌 Activity Bar", 2), ("⚙️ Settings", 3), ("💾 Data Layer", 4), ] for text, index in nav_items: btn = QPushButton(text) btn.setStyleSheet(""" QPushButton { background-color: transparent; color: rgba(255, 255, 255, 180); border: none; padding: 12px; text-align: left; border-radius: 8px; font-size: 13px; } QPushButton:hover { background-color: rgba(255, 255, 255, 10); color: white; } QPushButton:checked { background-color: #4a9eff; color: white; font-weight: bold; } """) btn.setCheckable(True) btn.clicked.connect(lambda checked, idx=index: self._switch_page(idx)) layout.addWidget(btn) if index == 0: btn.setChecked(True) self._nav_buttons = [btn] else: self._nav_buttons.append(btn) layout.addStretch() # Status self.status_label = QLabel("System Ready") self.status_label.setStyleSheet("color: #4ecdc4; font-size: 11px;") self.status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) layout.addWidget(self.status_label) return sidebar def _add_demo_pages(self): """Add demo pages to content stack.""" # Page 1: Dashboard self.dashboard = EnhancedDashboard(parent=self) self.dashboard.action_triggered.connect(self._on_dashboard_action) self.content.addWidget(self.dashboard) # Page 2: Widget Gallery gallery_page = self._create_gallery_page() self.content.addWidget(gallery_page) # Page 3: Activity Bar Demo activity_page = self._create_activity_page() self.content.addWidget(activity_page) # Page 4: Settings self.settings = EnhancedSettingsPanel(self, self) self.content.addWidget(self.settings) # Page 5: Data Layer data_page = self._create_data_page() self.content.addWidget(data_page) def _create_gallery_page(self) -> QWidget: """Create widget gallery demo page.""" page = QWidget() layout = QVBoxLayout(page) layout.setContentsMargins(30, 30, 30, 30) header = QLabel("🎨 Widget Gallery") header.setStyleSheet("font-size: 24px; font-weight: bold; color: white;") layout.addWidget(header) desc = QLabel("Dashboard widgets are modular components that provide information and quick actions.") desc.setStyleSheet("color: rgba(255, 255, 255, 150); font-size: 13px;") desc.setWordWrap(True) layout.addWidget(desc) layout.addSpacing(20) # Widget showcase showcase = QWidget() showcase_layout = QHBoxLayout(showcase) showcase_layout.setSpacing(20) # System Status Widget sys_widget = SystemStatusWidget() showcase_layout.addWidget(sys_widget) # Quick Actions Widget actions_widget = QuickActionsWidget() actions_widget.setFixedWidth(300) showcase_layout.addWidget(actions_widget) # Recent Activity Widget activity_widget = RecentActivityWidget() showcase_layout.addWidget(activity_widget) showcase_layout.addStretch() layout.addWidget(showcase) layout.addStretch() # Info info = QLabel("💡 These widgets are automatically managed by the DashboardWidgetManager and persist their state via SQLite.") info.setStyleSheet("color: #4ecdc4; font-size: 12px; padding: 10px; background-color: rgba(78, 205, 196, 20); border-radius: 6px;") info.setWordWrap(True) layout.addWidget(info) return page def _create_activity_page(self) -> QWidget: """Create activity bar demo page.""" page = QWidget() layout = QVBoxLayout(page) layout.setContentsMargins(30, 30, 30, 30) header = QLabel("📌 Activity Bar") header.setStyleSheet("font-size: 24px; font-weight: bold; color: white;") layout.addWidget(header) desc = QLabel("Windows 11-style taskbar with pinned plugins, app drawer, and search functionality.") desc.setStyleSheet("color: rgba(255, 255, 255, 150); font-size: 13px;") desc.setWordWrap(True) layout.addWidget(desc) layout.addSpacing(30) # Features features = QLabel(""" Features:
• Drag-to-pin plugins from the app drawer
• Search functionality for quick access
• Auto-hide when not in use
• Configurable position (top/bottom)
• Persistent pinned plugin state """) features.setStyleSheet("color: rgba(255, 255, 255, 200); font-size: 13px; line-height: 1.6;") features.setTextFormat(Qt.TextFormat.RichText) layout.addWidget(features) layout.addSpacing(30) # Demo button demo_btn = QPushButton("🚀 Show Activity Bar Demo") demo_btn.setStyleSheet(""" QPushButton { background-color: #4a9eff; color: white; padding: 15px 30px; border: none; border-radius: 8px; font-weight: bold; font-size: 14px; } QPushButton:hover { background-color: #3a8eef; } """) demo_btn.clicked.connect(self._show_activity_bar) layout.addWidget(demo_btn, alignment=Qt.AlignmentFlag.AlignCenter) layout.addStretch() return page def _create_data_page(self) -> QWidget: """Create data layer demo page.""" page = QWidget() layout = QVBoxLayout(page) layout.setContentsMargins(30, 30, 30, 30) header = QLabel("💾 Data Layer (SQLite)") header.setStyleSheet("font-size: 24px; font-weight: bold; color: white;") layout.addWidget(header) desc = QLabel("Persistent storage using SQLite with automatic backups and migration support.") desc.setStyleSheet("color: rgba(255, 255, 255, 150); font-size: 13px;") desc.setWordWrap(True) layout.addWidget(desc) layout.addSpacing(20) # Stats display self.data_stats = QLabel("Loading statistics...") self.data_stats.setStyleSheet(""" color: rgba(255, 255, 255, 200); font-size: 13px; font-family: monospace; background-color: rgba(0, 0, 0, 30); padding: 20px; border-radius: 8px; """) layout.addWidget(self.data_stats) # Refresh button refresh_btn = QPushButton("🔄 Refresh Statistics") refresh_btn.setStyleSheet(""" QPushButton { background-color: rgba(255, 255, 255, 10); color: white; padding: 10px 20px; border: none; border-radius: 6px; } QPushButton:hover { background-color: #4ecdc4; color: #141f23; } """) refresh_btn.clicked.connect(self._refresh_data_stats) layout.addWidget(refresh_btn) layout.addSpacing(20) # Features list features = QLabel(""" Data Layer Features:
• Plugin state persistence (enabled/disabled, settings)
• User preferences with categories
• Session tracking and analytics
• Activity logging for debugging
• Dashboard widget configurations
• Hotkey configurations
• Thread-safe database access
• Automatic database optimization """) features.setStyleSheet("color: rgba(255, 255, 255, 180); font-size: 12px; line-height: 1.5;") features.setTextFormat(Qt.TextFormat.RichText) layout.addWidget(features) layout.addStretch() # Initial refresh QTimer.singleShot(100, self._refresh_data_stats) return page def _switch_page(self, index: int): """Switch to a different demo page.""" self.content.setCurrentIndex(index) # Update nav button states for i, btn in enumerate(self._nav_buttons): btn.setChecked(i == index) # Update status pages = ["Dashboard", "Widget Gallery", "Activity Bar", "Settings", "Data Layer"] self.status_label.setText(f"Viewing: {pages[index]}") def _on_dashboard_action(self, action_id: str): """Handle dashboard quick action.""" print(f"[Demo] Dashboard action: {action_id}") if action_id == 'settings': self._switch_page(3) elif action_id == 'plugins': self._switch_page(1) def _show_activity_bar(self): """Show the activity bar demo.""" # Create activity bar self.activity_bar = EnhancedActivityBar(None, self) self.activity_bar.show() self.status_label.setText("Activity Bar: Visible") # Log self.data_store.log_activity('demo', 'activity_bar_shown') def _refresh_data_stats(self): """Refresh data statistics display.""" stats = self.data_store.get_stats() text = f""" Database Statistics: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Plugin States: {stats.get('plugin_states', 0):>6} User Preferences: {stats.get('user_preferences', 0):>6} Sessions: {stats.get('sessions', 0):>6} Activity Entries: {stats.get('activity_log', 0):>6} Dashboard Widgets: {stats.get('dashboard_widgets', 0):>6} Hotkeys: {stats.get('hotkeys', 0):>6} ────────────────────────────────── Database Size: {stats.get('db_size_mb', 0):>6.2f} MB ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""" self.data_stats.setText(text) def _log_session_start(self): """Log session start.""" self.data_store.log_activity( category='demo', action='session_start', details='Core functionality demo started' ) def _create_demo_data(self): """Create some demo data.""" # Save a plugin state state = PluginState( plugin_id='demo_plugin', enabled=True, version='1.0.0', settings={'key': 'value'} ) self.data_store.save_plugin_state(state) # Save some preferences self.data_store.set_preference('demo_mode', True, 'general') self.data_store.set_preference('demo_features', ['widgets', 'activity_bar', 'settings'], 'demo') # Log activities self.data_store.log_activity('demo', 'widgets_loaded', 'System Status, Quick Actions, Recent Activity') self.data_store.log_activity('demo', 'activity_bar_initialized') self.data_store.log_activity('demo', 'settings_panel_ready') def main(): """Run the demo application.""" app = QApplication(sys.argv) # Set application style app.setStyle('Fusion') # Apply dark stylesheet app.setStyleSheet(""" QMainWindow { background-color: #0f1419; } QWidget { font-family: 'Segoe UI', sans-serif; } QScrollBar:vertical { background: rgba(0, 0, 0, 50); width: 8px; border-radius: 4px; } QScrollBar::handle:vertical { background: rgba(255, 255, 255, 30); border-radius: 4px; } """) # Create and show window window = DemoWindow() window.show() print("=" * 60) print("EU-Utility Core Functionality Demo") print("=" * 60) print() print("Features demonstrated:") print(" ✓ Dashboard Widgets (System Status, Quick Actions, Recent Activity)") print(" ✓ Widget Gallery (Add, configure, manage widgets)") print(" ✓ Enhanced Activity Bar (Pinned plugins, app drawer, search)") print(" ✓ Enhanced Settings Panel (Full SQLite persistence)") print(" ✓ Data Layer (SQLite storage, preferences, activity logging)") print() print("Navigate using the sidebar to explore each feature!") print("=" * 60) sys.exit(app.exec()) if __name__ == '__main__': main()