From f7e3f2b6e9e157b3bba916428794ba81ba3fdbbe Mon Sep 17 00:00:00 2001
From: Alex Janka <alex@alexjanka.com>
Date: Sat, 4 Nov 2023 09:40:03 +1100
Subject: [PATCH] almost can run from mac ui

---
 gb-emu/src/bin/macos/mod.rs | 23 ++++++++++++++++++++++-
 gb-emu/src/lib.rs           | 15 +++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/gb-emu/src/bin/macos/mod.rs b/gb-emu/src/bin/macos/mod.rs
index 0e71967..e39e12d 100644
--- a/gb-emu/src/bin/macos/mod.rs
+++ b/gb-emu/src/bin/macos/mod.rs
@@ -1,8 +1,10 @@
+use std::path::PathBuf;
 use std::sync::RwLock;
 
 use cacao::appkit::menu::{Menu, MenuItem};
 use cacao::appkit::window::{Window, WindowConfig, WindowStyle, WindowToolbarStyle};
 use cacao::appkit::{App, AppDelegate};
+use cacao::filesystem::FileSelectPanel;
 use cacao::notification_center::Dispatcher;
 
 use self::preferences::{PreferencesMessage, PreferencesUi};
@@ -23,6 +25,25 @@ pub(crate) struct TwincUiApp {
     preferences: RwLock<Window<PreferencesUi>>,
 }
 
+impl TwincUiApp {
+    fn open_dialog(&self) {
+        let mut file_select_panel = FileSelectPanel::new();
+        file_select_panel.set_can_choose_directories(false);
+        file_select_panel.set_can_choose_files(true);
+        file_select_panel.set_allows_multiple_selection(false);
+        file_select_panel.show(move |v| {
+            if let Some(path) = v.first() {
+                open_file(path.pathbuf());
+            }
+        });
+    }
+}
+
+fn open_file(path: PathBuf) {
+    println!("open {path:?}");
+    // gb_emu::run(gb_emu::RunOptions::new(path));
+}
+
 impl Default for TwincUiApp {
     fn default() -> Self {
         Self {
@@ -59,7 +80,7 @@ impl Dispatcher for TwincUiApp {
 
     fn on_ui_message(&self, message: Self::Message) {
         match message {
-            AppMessage::Core(CoreMessage::Open) => println!("open"),
+            AppMessage::Core(CoreMessage::Open) => self.open_dialog(),
             AppMessage::Core(CoreMessage::OpenPreferences) => {
                 self.preferences.read().unwrap().show();
             }
diff --git a/gb-emu/src/lib.rs b/gb-emu/src/lib.rs
index 00e62f3..f98da0a 100644
--- a/gb-emu/src/lib.rs
+++ b/gb-emu/src/lib.rs
@@ -81,6 +81,21 @@ pub struct RunOptions {
     pub record: bool,
 }
 
+impl RunOptions {
+    pub fn new(rom: PathBuf) -> Self {
+        Self {
+            rom,
+            save: SramType::Auto,
+            serial: SerialTarget::None,
+            tile_window: false,
+            layer_window: false,
+            mute: false,
+            debug: false,
+            record: false,
+        }
+    }
+}
+
 pub fn run(options: RunOptions) -> ! {
     let (sender, receiver) = channel::<EmulatorMessage>();