summaryrefslogtreecommitdiff
path: root/src/main.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.vala')
-rw-r--r--src/main.vala171
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;
+}