# FikoCATIA Merkez

**CATIA V5** ortamında çoklu oturumu yöneten Windows masaüstü uygulaması.
Açık CATIA'ları canlı takip eder, sanal masaüstülerine taşır, oturum
kaydeder/geri yükler, makro ve komutları bağlama duyarlı bir paletten
çalıştırır ve dosya aramasını **Everything** üzerinden yapar.

---

## Mimari

Üç katmanlı hibrit yapı: Flutter arayüzü, yerel C++ Win32/COM köprüsü ve
CATIA'nın kendi otomasyon API'si.

```
CATIA V5 (CNEXT.exe)
  └─ baglan.catscript → CreateObject("FikoCatia.Bridge")
C++ Runner  (windows/runner/, ~7.000 satır)  ← COM sunucusu Flutter exe'inin İÇİNDE
  ├─ com_bridge.cpp      COM sunucu + DocPoller + iş kuyruğu
  ├─ flutter_window.cpp  IVirtualDesktopManager, pencere yönetimi
  ├─ palette_window.cpp  NOACTIVATE dock, sürükle/boyutlandırma
  └─ window_thumb.cpp    pencere küçük resimleri
Flutter/Dart  (lib/, ~30.000 satır)
  └─ CatiaProvider — TEK state kaynağı
```

**En önemli karar:** COM sunucusu ayrı bir süreç değil, `fikocatia.exe`
içinde gömülüdür. CATIA'dan `RegisterInstance` çağrıldığı an veri Dart'a
push edilir — dosya yazma, polling ve senkron sorunu yoktur.
Ayrıntı: `windows/runner/com_bridge.h` baş yorumu.

### Pencereler

Her pencere kendi Flutter engine/isolate'unda açılır; biri donunca
diğerleri çalışmaya devam eder (`lib/main.dart`).

| Pencere | Argüman | Özellik |
|---|---|---|
| Ana (tray popup) | — | Çerçevesiz, aero-cam |
| 🧰 Palet | `palette` | `NOACTIVATE` + `TOPMOST` (CATIA klavye odağını çalmaz) |
| ⚙ Ayarlar | `settings` | Gizlenerek yeniden kullanılır |
| 📂 Oturum seçici | `sessionpicker` | Gizlenerek yeniden kullanılır |
| 📧 Posta | `mail` | Gizlenerek yeniden kullanılır, resizable + frameless |

Pencereler arası **tek yazıcı** kuralı geçerlidir: alt pencereler karar
vermez, isteği ana pencereye yollar.

### 📧 Posta Yöneticisi

Ana popup ▸ **Araçlar ▸ Posta Yöneticisi** ile açılan **bağımsız** bir
penceredir: CATIA oturumu, palet veya ayarlarla hiçbir state paylaşmaz.
Birden fazla adresi (hesap başına renkli şerit) takip eder; mailleri
okundu/yıldız/işaret ile düzenler, klasörlere taşır ve serbest metinle arar.

| Katman | Dosya | Rol |
|---|---|---|
| Saf | `services/mail_store.dart` | filtre, sayaç, taşıma, sıralama (testli) |
| Model | `models/mail_account.dart`, `mail_message.dart` | JSON gidiş-dönüşü |
| Veri | `services/mail_repository.dart` → `mail.json` | kalıcılık (atomic yazma) |
| Pencere | `services/mail_window_service.dart`, `screens/mail_window_screen.dart` | açma/handshake |
| Arayüz | `widgets/mail_sidebar.dart`, `mail_list_tile.dart`, `mail_reader_pane.dart` | 3 kolon düzen |

**Aşama 1 (şu an):** veri `data/mock_mail_data.dart`'dan gelir; kullanıcının
yaptığı işler `mail.json`'a yazılır. **Aşama 2:** `services/mail_service.dart`
ile gerçek IMAP eklenir — arayüz değişmez, `MailRepository` arayüzü aynı kalır.
Şifre **hiçbir koşulda** `mail.json`'a yazılmaz (Aşama 2'de DPAPI).

---

## Gereksinimler

| Bileşen | Zorunlu | Not |
|---|---|---|
| **CATIA V5** (CNEXT.exe) | Evet | Uygulama CATIA olmadan boş açılır |
| **Windows 10 1809+** | Evet | `IVirtualDesktopManager` sanal masaüstü için |
| **Voidtools Everything** | Hayır | Arama paneli için; HTTP API + port ayarlanabilir |
| **PowerShell `VirtualDesktop`** | Hayır | Masaüstü oluşturma/adlandırma/geçiş (ayarlardan kontrol edilir) |

```powershell
Install-Module -Name VirtualDesktop -Scope CurrentUser   # isteğe bağlı
```

### CATIA'ya bağlama

