Add filament color next to tab button in filament setting

This commit is contained in:
Lam Wei Lun
2026-08-14 16:50:33 +08:00
parent 76ec2f10c6
commit 92123cdc2c
6 changed files with 79 additions and 9 deletions

View File

@@ -505,8 +505,10 @@ size_t PublishSettingsDialog::category_index_for(const wxString& title,
if (const auto* colours = full.opt<ConfigOptionStrings>("filament_colour")) if (const auto* colours = full.opt<ConfigOptionStrings>("filament_colour"))
if (source_index < colours->size()) if (source_index < colours->size())
hex = colours->get_at(source_index); hex = colours->get_at(source_index);
if (wxBitmap* chip = get_extruder_color_icon(hex, "", FromDIP(12), FromDIP(12))) if (wxBitmap* chip = get_extruder_color_icon(hex, "", FromDIP(12), FromDIP(12))) {
header_sizer->Add(new wxStaticBitmap(category.page, wxID_ANY, *chip), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(4)); category.filament_color_chip = new wxStaticBitmap(category.page, wxID_ANY, *chip);
header_sizer->Add(category.filament_color_chip, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(4));
}
category.master_check = new wxCheckBox(category.page, wxID_ANY, title); category.master_check = new wxCheckBox(category.page, wxID_ANY, title);
category.master_check->SetFont(Label::Head_14); category.master_check->SetFont(Label::Head_14);
category.master_check->SetToolTip(_L("Export this material")); category.master_check->SetToolTip(_L("Export this material"));
@@ -535,7 +537,19 @@ size_t PublishSettingsDialog::category_index_for(const wxString& title,
const size_t category_index = m_categories.size(); const size_t category_index = m_categories.size();
m_categories.push_back(std::move(category)); m_categories.push_back(std::move(category));
m_sections[group].categories.push_back(category_index); m_sections[group].categories.push_back(category_index);
if (section == Section::Material) {
std::string hex;
const DynamicPrintConfig full = wxGetApp().preset_bundle->full_config();
if (const auto* colours = full.opt<ConfigOptionStrings>("filament_colour"))
if (source_index < colours->size())
hex = colours->get_at(source_index);
if (wxBitmap* chip = get_extruder_color_icon(hex, "", FromDIP(12), FromDIP(12)))
m_sections[group].tabs->AppendItem(title, *chip);
else
m_sections[group].tabs->AppendItem(title); m_sections[group].tabs->AppendItem(title);
} else {
m_sections[group].tabs->AppendItem(title);
}
m_sections[group].page_host_sizer->Add(m_categories[category_index].page, 1, wxEXPAND); m_sections[group].page_host_sizer->Add(m_categories[category_index].page, 1, wxEXPAND);
if (m_sections[group].selected_inner < 0) if (m_sections[group].selected_inner < 0)
m_sections[group].selected_inner = 0; m_sections[group].selected_inner = 0;
@@ -971,6 +985,15 @@ void PublishSettingsDialog::on_dpi_changed(const wxRect& suggested_rect)
cat.header->Refresh(); cat.header->Refresh();
if (cat.master_check != nullptr) if (cat.master_check != nullptr)
cat.master_check->Refresh(); cat.master_check->Refresh();
if (cat.filament_color_chip != nullptr) {
std::string hex;
const DynamicPrintConfig full = wxGetApp().preset_bundle->full_config();
if (const auto* colours = full.opt<ConfigOptionStrings>("filament_colour"))
if (cat.filament_slot < colours->size())
hex = colours->get_at(cat.filament_slot);
if (wxBitmap* chip = get_extruder_color_icon(hex, "", FromDIP(12), FromDIP(12)))
cat.filament_color_chip->SetBitmap(*chip);
}
cat.scroll->FitInside(); cat.scroll->FitInside();
cat.list_sizer->Layout(); cat.list_sizer->Layout();
} }
@@ -978,6 +1001,23 @@ void PublishSettingsDialog::on_dpi_changed(const wxRect& suggested_rect)
for (SectionGroup& section : m_sections) for (SectionGroup& section : m_sections)
section.tabs->Rescale(); section.tabs->Rescale();
const DynamicPrintConfig full = wxGetApp().preset_bundle->full_config();
for (size_t category_index = 0; category_index < m_categories.size(); ++category_index) {
const Category& category = m_categories[category_index];
if (category.section != Section::Material)
continue;
std::string hex;
if (const auto* colours = full.opt<ConfigOptionStrings>("filament_colour"))
if (category.filament_slot < colours->size())
hex = colours->get_at(category.filament_slot);
if (wxBitmap* chip = get_extruder_color_icon(hex, "", FromDIP(12), FromDIP(12))) {
const SectionGroup& section = m_sections[category.group];
const auto iter = std::find(section.categories.begin(), section.categories.end(), category_index);
if (iter != section.categories.end())
m_sections[category.group].tabs->SetItemBitmap(static_cast<unsigned int>(iter - section.categories.begin()), *chip);
}
}
SetMinSize(FromDIP(wxSize(600, 500))); SetMinSize(FromDIP(wxSize(600, 500)));
Refresh(); Refresh();
} }

