+ strncpy(plugin->config.tracking_file, get_text(), sizeof(plugin->config.tracking_file));
+ plugin->reset_cache_file();
+ plugin->send_configure_change();
+ return 1;
+}
+
+MotionResetTracking::MotionResetTracking(MotionMain *plugin, MotionWindow *gui, int x, int y)
+ : BC_GenericButton(x, y, _("Generate tracking file name"))
+{
+ this->plugin = plugin;
+ this->gui = gui;
+};
+
+int MotionResetTracking::handle_event()
+{
+// First of all, ensure closing current tracking file
+ plugin->reset_cache_file();
+
+// Generate new tracking filename based on the asset filename
+ const char *sp = TRACKING_FILE;
+ char *cp = plugin->config.tracking_file, *ep = cp+sizeof(plugin->config.tracking_file)-1;
+ while( cp < ep && *sp != 0 ) *cp++ = *sp++;
+ if( cp < ep-1 && (sp=plugin->get_source_path()) ) {
+ *cp++ = '-';
+ const char *bp = strrchr(sp,'/');
+ if( bp ) sp = bp+1;
+ while( cp < ep && *sp != 0 ) {
+ *cp++ = (*sp>='a' && *sp<='z') ||
+ (*sp>='A' && *sp<='Z') ||
+ (*sp>='0' && *sp<='9') ? *sp : '_';
+ ++sp;
+ }
+ }
+ *cp = 0;
+
+ gui->tracking_file->update(plugin->config.tracking_file);
+ plugin->reset_cache_file();
+
+// Revert tracking type to not using tracking file
+ if( plugin->config.tracking_type == MotionScan::LOAD ||
+ plugin->config.tracking_type == MotionScan::SAVE )
+ {
+ plugin->config.tracking_type = MotionScan::NO_CALCULATE;
+ gui->tracking_type->set_text(TrackingType::to_text(plugin->config.tracking_type));
+ }
+
+ plugin->send_configure_change();
+ return 1;
+}
+
+MotionClearTracking::MotionClearTracking(MotionMain *plugin, MotionWindow *gui, int x, int y)
+ : BC_GenericButton(x, y, _("Clear tracking file contents"))
+{
+ this->plugin = plugin;
+ this->gui = gui;
+};
+
+int MotionClearTracking::handle_event()
+{
+ char save_file[BCTEXTLEN];
+
+// First of all, ensure closing current tracking file
+ plugin->reset_cache_file();
+
+// Suffix .bak not allowed: reserved for intermediate tracking file copy
+ snprintf(save_file, sizeof(save_file), "%s.old", plugin->config.tracking_file);
+ ::rename(plugin->config.tracking_file, save_file);
+
+// Just for safety
+ ::remove(plugin->config.tracking_file);
+ plugin->reset_cache_file();
+
+ return 1;
+}
+
+MotionFrameCurrent::MotionFrameCurrent(MotionMain *plugin, MotionWindow *gui, int x, int y)
+ : BC_GenericButton(x, y, _("Get current"))
+{
+ this->plugin = plugin;
+ this->gui = gui;
+};
+
+int MotionFrameCurrent::handle_event()
+{
+ plugin->config.track_frame = plugin->get_source_position();
+ gui->track_frame_number->update(plugin->config.track_frame);