import std.stdio; import std.file; import std.string; import std.conv : to; import gtk.Main; import gtk.MainWindow; import gtk.TreeView; import gtk.ListStore; import gtk.TreeViewColumn; import gtk.TreeIter; import gtk.Label; import gtk.Entry; import gtk.CellRenderer; import gtk.CellRendererText; import gtk.VBox; import gtk.Button; void main(string[] args) { Main.init(args); //Window auto window = new MainWindow("2DA-Edit"); auto cont = new VBox(false, 0); window.add(cont); cont.setSizeRequest(0, 100); auto buttonSave = new Button("document-save-symbolic", GtkIconSize.MENU); auto buttonOpen = new Button("document-open-symbolic", GtkIconSize.MENU); //"user-trash-symbolic" //"format-text-direction-ltr-symbolic" //"view-list-symbolic" version(Windows){ //Menu bar import gtk.HBox; auto cont2 = new HBox(false, 0); cont.packStart(cont2, false, false, 0); cont2.packStart(buttonOpen, false, false, 0); cont2.packEnd(buttonSave, false, false, 0); } else{ //Header bar import gtk.HeaderBar; auto header = new HeaderBar(); window.setTitlebar(header); header.setTitle("2DAEdit"); header.setProperty("show-close-button", true); header.packStart(buttonOpen); header.packEnd(buttonSave); } //TreeView to display database auto tree = new TreeView(); cont.packEnd(tree, true, true, 0); tree.setHeadersVisible(true); tree.setEnableSearch(true); tree.setProperty("enable-grid-lines", GtkTreeViewGridLines.VERTICAL); tree.setProperty("tooltip-column", 0); tree.setProperty("reorderable", true); tree.setProperty("headers-clickable", true); //Configure button callbacks buttonSave.addOnClicked((Button){ Save(tree); }); buttonOpen.addOnClicked((Button){ import gtk.Dialog; import gtk.FileChooserDialog; auto fc = new FileChooserDialog("Open 2DA", window, FileChooserAction.OPEN); auto res = fc.run(); if(res==GtkResponseType.OK){ string filename = fc.getFilename(); version(Windows) Open(filename, tree, cast(Object)window); else Open(filename, tree, cast(Object)header); } fc.destroy(); }); //Open if exists if(args.length>=2 && exists(args[1])){ version(Windows) Open(args[1], tree, cast(Object)window); else Open(args[1], tree, cast(Object)header); } window.showAll(); Main.run(); } void Save(ref TreeView tree){ auto store = cast(ListStore)tree.getModel(); if(store !is null){ TreeIter it = new TreeIter(); store.getIterFirst(it);//TODO: fail if first is null do{ for(int i=0 ; i lastLine) lastLine = nLine; } } } string[] header; string[][uint] values; uint lastLine; enum rgxField = ctRegex!"(?:\\b([^\\s]+?)\\b|\"([^\"]+?)\")"; }