@@ -132,6 +132,7 @@ IntegerEnumDropdownDatabase create_label_type_database(){
132132 IntegerEnumDropdownDatabase database;
133133 database.add (0 , " pokemon-form" , Pokemon::STRING_POKEMON + " Forms" );
134134 database.add (1 , " custom-set" , " Custom Set" );
135+ database.add (2 , " manual-input" , " Manual Input" );
135136 return database;
136137}
137138
@@ -151,23 +152,26 @@ LabelImages::LabelImages(const LabelImages_Descriptor& descriptor)
151152 " sun" ,
152153 " mc"
153154 }))
154- , CUSTOM_LABEL(CUSTOM_LABEL_DATABASE, LockMode::UNLOCK_WHILE_RUNNING, 0 )
155+ , CUSTOM_SET_LABEL(CUSTOM_LABEL_DATABASE, LockMode::UNLOCK_WHILE_RUNNING, 0 )
156+ , MANUAL_LABEL(false , " Input: " , LockMode::UNLOCK_WHILE_RUNNING, " " , " Custom Label" )
155157{
156158 ADD_OPTION (X);
157159 ADD_OPTION (Y);
158160 ADD_OPTION (WIDTH);
159161 ADD_OPTION (HEIGHT);
160162 ADD_OPTION (LABEL_TYPE);
161163 ADD_OPTION (FORM_LABEL);
162- ADD_OPTION (CUSTOM_LABEL);
164+ ADD_OPTION (CUSTOM_SET_LABEL);
165+ ADD_OPTION (MANUAL_LABEL);
163166
164167 X.add_listener (*this );
165168 Y.add_listener (*this );
166169 WIDTH.add_listener (*this );
167170 HEIGHT.add_listener (*this );
168171 LABEL_TYPE.add_listener (*this );
169172 FORM_LABEL.add_listener (*this );
170- CUSTOM_LABEL.add_listener (*this );
173+ CUSTOM_SET_LABEL.add_listener (*this );
174+ MANUAL_LABEL.add_listener (*this );
171175
172176 // , m_sam_session{RESOURCE_PATH() + "ML/sam_cpu.onnx"}
173177 const std::string sam_model_path = RESOURCE_PATH () + " ML/sam_cpu.onnx" ;
@@ -385,7 +389,7 @@ void LabelImages::compute_mask(){
385389 ImageFloatBox mask_box (
386390 min_mask_x/double (source_width), min_mask_y/double (source_height),
387391 mask_width/double (source_width), mask_height/double (source_height));
388- const std::string label = FORM_LABEL. slug ();
392+ const std::string label = this -> selected_label ();
389393
390394
391395 ObjectAnnotation annotation;
@@ -432,7 +436,7 @@ void LabelImages::delete_selected_annotation(){
432436 }
433437
434438 std::string& cur_label = m_annotations[m_selected_obj_idx].label ;
435- FORM_LABEL. set_by_slug (cur_label);
439+ set_selected_label (cur_label);
436440 update_rendered_objects ();
437441}
438442
@@ -455,9 +459,7 @@ void LabelImages::change_annotation_selection_by_mouse(double x, double y){
455459 }
456460
457461 auto new_label = m_annotations[m_selected_obj_idx].label ;
458- if (FORM_LABEL.slug () != new_label){
459- FORM_LABEL.set_by_slug (new_label);
460- }
462+ set_selected_label (new_label);
461463}
462464
463465void LabelImages::select_prev_annotation (){
@@ -475,9 +477,7 @@ void LabelImages::select_prev_annotation(){
475477 }
476478
477479 auto new_label = m_annotations[m_selected_obj_idx].label ;
478- if (FORM_LABEL.slug () != new_label){
479- FORM_LABEL.set_by_slug (new_label);
480- }
480+ set_selected_label (new_label);
481481 update_rendered_objects ();
482482}
483483void LabelImages::select_next_annotation (){
@@ -495,36 +495,73 @@ void LabelImages::select_next_annotation(){
495495 }
496496
497497 auto new_label = m_annotations[m_selected_obj_idx].label ;
498- if (FORM_LABEL.slug () != new_label){
499- FORM_LABEL.set_by_slug (new_label);
500- }
498+ set_selected_label (new_label);
501499 update_rendered_objects ();
502500}
503501
504502void LabelImages::on_config_value_changed (void * object){
505503 // cout << "LabelImages::on_config_value_changed" << endl;
506504 if (object == &LABEL_TYPE){
507- if (LABEL_TYPE.current_value () == 0 ){
505+ const size_t value = LABEL_TYPE.current_value ();
506+ // cout << "LABEL_TYPE value changed to " << value << endl;
507+ // label type changed
508+ if (value == 0 ){
508509 FORM_LABEL.set_visibility (ConfigOptionState::ENABLED);
509- CUSTOM_LABEL.set_visibility (ConfigOptionState::DISABLED);
510- } else {
511- FORM_LABEL.set_visibility (ConfigOptionState::DISABLED);
512- CUSTOM_LABEL.set_visibility (ConfigOptionState::ENABLED);
510+ CUSTOM_SET_LABEL.set_visibility (ConfigOptionState::HIDDEN);
511+ MANUAL_LABEL.set_visibility (ConfigOptionState::HIDDEN);
512+ } else if (value == 1 ){
513+ FORM_LABEL.set_visibility (ConfigOptionState::HIDDEN);
514+ CUSTOM_SET_LABEL.set_visibility (ConfigOptionState::ENABLED);
515+ MANUAL_LABEL.set_visibility (ConfigOptionState::HIDDEN);
516+ } else {
517+ FORM_LABEL.set_visibility (ConfigOptionState::HIDDEN);
518+ CUSTOM_SET_LABEL.set_visibility (ConfigOptionState::HIDDEN);
519+ MANUAL_LABEL.set_visibility (ConfigOptionState::ENABLED);
520+ // cout << "MANUAL_LABEL enabeld" << endl;
513521 }
514522 }
515523
516- if (object == &FORM_LABEL || object == &CUSTOM_LABEL || object == &LABEL_TYPE){
524+ if (object == &LABEL_TYPE || object == &FORM_LABEL || object == &CUSTOM_SET_LABEL || object == &MANUAL_LABEL){
525+ // label changed
517526 if (m_annotations.size () > 0 && m_selected_obj_idx < m_annotations.size ()){
518527 std::string& cur_label = m_annotations[m_selected_obj_idx].label ;
519- const std::string& ui_slug = FORM_LABEL. slug ();
528+ const std::string ui_slug = this -> selected_label ();
520529 if (ui_slug != cur_label){
521- cur_label = FORM_LABEL. slug ();
530+ cur_label = ui_slug;
522531 }
523532 }
524533 update_rendered_objects ();
525534 }
526535}
527536
537+ std::string LabelImages::selected_label () const {
538+ const size_t label_type = LABEL_TYPE.current_value ();
539+ if (label_type == 0 ){
540+ return FORM_LABEL.slug ();
541+ }
542+ if (label_type == 1 ){
543+ return CUSTOM_SET_LABEL.slug ();
544+ }
545+ return MANUAL_LABEL;
546+ }
547+
548+ void LabelImages::set_selected_label (const std::string& slug){
549+ size_t index = FORM_LABEL.database ().search_index_by_slug (slug);
550+ if (index != SIZE_MAX){
551+ LABEL_TYPE.set_value (0 );
552+ FORM_LABEL.set_by_index (index);
553+ return ;
554+ }
555+ index = CUSTOM_SET_LABEL.database ().search_index_by_slug (slug);
556+ if (index != SIZE_MAX){
557+ LABEL_TYPE.set_value (1 );
558+ CUSTOM_SET_LABEL.set_by_index (index);
559+ return ;
560+ }
561+ LABEL_TYPE.set_value (2 );
562+ MANUAL_LABEL.set (slug);
563+ }
564+
528565
529566LabelImages_Widget::~LabelImages_Widget (){
530567 m_display_session.overlay ().remove_listener (*this );
@@ -598,8 +635,10 @@ LabelImages_Widget::LabelImages_Widget(
598635
599636 ConfigWidget* pokemon_label_widget = program.FORM_LABEL .make_QtWidget (*scroll_inner);
600637 annotation_row->addWidget (&pokemon_label_widget->widget (), 2 );
601- ConfigWidget* custom_label_widget = program.CUSTOM_LABEL .make_QtWidget (*scroll_inner);
638+ ConfigWidget* custom_label_widget = program.CUSTOM_SET_LABEL .make_QtWidget (*scroll_inner);
602639 annotation_row->addWidget (&custom_label_widget->widget (), 2 );
640+ ConfigWidget* manual_input_label_widget = program.MANUAL_LABEL .make_QtWidget (*scroll_inner);
641+ annotation_row->addWidget (&manual_input_label_widget->widget (), 4 );
603642 annotation_row->addWidget (new QLabel (scroll_inner), 10 ); // an empty label to push other UIs to the left
604643
605644 // add compute embedding button
@@ -724,6 +763,8 @@ void LabelImages_Widget::on_mouse_move(double x, double y){
724763 m_program.Y .set (yl);
725764 m_program.WIDTH .set (xh - xl);
726765 m_program.HEIGHT .set (yh - yl);
766+
767+ m_program.update_rendered_objects ();
727768}
728769
729770}
0 commit comments