View File

@@ -105,6 +105,7 @@ private:
wxPoint scroll_pos{0, 0}; wxPoint scroll_pos{0, 0};
ScalableBitmap icon_bmp; // scalable bitmap for DPI changes ScalableBitmap icon_bmp; // scalable bitmap for DPI changes
wxStaticBitmap* icon{nullptr}; wxStaticBitmap* icon{nullptr};
wxStaticBitmap* filament_color_chip{nullptr};
wxCheckBox* header{nullptr}; // material select-all tri-state; null for Printer/Process wxCheckBox* header{nullptr}; // material select-all tri-state; null for Printer/Process
// Material opt-in: the master checkbox carries the material title and // Material opt-in: the master checkbox carries the material title and
// gates whether this material's keys may be exported. // gates whether this material's keys may be exported.

View File

@@ -80,6 +80,7 @@ bool Button::SetFont(const wxFont& font)
void Button::SetIcon(const wxString& icon) void Button::SetIcon(const wxString& icon)
{ {
custom_icon = wxNullBitmap;
auto tmpBitmap = ScalableBitmap(this, icon.ToStdString(), this->active_icon.px_cnt()); auto tmpBitmap = ScalableBitmap(this, icon.ToStdString(), this->active_icon.px_cnt());
if (!icon.IsEmpty()) { if (!icon.IsEmpty()) {
//BBS set button icon default size to 20 //BBS set button icon default size to 20
@@ -95,6 +96,13 @@ void Button::SetIcon(const wxString& icon)
} }
} }
void Button::SetBitmap(const wxBitmap& bitmap)
{
custom_icon = bitmap;
messureSize();
Refresh();
}
void Button::SetInactiveIcon(const wxString &icon) void Button::SetInactiveIcon(const wxString &icon)
{ {
if (!icon.IsEmpty()) { if (!icon.IsEmpty()) {
@@ -311,7 +319,8 @@ void Button::render(wxDC& dc)
} }
} }
auto szContent = textSize; auto szContent = textSize;
if (icon.bmp().IsOk()) { const bool has_custom_icon = custom_icon.IsOk();
if (has_custom_icon || icon.bmp().IsOk()) {
if (szContent.y > 0) { if (szContent.y > 0) {
//BBS norrow size between text and icon //BBS norrow size between text and icon
if (vertical) if (vertical)
@@ -319,7 +328,7 @@ void Button::render(wxDC& dc)
else else
szContent.x += spacing; szContent.x += spacing;
} }
szIcon = icon.GetBmpSize(); szIcon = has_custom_icon ? custom_icon.GetSize() : icon.GetBmpSize();
if (vertical) { if (vertical) {
szContent.y += szIcon.y; szContent.y += szIcon.y;
if (szIcon.x > szContent.x) szContent.x = szIcon.x; if (szIcon.x > szContent.x) szContent.x = szIcon.x;
@@ -342,12 +351,12 @@ void Button::render(wxDC& dc)
} }
// start draw // start draw
wxPoint pt = rcContent.GetLeftTop(); wxPoint pt = rcContent.GetLeftTop();
if (icon.bmp().IsOk()) { if (has_custom_icon || icon.bmp().IsOk()) {
if (vertical) if (vertical)
pt.x += (rcContent.width - szIcon.x) / 2; pt.x += (rcContent.width - szIcon.x) / 2;
else else
pt.y += (rcContent.height - szIcon.y) / 2; pt.y += (rcContent.height - szIcon.y) / 2;
dc.DrawBitmap(icon.bmp(), pt); dc.DrawBitmap(has_custom_icon ? custom_icon : icon.bmp(), pt);
//BBS norrow size between text and icon //BBS norrow size between text and icon
if (vertical) { if (vertical) {
pt.y += szIcon.y + spacing; pt.y += szIcon.y + spacing;
@@ -380,7 +389,7 @@ void Button::messureSize()
wxClientDC dc(this); wxClientDC dc(this);
dc.GetTextExtent(GetLabel(), &textSize.width, &textSize.height, &textSize.x, &textSize.y); dc.GetTextExtent(GetLabel(), &textSize.width, &textSize.height, &textSize.x, &textSize.y);
wxSize szContent = textSize.GetSize(); wxSize szContent = textSize.GetSize();
if (this->active_icon.bmp().IsOk()) { if (custom_icon.IsOk() || this->active_icon.bmp().IsOk()) {
if (szContent.y > 0) { if (szContent.y > 0) {
//BBS norrow size between text and icon //BBS norrow size between text and icon
if (vertical) if (vertical)
@@ -388,7 +397,7 @@ void Button::messureSize()
else else
szContent.x += 5; szContent.x += 5;
} }
wxSize szIcon = this->active_icon.GetBmpSize(); wxSize szIcon = custom_icon.IsOk() ? custom_icon.GetSize() : this->active_icon.GetBmpSize();
if (vertical) { if (vertical) {
szContent.y += szIcon.y; szContent.y += szIcon.y;
if (szIcon.x > szContent.x) szContent.x = szIcon.x; if (szIcon.x > szContent.x) szContent.x = szIcon.x;

View File

@@ -35,6 +35,7 @@ class Button : public StaticBox
wxSize paddingSize; wxSize paddingSize;
ScalableBitmap active_icon; ScalableBitmap active_icon;
ScalableBitmap inactive_icon; ScalableBitmap inactive_icon;
wxBitmap custom_icon;
StateColor text_color; StateColor text_color;
@@ -61,6 +62,7 @@ public:
bool SetFont(const wxFont& font) override; bool SetFont(const wxFont& font) override;
void SetIcon(const wxString& icon); void SetIcon(const wxString& icon);
void SetBitmap(const wxBitmap& bitmap);
void SetInactiveIcon(const wxString& icon); void SetInactiveIcon(const wxString& icon);

View File

@@ -84,6 +84,7 @@ void TabCtrl::Rescale()
{ {
for (auto & b : btns) for (auto & b : btns)
b->Rescale(); b->Rescale();
relayout();
} }
bool TabCtrl::SetFont(wxFont const& font) bool TabCtrl::SetFont(wxFont const& font)
@@ -117,6 +118,13 @@ int TabCtrl::AppendItem(const wxString &item,
return btns.size() - 1; return btns.size() - 1;
} }
int TabCtrl::AppendItem(const wxString& item, const wxBitmap& bitmap, void* clientData)
{
const int index = AppendItem(item, -1, -1, clientData);
SetItemBitmap(index, bitmap);
return index;
}
bool TabCtrl::DeleteItem(int item) bool TabCtrl::DeleteItem(int item)
{ {
if (item < 0 || item >= btns.size()) { if (item < 0 || item >= btns.size()) {
@@ -170,6 +178,14 @@ void TabCtrl::SetItemText(unsigned int item, wxString const &value)
btns[item]->SetLabel(value); btns[item]->SetLabel(value);
} }
void TabCtrl::SetItemBitmap(unsigned int item, const wxBitmap& bitmap)
{
if (item >= btns.size())
return;
btns[item]->SetBitmap(bitmap);
relayout();
}
bool TabCtrl::GetItemBold(unsigned int item) const bool TabCtrl::GetItemBold(unsigned int item) const
{ {
if (item >= btns.size()) return false; if (item >= btns.size()) return false;

View File

@@ -29,6 +29,7 @@ public:
public: public:
int AppendItem(const wxString &item, int image = -1, int selImage = -1, void *clientData = nullptr); int AppendItem(const wxString &item, int image = -1, int selImage = -1, void *clientData = nullptr);
int AppendItem(const wxString &item, const wxBitmap& bitmap, void *clientData = nullptr);
bool DeleteItem(int item); bool DeleteItem(int item);
@@ -46,6 +47,7 @@ public:
wxString GetItemText(unsigned int item) const; wxString GetItemText(unsigned int item) const;
void SetItemText(unsigned int item, wxString const &value); void SetItemText(unsigned int item, wxString const &value);
void SetItemBitmap(unsigned int item, const wxBitmap& bitmap);
bool GetItemBold(unsigned int item) const; bool GetItemBold(unsigned int item) const;
void SetItemBold(unsigned int item, bool bold); void SetItemBold(unsigned int item, bool bold);