1 #include "bcdisplayinfo.h"
5 #include "motionwindow.h"
12 PLUGIN_THREAD_OBJECT(MotionMain, MotionThread, MotionWindow)
16 MotionWindow::MotionWindow(MotionMain *plugin, int x, int y)
17 : BC_Window(plugin->gui_string,
27 this->plugin = plugin;
30 MotionWindow::~MotionWindow()
34 int MotionWindow::create_objects()
36 int x1 = 10, x = 10, y = 10;
42 add_subwindow(global = new MotionGlobal(plugin,
47 add_subwindow(rotate = new MotionRotate(plugin,
53 add_subwindow(title = new BC_Title(x1,
55 _("Translation search radius:\n(Percent of image)")));
56 add_subwindow(global_range = new GlobalRange(plugin,
57 x1 + title->get_w() + 10,
60 add_subwindow(title = new BC_Title(x2,
62 _("Rotation search radius:\n(Degrees)")));
63 add_subwindow(rotation_range = new RotationRange(plugin,
64 x2 + title->get_w() + 10,
68 add_subwindow(title = new BC_Title(x1,
70 _("Translation block size:\n(Percent of image)")));
71 add_subwindow(global_block_size = new GlobalBlockSize(plugin,
72 x1 + title->get_w() + 10,
75 add_subwindow(title = new BC_Title(x2,
77 _("Rotation block size:\n(Percent of image)")));
78 add_subwindow(rotation_block_size = new RotationBlockSize(plugin,
79 x2 + title->get_w() + 10,
83 add_subwindow(title = new BC_Title(x1, y, _("Translation search steps:")));
84 add_subwindow(global_search_positions = new GlobalSearchPositions(plugin,
85 x1 + title->get_w() + 10,
88 global_search_positions->create_objects();
90 add_subwindow(title = new BC_Title(x2, y, _("Rotation search steps:")));
91 add_subwindow(rotation_search_positions = new RotationSearchPositions(plugin,
92 x2 + title->get_w() + 10,
95 rotation_search_positions->create_objects();
98 add_subwindow(title = new BC_Title(x, y + 10, _("Block X:")));
99 add_subwindow(block_x = new MotionBlockX(plugin,
101 x + title->get_w() + 10,
103 add_subwindow(block_x_text = new MotionBlockXText(plugin,
105 x + title->get_w() + 10 + block_x->get_w() + 10,
109 add_subwindow(title = new BC_Title(x, y + 10, _("Block Y:")));
110 add_subwindow(block_y = new MotionBlockY(plugin,
112 x + title->get_w() + 10,
114 add_subwindow(block_y_text = new MotionBlockYText(plugin,
116 x + title->get_w() + 10 + block_y->get_w() + 10,
120 add_subwindow(title = new BC_Title(x, y + 10, _("Maximum absolute offset:")));
121 add_subwindow(magnitude = new MotionMagnitude(plugin,
122 x + title->get_w() + 10,
126 add_subwindow(title = new BC_Title(x, y + 10, _("Settling speed:")));
127 add_subwindow(return_speed = new MotionReturnSpeed(plugin,
128 x + title->get_w() + 10,
134 add_subwindow(vectors = new MotionDrawVectors(plugin,
141 add_subwindow(track_single = new TrackSingleFrame(plugin,
145 add_subwindow(title = new BC_Title(x + track_single->get_w() + 20,
147 _("Frame number:")));
148 add_subwindow(track_frame_number = new TrackFrameNumber(plugin,
150 x + track_single->get_w() + title->get_w() + 20,
154 add_subwindow(track_previous = new TrackPreviousFrame(plugin,
160 add_subwindow(previous_same = new PreviousFrameSameBlock(plugin,
167 add_subwindow(title = new BC_Title(x, y, _("Master layer:")));
168 add_subwindow(master_layer = new MasterLayer(plugin,
170 x + title->get_w() + 10,
172 master_layer->create_objects();
176 add_subwindow(title = new BC_Title(x, y, _("Action:")));
177 add_subwindow(mode1 = new Mode1(plugin,
179 x + title->get_w() + 10,
181 mode1->create_objects();
187 add_subwindow(title = new BC_Title(x, y, _("Calculation:")));
188 add_subwindow(mode2 = new Mode2(plugin,
190 x + title->get_w() + 10,
192 mode2->create_objects();
199 void MotionWindow::update_mode()
201 global_range->update(plugin->config.global_range,
204 rotation_range->update(plugin->config.rotation_range,
207 vectors->update(plugin->config.draw_vectors);
208 global->update(plugin->config.global);
209 rotate->update(plugin->config.rotate);
213 WINDOW_CLOSE_EVENT(MotionWindow)
224 GlobalRange::GlobalRange(MotionMain *plugin,
229 (int64_t)plugin->config.global_range,
233 this->plugin = plugin;
237 int GlobalRange::handle_event()
239 plugin->config.global_range = (int)get_value();
240 plugin->send_configure_change();
247 RotationRange::RotationRange(MotionMain *plugin,
252 (int64_t)plugin->config.rotation_range,
253 (int64_t)MIN_ROTATION,
254 (int64_t)MAX_ROTATION)
256 this->plugin = plugin;
260 int RotationRange::handle_event()
262 plugin->config.rotation_range = (int)get_value();
263 plugin->send_configure_change();
274 GlobalBlockSize::GlobalBlockSize(MotionMain *plugin,
279 (int64_t)plugin->config.global_block_size,
283 this->plugin = plugin;
287 int GlobalBlockSize::handle_event()
289 plugin->config.global_block_size = (int)get_value();
290 plugin->send_configure_change();
296 RotationBlockSize::RotationBlockSize(MotionMain *plugin,
301 (int64_t)plugin->config.rotation_block_size,
305 this->plugin = plugin;
309 int RotationBlockSize::handle_event()
311 plugin->config.rotation_block_size = (int)get_value();
312 plugin->send_configure_change();
326 GlobalSearchPositions::GlobalSearchPositions(MotionMain *plugin,
336 this->plugin = plugin;
338 void GlobalSearchPositions::create_objects()
340 add_item(new BC_MenuItem("64"));
341 add_item(new BC_MenuItem("128"));
342 add_item(new BC_MenuItem("256"));
343 add_item(new BC_MenuItem("512"));
344 add_item(new BC_MenuItem("1024"));
345 add_item(new BC_MenuItem("2048"));
346 add_item(new BC_MenuItem("4096"));
347 add_item(new BC_MenuItem("8192"));
348 add_item(new BC_MenuItem("16384"));
349 add_item(new BC_MenuItem("32768"));
350 add_item(new BC_MenuItem("65536"));
351 add_item(new BC_MenuItem("131072"));
352 char string[BCTEXTLEN];
353 sprintf(string, "%d", plugin->config.global_positions);
357 int GlobalSearchPositions::handle_event()
359 plugin->config.global_positions = atoi(get_text());
360 plugin->send_configure_change();
370 RotationSearchPositions::RotationSearchPositions(MotionMain *plugin,
380 this->plugin = plugin;
382 void RotationSearchPositions::create_objects()
384 add_item(new BC_MenuItem("4"));
385 add_item(new BC_MenuItem("8"));
386 add_item(new BC_MenuItem("16"));
387 add_item(new BC_MenuItem("32"));
388 char string[BCTEXTLEN];
389 sprintf(string, "%d", plugin->config.rotate_positions);
393 int RotationSearchPositions::handle_event()
395 plugin->config.rotate_positions = atoi(get_text());
396 plugin->send_configure_change();
407 MotionMagnitude::MotionMagnitude(MotionMain *plugin,
412 (int64_t)plugin->config.magnitude,
416 this->plugin = plugin;
419 int MotionMagnitude::handle_event()
421 plugin->config.magnitude = (int)get_value();
422 plugin->send_configure_change();
427 MotionReturnSpeed::MotionReturnSpeed(MotionMain *plugin,
432 (int64_t)plugin->config.return_speed,
436 this->plugin = plugin;
439 int MotionReturnSpeed::handle_event()
441 plugin->config.return_speed = (int)get_value();
442 plugin->send_configure_change();
450 MotionGlobal::MotionGlobal(MotionMain *plugin,
456 plugin->config.global,
457 _("Track translation"))
459 this->plugin = plugin;
463 int MotionGlobal::handle_event()
465 plugin->config.global = get_value();
466 plugin->send_configure_change();
470 MotionRotate::MotionRotate(MotionMain *plugin,
476 plugin->config.rotate,
479 this->plugin = plugin;
483 int MotionRotate::handle_event()
485 plugin->config.rotate = get_value();
486 plugin->send_configure_change();
494 MotionBlockX::MotionBlockX(MotionMain *plugin,
500 plugin->config.block_x,
504 this->plugin = plugin;
508 int MotionBlockX::handle_event()
510 plugin->config.block_x = get_value();
511 gui->block_x_text->update((float)plugin->config.block_x);
512 plugin->send_configure_change();
519 MotionBlockY::MotionBlockY(MotionMain *plugin,
525 (float)plugin->config.block_x,
529 this->plugin = plugin;
533 int MotionBlockY::handle_event()
535 plugin->config.block_y = get_value();
536 gui->block_y_text->update((float)plugin->config.block_y);
537 plugin->send_configure_change();
541 MotionBlockXText::MotionBlockXText(MotionMain *plugin,
549 (float)plugin->config.block_x)
551 this->plugin = plugin;
556 int MotionBlockXText::handle_event()
558 plugin->config.block_x = atof(get_text());
559 gui->block_x->update(plugin->config.block_x);
560 plugin->send_configure_change();
567 MotionBlockYText::MotionBlockYText(MotionMain *plugin,
575 (float)plugin->config.block_y)
577 this->plugin = plugin;
582 int MotionBlockYText::handle_event()
584 plugin->config.block_y = atof(get_text());
585 gui->block_y->update(plugin->config.block_y);
586 plugin->send_configure_change();
605 MotionDrawVectors::MotionDrawVectors(MotionMain *plugin,
611 plugin->config.draw_vectors,
615 this->plugin = plugin;
618 int MotionDrawVectors::handle_event()
620 plugin->config.draw_vectors = get_value();
621 plugin->send_configure_change();
632 TrackSingleFrame::TrackSingleFrame(MotionMain *plugin,
638 plugin->config.mode3 == MotionConfig::TRACK_SINGLE,
639 _("Track single frame"))
641 this->plugin = plugin;
645 int TrackSingleFrame::handle_event()
647 plugin->config.mode3 = MotionConfig::TRACK_SINGLE;
648 gui->track_previous->update(0);
649 gui->previous_same->update(0);
650 gui->track_frame_number->enable();
651 plugin->send_configure_change();
662 TrackFrameNumber::TrackFrameNumber(MotionMain *plugin,
666 : BC_TextBox(x, y, 100, 1, plugin->config.track_frame)
668 this->plugin = plugin;
670 if(plugin->config.mode3 != MotionConfig::TRACK_SINGLE) disable();
673 int TrackFrameNumber::handle_event()
675 plugin->config.track_frame = atol(get_text());
676 plugin->send_configure_change();
686 TrackPreviousFrame::TrackPreviousFrame(MotionMain *plugin,
692 plugin->config.mode3 == MotionConfig::TRACK_PREVIOUS,
693 _("Track previous frame"))
695 this->plugin = plugin;
698 int TrackPreviousFrame::handle_event()
700 plugin->config.mode3 = MotionConfig::TRACK_PREVIOUS;
701 gui->track_single->update(0);
702 gui->previous_same->update(0);
703 gui->track_frame_number->disable();
704 plugin->send_configure_change();
715 PreviousFrameSameBlock::PreviousFrameSameBlock(MotionMain *plugin,
721 plugin->config.mode3 == MotionConfig::PREVIOUS_SAME_BLOCK,
722 _("Previous frame same block"))
724 this->plugin = plugin;
727 int PreviousFrameSameBlock::handle_event()
729 plugin->config.mode3 = MotionConfig::PREVIOUS_SAME_BLOCK;
730 gui->track_single->update(0);
731 gui->track_previous->update(0);
732 gui->track_frame_number->disable();
733 plugin->send_configure_change();
744 MasterLayer::MasterLayer(MotionMain *plugin, MotionWindow *gui, int x, int y)
748 to_text(plugin->config.bottom_is_master))
750 this->plugin = plugin;
754 int MasterLayer::handle_event()
756 plugin->config.bottom_is_master = from_text(get_text());
757 plugin->send_configure_change();
761 void MasterLayer::create_objects()
763 add_item(new BC_MenuItem(to_text(0)));
764 add_item(new BC_MenuItem(to_text(1)));
767 int MasterLayer::from_text(char *text)
769 if(!strcmp(text, _("Top"))) return 0;
773 char* MasterLayer::to_text(int mode)
775 return mode ? _("Bottom") : _("Top");
778 int MasterLayer::calculate_w(MotionWindow *gui)
781 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(0)));
782 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(1)));
793 Mode1::Mode1(MotionMain *plugin, MotionWindow *gui, int x, int y)
797 to_text(plugin->config.mode1))
799 this->plugin = plugin;
803 int Mode1::handle_event()
805 plugin->config.mode1 = from_text(get_text());
806 plugin->send_configure_change();
810 void Mode1::create_objects()
812 add_item(new BC_MenuItem(to_text(MotionConfig::TRACK)));
813 add_item(new BC_MenuItem(to_text(MotionConfig::TRACK_PIXEL)));
814 add_item(new BC_MenuItem(to_text(MotionConfig::STABILIZE)));
815 add_item(new BC_MenuItem(to_text(MotionConfig::STABILIZE_PIXEL)));
816 add_item(new BC_MenuItem(to_text(MotionConfig::NOTHING)));
819 int Mode1::from_text(char *text)
821 if(!strcmp(text, _("Track Subpixel"))) return MotionConfig::TRACK;
822 if(!strcmp(text, _("Track Pixel"))) return MotionConfig::TRACK_PIXEL;
823 if(!strcmp(text, _("Stabilize Subpixel"))) return MotionConfig::STABILIZE;
824 if(!strcmp(text, _("Stabilize Pixel"))) return MotionConfig::STABILIZE_PIXEL;
825 if(!strcmp(text, _("Do Nothing"))) return MotionConfig::NOTHING;
828 char* Mode1::to_text(int mode)
832 case MotionConfig::TRACK:
833 return _("Track Subpixel");
835 case MotionConfig::TRACK_PIXEL:
836 return _("Track Pixel");
838 case MotionConfig::STABILIZE:
839 return _("Stabilize Subpixel");
841 case MotionConfig::STABILIZE_PIXEL:
842 return _("Stabilize Pixel");
844 case MotionConfig::NOTHING:
845 return _("Do Nothing");
850 int Mode1::calculate_w(MotionWindow *gui)
853 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::TRACK)));
854 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::TRACK_PIXEL)));
855 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::STABILIZE)));
856 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::STABILIZE_PIXEL)));
857 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::NOTHING)));
865 Mode2::Mode2(MotionMain *plugin, MotionWindow *gui, int x, int y)
869 to_text(plugin->config.mode2))
871 this->plugin = plugin;
875 int Mode2::handle_event()
877 plugin->config.mode2 = from_text(get_text());
878 plugin->send_configure_change();
882 void Mode2::create_objects()
884 add_item(new BC_MenuItem(to_text(MotionConfig::NO_CALCULATE)));
885 add_item(new BC_MenuItem(to_text(MotionConfig::RECALCULATE)));
886 add_item(new BC_MenuItem(to_text(MotionConfig::SAVE)));
887 add_item(new BC_MenuItem(to_text(MotionConfig::LOAD)));
890 int Mode2::from_text(char *text)
892 if(!strcmp(text, _("Don't Calculate"))) return MotionConfig::NO_CALCULATE;
893 if(!strcmp(text, _("Recalculate"))) return MotionConfig::RECALCULATE;
894 if(!strcmp(text, _("Save coords to /tmp"))) return MotionConfig::SAVE;
895 if(!strcmp(text, _("Load coords from /tmp"))) return MotionConfig::LOAD;
898 char* Mode2::to_text(int mode)
902 case MotionConfig::NO_CALCULATE:
903 return _("Don't Calculate");
905 case MotionConfig::RECALCULATE:
906 return _("Recalculate");
908 case MotionConfig::SAVE:
909 return _("Save coords to /tmp");
911 case MotionConfig::LOAD:
912 return _("Load coords from /tmp");
917 int Mode2::calculate_w(MotionWindow *gui)
920 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::NO_CALCULATE)));
921 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::RECALCULATE)));
922 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::SAVE)));
923 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::LOAD)));