// Menünün altındaki genel 16px emoji toolbar: sekme geçişi + toplu işler. import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../services/catia_provider.dart'; import '../services/detail_window_service.dart'; import '../services/session_service.dart'; import 'mini_toolbar.dart'; import '../theme/app_theme.dart'; class GlobalToolbar extends StatelessWidget { const GlobalToolbar({super.key}); @override Widget build(BuildContext context) { // 🚀 PERF (29. oturum): context.watch yerine select — bu toolbar 400ms'lik // aktif-pencere poll'u dahil HER notifyListeners()'da tüm MiniToolAction // listesini yeniden kuruyordu. Artık sadece burada GERÇEKTEN gösterilen // alanlar izleniyor (metodlar için read yeterli, provider sabit kalır). final s = context.select((p) => ( tab: p.tab, instanceSort: p.instanceSort, themeMode: p.themeMode, listMode: p.listMode, sessionBusy: p.sessionBusy, connectShortcut: p.sessionSettings.connectShortcut, connectAllBusy: p.connectAllBusy, openUnconnectedCount: p.openUnconnectedCount, saveAllBusy: p.saveAllBusy, problemCount: p.problemCount, )); final provider = context.read(); final isActive = s.tab == HomeTab.active; return Container( padding: const EdgeInsets.fromLTRB(6, 3, 6, 0), child: Row( children: [ Expanded( // 🖐 Boyutlandırma: pencere artık kullanıcı tarafından // daraltılabiliyor (bkz. home_screen.dart DragToResizeArea). // Bu toolbar'da ~15 aksiyon var; FittedBox olmadan dar // pencerede RenderFlex taşması (sarı/siyah çizgili hata) olurdu. // Kart toolbar'larındaki (catia_list_tile.dart) aynı desen: // sığmayınca ORANTILI küçülür, hiçbir buton listeden düşmez. child: FittedBox( fit: BoxFit.scaleDown, alignment: Alignment.centerLeft, child: MiniToolbar( size: 16, actions: [ MiniToolAction( emoji: '🟢', tooltip: 'Aktif listesi', tint: isActive ? AppColors.ok : null, onTap: () => provider.setTab(HomeTab.active), ), MiniToolAction( emoji: '🕘', tooltip: 'Geçmiş', tint: s.tab == HomeTab.history ? AppColors.violet : null, onTap: () => provider.setTab(HomeTab.history), ), // 🔎 Dosya arama modu: aktif CATIA listesinin YERİNE ana // pencereye gömülü Everything paneli geçer (bkz. // home_screen.dart / widgets/everything_search_panel.dart). // Tekrar tıklamak (zaten arama modundayken) aktif listeye // döner — ayrı bir "kapat" düğmesine gerek kalmasın diye. MiniToolAction( emoji: '🔎', tooltip: s.tab == HomeTab.search ? 'Dosya arama — tıkla: aktif listeye dön' : 'Dosya ara (Everything)', tint: s.tab == HomeTab.search ? AppColors.accent : null, onTap: () => provider.setTab( s.tab == HomeTab.search ? HomeTab.active : HomeTab.search), ), // ↕ Sıralama: tıkla → sıradaki sıralama (Görünüm menüsünden // doğrudan seçilebilir). Emoji mevcut sıralamayı gösterir; // varsayılan dışındaysa vurgulanır. MiniToolAction( emoji: s.instanceSort.emoji, tooltip: isActive ? 'Sıralama: ${s.instanceSort.label} — tıkla: ' '${s.instanceSort.next.label}' : 'Sıralama yalnız "Aktif" listesinde geçerli', tint: !isActive ? null : (s.instanceSort == InstanceSort.registered ? null : AppColors.accent), enabled: isActive, onTap: provider.cycleInstanceSort, ), // 🗂 Görünüm: düz liste ↔ masaüstüne göre gruplu. Emoji mevcut // modu gösterir; gruplu modda vurgulanır. // 🎨 Tema: koyu ↔ açık (emoji GEÇİLECEK temayı gösterir). MiniToolAction( emoji: s.themeMode == AppThemeMode.dark ? '☀️' : '🌙', tooltip: s.themeMode == AppThemeMode.dark ? 'Açık temaya geç' : 'Koyu temaya geç', onTap: provider.toggleThemeMode, ), MiniToolAction( emoji: s.listMode.emoji, tooltip: isActive ? 'Liste: ${s.listMode.label} — tıkla: ' '${s.listMode.next.label}' : 'Liste görünümü yalnız "Aktif" listesinde geçerli', tint: isActive && s.listMode == ListMode.byDesktop ? AppColors.accent : null, enabled: isActive, onTap: provider.toggleListMode, ), MiniToolAction( emoji: '➕', tooltip: s.sessionBusy ? 'Başka bir işlem sürüyor — bitmesini bekle' : 'Yeni CATIA: ayarlardaki başlatıcıyla CATIA açar ve ' 'bağlanmasını bekler (macro bağlanmazsa bağlantı ' 'kısayolunu dener)', tint: AppColors.ok, enabled: !s.sessionBusy, onTap: provider.addInstance, ), // 🔌 Bağlanmamış (kehribar) tüm CATIA'lara bağlantı kısayolunu // sırayla gönderir. Kısayol Ayarlar'da tanımlı değilse hiç // gösterilmez (kart üzerindeki 🔌 ile aynı kural). if (s.connectShortcut.trim().isNotEmpty) MiniToolAction( emoji: '🔌', tooltip: s.connectAllBusy ? 'Bağlantı kısayolu gönderiliyor…' : (s.openUnconnectedCount == 0 ? 'Bağlanmamış açık CATIA yok' : 'Bağlanmamış ${s.openUnconnectedCount} ' 'CATIA\'yı bağla: her birini öne getirip ' 'Ayarlar\'daki kısayolu gönderir (CATIA\'da ' 'bağlantı makrosu bu kısayola atanmış olmalı)'), tint: AppColors.ok, enabled: isActive && !s.connectAllBusy && s.openUnconnectedCount > 0, onTap: provider.triggerConnectShortcutAll, ), MiniToolAction( emoji: '💽', tooltip: 'Tüm açık dökümanları kaydet: bağlı her CATIA\'daki kaydedilmemiş dökümanlar (yeni/yolsuz olanlar atlanır)', tint: AppColors.ok, enabled: !s.saveAllBusy && !s.sessionBusy, onTap: provider.saveAllDocuments, ), MiniToolAction( emoji: '💾', tooltip: 'Oturumu dosyaya kaydet: tüm bağlı CATIA\'lardaki dökümanlar (nereye kaydedeceğin sorulur)', tint: AppColors.accent, enabled: !s.sessionBusy, onTap: provider.saveSessionToFile, ), MiniToolAction( emoji: '📂', tooltip: 'Oturum dosyası aç: dosyayı seç, sonra yeni CATIA\'da ya da açık bir CATIA\'da aç', tint: AppColors.accent, enabled: !s.sessionBusy, onTap: provider.openSessionFromFile, ), // MiniToolAction( // emoji: '▶️', // tooltip: 'Tümünü başlat', // tint: AppColors.ok, // onTap: provider.startAll, // ), // MiniToolAction( // emoji: '⏹', // tooltip: 'Tümünü durdur', // tint: AppColors.warn, // onTap: provider.stopAll, // ), // MiniToolAction( // emoji: '🔄', // tooltip: 'Yenile', // onTap: provider.refreshAll, // ), MiniToolAction( emoji: '🧹', tooltip: 'Bağlantısız kayıtları temizle', onTap: provider.clearIdle, ), // MiniToolAction( // emoji: '🗗', // tooltip: 'Detay penceresi aç', // onTap: () => DetailWindowService.openDetail( // title: provider.selectedInstance?.title ?? 'Detay', // ), // ), MiniToolAction( emoji: '⚙️', tooltip: 'Ayarlar', onTap: provider.openSettingsWindow, ), ], ), ), ), if (s.problemCount > 0) Container( margin: const EdgeInsets.only(left: 4), padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 1), decoration: BoxDecoration( color: AppColors.danger, borderRadius: BorderRadius.circular(8), ), child: Text( '${s.problemCount}', style: const TextStyle( color: Colors.white, fontSize: 9, fontWeight: FontWeight.w700, height: 1.0, ), ), ), ], ), ); } }