#include "work.hpp" #include "compat/library-path.hpp" #include #include #include #include QString Work::browse_datalogging_file(main_settings &s) { QString filename = s.tracklogging_filename; if (filename.isEmpty()) filename = OPENTRACK_BASE_PATH; /* Sometimes this function freezes the app before opening the dialog. Might be related to https://forum.qt.io/topic/49209/qfiledialog-getopenfilename-hangs-in-windows-when-using-the-native-dialog/8 and be a known problem. Possible solution is to use the QFileDialog::DontUseNativeDialog flag. Since the freeze is apparently random, I'm not sure it helped. */ QString newfilename = QFileDialog::getSaveFileName(nullptr, tr("Select filename"), filename, tr("CSV File (*.csv)"), nullptr); if (!newfilename.isEmpty()) { s.tracklogging_filename = newfilename; } // dialog likes to mess with current directory QDir::setCurrent(OPENTRACK_BASE_PATH); return newfilename; } std::unique_ptr Work::make_logger(main_settings &s) { if (s.tracklogging_enabled) { QString filename = browse_datalogging_file(s); if (filename.isEmpty()) { // The user probably canceled the file dialog. In this case we don't want to do anything. return {}; } else { auto logger = std::make_unique(*s.tracklogging_filename); if (!logger->is_open()) { QMessageBox::warning(nullptr, tr("Logging error"), tr("Unable to open file '%1'. Proceeding without logging.").arg(s.tracklogging_filename), QMessageBox::Ok, QMessageBox::NoButton); } else return logger; } } return std::make_unique(); } Work::Work(Mappings& m, event_handler& ev, QFrame* frame, const dylibptr& tracker_, const dylibptr& filter_, const dylibptr& proto_) : libs(frame, tracker_, filter_, proto_), pipeline_{ m, libs, ev, *logger } { if (!is_ok()) return; reload_shortcuts(); pipeline_.start(); } void Work::reload_shortcuts() { sc.reload(keys); } bool Work::is_ok() const { return libs.correct; } // TODO member dtor order looks fine, check valgrind -sh 20180706 #if 0 Work::~Work() { // order matters, otherwise use-after-free -sh //sc = nullptr; //pipeline = nullptr; //libs = runtime_libraries(); } #endif