mirror of
https://github.com/alhan/noteki.git
synced 2026-08-23 05:30:19 +00:00
- 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
279 lines
11 KiB
Markdown
279 lines
11 KiB
Markdown
# 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.
|