4 puan yazan GN⁺ 2024-05-26 | 1 yorum | WhatsApp'ta paylaş
  • Basit, çapraz platform bir reaktif GUI araç takımı
  • Basitlik: Projeye kolayca eklenebilir ve hemen UI oluşturmaya başlanabilir. Ek araçlara veya kod üretim aşamasına gerek yoktur. Go kodu yazarak kendi içinde her şeyi barındıran bir ikili dosya ile yerel GUI uygulamaları oluşturulabilir
  • Çapraz platform: Mümkün olduğunda yerel widget'ları kullanır ve derleme sırasında çalışılan platform için en uygun backend'i otomatik olarak seçer. Şu anda FLTK tabanlı ve Cocoa tabanlı iki backend uygulaması sunulmaktadır
  • Reaktif: Uygulama durumu değiştiğinde UI'yi otomatik olarak günceller. Yan etkisiz render fonksiyonları sağlar ve uygulama durumunu yönetmek için UseState hook'unu kullanır
  • Geniş widget desteği: Spot; butonlar, etiketler, metin girişi, slider'lar, açılır menüler ve daha birçok UI kontrolünü varsayılan olarak sunar

Sık sorulan sorular (SSS)

"Reaktif" ne anlama geliyor?

  • Spot'ta reaktif, uygulama durumu değiştiğinde UI'nin otomatik olarak güncellenmesi anlamına gelir. Bu, durum değiştiğinde değişmez bileşen ağacını yeniden oluşturarak ve önceki durumla karşılaştırıp hangi UI kontrollerinin güncellenmesi gerektiğini belirleyerek gerçekleştirilir.

Spot'un kullandığı "yerel widget'lar" nedir?

  • Şu anda Spot, macOS'ta Cocoa backend'ini, diğer tüm platformlarda ise FLTK tabanlı backend'i kullanır. İsteğe bağlı olarak Mac'te de FLTK kullanılabilir. Gelecekte Windows için daha iyi destek planlanmaktadır.

Kendi hook'larımı uygulayabilir miyim?

  • Evet, React'te olduğu gibi kendi hook'larınızı uygulayabilirsiniz. İlk argüman olarak *spot.RenderContext alan bir fonksiyon oluşturup bunun üzerinden Spot yaşam döngüsüne "hook" ekleyebilirsiniz.

Özel bileşenler nasıl yazılır?

  • Spot'ta UI'yi bileşenlere ayırmanın birkaç yolu vardır. Ana yöntem, spot.Component arayüzünü uygulayan bir struct oluşturmaktır. Bu arayüz, Render(ctx *spot.RenderContext) spot.Component adlı tek bir metoda sahiptir.

Sunulanlar dışında farklı bir widget kütüphanesi kullanılabilir mi?

  • Evet, kullanılabilir. spot.Component arayüzünü uygulayan ve yerel widget'ları yöneten bir struct oluşturmanız yeterlidir.

Cocoa veya FLTK dışında backend kullanılabilir mi?

  • Şimdilik yalnızca bu iki backend desteklenmektedir. Başka bir backend eklemek istiyorsanız bir PR gönderebilirsiniz.

spot/ui ile spot arasındaki fark nedir?

  • spot, reaktif model ve render yeteneklerini sağlayan çekirdek pakettir. Backend'den bağımsızdır ve spot.Control arayüzünü uygulayan her türlü kontrol setiyle birlikte kullanılabilir.
  • spot/ui, spot ile birlikte kullanılabilecek önceden hazırlanmış çapraz platform GUI kontrol seti sağlar.

"Bileşen" ile "kontrol" arasındaki fark nedir?

  • Spot'ta bileşen, iş mantığı ve durumu içeren uygulamanın mantıksal birimidir. Tüm bileşenler başka bileşenlerden oluşur ve nihayetinde bir veya daha fazla "kontrol" olarak render edilir.
  • Kontrol, UI ağacına mount edilen ve ekranda görsel öğeyi temsil eden özel bir bileşen türüdür.

Spot'ta "make", "render", "build", "mount", "update" terimleri ne anlama gelir?

  • Make: Yeni bir bileşen örneği oluşturma süreci. spot.Component arayüzünü uygulayan bir struct örneğine başvurarak veya render fonksiyonuyla spot.Make çağrılarak yapılır.
  • Render: Bileşenin durumunu yapı taşlarına uygulayıp başka bir bileşen örneği döndürme süreci. Bileşen örneğinde Render metodunu çağırarak yapılır.
  • Build: Bileşen örneğinden yeni bir UI ağacı oluşturma süreci. Bileşenler özyinelemeli olarak render edilerek kontrol ağacı oluşturulur.
  • Mount: (Sanal) kontrol ağacından gerçek UI kontrolleri oluşturma süreci. Ağaç düğümünde Mount çağrılarak veya bileşen örneği ya da render fonksiyonuyla spot.Mount çağrılarak yapılır.
  • Update: (Mount edilmiş) kontrol ağacını güncelleme süreci. Ağaç düğümünde Update çağrılarak yapılır.

Spot'un şu anda desteklemediği özellikler

  • Otomatik yerleşim
  • Çoklu pencere
  • Modal iletişim kutuları
  • Yeniden boyutlandırılabilir pencereler
  • Menü çubuğu
  • Özel widget'lar
  • Yerel widget erişimi
  • Sürükle ve bırak
  • Uluslararasılaştırma

