FIX: unable to select filament map mode in macos
1. add wxPU_CONTAINS_CONTROLS when construct 2. fix some ui bugs jira:NONE Signed-off-by: xun.zhang <xun.zhang@bambulab.com> Change-Id: I413dbaa35f3f79c97e2db3f8b2cdb5ab55739484
This commit is contained in:
parent
95e49986f3
commit
cd23329267
|
@ -24,6 +24,13 @@ static const wxString AutoForMatchDetail = _L("Based on the current filaments in
|
||||||
"filaments to the left and right nozzles.");
|
"filaments to the left and right nozzles.");
|
||||||
static const wxString ManualDetail = _L("Mannully allocate the filaments for the left and right nozzles.");
|
static const wxString ManualDetail = _L("Mannully allocate the filaments for the left and right nozzles.");
|
||||||
|
|
||||||
|
static const wxColour LabelEnableColor = wxColour("#262E30");
|
||||||
|
static const wxColour LabelDisableColor = wxColour("#6B6B6B");
|
||||||
|
static const wxColour GreyColor = wxColour("#6B6B6B");
|
||||||
|
static const wxColour GreenColor = wxColour("#00AE42");
|
||||||
|
static const wxColour BackGroundColor = wxColour("#FFFFFF");
|
||||||
|
|
||||||
|
|
||||||
static bool is_multi_extruder()
|
static bool is_multi_extruder()
|
||||||
{
|
{
|
||||||
const auto &preset_bundle = wxGetApp().preset_bundle;
|
const auto &preset_bundle = wxGetApp().preset_bundle;
|
||||||
|
@ -76,7 +83,7 @@ bool is_pop_up_required()
|
||||||
return is_multi_extruder_ && is_manual_mode_;
|
return is_multi_extruder_ && is_manual_mode_;
|
||||||
}
|
}
|
||||||
|
|
||||||
FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, wxBORDER_NONE)
|
FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS)
|
||||||
{
|
{
|
||||||
wxBoxSizer *top_sizer = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *top_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
const int horizontal_margin = FromDIP(16);
|
const int horizontal_margin = FromDIP(16);
|
||||||
|
@ -84,8 +91,7 @@ FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, w
|
||||||
const int vertical_padding = FromDIP(12);
|
const int vertical_padding = FromDIP(12);
|
||||||
const int ratio_spacing = FromDIP(4);
|
const int ratio_spacing = FromDIP(4);
|
||||||
|
|
||||||
const wxColor background_color = wxColor(255, 255, 255);
|
SetBackgroundColour(BackGroundColor);
|
||||||
SetBackgroundColour(background_color);
|
|
||||||
|
|
||||||
radio_btns.resize(ButtonType::btCount);
|
radio_btns.resize(ButtonType::btCount);
|
||||||
button_labels.resize(ButtonType::btCount);
|
button_labels.resize(ButtonType::btCount);
|
||||||
|
@ -103,16 +109,16 @@ FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, w
|
||||||
for (size_t idx = 0; idx < ButtonType::btCount; ++idx) {
|
for (size_t idx = 0; idx < ButtonType::btCount; ++idx) {
|
||||||
wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
radio_btns[idx] = new wxBitmapButton(this, idx, unchecked_bmp, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
|
radio_btns[idx] = new wxBitmapButton(this, idx, unchecked_bmp, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
|
||||||
radio_btns[idx]->SetBackgroundColour(background_color);
|
radio_btns[idx]->SetBackgroundColour(BackGroundColor);
|
||||||
|
|
||||||
button_labels[idx] = new wxStaticText(this, wxID_ANY, btn_texts[idx]);
|
button_labels[idx] = new Label(this, btn_texts[idx]);
|
||||||
button_labels[idx]->SetBackgroundColour(background_color);
|
button_labels[idx]->SetBackgroundColour(BackGroundColor);
|
||||||
button_labels[idx]->SetForegroundColour(wxColor("#262E30"));
|
button_labels[idx]->SetForegroundColour(LabelEnableColor);
|
||||||
button_labels[idx]->SetFont(Label::Head_14);
|
button_labels[idx]->SetFont(Label::Body_14);
|
||||||
|
|
||||||
button_desps[idx] = new wxStaticText(this, wxID_ANY, btn_desps[idx]);
|
button_desps[idx] = new Label(this, btn_desps[idx]);
|
||||||
button_desps[idx]->SetBackgroundColour(background_color);
|
button_desps[idx]->SetBackgroundColour(BackGroundColor);
|
||||||
button_desps[idx]->SetForegroundColour(wxColor("#262E30"));
|
button_desps[idx]->SetForegroundColour(LabelEnableColor);
|
||||||
button_desps[idx]->SetFont(Label::Body_14);
|
button_desps[idx]->SetFont(Label::Body_14);
|
||||||
|
|
||||||
button_sizer->Add(radio_btns[idx], 0, wxALIGN_CENTER_VERTICAL);
|
button_sizer->Add(radio_btns[idx], 0, wxALIGN_CENTER_VERTICAL);
|
||||||
|
@ -122,9 +128,9 @@ FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, w
|
||||||
|
|
||||||
wxBoxSizer *label_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *label_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
detail_infos[idx] = new wxStaticText(this, wxID_ANY, mode_details[idx]);
|
detail_infos[idx] = new Label(this, mode_details[idx]);
|
||||||
detail_infos[idx]->SetBackgroundColour(background_color);
|
detail_infos[idx]->SetBackgroundColour(BackGroundColor);
|
||||||
detail_infos[idx]->SetForegroundColour(wxColor("#6B6B6B"));
|
detail_infos[idx]->SetForegroundColour(GreyColor);
|
||||||
detail_infos[idx]->SetFont(Label::Body_12);
|
detail_infos[idx]->SetFont(Label::Body_12);
|
||||||
detail_infos[idx]->Wrap(FromDIP(320));
|
detail_infos[idx]->Wrap(FromDIP(320));
|
||||||
|
|
||||||
|
@ -135,44 +141,42 @@ FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, w
|
||||||
top_sizer->Add(label_sizer, 0, wxLEFT | wxRIGHT, horizontal_margin);
|
top_sizer->Add(label_sizer, 0, wxLEFT | wxRIGHT, horizontal_margin);
|
||||||
top_sizer->AddSpacer(vertical_padding);
|
top_sizer->AddSpacer(vertical_padding);
|
||||||
|
|
||||||
radio_btns[idx]->Bind(wxEVT_BUTTON, [this, idx](wxCommandEvent &event) {
|
radio_btns[idx]->Bind(wxEVT_LEFT_DOWN, [this, idx](auto &) { OnRadioBtn(idx);});
|
||||||
event.SetInt(idx);
|
|
||||||
OnRadioBtn(event);
|
|
||||||
});
|
|
||||||
|
|
||||||
radio_btns[idx]->Bind(wxEVT_ENTER_WINDOW, [this, idx](wxMouseEvent &) { UpdateButtonStatus(idx); });
|
radio_btns[idx]->Bind(wxEVT_ENTER_WINDOW, [this, idx](auto &) { UpdateButtonStatus(idx); });
|
||||||
|
radio_btns[idx]->Bind(wxEVT_LEAVE_WINDOW, [this](auto &) { UpdateButtonStatus(); });
|
||||||
|
|
||||||
radio_btns[idx]->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent &) { UpdateButtonStatus(); });
|
button_labels[idx]->Bind(wxEVT_LEFT_DOWN, [this, idx](auto &) { OnRadioBtn(idx);});
|
||||||
|
button_labels[idx]->Bind(wxEVT_ENTER_WINDOW, [this, idx](auto &) { UpdateButtonStatus(idx); });
|
||||||
button_labels[idx]->Bind(wxEVT_LEFT_UP, [this, idx](wxMouseEvent &) {
|
button_labels[idx]->Bind(wxEVT_LEAVE_WINDOW, [this](auto &) { UpdateButtonStatus(); });
|
||||||
wxCommandEvent event;
|
|
||||||
event.SetInt(idx);
|
|
||||||
OnRadioBtn(event);
|
|
||||||
});
|
|
||||||
|
|
||||||
button_labels[idx]->Bind(wxEVT_ENTER_WINDOW, [this, idx](wxMouseEvent &) { UpdateButtonStatus(idx); });
|
|
||||||
button_labels[idx]->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent &) { UpdateButtonStatus(); });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
|
||||||
|
auto* wiki_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
wiki_link = new wxStaticText(this, wxID_ANY, _L("More info on wiki"));
|
wiki_link = new wxStaticText(this, wxID_ANY, _L("More info on wiki"));
|
||||||
wiki_link->SetBackgroundColour(background_color);
|
wiki_link->SetBackgroundColour(BackGroundColor);
|
||||||
wiki_link->SetForegroundColour(wxColor("#00AE42"));
|
wiki_link->SetForegroundColour(GreenColor);
|
||||||
wiki_link->SetFont(Label::Body_12.Underlined());
|
wiki_link->SetFont(Label::Body_12.Underlined());
|
||||||
wiki_link->SetCursor(wxCursor(wxCURSOR_HAND));
|
wiki_link->SetCursor(wxCursor(wxCURSOR_HAND));
|
||||||
wiki_link->Bind(wxEVT_LEFT_DOWN, [](wxMouseEvent &) { wxLaunchDefaultBrowser("http//:example.com"); });
|
wiki_link->Bind(wxEVT_LEFT_DOWN, [](wxMouseEvent &) { wxLaunchDefaultBrowser("http//:example.com"); });
|
||||||
|
wiki_sizer->Add(wiki_link, 0, wxALIGN_CENTER | wxALL, FromDIP(3));
|
||||||
|
|
||||||
remind_checkbox = new wxCheckBox(this, wxID_ANY, _L("Don't remind me again"));
|
auto* checkbox_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
remind_checkbox->SetBackgroundColour(background_color);
|
remind_checkbox = new CheckBox(this);
|
||||||
remind_checkbox->SetForegroundColour(wxColor("#6B6B6B"));
|
remind_checkbox->Bind(wxEVT_TOGGLEBUTTON, &FilamentGroupPopup::OnRemindBtn, this);
|
||||||
remind_checkbox->SetFont(Label::Body_12);
|
checkbox_sizer->Add(remind_checkbox, 0, wxALIGN_CENTER, 0);
|
||||||
remind_checkbox->Bind(wxEVT_CHECKBOX, &FilamentGroupPopup::OnRemindBtn, this);
|
|
||||||
|
|
||||||
button_sizer->Add(wiki_link, 0, wxLEFT, horizontal_margin);
|
auto checkbox_title = new Label(this, _L("Don't remind me again"));
|
||||||
|
checkbox_title->SetBackgroundColour(BackGroundColor);
|
||||||
|
checkbox_title->SetForegroundColour(GreyColor);
|
||||||
|
checkbox_title->SetFont(Label::Body_12);
|
||||||
|
checkbox_sizer->Add(checkbox_title, 0, wxALIGN_CENTER | wxALL, FromDIP(3));
|
||||||
|
|
||||||
|
button_sizer->Add(wiki_sizer, 0, wxLEFT, horizontal_margin);
|
||||||
button_sizer->AddStretchSpacer();
|
button_sizer->AddStretchSpacer();
|
||||||
button_sizer->Add(remind_checkbox, 0, wxRIGHT, horizontal_margin);
|
button_sizer->Add(checkbox_sizer, 0, wxRIGHT, horizontal_margin);
|
||||||
|
|
||||||
top_sizer->Add(button_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, horizontal_margin);
|
top_sizer->Add(button_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, horizontal_margin);
|
||||||
}
|
}
|
||||||
|
@ -216,13 +220,16 @@ void FilamentGroupPopup::DrawRoundedCorner(int radius)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilamentGroupPopup::Init(bool connect_status)
|
void FilamentGroupPopup::Init()
|
||||||
{
|
{
|
||||||
radio_btns[ButtonType::btForMatch]->Enable(connect_status);
|
radio_btns[ButtonType::btForMatch]->Enable(m_connected);
|
||||||
button_labels[ButtonType::btForMatch]->Enable(connect_status);
|
if (m_connected)
|
||||||
|
button_labels[ButtonType::btForMatch]->SetForegroundColour(LabelEnableColor);
|
||||||
|
else
|
||||||
|
button_labels[ButtonType::btForMatch]->SetForegroundColour(LabelDisableColor);
|
||||||
|
|
||||||
|
|
||||||
if (connect_status) {
|
if (m_connected) {
|
||||||
button_desps[ButtonType::btForMatch]->SetLabel(AutoForMatchDesp);
|
button_desps[ButtonType::btForMatch]->SetLabel(AutoForMatchDesp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -230,13 +237,13 @@ void FilamentGroupPopup::Init(bool connect_status)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_mode = get_prefered_map_mode();
|
m_mode = get_prefered_map_mode();
|
||||||
if (m_mode == fmmAutoForMatch && !connect_status) {
|
if (m_mode == fmmAutoForMatch && !m_connected) {
|
||||||
set_prefered_map_mode(fmmAutoForFlush);
|
set_prefered_map_mode(fmmAutoForFlush);
|
||||||
m_mode = fmmAutoForFlush;
|
m_mode = fmmAutoForFlush;
|
||||||
}
|
}
|
||||||
|
|
||||||
wxCheckBoxState check_state = get_pop_up_remind_flag() ? wxCheckBoxState::wxCHK_UNCHECKED : wxCheckBoxState::wxCHK_CHECKED;
|
bool check_state = get_pop_up_remind_flag() ? false : true;
|
||||||
remind_checkbox->Set3StateValue(check_state);
|
remind_checkbox->SetValue(check_state);
|
||||||
|
|
||||||
UpdateButtonStatus();
|
UpdateButtonStatus();
|
||||||
}
|
}
|
||||||
|
@ -250,8 +257,9 @@ void FilamentGroupPopup::tryPopup(bool connect_status)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (canPopup()) {
|
if (canPopup()) {
|
||||||
|
m_connected = connect_status;
|
||||||
DrawRoundedCorner(16);
|
DrawRoundedCorner(16);
|
||||||
Init(connect_status);
|
Init();
|
||||||
ResetTimer();
|
ResetTimer();
|
||||||
PopupWindow::Popup();
|
PopupWindow::Popup();
|
||||||
}
|
}
|
||||||
|
@ -266,9 +274,9 @@ void FilamentGroupPopup::ResetTimer()
|
||||||
if (m_timer->IsRunning()) { m_timer->Stop(); }
|
if (m_timer->IsRunning()) { m_timer->Stop(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void FilamentGroupPopup::OnRadioBtn(wxCommandEvent &event)
|
void FilamentGroupPopup::OnRadioBtn(int idx)
|
||||||
{
|
{
|
||||||
m_mode = mode_list.at(event.GetInt());
|
m_mode = mode_list.at(idx);
|
||||||
|
|
||||||
set_prefered_map_mode(m_mode);
|
set_prefered_map_mode(m_mode);
|
||||||
|
|
||||||
|
@ -277,7 +285,8 @@ void FilamentGroupPopup::OnRadioBtn(wxCommandEvent &event)
|
||||||
|
|
||||||
void FilamentGroupPopup::OnRemindBtn(wxCommandEvent &event)
|
void FilamentGroupPopup::OnRemindBtn(wxCommandEvent &event)
|
||||||
{
|
{
|
||||||
bool is_checked = remind_checkbox->IsChecked();
|
bool is_checked = remind_checkbox->GetValue();
|
||||||
|
remind_checkbox->SetValue(is_checked);
|
||||||
set_pop_up_remind_flag(!is_checked);
|
set_pop_up_remind_flag(!is_checked);
|
||||||
|
|
||||||
if (is_checked) {
|
if (is_checked) {
|
||||||
|
@ -306,6 +315,10 @@ void FilamentGroupPopup::UpdateButtonStatus(int hover_idx)
|
||||||
auto unchecked_hover_bmp = create_scaled_bitmap("map_mode_off_hovered", nullptr);
|
auto unchecked_hover_bmp = create_scaled_bitmap("map_mode_off_hovered", nullptr);
|
||||||
|
|
||||||
for (int i = 0; i < ButtonType::btCount; ++i) {
|
for (int i = 0; i < ButtonType::btCount; ++i) {
|
||||||
|
if (ButtonType::btForMatch == i && !m_connected) {
|
||||||
|
button_labels[i]->SetFont(Label::Body_14);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// process checked and unchecked status
|
// process checked and unchecked status
|
||||||
if (mode_list.at(i) == m_mode) {
|
if (mode_list.at(i) == m_mode) {
|
||||||
if (i == hover_idx)
|
if (i == hover_idx)
|
||||||
|
@ -326,6 +339,8 @@ void FilamentGroupPopup::UpdateButtonStatus(int hover_idx)
|
||||||
remind_checkbox->Enable(false);
|
remind_checkbox->Enable(false);
|
||||||
else
|
else
|
||||||
remind_checkbox->Enable(true);
|
remind_checkbox->Enable(true);
|
||||||
|
Fit();
|
||||||
|
Layout();
|
||||||
}
|
}
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
|
@ -5,6 +5,8 @@
|
||||||
#include <wx/hyperlink.h>
|
#include <wx/hyperlink.h>
|
||||||
#include "wxExtensions.hpp"
|
#include "wxExtensions.hpp"
|
||||||
#include "Widgets/PopupWindow.hpp"
|
#include "Widgets/PopupWindow.hpp"
|
||||||
|
#include "Widgets/CheckBox.hpp"
|
||||||
|
#include "Widgets/Label.hpp"
|
||||||
|
|
||||||
namespace Slic3r { namespace GUI {
|
namespace Slic3r { namespace GUI {
|
||||||
|
|
||||||
|
@ -24,13 +26,13 @@ private:
|
||||||
void StartTimer();
|
void StartTimer();
|
||||||
void ResetTimer();
|
void ResetTimer();
|
||||||
|
|
||||||
void OnRadioBtn(wxCommandEvent &event);
|
void OnRadioBtn(int idx);
|
||||||
void OnLeaveWindow(wxMouseEvent &);
|
void OnLeaveWindow(wxMouseEvent &);
|
||||||
void OnEnterWindow(wxMouseEvent &);
|
void OnEnterWindow(wxMouseEvent &);
|
||||||
void OnTimer(wxTimerEvent &event);
|
void OnTimer(wxTimerEvent &event);
|
||||||
void OnRemindBtn(wxCommandEvent &event);
|
void OnRemindBtn(wxCommandEvent &event);
|
||||||
|
|
||||||
void Init(bool connect_status);
|
void Init();
|
||||||
void UpdateButtonStatus(int hover_idx = -1);
|
void UpdateButtonStatus(int hover_idx = -1);
|
||||||
void DrawRoundedCorner(int radius);
|
void DrawRoundedCorner(int radius);
|
||||||
|
|
||||||
|
@ -40,15 +42,16 @@ private:
|
||||||
const std::vector<FilamentMapMode> mode_list = {fmmAutoForFlush, fmmAutoForMatch, fmmManual};
|
const std::vector<FilamentMapMode> mode_list = {fmmAutoForFlush, fmmAutoForMatch, fmmManual};
|
||||||
|
|
||||||
FilamentMapMode m_mode;
|
FilamentMapMode m_mode;
|
||||||
|
bool m_connected{ false };
|
||||||
wxTimer *m_timer;
|
wxTimer *m_timer;
|
||||||
|
|
||||||
std::vector<wxBitmapButton *> radio_btns;
|
std::vector<wxBitmapButton *> radio_btns;
|
||||||
std::vector<wxStaticText *> button_labels;
|
std::vector<Label *> button_labels;
|
||||||
std::vector<wxStaticText *> button_desps;
|
std::vector<Label *> button_desps;
|
||||||
std::vector<wxStaticText *> detail_infos;
|
std::vector<Label *> detail_infos;
|
||||||
|
|
||||||
wxStaticText *wiki_link;
|
wxStaticText *wiki_link;
|
||||||
wxCheckBox *remind_checkbox;
|
CheckBox* remind_checkbox;
|
||||||
};
|
};
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
#endif
|
#endif
|
|
@ -70,9 +70,11 @@ FilamentMapDialog::FilamentMapDialog(wxWindow *parent,
|
||||||
wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
m_ok_btn = new Button(this, _L("OK"));
|
m_ok_btn = new Button(this, _L("OK"));
|
||||||
m_cancel_btn = new Button(this, _L("Cancel"));
|
m_cancel_btn = new Button(this, _L("Cancel"));
|
||||||
button_sizer->Add(m_ok_btn, 0, wxALL, 5);
|
m_ok_btn->SetFont(Label::Body_12);
|
||||||
button_sizer->Add(m_cancel_btn, 0, wxALL, 5);
|
m_cancel_btn->SetFont(Label::Body_12);
|
||||||
main_sizer->Add(button_sizer, 0, wxALIGN_CENTER | wxALL, 10);
|
button_sizer->Add(m_ok_btn, 0, wxALL, FromDIP(8));
|
||||||
|
button_sizer->Add(m_cancel_btn, 0, wxALL, FromDIP(8));
|
||||||
|
main_sizer->Add(button_sizer, 0, wxALIGN_RIGHT | wxALL, FromDIP(15));
|
||||||
|
|
||||||
m_ok_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_ok, this);
|
m_ok_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_ok, this);
|
||||||
m_cancel_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_cancle, this);
|
m_cancel_btn->Bind(wxEVT_BUTTON, &FilamentMapDialog::on_cancle, this);
|
||||||
|
|
Loading…
Reference in New Issue