Files
noteki/prd.md
git_alhan 9f3a599b79 Initial commit: Noteki v1.0
- Modern sticky notes app for Windows
- PySide6 full-screen transparent canvas
- System tray integration, global Alt+N hotkey
- Session management, undo/redo, auto-save
- Custom color palette with dynamic contrast
- Pin notes always-on-top, Tab navigation
- Windows Named Mutex single-instance guard
2026-05-21 04:13:45 +03:00

11 KiB
Raw Permalink Blame History

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:

{
  "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:

{
  "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.