Desteklenen UI kontrolleri listesi

  • Button: Bir eylem başlatan basit buton (Fl_Button, NSButton)
  • Checkbox: Karşılıklı olarak dışlayıcı iki seçenekten birini seçen kontrol (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
  • ComboBox: Metin girişi yapılabilen açılır menü (ComboBox, NSComboBox)
  • Dial: Dairesel durum kontrolü (Fl_Dial, NSProgressIndicator (with NSCircular style))
  • Dropdown: Birden çok seçenekten birini seçen açılır menü (Fl_Choice, NSComboBox)
  • Image: Görsel kontrolü (Image, NSImageView)
  • Label: Basit, düzenlenemeyen metin etiketi (Fl_Box, NSTextField)
  • ListBox: Verilen listeden bir veya birden fazla öğe seçilebilen kaydırılabilir kontrol (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
  • ProgressBar: Uzun süren işlerin ilerlemesini görselleştiren ilerleme çubuğu kontrolü (Fl_Progress, NSProgressIndicator)
  • Slider: Yatay slider giriş kontrolü (Fl_Slider, NSSlider)
  • Spinner: Yukarı/aşağı düğmeleri bulunan sayısal giriş kontrolü (Fl_Spinner, NSTextField+NSStepper)
  • TextField: Tek satırlı metin giriş kontrolü (Fl_Input, NSTextField)
  • TextView/TextEditor: Çok satırlı metin içeriğini görüntüleyip düzenleyebilen genel amaçlı metin kutusu (Text, NSTextView)
  • Window: Ekranda (üst düzey) pencereyi temsil eden kontrol (Fl_Window, NSWindow)

GN⁺ görüşü

  • Spot, Go diliyle çapraz platform GUI uygulamalarının kolayca geliştirilmesini sağlar. Özellikle reaktif modeli benimseyerek geliştiricilerin UI güncellemeleriyle uğraşmadan uygulama mantığına odaklanmasına yardımcı olur.
  • Şu anda desteklenmeyen birçok özellik bulunduğundan, karmaşık uygulamalar geliştirirken bazı kısıtlar olabilir. Özellikle otomatik yerleşim veya çoklu pencere gibi özelliklere ihtiyaç varsa başka araç takımları değerlendirilmelidir.
  • Spot'un sadeliği ve çapraz platform desteği, küçük projeler veya prototip geliştirme için çok yararlı olabilir. Ancak büyük ölçekli uygulamalarda işlevsellik sınırları olabilir.
  • Spot'un topluluğu ve dokümantasyonu daha da gelişirse, daha fazla geliştirici ona kolayca erişip kullanabilir. Özellikle özel hook'lar ve bileşen yazımı konusunda daha fazla örnek faydalı olacaktır.
  • Spot'un backend genişletilebilirliği ilgi çekicidir. Özellikle Windows için daha iyi destek eklenirse daha fazla geliştirici tarafından kullanılabilir.

1 yorum

 
GN⁺ 2024-05-26

Hacker News görüşleri

Hacker News yorumlarının özeti

  • Desteklenen platformların README'de belirtilmesi iyi olurdu. Flutter belgelerine benzer şekilde yazılması öneriliyor.
  • Go kullanarak dahili geliştirme araçları oluşturmak istiyor, şu anda Wails kullanıyor ve memnun. Bu proje de ilgi çekici görünüyor ve göz atmaya değer.
  • Go'nun çapraz platform UI geliştirmede iyi bir deneyim sunabileceği düşünülüyor.
    • Build karmaşıklığını yönetmek çapraz platform geliştirmenin büyük zorluklarından biri, Go bunu neredeyse ortadan kaldırıyor.
    • Native kontrollerin boyutları platforma göre değiştiğinde çapraz platform yerleşiminin nasıl çözüldüğü merak ediliyor.
  • Sanal kontrol ağacı yaklaşımının avantajlarının ne olduğu merak ediliyor.
    • Kullanıcıya gösterilen kontrolleri doğrudan güncellemekle karşılaştırıldığında ne gibi faydalar sağladığını öğrenmek istiyor.
  • Yıllardır böyle bir şey arıyordu.
    • Windows desteğine ihtiyaç duyduğu için C++'a geçip wxWidgets kullanmış.
  • Emeği takdir ediyor ama Windows desteği olmayan bir çapraz platform çözümü hayal kırıklığı yaratıyor.
  • Bu projeyi 3 hafta önce öğrenmiş olmayı isterdi.
    • Go'ya port edilmiş bir React ya da React-benzeri framework'ün harika bir geliştirme deneyimi sunacağını düşünüyor.
  • Fltk, Windows'u destekliyor.
    • Başka bir çözüm kullandığı için mi Windows'un henüz desteklenmediği merak ediliyor.
  • Bu kodun GOMAXPROCS değerinin en az 2 olarak ayarlanması gerektiği anlamına gelip gelmediği merak ediliyor.
  • Çapraz platform build'in nasıl yapıldığı merak ediliyor.
    • Her platform için paket yönetimi, container ve imzalama sorunlarını çözmeden MacOS .app ve Windows exe üreten bir komut olsa iyi olurdu.