summaryrefslogtreecommitdiffhomepage
path: root/logic/work.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/work.cpp')
-rw-r--r--logic/work.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/logic/work.cpp b/logic/work.cpp
new file mode 100644
index 00000000..8d00270b
--- /dev/null
+++ b/logic/work.cpp
@@ -0,0 +1,73 @@
+#include "work.hpp"
+
+#include <QMessageBox>
+
+
+std::shared_ptr<TrackLogger> Work::make_logger(const main_settings &s)
+{
+ if (s.tracklogging_enabled)
+ {
+ if (static_cast<QString>(s.tracklogging_filename).isEmpty())
+ {
+ QMessageBox::warning(nullptr, "Logging Error",
+ "No filename given for track logging. Proceeding without logging.",
+ QMessageBox::Ok,
+ QMessageBox::NoButton);
+ }
+ else
+ {
+ auto logger = std::make_shared<TrackLoggerCSV>(s.tracklogging_filename);
+ if (!logger->is_open())
+ {
+ logger = nullptr;
+ QMessageBox::warning(nullptr, "Logging Error",
+ "Unable to open file: " + s.tracklogging_filename + ". Proceeding without logging.",
+ QMessageBox::Ok,
+ QMessageBox::NoButton);
+ }
+ else
+ {
+ /* As this function has the potential to fill up the hard drive
+ of the unwary with junk data, a warning is in order. */
+ QMessageBox::warning(nullptr, "Logging Active",
+ "Just a heads up. You are recoding pose data to " + s.tracklogging_filename + "!",
+ QMessageBox::Ok,
+ QMessageBox::NoButton);
+ return logger;
+ }
+ }
+ }
+ return std::make_shared<TrackLogger>();
+}
+
+
+Work::Work(Mappings& m, SelectedLibraries& libs, WId handle) :
+ libs(libs),
+ logger(make_logger(s)),
+ tracker(std::make_shared<Tracker>(m, libs, *logger)),
+ sc(std::make_shared<Shortcuts>()),
+ handle(handle),
+ keys {
+ key_tuple(s.key_center, [&](bool) -> void { tracker->center(); }, true),
+ key_tuple(s.key_toggle, [&](bool) -> void { tracker->toggle_enabled(); }, true),
+ key_tuple(s.key_zero, [&](bool) -> void { tracker->zero(); }, true),
+ key_tuple(s.key_toggle_press, [&](bool x) -> void { tracker->set_toggle(!x); }, false),
+ key_tuple(s.key_zero_press, [&](bool x) -> void { tracker->set_zero(x); }, false),
+ }
+{
+ reload_shortcuts();
+ tracker->start();
+}
+
+void Work::reload_shortcuts()
+{
+ sc->reload(keys);
+}
+
+Work::~Work()
+{
+ sc = nullptr;
+ // order matters, otherwise use-after-free -sh
+ tracker = nullptr;
+ libs = SelectedLibraries();
+}