Konsol: fraktal (paralel şeritli 24-bit Mandelbrot/Julia + yakınlaşma), sudoku (geri izlemeli, canlı animasyon), fatura (JSON → terminal tablosu, PDF ve Excel). Masaüstü: hesap makinesi (işlem önceliği, canlı bağlama), odak (Pomodoro), parola atölyesi (entropi ölçer, SHA-256). Web: pano (Kanban REST API + SQLite), kisalt (302 yönlendirme, SVG istatistik), anket (adres başına tek oy, sunucuda çizilen grafik). Hepsi `kabalang calistir` ile derlenip çalışır; web uygulamaları yalnız 127.0.0.1'i dinler, SQL parametre bağlamalı, HTML çıktısı kaçırılır. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
156 lines
6.6 KiB
Plaintext
156 lines
6.6 KiB
Plaintext
# ╔══════════════════════════════════════════════════════════════╗
|
|
# ║ Odak — KabaLang ile yazılmış Pomodoro zamanlayıcısı ║
|
|
# ║ Odaklan, mola ver, günün oturumlarını kaydet. ║
|
|
# ╚══════════════════════════════════════════════════════════════╝
|
|
#
|
|
# Çalıştır: kabalang calistir odak.kbl
|
|
# Deneme kipi: ODAK_DENEME=1 kabalang calistir odak.kbl
|
|
# (1 dakika 1 saniye sürer — sunum ve sınama için)
|
|
|
|
kullan kaba.arayuz
|
|
kullan kaba.sistem
|
|
|
|
izinler:
|
|
ag_erisim = yanlis
|
|
|
|
# ── Oturum türleri ────────────────────────────────────────────────
|
|
sayilabilir Kip:
|
|
ODAK
|
|
MOLA
|
|
|
|
fonksiyon dakika_coz(secim: metin) -> sayi:
|
|
# "Odak · 25 dk" → 25
|
|
parca = secim.bol(" · ")[1]
|
|
don sayi(parca.degistir(" dk", ""))
|
|
|
|
fonksiyon kip_coz(secim: metin) -> Kip:
|
|
eger secim.icerir("mola"):
|
|
don Kip.MOLA
|
|
don Kip.ODAK
|
|
|
|
# 1500 → "25:00"
|
|
fonksiyon saat_metni(saniye: sayi) -> metin:
|
|
dk = saniye // 60
|
|
sn = saniye % 60
|
|
don f"{dk:02d}:{sn:02d}"
|
|
|
|
fonksiyon durum_metni(k: Kip, calisiyor: mantik) -> metin:
|
|
eger degil calisiyor:
|
|
don "Hazır olduğunda başlat"
|
|
eger k == Kip.MOLA:
|
|
don "☕ Mola — biraz nefes al"
|
|
don "● Odaklanılıyor"
|
|
|
|
# ── Durum ─────────────────────────────────────────────────────────
|
|
saniye_carpani = 1
|
|
eger cevre.al("ODAK_DENEME") == "1":
|
|
saniye_carpani = 60
|
|
|
|
toplam = 25 * 60
|
|
kalan = toplam
|
|
kip = Kip.ODAK
|
|
calisiyor = yanlis
|
|
oturum_sayisi = 0
|
|
odak_dakikasi = 0
|
|
|
|
pencere Odak:
|
|
baslik = "Odak — Pomodoro"
|
|
genislik = 900
|
|
yukseklik = 620
|
|
tema = "koyu"
|
|
|
|
yatay_kutu Govde:
|
|
dikey_kutu Zamanlayici:
|
|
girdi GorevGirdisi:
|
|
metin = "KabaLang örnekleri"
|
|
ipucu = "Ne üzerinde çalışıyorsun?"
|
|
stil = "font-size: 17px; padding: 10px 12px; border-radius: 10px; border: 1px solid #1c2336; background: #0d1220; color: #e6e9f2;"
|
|
|
|
# Canlı bağlama: yukarıdaki girdiye yazdıkça bu satır kendiliğinden değişir.
|
|
etiket Baslik:
|
|
metin = "Şu an: " + GorevGirdisi.metin
|
|
stil = "font-size: 20px; font-weight: 700; color: #22d3ee; padding: 2px 4px 6px 4px;"
|
|
|
|
acilir_liste Secim:
|
|
secenekler = ["Odak · 25 dk", "Derin çalışma · 50 dk", "Kısa mola · 5 dk", "Uzun mola · 15 dk"]
|
|
stil = "font-size: 17px; padding: 8px 12px; border-radius: 10px; background: #121829; color: #e6e9f2;"
|
|
degistiginde:
|
|
eger degil calisiyor:
|
|
kip = kip_coz(Secim.secili_metin)
|
|
toplam = dakika_coz(Secim.secili_metin) * 60
|
|
kalan = toplam
|
|
Sayac.metin = saat_metni(kalan)
|
|
Ilerleme.deger = 0
|
|
|
|
etiket Sayac:
|
|
metin = "25:00"
|
|
stil = "font-size: 112px; font-weight: 800; color: #ffffff; padding: 10px 0px 0px 6px;"
|
|
|
|
etiket Durum:
|
|
metin = "Hazır olduğunda başlat"
|
|
stil = "font-size: 18px; color: #9ece6a; padding: 0px 8px 10px 8px;"
|
|
|
|
ilerleme_cubugu Ilerleme:
|
|
deger = 0
|
|
stil = "font-size: 14px; min-height: 22px; border-radius: 11px; background: #121829; color: #e6e9f2;"
|
|
|
|
yatay_kutu Dugmeler:
|
|
dugme Baslat:
|
|
metin = "Başlat"
|
|
stil = "font-size: 19px; font-weight: 700; min-height: 54px; border-radius: 14px; border: none; background: #377ef4; color: #ffffff;"
|
|
tiklandiginda:
|
|
calisiyor = degil calisiyor
|
|
eger calisiyor:
|
|
Baslat.metin = "Duraklat"
|
|
degilse:
|
|
Baslat.metin = "Sürdür"
|
|
Durum.metin = durum_metni(kip, calisiyor)
|
|
|
|
dugme Sifirla:
|
|
metin = "Sıfırla"
|
|
stil = "font-size: 19px; font-weight: 600; min-height: 54px; border-radius: 14px; border: 1px solid #1c2336; background: #121829; color: #c9d1e6;"
|
|
tiklandiginda:
|
|
calisiyor = yanlis
|
|
kalan = toplam
|
|
Sayac.metin = saat_metni(kalan)
|
|
Ilerleme.deger = 0
|
|
Baslat.metin = "Başlat"
|
|
Durum.metin = durum_metni(kip, calisiyor)
|
|
|
|
dikey_kutu Gunluk:
|
|
etiket GunlukBasligi:
|
|
metin = "Bugün"
|
|
stil = "font-size: 20px; font-weight: 700; color: #22d3ee; padding: 6px 4px;"
|
|
|
|
etiket Ozet:
|
|
metin = "0 oturum · 0 dk odak"
|
|
stil = "font-size: 26px; font-weight: 800; color: #ffffff; padding: 2px 4px 10px 4px;"
|
|
|
|
liste Oturumlar:
|
|
stil = "font-size: 17px; color: #c9d1e6; background: #0d1220; border: 1px solid #1c2336; border-radius: 12px; padding: 8px; min-width: 330px;"
|
|
|
|
# Saniyede bir: geri say, çubuğu ilerlet, bitince kaydet ve haber ver.
|
|
zamanlayici 1000ms:
|
|
eger calisiyor:
|
|
kalan = kalan - saniye_carpani
|
|
eger kalan < 0:
|
|
kalan = 0
|
|
Sayac.metin = saat_metni(kalan)
|
|
Ilerleme.deger = (toplam - kalan) * 100 // toplam
|
|
eger kalan == 0:
|
|
calisiyor = yanlis
|
|
dakika = toplam // 60
|
|
eger kip == Kip.ODAK:
|
|
oturum_sayisi = oturum_sayisi + 1
|
|
odak_dakikasi = odak_dakikasi + dakika
|
|
Oturumlar.ekle(f"✓ {zaman.saat().parca(0, 5)} {GorevGirdisi.metin} · {dakika} dk")
|
|
sistem.bildirim("Odak", "Oturum bitti! Kısa bir mola hak ettin.")
|
|
degilse:
|
|
Oturumlar.ekle(f"☕ {zaman.saat().parca(0, 5)} Mola · {dakika} dk")
|
|
sistem.bildirim("Odak", "Mola bitti, kaldığın yerden devam.")
|
|
Ozet.metin = f"{oturum_sayisi} oturum · {odak_dakikasi} dk odak"
|
|
kalan = toplam
|
|
Sayac.metin = saat_metni(kalan)
|
|
Baslat.metin = "Başlat"
|
|
Durum.metin = "Tamamlandı — yenisine hazır"
|