Vala kaynak kullanımı 2

Bu derste Vala kaynak kullanımına devam ediyoruz

Giriş

Önceki derste Vala kaynak kullanımı ve kaynakları C koduna nasıl gömebileceğimizden bahsetmiştik.

Desen kullanımı

Ö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;
}

Kaynak kodun açıklaması

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ömüp uygulamayı derleyelim

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.

Kullanıcının saati arttırıp azaltabildiği ufak bir uygulama

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 kaynak kodu

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

yorum yaz

Yorum yaz

Henüz yorum yok.