diff --git a/src/core/cartridge.ml b/src/core/cartridge.ml index a0d908c..3a9dc11 100644 --- a/src/core/cartridge.ml +++ b/src/core/cartridge.ml @@ -67,6 +67,8 @@ let get_RAM_size = function let read_cartridge file = + Printf.printf "Read cartridge: %s" file; + print_newline (); try let ic = open_in_bin file in diff --git a/src/core/cbindings.ml b/src/core/cbindings.ml index 14dbf97..d08f928 100644 --- a/src/core/cbindings.ml +++ b/src/core/cbindings.ml @@ -1,3 +1,4 @@ let () = Callback.register "oboy_name" Version.name; Callback.register "oboy_version" Version.version; + Callback.register "oboy_load" State.load_cartridge; diff --git a/src/core/state.ml b/src/core/state.ml index b017035..b40bace 100644 --- a/src/core/state.ml +++ b/src/core/state.ml @@ -1,9 +1,16 @@ (* State of the world, contains all the required information at any point *) type t = { - cartridge : option Cartridge.t; + mutable cartridge : Cartridge.t option; } (* Global reference *) let state = ref { cartridge = None } + +let load_cartridge file = + let cartridge = Cartridge.read_cartridge file in + !state.cartridge <- cartridge; + match cartridge with + | Some _ -> true + | None -> false diff --git a/src/qt/About.qml b/src/qt/About.qml index 4b90dc4..59476ce 100644 --- a/src/qt/About.qml +++ b/src/qt/About.qml @@ -1,6 +1,5 @@ import QtQuick 2.4 import QtQuick.Window 2.0 -import com.oboy.oboy 1.0 Window { id: window @@ -12,10 +11,6 @@ Window { maximumHeight: height minimumHeight: height - OBoy { - id: oboy - } - Text { id: name text: oboy.name diff --git a/src/qt/main.qml b/src/qt/main.qml index 1c60442..0f523b7 100644 --- a/src/qt/main.qml +++ b/src/qt/main.qml @@ -1,6 +1,7 @@ import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Dialogs 1.2 +import com.oboy.oboy 1.0 ApplicationWindow { id: root @@ -49,6 +50,10 @@ ApplicationWindow { } + OBoy { + id: oboy + } + MainForm { anchors.fill: parent openButton.onClicked: fileDialog.open() @@ -70,7 +75,8 @@ ApplicationWindow { title: "Please choose a file" folder: shortcuts.home onAccepted: { - console.log("You chose: " + fileDialog.fileUrls) + console.log("You chose: " + fileDialog.fileUrl) + oboy.load(fileDialog.fileUrl) } onRejected: { console.log("Canceled") diff --git a/src/qt/oboy.cpp b/src/qt/oboy.cpp index d02ac3e..d66a3b2 100644 --- a/src/qt/oboy.cpp +++ b/src/qt/oboy.cpp @@ -2,6 +2,9 @@ #include #include +#include +#include +#include OBoy::OBoy(QObject *parent) : QObject(parent) { @@ -29,3 +32,19 @@ QString OBoy::version() const const char *str = String_val(caml_callback(*closure_f, Val_unit)); return QString(str); } + +bool OBoy::load(const QString &path) +{ + value * closure_f = caml_named_value("oboy_load"); + if (closure_f == nullptr) { + return false; + } + + QString truncated(path); + truncated.remove(0, 7); // remove file:// + QByteArray ba = truncated.toLocal8Bit(); + value ocaml_path = caml_copy_string_of_os(ba.data()); + + const bool success = Bool_val(caml_callback(*closure_f, ocaml_path)); + return success; +} diff --git a/src/qt/oboy.h b/src/qt/oboy.h index 804b71b..5a67932 100644 --- a/src/qt/oboy.h +++ b/src/qt/oboy.h @@ -5,11 +5,12 @@ class OBoy : public QObject { Q_OBJECT - Q_PROPERTY(QString name READ name) - Q_PROPERTY(QString version READ version) + Q_PROPERTY(QString name READ name CONSTANT) + Q_PROPERTY(QString version READ version CONSTANT) public: explicit OBoy(QObject *parent = nullptr); QString name() const; QString version() const; + Q_INVOKABLE bool load(const QString &path); };