Bu derste Vala kaynak kullanımına devam ediyoruz
Önceki derste Vala kaynak kullanımı ve kaynakları C koduna nasıl gömebileceğimizden bahsetmiştik.
Önceki dersteki tasarımda biraz değişiklikler yaptık.
Bu sefer pencereyi template
anahtar kelimesi ile bir desen olarak belirledik.
Ayrıca tusaBasildi
ismi ile bir işaret ekledik.
Aşağıdaki kütüğü cay.glade
ismi ile kaydediniz.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<template class="Pencere" parent="GtkWindow">
<property name="can-focus">False</property>
<property name="title" translatable="yes">Çay</property>
<property name="window-position">center</property>
<property name="default-width">320</property>
<signal name="key-press-event" handler="tusaBasildi" swapped="no"/>
<child>
<object class="GtkBox" id="kutu">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="saat">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-top">69</property>
<property name="margin-bottom">69</property>
<property name="label" translatable="yes">00:00</property>
<property name="justify">center</property>
<attributes>
<attribute name="scale" value="5"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</template>
</interface>
Kaynakları belirten xml kütüğünü cay.xml
ismi ile oluşturuyoruz.
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/bir/cay/koy">
<file compressed="true" preprocess="xml-stripblanks">cay.glade</file>
</gresource>
</gresources>
Uygulamanın kaynak kütüğünü ise cay.vala
ismi ile kaydediyoruz.
using Gtk;
using Gdk;
[GtkTemplate (ui = "/bir/cay/koy/cay.glade")]
class Pencere : Gtk.Window
{
public Pencere ()
{
saat.set_label("07:10");
show_all();
}
[GtkChild]
private unowned Label saat;
[GtkCallback]
private bool tusaBasildi(EventKey tus )
{
string tusIsmi = Gdk.keyval_name(tus.keyval);
stdout.printf("%s tuşuna basıldı\n", tusIsmi);
return true;
}
}
int main (string[] secenekler)
{
Gtk.init (ref secenekler);
var pencere = new Pencere();
pencere.destroy.connect(Gtk.main_quit);
Gtk.main();
return 0;
}
Burada oluşturduğumuz deseni [GtkTemplate (ui = "/bir/cay/koy/cay.glade")]
şeklinde sınıfa ekleyebiliyoruz.
Pencerede bir kutu ve kutunun içinde saat isimli bir etiket vardı.
[GtkChild]
private unowned Label saat;
Bu etiketi de sınıfa aynı kimliği ("id")
, ismi kullanacak şekilde ekliyoruz.
Burada [GtkChild]
bu etiketin pencerenin bir alt elemanı olduğunu belirtiyor.
[GtkCallback]
private bool tusaBasildi(EventKey tus )
{
/* ... */
}
Bu bölüme baktığımızda [GtkCallback]
ile bir işaret, sinyal ekliyoruz.
Bir işaret, sinyal bir olay meydana geldiğinde tetiklenecek işlevdir. Örneğin tuşa basıldığı zaman tetiklenebilir.
Bu işaretin ismini desende belirtmiştik. Ne yapacağını ise burada belirtiyoruz.
Kaynakları C koduna gömmek için aşağıdaki komutu veriyoruz.
glib-compile-resources --generate-source --target cay.c cay.xml
Uygulamayı derlemek için aşağıdaki komutu veriniz.
valac --pkg gtk+-3.0 --pkg gmodule-2.0 --gresources=cay.xml cay.c cay.vala -o cay
Uygulamayı ./cay
komutu ile çalıştırıp bir tuşa basarsanız, bastığınız tuşun yazıldığını görebilirsiniz.
Yazdığımız yazılımlar kullanıcı ile etkileşime geçmezse çok tutulmayabilir.
Yazdığımız örneği kullanıcı + ve - tuşlarına basınca saati arttırıp azaltacak şekilde geliştirelim.
Kaynaklarda değişiklik olmadığı için tekrar derlememize gerek yoktur.
cay.vala
kütüğünü aşağıdaki gibi değiştiriniz.
using Gtk;
using Gdk;
[GtkTemplate (ui = "/bir/cay/koy/cay.glade")]
class Pencere : Gtk.Window
{
public Pencere ()
{
saat.set_label("07:10");
show_all();
}
[GtkChild]
private unowned Label saat;
private int saniyeyeCevir(string sure)
{
int dakika = sure.split(":")[0].to_int();
int saniye = sure.split(":")[1].to_int();
return dakika * 60 + saniye;
}
private string metneCevir(int sureDakika)
{
int dakika = sureDakika / 60;
int saniye = sureDakika - dakika * 60;
if (dakika > 9)
if (saniye > 9)
return (dakika.to_string() + ":" + saniye.to_string());
else
return (dakika.to_string() + ":" + "0" + saniye.to_string());
else
if (saniye > 9)
return ("0" + dakika.to_string() + ":" + saniye.to_string());
else
return ("0" + dakika.to_string() + ":" + "0" + saniye.to_string());
}
private void saatiAzalt()
{
int simdikiSaat = saniyeyeCevir(saat.get_label());
stdout.printf("Saati azaltıyorum\n");
if (simdikiSaat != 0)
simdikiSaat = simdikiSaat - 1;
stdout.printf("Şimdiki saat %s\n", metneCevir(simdikiSaat));
saat.set_label(metneCevir(simdikiSaat));
}
private void saatiArttir()
{
int simdikiSaat = saniyeyeCevir(saat.get_label());
stdout.printf("Saati arttırıyorum\n");
simdikiSaat = simdikiSaat + 1;
stdout.printf("Şimdiki saat %s\n", metneCevir(simdikiSaat));
saat.set_label(metneCevir(simdikiSaat));
}
[GtkCallback]
private bool tusaBasildi(EventKey tus )
{
string tusIsmi = Gdk.keyval_name(tus.keyval);
if (tusIsmi == "minus" || tusIsmi == "KP_Subtract")
saatiAzalt();
if (tusIsmi == "plus" || tusIsmi == "KP_Add")
saatiArttir();
stdout.printf("%s tuşuna basıldı\n", tusIsmi);
return true;
}
}
int main (string[] secenekler)
{
Gtk.init (ref secenekler);
var pencere = new Pencere();
pencere.destroy.connect(Gtk.main_quit);
Gtk.main();
return 0;
}
Uygulamayı daha önce olduğu gibi derleyiniz.
valac --pkg gtk+-3.0 --pkg gmodule-2.0 --gresources=cay.xml cay.c cay.vala -o cay
Artık kullanıcı klavye ya da sayısal tuş takımına basarak saati artırıp, azaltabilecek.
Uygulamanın kaynağını buradan indirebilirsiniz.
Eğer git kullanarak indirmek indirmek isterseniz
git clone https://codeberg.org/erdem/rizeden.git --branch Ders4
komutu ile bu dersi indirebilirsiniz.
Yorumlar