Forum: Duyurular RSS
D ile görsel programlama
Sayfa:  önceki  1  2 
erdem (Moderatör) #16
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 12530
Ali beyin önerdiği değişikliklerden sonra kodun son hali şu şekilde oldu.
import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.ListStore;
import gtk.TreeView;
import gtk.TreeViewColumn;
import gtk.CellRendererText;
import gtk.TreeModelFilter;
import gtk.Grid;
import gtk.Button;
import gtk.ScrolledWindow;
import gtk.TreeModel;
import gtk.TreeIter;
 
import gobject.Value;
 
import std.format: formattedRead;
import std.stdio: File, writeln;
 
class Pencere: MainWindow
{
    Button[] düğmeler;
    string seçiliProgramlamaDili;
    GörünümModeli görünüm;
    TreeModelFilter süz;
 
 
    this (GörünümModeli görünüm)
    {
        super("Ağaç örneği");
        this.görünüm = görünüm;
 
        auto ızgara = new Grid();
        ızgara.setColumnHomogeneous(true);
        ızgara.setRowHomogeneous(true);
        add(ızgara);
 
        seçiliProgramlamaDili = "Hiçbiri";
 
        string[] programlamaDilleri = ["Java", "C++", "C", "Python", "Hiçbiri"];
 
        Button düğmeYap(string dil)
        {
            Button düğme = new Düğme(dil);
            düğme.addOnClicked(&seçimDüğmesiTıklandı);
            return düğme;
        }
 
        foreach (dil; programlamaDilleri)
        {
            düğmeler ~= düğmeYap(dil);
        }
 
        auto kayarPencere = new ScrolledWindow();
        kayarPencere.setVexpand(true);
        ızgara.attach(kayarPencere, 0, 0, 8, 10);
        ızgara.attachNextTo(düğmeler[0], kayarPencere, GtkPositionType.BOTTOM, 1, 1);
 
        foreach (i, düğme; düğmeler[1..$])
            ızgara.attachNextTo(düğme, düğmeler[i], GtkPositionType.RIGHT, 1, 1);
        kayarPencere.add(görünüm);
 
        showAll();
 
    }
 
    this (GörünümModeli görünüm, TreeModelFilter süz)
    {
        this.süz = süz;
        this(görünüm);
    }
 
    void seçimDüğmesiTıklandı(Button düğme)
    {
        seçiliProgramlamaDili = düğme.getLabel();
        if (seçiliProgramlamaDili != "Hiçbiri")
            writeln(seçiliProgramlamaDili, " dili seçildi!");
        else
            writeln("Hiç bir dil seçilmedi.");
        süz.refilter();
    }
}
 
struct Yazılım
{
    string isim;
    uint yıl;
    string dil;
}
 
class VeriModeli: ListStore /* model */
{
    this(Yazılım[] yazılımlar)
    {
 
        super([GType.STRING, GType.INT, GType.STRING]);
 
        void yazılımEkle(Yazılım yazılım)
        {
            auto erişici = createIter();
            setValue(erişici, 0, yazılım.isim);
            setValue(erişici, 1, yazılım.yıl);
            setValue(erişici, 2, yazılım.dil);
        }
 
        void yazılımlarıEkle(Yazılım[] yazılımlar)
        {
 
            foreach (yazılım; yazılımlar)
            {
                yazılımEkle(yazılım);
            }
        }
 
        yazılımlarıEkle(yazılımlar);
    }
}
 
class GörünümModeli: TreeView /* görünüm */
{
    this (ListStore model)
    {
        auto isimSütunu = new TreeViewColumn("İsim", new CellRendererText(), "text", 0);
        appendColumn(isimSütunu);
        auto yılSütunu = new TreeViewColumn("Yıl", new CellRendererText(), "text", 1);
        appendColumn(yılSütunu);
        auto dilSütunu = new TreeViewColumn("Dil", new CellRendererText(), "text", 2);
        appendColumn(dilSütunu);
    }
}
 
static extern(C) int dilleriSüz(GtkTreeModel * gtkModeli,
                                GtkTreeIter * gtkErişici, void * veriler)
{
    auto model = new TreeModel(gtkModeli, false);
    auto erişici = new TreeIter(gtkErişici, false);
    Pencere pencere = cast(Pencere) veriler;
 
    string dil = model.getValue(erişici, 2).dupString();
 
    if (pencere.seçiliProgramlamaDili == "Hiçbiri")
        return true;
    else
        return dil == pencere.seçiliProgramlamaDili;
}
 
