00001 #include "bcdisplayinfo.h" 00002 #include "clip.h" 00003 #include "language.h" 00004 #include "motion.h" 00005 #include "motionwindow.h" 00006 00007 00008 00009 00010 00011 00012 PLUGIN_THREAD_OBJECT(MotionMain, MotionThread, MotionWindow) 00013 00014 00015 00016 MotionWindow::MotionWindow(MotionMain *plugin, int x, int y) 00017 : BC_Window(plugin->gui_string, 00018 x, 00019 y, 00020 610, 00021 650, 00022 610, 00023 650, 00024 0, 00025 1) 00026 { 00027 this->plugin = plugin; 00028 } 00029 00030 MotionWindow::~MotionWindow() 00031 { 00032 } 00033 00034 int MotionWindow::create_objects() 00035 { 00036 int x1 = 10, x = 10, y = 10; 00037 int x2 = 310; 00038 BC_Title *title; 00039 00040 00041 00042 add_subwindow(global = new MotionGlobal(plugin, 00043 this, 00044 x1, 00045 y)); 00046 00047 add_subwindow(rotate = new MotionRotate(plugin, 00048 this, 00049 x2, 00050 y)); 00051 y += 50; 00052 00053 add_subwindow(title = new BC_Title(x1, 00054 y, 00055 _("Translation search radius:\n(W/H Percent of image)"))); 00056 add_subwindow(global_range_w = new GlobalRange(plugin, 00057 x1 + title->get_w() + 10, 00058 y, 00059 &plugin->config.global_range_w)); 00060 add_subwindow(global_range_h = new GlobalRange(plugin, 00061 x1 + title->get_w() + 10 + global_range_w->get_w(), 00062 y, 00063 &plugin->config.global_range_h)); 00064 00065 add_subwindow(title = new BC_Title(x2, 00066 y, 00067 _("Rotation search radius:\n(Degrees)"))); 00068 add_subwindow(rotation_range = new RotationRange(plugin, 00069 x2 + title->get_w() + 10, 00070 y)); 00071 00072 y += 50; 00073 add_subwindow(title = new BC_Title(x1, 00074 y, 00075 _("Translation block size:\n(W/H Percent of image)"))); 00076 add_subwindow(global_block_w = new BlockSize(plugin, 00077 x1 + title->get_w() + 10, 00078 y, 00079 &plugin->config.global_block_w)); 00080 add_subwindow(global_block_h = new BlockSize(plugin, 00081 x1 + title->get_w() + 10 + global_block_w->get_w(), 00082 y, 00083 &plugin->config.global_block_h)); 00084 00085 add_subwindow(title = new BC_Title(x2, 00086 y, 00087 _("Rotation block size:\n(W/H Percent of image)"))); 00088 add_subwindow(rotation_block_w = new BlockSize(plugin, 00089 x2 + title->get_w() + 10, 00090 y, 00091 &plugin->config.rotation_block_w)); 00092 add_subwindow(rotation_block_h = new BlockSize(plugin, 00093 x2 + title->get_w() + 10 + rotation_block_w->get_w(), 00094 y, 00095 &plugin->config.rotation_block_h)); 00096 00097 y += 50; 00098 add_subwindow(title = new BC_Title(x1, y, _("Translation search steps:"))); 00099 add_subwindow(global_search_positions = new GlobalSearchPositions(plugin, 00100 x1 + title->get_w() + 10, 00101 y, 00102 80)); 00103 global_search_positions->create_objects(); 00104 00105 add_subwindow(title = new BC_Title(x2, y, _("Rotation search steps:"))); 00106 add_subwindow(rotation_search_positions = new RotationSearchPositions(plugin, 00107 x2 + title->get_w() + 10, 00108 y, 00109 80)); 00110 rotation_search_positions->create_objects(); 00111 00112 y += 50; 00113 add_subwindow(title = new BC_Title(x, y, _("Translation direction:"))); 00114 add_subwindow(mode3 = new Mode3(plugin, 00115 this, 00116 x + title->get_w() + 10, 00117 y)); 00118 mode3->create_objects(); 00119 00120 y += 40; 00121 add_subwindow(title = new BC_Title(x, y + 10, _("Block X:"))); 00122 add_subwindow(block_x = new MotionBlockX(plugin, 00123 this, 00124 x + title->get_w() + 10, 00125 y)); 00126 add_subwindow(block_x_text = new MotionBlockXText(plugin, 00127 this, 00128 x + title->get_w() + 10 + block_x->get_w() + 10, 00129 y + 10)); 00130 00131 y += 40; 00132 add_subwindow(title = new BC_Title(x, y + 10, _("Block Y:"))); 00133 add_subwindow(block_y = new MotionBlockY(plugin, 00134 this, 00135 x + title->get_w() + 10, 00136 y)); 00137 add_subwindow(block_y_text = new MotionBlockYText(plugin, 00138 this, 00139 x + title->get_w() + 10 + block_y->get_w() + 10, 00140 y + 10)); 00141 00142 y += 50; 00143 add_subwindow(title = new BC_Title(x, y + 10, _("Maximum absolute offset:"))); 00144 add_subwindow(magnitude = new MotionMagnitude(plugin, 00145 x + title->get_w() + 10, 00146 y)); 00147 00148 y += 40; 00149 add_subwindow(title = new BC_Title(x, y + 10, _("Settling speed:"))); 00150 add_subwindow(return_speed = new MotionReturnSpeed(plugin, 00151 x + title->get_w() + 10, 00152 y)); 00153 00154 00155 00156 y += 40; 00157 add_subwindow(vectors = new MotionDrawVectors(plugin, 00158 this, 00159 x, 00160 y)); 00161 00162 00163 y += 40; 00164 add_subwindow(track_single = new TrackSingleFrame(plugin, 00165 this, 00166 x, 00167 y)); 00168 add_subwindow(title = new BC_Title(x + track_single->get_w() + 20, 00169 y, 00170 _("Frame number:"))); 00171 add_subwindow(track_frame_number = new TrackFrameNumber(plugin, 00172 this, 00173 x + track_single->get_w() + title->get_w() + 20, 00174 y)); 00175 add_subwindow(addtrackedframeoffset = new AddTrackedFrameOffset(plugin, 00176 this, 00177 x + track_single->get_w() + title->get_w() + 20 + track_frame_number->get_w(), 00178 y)); 00179 00180 00181 y += 20; 00182 add_subwindow(track_previous = new TrackPreviousFrame(plugin, 00183 this, 00184 x, 00185 y)); 00186 00187 y += 20; 00188 add_subwindow(previous_same = new PreviousFrameSameBlock(plugin, 00189 this, 00190 x, 00191 y)); 00192 00193 y += 40; 00194 int y1 = y; 00195 add_subwindow(title = new BC_Title(x, y, _("Master layer:"))); 00196 add_subwindow(master_layer = new MasterLayer(plugin, 00197 this, 00198 x + title->get_w() + 10, 00199 y)); 00200 master_layer->create_objects(); 00201 y += 30; 00202 00203 00204 add_subwindow(title = new BC_Title(x, y, _("Action:"))); 00205 add_subwindow(mode1 = new Mode1(plugin, 00206 this, 00207 x + title->get_w() + 10, 00208 y)); 00209 mode1->create_objects(); 00210 y += 30; 00211 00212 00213 00214 00215 add_subwindow(title = new BC_Title(x, y, _("Calculation:"))); 00216 add_subwindow(mode2 = new Mode2(plugin, 00217 this, 00218 x + title->get_w() + 10, 00219 y)); 00220 mode2->create_objects(); 00221 00222 00223 00224 show_window(); 00225 flush(); 00226 return 0; 00227 } 00228 00229 void MotionWindow::update_mode() 00230 { 00231 global_range_w->update(plugin->config.global_range_w, 00232 MIN_RADIUS, 00233 MAX_RADIUS); 00234 global_range_h->update(plugin->config.global_range_h, 00235 MIN_RADIUS, 00236 MAX_RADIUS); 00237 rotation_range->update(plugin->config.rotation_range, 00238 MIN_ROTATION, 00239 MAX_ROTATION); 00240 vectors->update(plugin->config.draw_vectors); 00241 global->update(plugin->config.global); 00242 rotate->update(plugin->config.rotate); 00243 addtrackedframeoffset->update(plugin->config.addtrackedframeoffset); 00244 } 00245 00246 00247 WINDOW_CLOSE_EVENT(MotionWindow) 00248 00249 00250 00251 00252 00253 00254 00255 00256 00257 00258 GlobalRange::GlobalRange(MotionMain *plugin, 00259 int x, 00260 int y, 00261 int *value) 00262 : BC_IPot(x, 00263 y, 00264 (int64_t)*value, 00265 (int64_t)MIN_RADIUS, 00266 (int64_t)MAX_RADIUS) 00267 { 00268 this->plugin = plugin; 00269 this->value = value; 00270 } 00271 00272 00273 int GlobalRange::handle_event() 00274 { 00275 *value = (int)get_value(); 00276 plugin->send_configure_change(); 00277 return 1; 00278 } 00279 00280 00281 00282 00283 RotationRange::RotationRange(MotionMain *plugin, 00284 int x, 00285 int y) 00286 : BC_IPot(x, 00287 y, 00288 (int64_t)plugin->config.rotation_range, 00289 (int64_t)MIN_ROTATION, 00290 (int64_t)MAX_ROTATION) 00291 { 00292 this->plugin = plugin; 00293 } 00294 00295 00296 int RotationRange::handle_event() 00297 { 00298 plugin->config.rotation_range = (int)get_value(); 00299 plugin->send_configure_change(); 00300 return 1; 00301 } 00302 00303 00304 00305 00306 00307 00308 00309 00310 BlockSize::BlockSize(MotionMain *plugin, 00311 int x, 00312 int y, 00313 int *value) 00314 : BC_IPot(x, 00315 y, 00316 (int64_t)*value, 00317 (int64_t)MIN_BLOCK, 00318 (int64_t)MAX_BLOCK) 00319 { 00320 this->plugin = plugin; 00321 this->value = value; 00322 } 00323 00324 00325 int BlockSize::handle_event() 00326 { 00327 *value = (int)get_value(); 00328 plugin->send_configure_change(); 00329 return 1; 00330 } 00331 00332 00333 00334 00335 00336 00337 00338 00339 00340 00341 00342 00343 00344 GlobalSearchPositions::GlobalSearchPositions(MotionMain *plugin, 00345 int x, 00346 int y, 00347 int w) 00348 : BC_PopupMenu(x, 00349 y, 00350 w, 00351 "", 00352 1) 00353 { 00354 this->plugin = plugin; 00355 } 00356 void GlobalSearchPositions::create_objects() 00357 { 00358 add_item(new BC_MenuItem("64")); 00359 add_item(new BC_MenuItem("128")); 00360 add_item(new BC_MenuItem("256")); 00361 add_item(new BC_MenuItem("512")); 00362 add_item(new BC_MenuItem("1024")); 00363 add_item(new BC_MenuItem("2048")); 00364 add_item(new BC_MenuItem("4096")); 00365 add_item(new BC_MenuItem("8192")); 00366 add_item(new BC_MenuItem("16384")); 00367 add_item(new BC_MenuItem("32768")); 00368 add_item(new BC_MenuItem("65536")); 00369 add_item(new BC_MenuItem("131072")); 00370 char string[BCTEXTLEN]; 00371 sprintf(string, "%d", plugin->config.global_positions); 00372 set_text(string); 00373 } 00374 00375 int GlobalSearchPositions::handle_event() 00376 { 00377 plugin->config.global_positions = atoi(get_text()); 00378 plugin->send_configure_change(); 00379 return 1; 00380 } 00381 00382 00383 00384 00385 00386 00387 00388 RotationSearchPositions::RotationSearchPositions(MotionMain *plugin, 00389 int x, 00390 int y, 00391 int w) 00392 : BC_PopupMenu(x, 00393 y, 00394 w, 00395 "", 00396 1) 00397 { 00398 this->plugin = plugin; 00399 } 00400 void RotationSearchPositions::create_objects() 00401 { 00402 add_item(new BC_MenuItem("4")); 00403 add_item(new BC_MenuItem("8")); 00404 add_item(new BC_MenuItem("16")); 00405 add_item(new BC_MenuItem("32")); 00406 char string[BCTEXTLEN]; 00407 sprintf(string, "%d", plugin->config.rotate_positions); 00408 set_text(string); 00409 } 00410 00411 int RotationSearchPositions::handle_event() 00412 { 00413 plugin->config.rotate_positions = atoi(get_text()); 00414 plugin->send_configure_change(); 00415 return 1; 00416 } 00417 00418 00419 00420 00421 00422 00423 00424 00425 MotionMagnitude::MotionMagnitude(MotionMain *plugin, 00426 int x, 00427 int y) 00428 : BC_IPot(x, 00429 y, 00430 (int64_t)plugin->config.magnitude, 00431 (int64_t)0, 00432 (int64_t)100) 00433 { 00434 this->plugin = plugin; 00435 } 00436 00437 int MotionMagnitude::handle_event() 00438 { 00439 plugin->config.magnitude = (int)get_value(); 00440 plugin->send_configure_change(); 00441 return 1; 00442 } 00443 00444 00445 MotionReturnSpeed::MotionReturnSpeed(MotionMain *plugin, 00446 int x, 00447 int y) 00448 : BC_IPot(x, 00449 y, 00450 (int64_t)plugin->config.return_speed, 00451 (int64_t)0, 00452 (int64_t)100) 00453 { 00454 this->plugin = plugin; 00455 } 00456 00457 int MotionReturnSpeed::handle_event() 00458 { 00459 plugin->config.return_speed = (int)get_value(); 00460 plugin->send_configure_change(); 00461 return 1; 00462 } 00463 00464 00465 00466 AddTrackedFrameOffset::AddTrackedFrameOffset(MotionMain *plugin, 00467 MotionWindow *gui, 00468 int x, 00469 int y) 00470 : BC_CheckBox(x, 00471 y, 00472 plugin->config.addtrackedframeoffset, 00473 _("Add (loaded) offset from tracked frame")) 00474 { 00475 this->plugin = plugin; 00476 this->gui = gui; 00477 } 00478 00479 int AddTrackedFrameOffset::handle_event() 00480 { 00481 plugin->config.addtrackedframeoffset = get_value(); 00482 plugin->send_configure_change(); 00483 return 1; 00484 } 00485 00486 00487 MotionGlobal::MotionGlobal(MotionMain *plugin, 00488 MotionWindow *gui, 00489 int x, 00490 int y) 00491 : BC_CheckBox(x, 00492 y, 00493 plugin->config.global, 00494 _("Track translation")) 00495 { 00496 this->plugin = plugin; 00497 this->gui = gui; 00498 } 00499 00500 int MotionGlobal::handle_event() 00501 { 00502 plugin->config.global = get_value(); 00503 plugin->send_configure_change(); 00504 return 1; 00505 } 00506 00507 MotionRotate::MotionRotate(MotionMain *plugin, 00508 MotionWindow *gui, 00509 int x, 00510 int y) 00511 : BC_CheckBox(x, 00512 y, 00513 plugin->config.rotate, 00514 _("Track rotation")) 00515 { 00516 this->plugin = plugin; 00517 this->gui = gui; 00518 } 00519 00520 int MotionRotate::handle_event() 00521 { 00522 plugin->config.rotate = get_value(); 00523 plugin->send_configure_change(); 00524 return 1; 00525 } 00526 00527 00528 00529 00530 00531 MotionBlockX::MotionBlockX(MotionMain *plugin, 00532 MotionWindow *gui, 00533 int x, 00534 int y) 00535 : BC_FPot(x, 00536 y, 00537 plugin->config.block_x, 00538 (float)0, 00539 (float)100) 00540 { 00541 this->plugin = plugin; 00542 this->gui = gui; 00543 } 00544 00545 int MotionBlockX::handle_event() 00546 { 00547 plugin->config.block_x = get_value(); 00548 gui->block_x_text->update((float)plugin->config.block_x); 00549 plugin->send_configure_change(); 00550 return 1; 00551 } 00552 00553 00554 00555 00556 MotionBlockY::MotionBlockY(MotionMain *plugin, 00557 MotionWindow *gui, 00558 int x, 00559 int y) 00560 : BC_FPot(x, 00561 y, 00562 (float)plugin->config.block_y, 00563 (float)0, 00564 (float)100) 00565 { 00566 this->plugin = plugin; 00567 this->gui = gui; 00568 } 00569 00570 int MotionBlockY::handle_event() 00571 { 00572 plugin->config.block_y = get_value(); 00573 gui->block_y_text->update((float)plugin->config.block_y); 00574 plugin->send_configure_change(); 00575 return 1; 00576 } 00577 00578 MotionBlockXText::MotionBlockXText(MotionMain *plugin, 00579 MotionWindow *gui, 00580 int x, 00581 int y) 00582 : BC_TextBox(x, 00583 y, 00584 75, 00585 1, 00586 (float)plugin->config.block_x) 00587 { 00588 this->plugin = plugin; 00589 this->gui = gui; 00590 set_precision(4); 00591 } 00592 00593 int MotionBlockXText::handle_event() 00594 { 00595 plugin->config.block_x = atof(get_text()); 00596 gui->block_x->update(plugin->config.block_x); 00597 plugin->send_configure_change(); 00598 return 1; 00599 } 00600 00601 00602 00603 00604 MotionBlockYText::MotionBlockYText(MotionMain *plugin, 00605 MotionWindow *gui, 00606 int x, 00607 int y) 00608 : BC_TextBox(x, 00609 y, 00610 75, 00611 1, 00612 (float)plugin->config.block_y) 00613 { 00614 this->plugin = plugin; 00615 this->gui = gui; 00616 set_precision(4); 00617 } 00618 00619 int MotionBlockYText::handle_event() 00620 { 00621 plugin->config.block_y = atof(get_text()); 00622 gui->block_y->update(plugin->config.block_y); 00623 plugin->send_configure_change(); 00624 return 1; 00625 } 00626 00627 00628 00629 00630 00631 00632 00633 00634 00635 00636 00637 00638 00639 00640 00641 00642 MotionDrawVectors::MotionDrawVectors(MotionMain *plugin, 00643 MotionWindow *gui, 00644 int x, 00645 int y) 00646 : BC_CheckBox(x, 00647 y, 00648 plugin->config.draw_vectors, 00649 _("Draw vectors")) 00650 { 00651 this->gui = gui; 00652 this->plugin = plugin; 00653 } 00654 00655 int MotionDrawVectors::handle_event() 00656 { 00657 plugin->config.draw_vectors = get_value(); 00658 plugin->send_configure_change(); 00659 return 1; 00660 } 00661 00662 00663 00664 00665 00666 00667 00668 00669 TrackSingleFrame::TrackSingleFrame(MotionMain *plugin, 00670 MotionWindow *gui, 00671 int x, 00672 int y) 00673 : BC_Radial(x, 00674 y, 00675 plugin->config.mode3 == MotionConfig::TRACK_SINGLE, 00676 _("Track single frame")) 00677 { 00678 this->plugin = plugin; 00679 this->gui = gui; 00680 } 00681 00682 int TrackSingleFrame::handle_event() 00683 { 00684 plugin->config.mode3 = MotionConfig::TRACK_SINGLE; 00685 gui->track_previous->update(0); 00686 gui->previous_same->update(0); 00687 gui->track_frame_number->enable(); 00688 plugin->send_configure_change(); 00689 return 1; 00690 } 00691 00692 00693 00694 00695 00696 00697 00698 00699 TrackFrameNumber::TrackFrameNumber(MotionMain *plugin, 00700 MotionWindow *gui, 00701 int x, 00702 int y) 00703 : BC_TextBox(x, y, 100, 1, plugin->config.track_frame) 00704 { 00705 this->plugin = plugin; 00706 this->gui = gui; 00707 if(plugin->config.mode3 != MotionConfig::TRACK_SINGLE) disable(); 00708 } 00709 00710 int TrackFrameNumber::handle_event() 00711 { 00712 plugin->config.track_frame = atol(get_text()); 00713 plugin->send_configure_change(); 00714 return 1; 00715 } 00716 00717 00718 00719 00720 00721 00722 00723 TrackPreviousFrame::TrackPreviousFrame(MotionMain *plugin, 00724 MotionWindow *gui, 00725 int x, 00726 int y) 00727 : BC_Radial(x, 00728 y, 00729 plugin->config.mode3 == MotionConfig::TRACK_PREVIOUS, 00730 _("Track previous frame")) 00731 { 00732 this->plugin = plugin; 00733 this->gui = gui; 00734 } 00735 int TrackPreviousFrame::handle_event() 00736 { 00737 plugin->config.mode3 = MotionConfig::TRACK_PREVIOUS; 00738 gui->track_single->update(0); 00739 gui->previous_same->update(0); 00740 gui->track_frame_number->disable(); 00741 plugin->send_configure_change(); 00742 return 1; 00743 } 00744 00745 00746 00747 00748 00749 00750 00751 00752 PreviousFrameSameBlock::PreviousFrameSameBlock(MotionMain *plugin, 00753 MotionWindow *gui, 00754 int x, 00755 int y) 00756 : BC_Radial(x, 00757 y, 00758 plugin->config.mode3 == MotionConfig::PREVIOUS_SAME_BLOCK, 00759 _("Previous frame same block")) 00760 { 00761 this->plugin = plugin; 00762 this->gui = gui; 00763 } 00764 int PreviousFrameSameBlock::handle_event() 00765 { 00766 plugin->config.mode3 = MotionConfig::PREVIOUS_SAME_BLOCK; 00767 gui->track_single->update(0); 00768 gui->track_previous->update(0); 00769 gui->track_frame_number->disable(); 00770 plugin->send_configure_change(); 00771 return 1; 00772 } 00773 00774 00775 00776 00777 00778 00779 00780 00781 MasterLayer::MasterLayer(MotionMain *plugin, MotionWindow *gui, int x, int y) 00782 : BC_PopupMenu(x, 00783 y, 00784 calculate_w(gui), 00785 to_text(plugin->config.bottom_is_master)) 00786 { 00787 this->plugin = plugin; 00788 this->gui = gui; 00789 } 00790 00791 int MasterLayer::handle_event() 00792 { 00793 plugin->config.bottom_is_master = from_text(get_text()); 00794 plugin->send_configure_change(); 00795 return 1; 00796 } 00797 00798 void MasterLayer::create_objects() 00799 { 00800 add_item(new BC_MenuItem(to_text(0))); 00801 add_item(new BC_MenuItem(to_text(1))); 00802 } 00803 00804 int MasterLayer::from_text(char *text) 00805 { 00806 if(!strcmp(text, _("Top"))) return 0; 00807 return 1; 00808 } 00809 00810 char* MasterLayer::to_text(int mode) 00811 { 00812 return mode ? _("Bottom") : _("Top"); 00813 } 00814 00815 int MasterLayer::calculate_w(MotionWindow *gui) 00816 { 00817 int result = 0; 00818 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(0))); 00819 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(1))); 00820 return result + 50; 00821 } 00822 00823 00824 00825 00826 00827 00828 00829 00830 Mode1::Mode1(MotionMain *plugin, MotionWindow *gui, int x, int y) 00831 : BC_PopupMenu(x, 00832 y, 00833 calculate_w(gui), 00834 to_text(plugin->config.mode1)) 00835 { 00836 this->plugin = plugin; 00837 this->gui = gui; 00838 } 00839 00840 int Mode1::handle_event() 00841 { 00842 plugin->config.mode1 = from_text(get_text()); 00843 plugin->send_configure_change(); 00844 return 1; 00845 } 00846 00847 void Mode1::create_objects() 00848 { 00849 add_item(new BC_MenuItem(to_text(MotionConfig::TRACK))); 00850 add_item(new BC_MenuItem(to_text(MotionConfig::TRACK_PIXEL))); 00851 add_item(new BC_MenuItem(to_text(MotionConfig::STABILIZE))); 00852 add_item(new BC_MenuItem(to_text(MotionConfig::STABILIZE_PIXEL))); 00853 add_item(new BC_MenuItem(to_text(MotionConfig::NOTHING))); 00854 } 00855 00856 int Mode1::from_text(char *text) 00857 { 00858 if(!strcmp(text, _("Track Subpixel"))) return MotionConfig::TRACK; 00859 if(!strcmp(text, _("Track Pixel"))) return MotionConfig::TRACK_PIXEL; 00860 if(!strcmp(text, _("Stabilize Subpixel"))) return MotionConfig::STABILIZE; 00861 if(!strcmp(text, _("Stabilize Pixel"))) return MotionConfig::STABILIZE_PIXEL; 00862 if(!strcmp(text, _("Do Nothing"))) return MotionConfig::NOTHING; 00863 } 00864 00865 char* Mode1::to_text(int mode) 00866 { 00867 switch(mode) 00868 { 00869 case MotionConfig::TRACK: 00870 return _("Track Subpixel"); 00871 break; 00872 case MotionConfig::TRACK_PIXEL: 00873 return _("Track Pixel"); 00874 break; 00875 case MotionConfig::STABILIZE: 00876 return _("Stabilize Subpixel"); 00877 break; 00878 case MotionConfig::STABILIZE_PIXEL: 00879 return _("Stabilize Pixel"); 00880 break; 00881 case MotionConfig::NOTHING: 00882 return _("Do Nothing"); 00883 break; 00884 } 00885 } 00886 00887 int Mode1::calculate_w(MotionWindow *gui) 00888 { 00889 int result = 0; 00890 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::TRACK))); 00891 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::TRACK_PIXEL))); 00892 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::STABILIZE))); 00893 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::STABILIZE_PIXEL))); 00894 result = MAX(result, gui->get_text_width(MEDIUMFONT, to_text(MotionConfig::NOTHING))); 00895 return result + 50; 00896 } 00897 00898 00899 00900 00901 00902 Mode2::Mode2(MotionMain *plugin, MotionWindow *gui, int x, int y) 00903 : BC_PopupMenu(x, 00904 y, 00905 calculate_w(gui), 00906 to_text(plugin->config.mode2)) 00907 { 00908 this->plugin = plugin; 00909 this->gui = gui; 00910 } 00911 00912 int Mode2::handle_event() 00913 { 00914 plugin->config.mode2 = from_text(get_text()); 00915 plugin->send_configure_change(); 00916 return 1; 00917 } 00918 00919 void Mode2::create_objects() 00920 { 00921 add_item(new BC_MenuItem(to_text(MotionConfig::NO_CALCULATE))); 00922 add_item(new BC_MenuItem(to_text(MotionConfig::RECALCULATE))); 00923 add_item(new BC_MenuItem(to_text(MotionConfig::SAVE))); 00924 add_item(new BC_MenuItem(to_text(MotionConfig::LOAD))); 00