diff options
Diffstat (limited to 'src/UIFile.hpp')
-rw-r--r-- | src/UIFile.hpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/UIFile.hpp b/src/UIFile.hpp new file mode 100644 index 0000000..6ae68f7 --- /dev/null +++ b/src/UIFile.hpp @@ -0,0 +1,74 @@ +/* This file is part of Patchage. + * Copyright 2007-2011 David Robillard <http://drobilla.net> + * + * Patchage is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * Patchage is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef PATCHAGE_GLADEFILE_HPP +#define PATCHAGE_GLADEFILE_HPP + +#include <fstream> +#include <sstream> +#include <stdexcept> +#include <string> + +#include <gtkmm.h> + +#include "raul/log.hpp" + +#include "patchage-config.h" +#ifdef PATCHAGE_BINLOC +#include "binary_location.h" +#endif + +class UIFile { +public: + inline static bool is_readable(const std::string& filename) { + std::ifstream fs(filename.c_str()); + const bool fail = fs.fail(); + fs.close(); + return !fail; + } + + static Glib::RefPtr<Gtk::Builder> open(const std::string& base_name) { + std::string ui_filename; + char* loc = NULL; +#ifdef PATCHAGE_BINLOC + loc = binary_location(); + if (loc) { + std::string bundle = loc; + bundle = bundle.substr(0, bundle.find_last_of("/")); + ui_filename = bundle + "/" + base_name + ".ui"; + free(loc); + if (is_readable(ui_filename)) { + Raul::info << "Loading UI file " << ui_filename << std::endl; + return Gtk::Builder::create_from_file(ui_filename); + } + } +#endif + ui_filename = std::string(PATCHAGE_DATA_DIR) + "/" + base_name + ".ui"; + if (is_readable(ui_filename)) { + Raul::info << "Loading UI file " << ui_filename << std::endl; + return Gtk::Builder::create_from_file(ui_filename); + } + + std::stringstream ss; + ss << "Unable to find " << base_name << ".ui in " << loc + << " or " << PATCHAGE_DATA_DIR << std::endl; + throw std::runtime_error(ss.str()); + return Glib::RefPtr<Gtk::Builder>(); + } +}; + +#endif // PATCHAGE_GLADEFILE_HPP |