CATIA içindeki `CATMain` bloğuna `baglan.catscript` içeriği eklenir.
Makro, `CreateObject("FikoCatia.Bridge")` ile uygulamaya kendini kaydeder.

---

## Derleme

```powershell
flutter pub get
flutter build windows --release     # .\build\windows\x64\runner\Release\fikocatia.exe
```

Açılışta otomatik geri yükleme yapılmasın isteniyorsa
`%LOCALAPPDATA%\FikoCatia\settings.json` → `autoRestore: false`.

### Teşhis bayrakları

```powershell
fikocatia.exe --open-detail           # detay penceresi + tray popup kanal sağlığı
fikocatia.exe --selftest-settings     # ayarlar penceresi el sıkışması
fikocatia.exe --selftest-session      # oturum kaydet/geri yükleme (dosya komutuyla)
```

---

## Dosya düzeni

```
lib/
  main.dart                 giriş + pencere yönlendirme + hata günlüğü
  models/                   CatiaInstance, CatiaDocument, CatiaStatus, HistoryEntry
  services/                 servis katmanı (24 dosya)
    catia_provider.dart     TEK state kaynağı (ChangeNotifier)
    native_bridge.dart      "fikocatia/native" kanalı (44 metot)
    session_service.dart    oturum/ayar kalıcılığı, sıralama enum'ları
    palette_*.dart          palet modeli, durum ve yerleşim (saf + servis)
    virtual_desktop_service.dart  PowerShell VirtualDesktop köprüsü
  screens/                  ana ekranlar (6)
  widgets/                  kart, arama paneli, palet kartı, diyaloglar (26)
  theme/                    açık/koyu tema, çalışma anında değişen palet
test/                       237 birim test (saf katman odaklı)
```

**Saf katman deseni:** native'e ve UI'a bağlı olmayan mantık
(`palette_state`, `window_documents`, `open_ghosts`, `desktop_groups`,
`restore_plan`, `catia_file_types`) ayrı dosyalarda tutulur ve doğrudan
test edilir.

---

## Kalıcı dosyalar

`%LOCALAPPDATA%\FikoCatia\`

| Dosya | İçerik |
|---|---|
| `settings.json` | Uygulama ayarları, sıralama, tema |
| `session.json` | "Son oturum" (oto-kayıt) |
| `macros.json` | Kayıtlı makro/komut kütüphanesi |
| `palette.json` | Palet ayarları (`settings.json`'dan **ayrı** dosya) |
| `fikatia_debug.log` | Hata/akış günlüğü (5 MB'de rotasyon: `.1`, `.2`) |

Projeler arası etiketler: `<klasör>\.fikoyt\everything\tags.json`

**Güvenlik:** Makro kaydı yalnız kullanıcının seçtiği dosya **yolunu**
tutar (içeriği kopyalamaz). Kod öğeleri yalnız kullanıcının elle yazıp
"Kaydet" dediği metindir; `.fikoses` oturum dosyalarından hiçbir zaman
otomatik çalıştırılmaz.

---

## Geliştirme

```powershell
flutter analyze     # 0 hata beklenir
flutter test        # 237 test
```

Kod tabanı Türkçe yorumludur ve karar gerekçelerini satır içinde taşır
(`NEDEN AYRI DOSYA`, `NEDEN NATIVE DEĞİL` gibi başlıklar). Yeni bir karar
eklerken bu deseni sürdürün.

Lint kural seti `analysis_options.yaml` içindedir; `flutter_lints` taban
alınır. Aşırı gürültü üreten kurallar (`public_member_api_docs` gibi)
bilinçli olarak dışarıda bırakılmıştır — bu kod tabanında yorum zaten
yoğun.

---

## Sık karşılaşılan sorunlar

**CATIA listesinde kart görünmüyor.** CATIA'nın `CATMain`'ine
`baglan.catscript` eklenmemiştir ya da COM kaydı başarısız olmuştur.
`fikatia_debug.log` dosyasına bakın.

**"Açık ama bağlanmadı" kartları.** Macro kaydı gecikiyordur; 12 saniye
bekleme süresi (grace period) dolmadan gösterilmez. Sistem tepsisinden
tümünü bağlamayı deneyebilirsiniz.

**Sanal masaüstü oluşturulamıyor.** PowerShell `VirtualDesktop` modülü
kurulu değil (native motor yalnız taşıma yapabilir, oluşturma/isimlendirme
yapamaz).

**Çoklu pencere takılıyor.** `fikatia_debug.log`'a bakın — palet
penceresi `NOACTIVATE` olduğu için klavye girişi alamaz; metin gerektiren
işlemler bilinçli olarak ana pencereye yönlendirilir.

---

## Lisans

Proje içi kullanım.

