From b80654a5193536050c8f8e494ba5fd402b7a18aa Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 22 Mar 2007 01:16:48 +0000 Subject: Cleaned up loading code. Preliminary action loading code (queried from RDF but not actually created yet). Fixed URI/filename handling so command line 'machina' accepts either. git-svn-id: http://svn.drobilla.net/lad/machina@367 a436a847-0d15-0410-975c-d299462d15a1 --- src/gui/MachinaCanvas.cpp | 8 +++++--- src/gui/MachinaGUI.cpp | 48 ++++++++++++++++++++++++++++++++--------------- src/gui/MachinaGUI.hpp | 2 +- src/gui/main.cpp | 5 ++++- 4 files changed, 43 insertions(+), 20 deletions(-) (limited to 'src/gui') diff --git a/src/gui/MachinaCanvas.cpp b/src/gui/MachinaCanvas.cpp index 34db1c1..10334d0 100644 --- a/src/gui/MachinaCanvas.cpp +++ b/src/gui/MachinaCanvas.cpp @@ -84,8 +84,10 @@ MachinaCanvas::canvas_event(GdkEvent* event) { static int last = 0; - assert(event); - + SharedPtr machine = _app->machine(); + if (!machine) + return false; + if (event->type == GDK_BUTTON_RELEASE && event->button.state & GDK_CONTROL_MASK) { @@ -106,7 +108,7 @@ MachinaCanvas::canvas_event(GdkEvent* event) view->resize(); view->raise_to_top(); - _app->machine()->add_node(node); + machine->add_node(node); } } diff --git a/src/gui/MachinaGUI.cpp b/src/gui/MachinaGUI.cpp index 83a7504..0ab4356 100644 --- a/src/gui/MachinaGUI.cpp +++ b/src/gui/MachinaGUI.cpp @@ -54,7 +54,8 @@ MachinaGUI::MachinaGUI(SharedPtr engine) fs.open(glade_filename.c_str()); if (fs.fail()) { - cerr << "Unable to find machina.glade in current directory or " << PKGDATADIR << "." << endl; + cerr << "Unable to find machina.glade in current directory or " + << PKGDATADIR << "." << endl; exit(EXIT_FAILURE); } fs.close(); @@ -330,10 +331,12 @@ MachinaGUI::menu_file_open() const int result = dialog.run(); if (result == Gtk::RESPONSE_OK) { - SharedPtr new_machine = _engine->load_machine(dialog.get_uri()); - _canvas->destroy(); - _canvas->build(new_machine); - _save_filename = dialog.get_filename(); + _save_uri = dialog.get_uri(); + SharedPtr new_machine = _engine->load_machine(_save_uri); + if (new_machine) { + _canvas->destroy(); + _canvas->build(new_machine); + } } } @@ -341,13 +344,21 @@ MachinaGUI::menu_file_open() void MachinaGUI::menu_file_save() { - if (_save_filename == "") { + if (_save_uri == "" || _save_uri.substr(0, 5) != "file:") { menu_file_save_as(); } else { + char* save_filename = raptor_uri_uri_string_to_filename( + (const unsigned char*)_save_uri.c_str()); + if (!save_filename) { + cerr << "ERROR: Unable to create filename from \"" << _save_uri << "\"" << endl; + menu_file_save_as(); + } Raul::RDFWriter writer; - writer.start_to_filename(_save_filename); + cout << "Writing machine to " << save_filename << endl; + writer.start_to_filename(save_filename); machine()->write_state(writer); writer.finish(); + free(save_filename); } } @@ -355,20 +366,24 @@ MachinaGUI::menu_file_save() void MachinaGUI::menu_file_save_as() { - Gtk::FileChooserDialog dialog(*_main_window, "Save Machine", Gtk::FILE_CHOOSER_ACTION_SAVE); + Gtk::FileChooserDialog dialog(*_main_window, "Save Machine", + Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); - if (_save_filename.length() > 0) - dialog.set_filename(_save_filename); + if (_save_uri.length() > 0) + dialog.set_uri(_save_uri); const int result = dialog.run(); - assert(result == Gtk::RESPONSE_OK || result == Gtk::RESPONSE_CANCEL || result == Gtk::RESPONSE_NONE); + assert(result == Gtk::RESPONSE_OK + || result == Gtk::RESPONSE_CANCEL + || result == Gtk::RESPONSE_NONE); if (result == Gtk::RESPONSE_OK) { string filename = dialog.get_filename(); + if (filename.length() < 8 || filename.substr(filename.length()-8) != ".machina") filename += ".machina"; @@ -394,7 +409,7 @@ MachinaGUI::menu_file_save_as() writer.start_to_filename(filename); machine()->write_state(writer); writer.finish(); - _save_filename = filename; + _save_uri = dialog.get_uri(); } } } @@ -403,7 +418,8 @@ MachinaGUI::menu_file_save_as() void MachinaGUI::menu_import_midi() { - Gtk::FileChooserDialog dialog(*_main_window, "Learn from MIDI file", Gtk::FILE_CHOOSER_ACTION_OPEN); + Gtk::FileChooserDialog dialog(*_main_window, "Learn from MIDI file", + Gtk::FILE_CHOOSER_ACTION_OPEN); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); @@ -444,7 +460,8 @@ MachinaGUI::menu_import_midi() void MachinaGUI::menu_export_midi() { - Gtk::FileChooserDialog dialog(*_main_window, "Export to a MIDI file", Gtk::FILE_CHOOSER_ACTION_SAVE); + Gtk::FileChooserDialog dialog(*_main_window, "Export to a MIDI file", + Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); @@ -468,7 +485,8 @@ MachinaGUI::menu_export_midi() void MachinaGUI::menu_export_graphviz() { - Gtk::FileChooserDialog dialog(*_main_window, "Export to a GraphViz DOT file", Gtk::FILE_CHOOSER_ACTION_SAVE); + Gtk::FileChooserDialog dialog(*_main_window, "Export to a GraphViz DOT file", + Gtk::FILE_CHOOSER_ACTION_SAVE); dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); diff --git a/src/gui/MachinaGUI.hpp b/src/gui/MachinaGUI.hpp index 6677d24..3c16f86 100644 --- a/src/gui/MachinaGUI.hpp +++ b/src/gui/MachinaGUI.hpp @@ -84,7 +84,7 @@ protected: bool _refresh; - string _save_filename; + string _save_uri; boost::shared_ptr _canvas; boost::shared_ptr _engine; diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 5f208b4..6f1fc4d 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -45,11 +45,14 @@ main(int argc, char** argv) machine = file_driver->learn(filename); } + if (!machine) + machine = SharedPtr(new Machine()); + // Build engine SharedPtr driver; #ifdef WITH_JACK driver = SharedPtr(new JackDriver(machine)); - driver->attach("machina"); + ((JackDriver*)driver.get())->attach("machina"); #endif if (!driver) driver = SharedPtr(new SMFDriver(machine)); -- cgit v1.2.1