# Product Requirement Document (PRD) - Sticky Canvas ## 1. Proje Özeti Windows işletim sistemi üzerinde çalışan, minimum kaynak tüketimi ve yüksek performans odaklı, ekranın tüm yüzeyini aktif bir tuval (canvas) olarak kullanan bir masaüstü yapışkan not (Sticky Notes) uygulamasıdır. ## 2. Teknik Mimari ve Altyapı * **Geliştirme Dili ve Kütüphane:** Python 3.x / PySide6 (Qt for Python). * **Hedef İşletim Sistemi:** Windows (Master Monitör odaklı). Kod yapısı Linux için derlemeye uygun mimaride kurulacaktır. * **Pencere Yönetimi:** Tek bir tam ekran transparan katman (Canvas Window) oluşturulacaktır. `Qt.FramelessWindowHint` ve `Qt.WA_TranslucentBackground` öznitelikleri kullanılacaktır. * **Tek Instance Kilidi (Single Instance Lock):** Uygulama aynı anda yalnızca tek bir kopya olarak çalışabilecektir. İkinci bir instance başlatılmaya çalışıldığında, mevcut instance öne getirilecek ve yeni instance sessizce kapanacaktır. Bu mekanizma `QLockFile` veya Named Mutex ile sağlanacaktır. ## 3. Fonksiyonel Gereksinimler ### 3.1. Katman ve Görünürlük Yönetimi (Toggle State) * Uygulama, global `Alt + N` kısayolu veya sistem tepsisi (System Tray) ikonu aracılığıyla tetiklendiğinde tüm not katmanıyla birlikte en üste (`Always on Top`) gelecektir. * Görünürlük bir "Toggle" mekanizmasıyla çalışacaktır: Kısayola tekrar basıldığında veya kullanıcı not alanları dışında boş bir alana tıkladığında, uygulama odağını (focus) kaybederek kendini arka plana atacak ve tıklama geçirgenliği (`Click-Through`) aktifleşecektir. * **Kısayol Çakışması:** `Alt+N` kısayolu başka bir uygulama tarafından kullanılıyorsa veya kayıt başarısız olursa, kullanıcıya System Tray üzerinden bilgi verilecek ve kısayol Ayarlar penceresinden değiştirilebilecektir. ### 3.2. Not Ekleme, Düzenleme ve Silme * **Yeni Not Oluşturma:** Ekranın sağ alt köşesinde sabit duran bir "+" butonu veya ekranın boş bir yerine sağ tıklayarak açılan bağlam menüsü (Context Menu) üzerinden yeni not eklenecektir. * **Varsayılan Yeni Not Pozisyonu:** Yeni not, ekranın merkezine yakın bir alanda, mevcut notlarla çakışmayacak şekilde kaskad (cascade) düzeninde oluşturulacaktır (her yeni not bir öncekinden ~20px sağa ve aşağı kaydırılır). * **Not Silme:** Her not kutusunun sağ üst köşesinde bir "X" butonu yer alacaktır. Undo mekanizması mevcut olduğundan, silme işlemi için onay diyaloğu gösterilmeyecektir. * **Boş Not Davranışı:** İçeriği boş olan notlar, kullanıcı notu terk ettiğinde (başka bir nota tıkladığında veya canvas dışına çıktığında) otomatik olarak silinecektir. * **Z-Index (Katman Sırası):** Notlar üst üste bindiğinde, kullanıcının son tıkladığı veya sürüklediği not otomatik olarak en üste çıkacaktır (Auto Z-Index). ### 3.3. Not Kutusu Özellikleri * **Varsayılan Boyut:** Yeni oluşturulan notlar 220x180 piksel boyutunda olacaktır. * **Boyut Sınırları:** Minimum boyut: 150x100 px. Maksimum boyut: 600x500 px. * **Yeniden Boyutlandırma (Resize):** Notlar, sağ alt köşelerindeki tutamaç (resize grip) ile yeniden boyutlandırılabilecektir. * **Renk Paleti:** Notlar aşağıdaki 6 renk seçeneğinden birine sahip olabilecektir: - Sarı (varsayılan): `#FFF9C4` - Yeşil: `#C8E6C9` - Mavi: `#BBDEFB` - Pembe: `#F8BBD0` - Mor: `#E1BEE7` - Turuncu: `#FFE0B2` * **Metin Desteği:** Yalnızca düz metin (plain text) desteklenecektir. Zengin metin biçimlendirme (bold, italic vb.) bu sürümde kapsam dışıdır. * **Metin Taşması:** İçerik nota sığmadığında dikey kaydırma çubuğu (vertical scrollbar) otomatik olarak görünür olacaktır. * **Karakter Limiti:** Tek bir notta maksimum 2000 karakter girilebilecektir. * **Büyük Metin Yapıştırma:** Clipboard'dan 2000 karakterden fazla metin yapıştırılmaya çalışıldığında, metin 2000 karaktere kırpılacak ve kullanıcıya kısa bir tooltip ile bilgi verilecektir. ### 3.4. Not Üzerinde Sağ Tıklama Menüsü (Context Menu) Not üzerine sağ tıklandığında aşağıdaki menü gösterilecektir: ``` ├── Renk Değiştir ──► [Sarı] [Yeşil] [Mavi] [Pembe] [Mor] [Turuncu] ├── Kopyala (Ctrl+C) ├── Yapıştır (Ctrl+V) ├── ───────────── └── Notu Sil ``` ### 3.5. Yapılandırma ve Ayarlar * **Yönetim Merkezi:** Grafiksel bir ana pencere olmayacaktır. Tüm yönetim Sistem Tepsi (System Tray) ikonuna sağ tıklanarak açılan menüden yapılacaktır. * **Ayarlar Penceresi:** Tray menüsünden erişilebilir olacak ve aşağıdaki ayarları içerecektir: - Varsayılan font tipi - Varsayılan font boyutu (8-32 px arası) - Varsayılan not rengi - Global kısayol tuşu değiştirme - Windows başlangıcında otomatik çalıştır (varsayılan: kapalı) ### 3.6. System Tray Menü Yapısı System Tray ikonu üzerine sol tıklandığında Toggle (Göster/Gizle) tetiklenecektir. Sağ tıklandığında aşağıdaki menü gösterilecektir: ``` ├── Notları Göster/Gizle ├── Yeni Not Ekle ├── ───────────── ├── Tüm Notları Sil (onay diyaloğu ile) ├── Geri Al (Ctrl+Z) ├── ───────────── ├── Ayarlar... ├── ───────────── └── Çıkış ``` * **Tray Tooltip:** İkon üzerine gelindiğinde "Sticky Canvas — X Not" şeklinde tooltip gösterilecektir. ## 4. Kullanıcı Etkileşimi ve Akış (UX/UI) ### 4.1. Boş Alan ve Tıklama Geçirgenliği Mekanizması [Alt+N / Tray Tıklaması] ──> Canvas Öne Çıkar (Notlar Düzenlenebilir) │ ┌─────────────────────────┴────────────────────────┐ ▼ ▼ [Not Üzerine Tıklama] [Boş Alana Tıklama] │ │ ├─ Sürükle/Bırak └─ Odak Kaybolur (Focus Lost) ├─ Metin Düzenle Canvas Arka Plana Atılır └─ Z-Index Artır (Öne Getir) OS Pencereleri Üste Çıkar ### 4.2. Not Kutusu Davranışları * Notlar çerçevesiz, düz renk arka plana sahip kutulardan oluşacaktır. Hafif bir drop-shadow (gölge) uygulanacaktır. * Her not kutusu başlık çubuğu olmadan, gövdesinden tutularak ekranın herhangi bir yerine sürüklenebilecektir. * **Sürükleme Göstergesi:** Sürükleme sırasında notun opaklığı %85'e düşürülecek, gölge derinliği artırılacaktır. * **Aktif Not Göstergesi:** Düzenlenmekte olan not, sol kenarında 3px kalınlığında vurgu rengi (accent border) ile belirginleştirilecektir. * **"+" Butonu Stili:** 48x48 px, yarı-saydam koyu arka plan, beyaz "+" ikonu, üzerine gelindiğinde (hover) opaklık artışı. ### 4.3. Sağ Tıklama — Boş Alan Canvasın boş bir alanına sağ tıklandığında: ``` ├── Yeni Not Ekle ├── ───────────── ├── Tüm Notları Göster └── Geri Al (Ctrl+Z) ``` ## 5. Veri Yönetimi ve Performans ### 5.1. Kalıcılık (Persistence) * **Dosya Konumu:** Tüm veriler `%APPDATA%/StickyCanvas/` dizini altında saklanacaktır. * **Oturum Dosyası:** Aktif notların tüm bilgileri `session.json` dosyasında tutulacaktır. * **Ayarlar Dosyası:** Kullanıcı tercihleri `settings.json` dosyasında ayrı olarak saklanacaktır. * **Yedekleme (Backup):** Her başarılı kayıtta mevcut dosya `session.backup.json` olarak yedeklenecektir. Ana dosya bozulursa yedek dosyadan otomatik olarak kurtarma yapılacaktır. * **Auto-Save:** Kullanıcı metin alanından çıktığında, bir notu sürükleyip bıraktığında veya yeni not ekleyip sildiğinde JSON dosyası asenkron olarak anında güncellenecektir. ### 5.2. Veri Şeması (Data Schema) **session.json:** ```json { "version": "1.0", "notes": [ { "id": "uuid-v4", "content": "Not içeriği...", "x": 100, "y": 200, "width": 220, "height": 180, "color": "#FFF9C4", "z_index": 1, "created_at": "2026-05-20T22:00:00Z", "updated_at": "2026-05-20T22:05:00Z" } ] } ``` **settings.json:** ```json { "version": "1.0", "default_font_family": "Segoe UI", "default_font_size": 14, "default_note_color": "#FFF9C4", "hotkey": "Alt+N", "auto_start": false } ``` ### 5.3. Geri Alma (Undo History) * Yanlışlıkla silinen notları kurtarmak amacıyla bellek üzerinde (RAM) 10 işlem kapasiteli bir geçmiş kuyruğu (History Queue) tutulacaktır. * Uygulama tamamen kapatılmadığı sürece, silinen notlar bu kuyruktan sırayla geri getirilebilecektir (`Ctrl + Z` entegrasyonu ile). Uygulama kapatıldığında bu geçici kuyruk temizlenecektir. ### 5.4. Kaynak Tüketim Sınırları * Tek pencere (Canvas) mimarisi sayesinde uygulama boşta çalışırken RAM tüketimi minimum düzeyde tutulacak, CPU kullanımı ise yalnızca çizim (render) ve metin girişi esnasında tetiklenecektir. * **Maksimum Not Sayısı:** Performans garantisi açısından maksimum 50 aktif not desteklenecektir. Limite ulaşıldığında "+" butonu devre dışı kalacak ve kullanıcıya bilgi verilecektir. ## 6. Hata Yönetimi ve Sınır Durumları (Edge Cases) * **Ekran Dışı Not Kurtarma:** Çözünürlük değiştiğinde veya monitör bağlantısı kesildiğinde, ekran sınırları dışında kalan notlar otomatik olarak görünür alana (ekranın sol üst köşesine kaskad düzeninde) taşınacaktır. Bu kontrol uygulama başlatıldığında yapılacaktır. * **Dosya Bozulması Kurtarma:** `session.json` okunamazsa, `session.backup.json` dosyasından kurtarma denenecektir. Her iki dosya da bozuksa uygulama boş bir oturumla başlayacak ve kullanıcıya bilgi verilecektir. * **Loglama:** Hata ve kritik olaylar `%APPDATA%/StickyCanvas/logs/` dizininde günlük bazlı log dosyalarında tutulacaktır (rotating file handler, 7 günlük). Standart Python `logging` modülü kullanılacaktır. ## 7. Uygulama Yaşam Döngüsü * **İlk Açılış:** Uygulama ilk kez çalıştırıldığında, kullanımı anlatan kısa bir "Hoş Geldin" notu otomatik olarak oluşturulacaktır. * **Windows Başlangıcında Otomatik Çalıştırma:** Ayarlar penceresinden etkinleştirilebilir. Windows Registry (`HKCU\Software\Microsoft\Windows\CurrentVersion\Run`) üzerinden yönetilecektir. * **Çıkış Davranışı:** Tray menüsünden "Çıkış" seçildiğinde onay diyaloğu gösterilmeden uygulama kapanacaktır. Veriler zaten auto-save ile kayıtlıdır. * **Tray'e Küçültme:** "X" veya pencere kapatma eylemi uygulamayı kapatmaz, System Tray'e küçültür. ## 8. Erişilebilirlik (Accessibility) * **Klavye Navigasyonu:** Notlar arasında `Tab` tuşu ile geçiş yapılabilecektir. `Shift+Tab` ters yönde geçiş sağlayacaktır. * **Ekran Okuyucu Desteği:** Qt Accessibility API kullanılarak, notlar ve butonlar için uygun erişilebilirlik etiketleri (accessible names/descriptions) tanımlanacaktır. * **Dil:** Uygulama arayüzü Türkçe olacaktır. İlk sürümde çoklu dil desteği planlanmamaktadır.