Yazılım[] yazılımOku(string kütükİsmi)
{
    auto kütük = File(kütükİsmi, "r");
    Yazılım[] yazılımlar;
    foreach (satır; kütük.byLine())
    {
        string isim, dil;
        uint yıl;
        formattedRead(satır,"\"%s\", %d, \"%s\"", &isim, &yıl, &dil);
        yazılımlar ~= Yazılım(isim, yıl, dil);
    }
    return yazılımlar;
}
 
 
void main(string[] args)
{
    Main.init(args);
    auto yazılımlar = yazılımOku("veriler.txt");
 
    auto model = new VeriModeli(yazılımlar);
 
    auto süz = new TreeModelFilter(model, null);
    auto görünüm = new GörünümModeli(model);
    görünüm.setModel(süz);
 
    auto pencere = new Pencere(görünüm, süz);
    süz.setVisibleFunc(cast (GtkTreeModelFilterVisibleFunc) &dilleriSüz,
                       cast(void *)pencere, null);
    Main.run();
}

Yalnız burada Pencere sınıfına görünüm modelinden başka bir de süzme görevi yapan TreeFilter geçmiş olduk. O zaman bu durumda hem veri hem de görünümü kullanan ara bileşen ("Controller") ana sınıfımız oldu.

düğmeYap() konusunda ben de kararsız kaldım. Hatta ilk örnek bile kullanılabilir diye düşünüyorum.
erdem (Moderatör) #17
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İşin içine süzme sıralama gibi işlemler de girince pencere sınıfının kurucu işlevi şuna benzemeye başlamıştı.

    this (GörünümModeli görünüm, VeriModeli model, TreeModelFilter süz, TreeModelSort sırala)
    {
        this.model = model;
        this.sırala = sırala;
        this.süz = süz;
        this(görünüm);
    }

Ben de bu sefer VeriModeli sınıfını basitçe yapı yaptım. İlk örneklerde VeriModeli bir ListStore'dan türüyordu. Bunu sahip olma ilişkisi olacak şekilde değiştirdim.

Her türlü yorum ve önerilerinizi bekliyorum.
import gtk.Main;
import gtk.MainWindow;
import gtk.Box;
import gtk.ListStore;
import gtk.TreeModelSort;
import gtk.TreeModelFilter;
import gtk.TreeView;
import gtk.TreeViewColumn;
import gtk.CellRendererText;
import gtk.Adjustment;
import gtk.SpinButton;
import gtk.TreeModel;
import gtk.TreeIter;
import gtk.CellRenderer;
import gtk.CellRendererText;
import gtk.TreePath;
 
import gobject.Value;
 
import std.stdio: writeln;
import std.format: format;
 
string liraYap(int kuruş)
{
    return "%.2f".format(cast (double) kuruş / 100);
}
 
class Pencere: MainWindow
{
    Box anaKutu;
    Görünüm görünüm;
    VeriModeli veri;
    double enYüksekFiyat;
 
    this(Görünüm görünüm, VeriModeli veri)
    {
        super("Ağaç örneği");
 
        this.görünüm = görünüm;
        this.veri = veri;
 
        anaKutu = new Box(Orientation.VERTICAL, 0);
 
        auto enYüksekFiyat = new Adjustment(10.99, 0.01, 1024.0, 0.01, 1.0, 0.0);
        auto kayarDüğme = new SpinButton(enYüksekFiyat, 1.0, 2);
 
        enYüksekFiyat.addOnValueChanged(&fiyatDeğişti);
        veri.süz.setVisibleFunc(cast (GtkTreeModelFilterVisibleFunc) &satırGörünürMü,
                                cast(void *)this, null);
        görünüm.addOnRowActivated(&sütünTıklandı);
 
        anaKutu.packStart(this.görünüm, true, true, 0);
        anaKutu.packStart(kayarDüğme, false, false, 0);
 
        add(anaKutu);
 
        showAll();
    }
 
    void fiyatDeğişti(Adjustment hizalama)
    {
        this.enYüksekFiyat = hizalama.getValue();
        veri.süz.refilter();
    }
 
    static extern(C) int satırGörünürMü(GtkTreeModel * gtkModeli,
                                        GtkTreeIter * gtkErişici, void * veriler)
    {
        auto model = new TreeModel(gtkModeli, false);
        auto erişici = new TreeIter(gtkErişici, false);
        Pencere pencere = cast(Pencere) veriler;
 
        int fiyat = model.getValue(erişici, 1).getInt();
        return cast (double) fiyat / 100 <= pencere.enYüksekFiyat;
 
    }
 
