Skip to content

Commit 2c745b8

Browse files
author
Gin
committed
add dropdown to choose label type
1 parent 6ddb1e6 commit 2c745b8

File tree

5 files changed

+52
-28
lines changed

5 files changed

+52
-28
lines changed

Common/Cpp/Options/EnumDropdownDatabase.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,14 @@ const EnumEntry* IntegerEnumDropdownDatabase::find_display(const std::string& di
120120
FixedLimitVector<size_t> IntegerEnumDropdownDatabase::all_values() const{
121121
return m_core->all_values();
122122
}
123-
123+
IntegerEnumDropdownDatabase create_integer_enum_dropdown_database(const std::vector<std::string>& slugs){
124+
IntegerEnumDropdownDatabase database;
125+
for (size_t i = 0; i < slugs.size(); i++){
126+
// display name is the same as slug
127+
database.add(i, slugs[i], slugs[i]);
128+
}
129+
return database;
130+
}
124131

125132
template class FixedLimitVector<size_t>;
126133

Common/Cpp/Options/EnumDropdownDatabase.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class IntegerEnumDropdownDatabase{
4747
IntegerEnumDropdownDatabase(std::initializer_list<EnumEntry> list);
4848

4949
void add(EnumEntry entry);
50-
void add(size_t value, std::string slug, std::string display, bool enabled){
50+
void add(size_t value, std::string slug, std::string display, bool enabled = true){
5151
add(EnumEntry{value, std::move(slug), std::move(display), enabled});
5252
}
5353

@@ -65,6 +65,10 @@ class IntegerEnumDropdownDatabase{
6565
Pimpl<IntegerEnumDropdownDatabaseImpl> m_core;
6666
};
6767

68+
// Create a simple StringSelectDatabase from a list of slugs.
69+
// The display names of each entry will be the same as their slugs and enum_values will be their indices.
70+
IntegerEnumDropdownDatabase create_integer_enum_dropdown_database(const std::vector<std::string>& slugs);
71+
6872

6973

7074
// This is the type-safe database for your specific enum.

Common/Qt/Options/BatchWidget.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
namespace PokemonAutomation{
1515

1616

17-
17+
// A Widget to hold multiple derived classes of ConfigWidget.
18+
// Construct using a BatchOption.
1819
class BatchWidget : public QWidget, public ConfigWidget{
1920
public:
2021
~BatchWidget();

SerialPrograms/Source/ML/Programs/ML_LabelImages.cpp

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,13 @@ LabelImages_Descriptor::LabelImages_Descriptor()
128128

129129
#define ADD_OPTION(x) m_options.add_option(x, #x)
130130

131+
IntegerEnumDropdownDatabase create_label_type_database(){
132+
IntegerEnumDropdownDatabase database;
133+
database.add(0, "pokemon-form", Pokemon::STRING_POKEMON + " Forms");
134+
database.add(1, "custom-set", "Custom Set");
135+
return database;
136+
}
137+
131138
LabelImages::LabelImages(const LabelImages_Descriptor& descriptor)
132139
: PanelInstance(descriptor)
133140
, m_display_session(m_display_option)
@@ -136,6 +143,8 @@ LabelImages::LabelImages(const LabelImages_Descriptor& descriptor)
136143
, Y("<b>Y Coordinate:</b>", LockMode::UNLOCK_WHILE_RUNNING, 0.3, 0.0, 1.0)
137144
, WIDTH("<b>Width:</b>", LockMode::UNLOCK_WHILE_RUNNING, 0.4, 0.0, 1.0)
138145
, HEIGHT("<b>Height:</b>", LockMode::UNLOCK_WHILE_RUNNING, 0.4, 0.0, 1.0)
146+
, LABEL_TYPE_DATABASE(create_label_type_database())
147+
, LABEL_TYPE("<b>Select Label:</b>", LABEL_TYPE_DATABASE, LockMode::UNLOCK_WHILE_RUNNING, 0)
139148
, FORM_LABEL("bulbasaur")
140149
, CUSTOM_LABEL_DATABASE(create_string_select_database({
141150
"sun",
@@ -147,9 +156,12 @@ LabelImages::LabelImages(const LabelImages_Descriptor& descriptor)
147156
ADD_OPTION(Y);
148157
ADD_OPTION(WIDTH);
149158
ADD_OPTION(HEIGHT);
159+
ADD_OPTION(LABEL_TYPE);
150160
ADD_OPTION(FORM_LABEL);
151161
ADD_OPTION(CUSTOM_LABEL);
152162

163+
LABEL_TYPE.add_listener(*this);
164+
153165
// , m_sam_session{RESOURCE_PATH() + "ML/sam_cpu.onnx"}
154166
const std::string sam_model_path = RESOURCE_PATH() + "ML/sam_cpu.onnx";
155167
if (std::filesystem::exists(sam_model_path)){
@@ -467,6 +479,19 @@ void LabelImages::select_next_annotation(){
467479
}
468480
}
469481

482+
void LabelImages::on_config_value_changed(void* object){
483+
// cout << "LabelImages::on_config_value_changed" << endl;
484+
if (object == &LABEL_TYPE){
485+
if (LABEL_TYPE.current_value() == 0){
486+
FORM_LABEL.set_visibility(ConfigOptionState::ENABLED);
487+
CUSTOM_LABEL.set_visibility(ConfigOptionState::DISABLED);
488+
} else{
489+
FORM_LABEL.set_visibility(ConfigOptionState::DISABLED);
490+
CUSTOM_LABEL.set_visibility(ConfigOptionState::ENABLED);
491+
}
492+
}
493+
}
494+
470495

471496
LabelImages_Widget::~LabelImages_Widget(){
472497
m_program.X.remove_listener(*this);
@@ -547,26 +572,15 @@ LabelImages_Widget::LabelImages_Widget(
547572
QHBoxLayout* annotation_row = new QHBoxLayout();
548573
scroll_layout->addLayout(annotation_row);
549574

550-
annotation_row->addWidget(new QLabel("<b>Select Label:</b>", scroll_inner), 0);
551-
552-
// add a group box for user to pick whether to choose from pokemon form label or custom label
553-
QGroupBox* label_type_group = new QGroupBox();
554-
QRadioButton* pokemon_radio_button = new QRadioButton(QString::fromStdString(Pokemon::STRING_POKEMON + " Forms"));
555-
QRadioButton* custom_label_radio_button = new QRadioButton("Custom Set");
556-
pokemon_radio_button->setChecked(true);
557-
558-
QHBoxLayout* group_box_layout = new QHBoxLayout;
559-
group_box_layout->addWidget(pokemon_radio_button);
560-
group_box_layout->addWidget(custom_label_radio_button);
561-
label_type_group->setLayout(group_box_layout);
562-
annotation_row->addWidget(label_type_group);
575+
// add a dropdown menu for user to pick whether to choose from pokemon form label or custom label
576+
ConfigWidget* label_type_widget = program.LABEL_TYPE.make_QtWidget(*scroll_inner);
577+
annotation_row->addWidget(&label_type_widget->widget(), 0);
563578

564579
ConfigWidget* pokemon_label_widget = program.FORM_LABEL.make_QtWidget(*scroll_inner);
565580
annotation_row->addWidget(&pokemon_label_widget->widget(), 2);
566581
ConfigWidget* custom_label_widget = program.CUSTOM_LABEL.make_QtWidget(*scroll_inner);
567582
annotation_row->addWidget(&custom_label_widget->widget(), 2);
568-
// disable the custom label widget to correpsond to the default selection of label_type_group
569-
custom_label_widget->widget().setEnabled(false);
583+
annotation_row->addWidget(new QLabel(scroll_inner), 10); // an empty label to push other UIs to the left
570584

571585
// add compute embedding button
572586

@@ -590,15 +604,6 @@ LabelImages_Widget::LabelImages_Widget(
590604
program.update_rendered_objects(this->m_overlay_set);
591605
});
592606

593-
connect(pokemon_radio_button, &QPushButton::clicked, this, [pokemon_label_widget, custom_label_widget](bool){
594-
pokemon_label_widget->widget().setEnabled(true);
595-
custom_label_widget->widget().setEnabled(false);
596-
});
597-
connect(custom_label_radio_button, &QPushButton::clicked, this, [pokemon_label_widget, custom_label_widget](bool){
598-
pokemon_label_widget->widget().setEnabled(false);
599-
custom_label_widget->widget().setEnabled(true);
600-
});
601-
602607
connect(compute_embedding_button, &QPushButton::clicked, this, [this](bool){
603608
std::string folder_path = QFileDialog::getExistingDirectory(
604609
nullptr, "Open image folder", ".").toStdString();

SerialPrograms/Source/ML/Programs/ML_LabelImages.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <memory>
1212
#include "Common/Cpp/Options/BatchOption.h"
1313
#include "Common/Cpp/Options/FloatingPointOption.h"
14+
#include "Common/Cpp/Options/EnumDropdownOption.h"
15+
#include "Common/Cpp/Options/EnumDropdownDatabase.h"
1416
#include "CommonFramework/Panels/PanelInstance.h"
1517
#include "CommonFramework/Panels/UI/PanelWidget.h"
1618
#include "CommonFramework/ImageTypes/ImageViewRGB32.h"
@@ -66,7 +68,7 @@ class LabelImages_Descriptor : public PanelDescriptor{
6668

6769

6870
// Program to annoatation images for training ML models
69-
class LabelImages : public PanelInstance{
71+
class LabelImages : public PanelInstance, public ConfigOption::Listener {
7072
public:
7173
LabelImages(const LabelImages_Descriptor& descriptor);
7274
virtual QWidget* make_widget(QWidget& parent, PanelHolder& holder) override;
@@ -105,6 +107,8 @@ class LabelImages : public PanelInstance{
105107
void select_next_annotation();
106108

107109
private:
110+
void on_config_value_changed(void* object) override;
111+
108112
friend class LabelImages_Widget;
109113

110114
// image display options like what image file is loaded
@@ -118,6 +122,9 @@ class LabelImages : public PanelInstance{
118122
FloatingPointOption Y;
119123
FloatingPointOption WIDTH;
120124
FloatingPointOption HEIGHT;
125+
126+
IntegerEnumDropdownDatabase LABEL_TYPE_DATABASE;
127+
IntegerEnumDropdownOption LABEL_TYPE;
121128
Pokemon::HomeSpriteSelectCell FORM_LABEL;
122129
StringSelectDatabase CUSTOM_LABEL_DATABASE;
123130
StringSelectCell CUSTOM_LABEL;

0 commit comments

Comments
 (0)