diff options
Diffstat (limited to 'src/main.vala')
-rw-r--r-- | src/main.vala | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/main.vala b/src/main.vala new file mode 100644 index 0000000..4a55e92 --- /dev/null +++ b/src/main.vala @@ -0,0 +1,171 @@ +using Emulation; +using Gtk; + +namespace GUI +{ + public class CActions + { + public Action New; + public Action Open; + public Action Save; + public Action SaveAs; + public Action RemoveCS; + public Action ImportCS; + public Action ExportCS; + public Action Quit; + + public RadioAction EmulateR300; + public RadioAction EmulateR500; + + public CActions() + { + New = new Action("New", null, null, "gtk-new"); + Open = new Action("Open", null, null, "gtk-open"); + Save = new Action("Save", null, null, "gtk-save"); + SaveAs = new Action("SaveAs", null, null, "gtk-save-as"); + RemoveCS = new Action("RemoveCS", "Remove", "Remove selected CS' from the list", "gtk-remove"); + ImportCS = new Action("ImportCS", "Import", "Import a command stream to the list", "gtk-add"); + ExportCS = new Action("ExportCS", "Export", "Export a CS to a file", "gtk-convert"); + Quit = new Action("Quit", null, null, "gtk-quit"); + + EmulateR300 = new RadioAction("EmulateR300", "R300", "Emulate the R300 register space", null, Chip.R300); + EmulateR500 = new RadioAction("EmulateR500", "R500", "Emulate the R500 register space", null, Chip.R500); + EmulateR500.set_group(EmulateR300.get_group()); + EmulateR300.set_current_value(Chip.R300); + + ImportCS.activate += ((source) => { var d = new CSImport(); d.run(); }); + } + } + + public class CMenus + { + public Menu file; + public Menu edit; + public Menu emulation; + } + + public class CMain : Window + { + public CMenus menu; + public MenuBar menubar; + public Toolbar toolbar; + public ListStore cs_store; + + construct { + menu = new CMenus(); + + toolbar = new Toolbar(); + add_toolitem(actions.New); + add_toolitem(actions.Open); + add_toolitem(actions.Save); + toolbar.insert(new SeparatorToolItem() as ToolItem, -1); + add_toolitem(actions.RemoveCS); + add_toolitem(actions.ImportCS); + add_toolitem(actions.ExportCS); + + menu.file = new Menu(); + menu.file.append(actions.New.create_menu_item() as MenuItem); + menu.file.append(actions.Open.create_menu_item() as MenuItem); + menu.file.append(actions.Save.create_menu_item() as MenuItem); + menu.file.append(actions.SaveAs.create_menu_item() as MenuItem); + menu.file.append(new SeparatorMenuItem() as MenuItem); + menu.file.append(actions.Quit.create_menu_item() as MenuItem); + var menu_file_item = new MenuItem.with_label("File"); + menu_file_item.submenu = menu.file; + + menu.edit = new Menu(); + menu.edit.append(actions.RemoveCS.create_menu_item() as MenuItem); + menu.edit.append(actions.ImportCS.create_menu_item() as MenuItem); + menu.edit.append(actions.ExportCS.create_menu_item() as MenuItem); + var menu_edit_item = new MenuItem.with_label("Edit"); + menu_edit_item.submenu = menu.edit; + + menu.emulation = new Menu(); + menu.emulation.append(actions.EmulateR300.create_menu_item() as MenuItem); + menu.emulation.append(actions.EmulateR500.create_menu_item() as MenuItem); + var menu_emulation_item = new MenuItem.with_label("Emulation"); + menu_emulation_item.submenu = menu.emulation; + + menubar = new MenuBar(); + menubar.append(menu_file_item); + menubar.append(menu_edit_item); + menubar.append(menu_emulation_item); + + cs_store = new ListStore(2, typeof(string), typeof(CS)); + var cslist = new TreeView(); + cslist.insert_column_with_data_func(-1, "DWORDs", new CellRendererText(), dwords_cellrenderer); + cslist.insert_column_with_attributes(-1, "Name", new CellRendererText(), "text", 0, null); + cslist.set_model(cs_store); + cslist.row_activated += open_csview; + + var sw = new ScrolledWindow(null, null); + sw.hscrollbar_policy = PolicyType.AUTOMATIC; + sw.vscrollbar_policy = PolicyType.AUTOMATIC; + sw.add(cslist); + + var mainbox = new VBox(false, 0); + mainbox.pack_start(menubar, false, true, 0); + mainbox.pack_start(toolbar, false, true, 0); + mainbox.pack_start(sw, true, true, 0); + + set_size_request(400, 200); + title = "Radeon Simulator"; + add(mainbox); + destroy += main_quit; + + show_all(); + } + + private void add_toolitem(Action action) + { + ToolItem titem = action.create_tool_item() as ToolItem; + titem.set_homogeneous(false); + toolbar.insert(titem, -1); + } + + private void dwords_cellrenderer(TreeViewColumn tree_column, CellRenderer cell, TreeModel model, TreeIter iter) + { + CS cs; + model.get(iter, 1, out cs, -1); + assert(cs != null); + (cell as CellRendererText).text = cs.dwords.length.to_string(); + } + + private void open_csview(TreePath path, TreeViewColumn column) + { + TreeIter iter; + CS cs; + cs_store.get_iter(out iter, path); + cs_store.get(iter, 1, out cs, -1); + + var csv = new CSView(cs, r500_registers); + csv.show_all(); + } + } + + public static CActions actions; + public static CMain main; + + static void init(ref unowned string[] args) + { + Gtk.init(ref args); + actions = new CActions(); + main = new CMain(); + Gtk.main(); + } +} + +public Spec r300_registers; +public Spec r500_registers; + +public static int main(string[] args) +{ + r300_registers = new Spec(); + r500_registers = new Spec(); + r300_registers.load_xml("r300reg.xml", "r300"); + r500_registers.load_xml("r300reg.xml", "r500"); + GUI.init(ref args); + r300_registers.unref(); + r500_registers.unref(); + return 0; +} |