    void sütünTıklandı(TreePath iz, TreeViewColumn sütün, TreeView görünüm)
    {
        auto süzülmüşİz = veri.sırala.convertPathToChildPath(iz);
        auto gerçekİz = veri.süz.convertPathToChildPath(süzülmüşİz);
 
        TreeIter erişici = new TreeIter();
 
        if (veri.model.getIter(erişici, gerçekİz))
        {
            auto mal = veri.model.getValue(erişici, 0).dupString();
            auto fiyat = veri.model.getValue(erişici, 1).getInt();
 
            switch(mal)
            {
            case "Lokum":
                writeln(liraYap(fiyat), " e güzel lokumum var yer misin?");
                break;
            case "Üzüm":
                writeln("Taze üzüm geldi.", liraYap(fiyat), " lira");
                break;
            case "Karpuz":
                writeln("Kesmece karpuz ", liraYap(fiyat), " lira");
                break;
            case "Çorba":
                writeln("Mercimek çorbası içer misin?");
                break;
 
            default:
                writeln(mal, " ", liraYap(fiyat), " lira");
                break;
            }
 
        }
    }
}
 
struct Mal
{
    string isim;
    int fiyat;
};
 
class Görünüm: TreeView
{
    this(VeriModeli veri)
    {
        auto malSütunu = new TreeViewColumn("Mal", new CellRendererText(), "text", 0);
        malSütunu.setSortColumnId(0);
        appendColumn(malSütunu);
 
        auto fiyatGösterir = new CellRendererText();
        auto fiyatSütunu = new TreeViewColumn("Fiyat", fiyatGösterir, "text", 1);
        fiyatSütunu.setSortColumnId(1);
        appendColumn(fiyatSütunu);
 
        fiyatSütunu.setCellDataFunc(fiyatGösterir, cast(GtkTreeCellDataFunc)
                                    &fiyatSütununuGöster, null, null);
 
        setModel(veri.süz);
 
    }
 
    static extern(C) void fiyatSütununuGöster(GtkTreeViewColumn * treeColumn, GtkCellRenderer * cell,
                                              GtkTreeModel * gtkModeli, GtkTreeIter * iter, void * data)
    {
        auto model = new TreeModel(gtkModeli, false);
        auto erişici = new TreeIter(iter, false);
        auto hücreÇizici = new CellRenderer(cell, false);
 
        auto fiyat = model.getValue(erişici, 1).getInt();
 
        auto yeniFiyat = liraYap(fiyat);
 
        hücreÇizici.setProperty("foreground", "darkgreen");
        hücreÇizici.setProperty("text", yeniFiyat);
    }
}
 
struct VeriModeli
{
    ListStore model;
    TreeModelFilter süz;
    TreeModelSort sırala;
    
    this(Mal[] mallar)
    {
        model = new ListStore([GType.STRING, GType.INT]);
        süz = new TreeModelFilter(model, null);
        sırala = new TreeModelSort(süz);
 
        void malEkle(Mal mal)
        {
            auto erişici = model.createIter();
            model.setValue(erişici, 0, mal.isim);
            model.setValue(erişici, 1, new Value(mal.fiyat));
        }
 
        void mallarıEkle(Mal[] mallar)
        {
            foreach (mal; mallar)
            {
                malEkle(mal);
            }
        }
        mallarıEkle(mallar);
    }
}
 
Mal[]  mallarıEkle()
{
    Mal[] mallar;
    mallar ~= Mal("Ekmek", 100);
    mallar ~= Mal("Karpuz", 80);
    mallar ~= Mal("Lokum", 425);
    mallar ~= Mal("Çorba", 225);
    mallar ~= Mal("Üzüm", 325);
    mallar ~= Mal("Un", 515);
    return mallar;
}
 
 
void main(string[] args)
{
    Main.init(args);
    auto mallar = mallarıEkle();
    auto veri = VeriModeli(mallar);
    auto görünüm = new Görünüm(veri);
    auto pencere = new Pencere(görünüm, veri);
    Main.run();
}
acehreli (Moderatör) #18
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4431 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bana güzel gözüktü.

Bu arada, "sütün" kelimesi nedense bana yazım kılavuzunu hatırlattı. ;)

Ali
erdem (Moderatör) #19
Üye Tem 2009 tarihinden beri · 902 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Kusura kalmayın orada bir yazım hatası olmuş :)

Aslında oradaki static extern(C) satırlarını kütüphanenin içine taşımanın bir yolunu bulabilsek güzel olacak. Dikkat ederseniz aslında sadece basitçe bir fiyat verisine erişiyor. GTK# ve PyGTK gibi kütüphaneler örneğin filtreleme için basitçe bir model ve erişiciyi parametre olarak göndermişler.

Benim kanaatime göre de bu static extern(C) satırları kütüphanenin içinde olsa daha güzel olur. Ama şimdilik kafa yormadım.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2 
Forum: Duyurular RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-07-27, 01:50:14 (UTC -07:00)