Skip to content

Commit 874590e

Browse files
author
Gin
committed
add manual input label field
1 parent 8106938 commit 874590e

File tree

5 files changed

+83
-28
lines changed

5 files changed

+83
-28
lines changed

Common/Cpp/Options/TextEditOption.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ struct TextEditOption::Data{
3737
{}
3838
};
3939

40-
void TextEditOption::add_listener(FocusListener& listener){
40+
void TextEditOption::add_focus_listener(FocusListener& listener){
4141
Data& data = *m_data;
4242
WriteSpinLock lg(data.m_lock);
4343
data.listeners.insert(&listener);
4444
}
45-
void TextEditOption::remove_listener(FocusListener& listener){
45+
void TextEditOption::remove_focus_listener(FocusListener& listener){
4646
Data& data = *m_data;
4747
WriteSpinLock lg(data.m_lock);
4848
data.listeners.erase(&listener);

Common/Cpp/Options/TextEditOption.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class TextEditOption : public ConfigOption{
1919
struct FocusListener{
2020
virtual void focus_in(){}
2121
};
22-
void add_listener(FocusListener& listener);
23-
void remove_listener(FocusListener& listener);
22+
void add_focus_listener(FocusListener& listener);
23+
void remove_focus_listener(FocusListener& listener);
2424

2525
void report_focus_in();
2626

SerialPrograms/Source/CommonTools/Options/StringSelectOption.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ class StringSelectDatabase{
5757
size_t longest_text_length() const;
5858

5959
const StringSelectEntry& operator[](size_t index) const;
60+
// if not found, return SIZE_MAX
6061
size_t search_index_by_slug(const std::string& slug) const;
62+
// if not found, return SIZE_MAX
6163
size_t search_index_by_name(const std::string& display_name) const;
6264

6365
private:

SerialPrograms/Source/ML/Programs/ML_LabelImages.cpp

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

463465
void 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
}
483483
void 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

504502
void 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

529566
LabelImages_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
}

SerialPrograms/Source/ML/Programs/ML_LabelImages.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "Common/Cpp/Options/FloatingPointOption.h"
1414
#include "Common/Cpp/Options/EnumDropdownOption.h"
1515
#include "Common/Cpp/Options/EnumDropdownDatabase.h"
16+
#include "Common/Cpp/Options/StringOption.h"
1617
#include "CommonFramework/Panels/PanelInstance.h"
1718
#include "CommonFramework/Panels/UI/PanelWidget.h"
1819
#include "CommonFramework/ImageTypes/ImageViewRGB32.h"
@@ -107,6 +108,10 @@ class LabelImages : public PanelInstance, public ConfigOption::Listener {
107108
void select_prev_annotation();
108109
void select_next_annotation();
109110

111+
// return the label selected on UI
112+
std::string selected_label() const;
113+
void set_selected_label(const std::string& label);
114+
110115
private:
111116
void on_config_value_changed(void* object) override;
112117

@@ -125,11 +130,18 @@ class LabelImages : public PanelInstance, public ConfigOption::Listener {
125130
FloatingPointOption WIDTH;
126131
FloatingPointOption HEIGHT;
127132

133+
// the database to initialize LABEL_TYPE
128134
IntegerEnumDropdownDatabase LABEL_TYPE_DATABASE;
135+
// a dropdown menu to choose which source below to set label from
129136
IntegerEnumDropdownOption LABEL_TYPE;
137+
// source 1: a dropdown menu for all pokemon forms
130138
Pokemon::HomeSpriteSelectCell FORM_LABEL;
139+
// the database to initialize CUSTOM_SET_LABEL
131140
StringSelectDatabase CUSTOM_LABEL_DATABASE;
132-
StringSelectCell CUSTOM_LABEL;
141+
// source 2: a dropdown menu for custom labels
142+
StringSelectCell CUSTOM_SET_LABEL;
143+
// source 3: editable text input
144+
StringOption MANUAL_LABEL;
133145

134146
size_t source_image_height = 0;
135147
size_t source_image_width = 0;

0 commit comments

Comments
 (0)