İş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();
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]