mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-06-28 14:41:58 +00:00
1. first formal version of macos 2. add the bambu networking plugin install logic 3. auto compute the wipe volume when filament change 4. add the logic of wiping into support 5. refine the GUI layout and icons, improve the gui apperance in lots of small places 6. serveral improve to support 7. support AMS auto-mapping 8. disable lots of unstable features: such as params table, media file download, HMS 9. fix serveral kinds of bugs 10. update the document of building 11. ...
757 lines
24 KiB
C++
757 lines
24 KiB
C++
///////////////////////////////////////////////////////////////////////////
|
|
// C++ code generated with wxFormBuilder (version 3.10.0-4761b0c)
|
|
// http://www.wxformbuilder.org/
|
|
//
|
|
// PLEASE DO *NOT* EDIT THIS FILE!
|
|
///////////////////////////////////////////////////////////////////////////
|
|
#include "libslic3r/PresetBundle.hpp"
|
|
#include "libslic3r/Preset.hpp"
|
|
#include "ParamsPanel.hpp"
|
|
#include "Tab.hpp"
|
|
#include "format.hpp"
|
|
#include "MainFrame.hpp"
|
|
#include "GUI_App.hpp"
|
|
#include "Plater.hpp"
|
|
|
|
#include "Widgets/Label.hpp"
|
|
#include "Widgets/SwitchButton.hpp"
|
|
#include "Widgets/Button.hpp"
|
|
|
|
|
|
namespace Slic3r {
|
|
namespace GUI {
|
|
|
|
|
|
TipsDialog::TipsDialog(wxWindow *parent, const wxString &title)
|
|
: DPIDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX)
|
|
{
|
|
SetBackgroundColour(*wxWHITE);
|
|
std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str();
|
|
SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO));
|
|
|
|
wxBoxSizer *m_sizer_main = new wxBoxSizer(wxVERTICAL);
|
|
|
|
m_top_line = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
|
m_top_line->SetBackgroundColour(wxColour(166, 169, 170));
|
|
|
|
m_sizer_main->Add(m_top_line, 0, wxEXPAND, 0);
|
|
|
|
m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(20));
|
|
|
|
m_msg = new wxStaticText(this, wxID_ANY, _L("Switch to per-object setting mode to edit modifier settings."), wxDefaultPosition, wxDefaultSize, 0);
|
|
m_msg->Wrap(-1);
|
|
m_msg->SetFont(::Label::Body_13);
|
|
m_msg->SetForegroundColour(wxColour(107, 107, 107));
|
|
m_msg->SetBackgroundColour(wxColour(255, 255, 255));
|
|
|
|
m_sizer_main->Add(m_msg, 1, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(40));
|
|
|
|
m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(5));
|
|
|
|
wxBoxSizer *m_sizer_bottom = new wxBoxSizer(wxHORIZONTAL);
|
|
wxBoxSizer *m_sizer_left = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
auto dont_show_again = create_item_checkbox(_L("Don't show again"), this, _L("Don't show again"), "do_not_show_modifer_tips");
|
|
m_sizer_left->Add(dont_show_again, 1, wxALL, FromDIP(5));
|
|
|
|
m_sizer_bottom->Add(m_sizer_left, 1, wxEXPAND, FromDIP(5));
|
|
|
|
wxBoxSizer *m_sizer_right = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
m_confirm = new Button(this, _L("OK"));
|
|
StateColor btn_bg_green(std::pair<wxColour, int>(wxColour(27, 136, 68), StateColor::Pressed), std::pair<wxColour, int>(wxColour(61, 203, 115), StateColor::Hovered),
|
|
std::pair<wxColour, int>(wxColour(0, 174, 66), StateColor::Normal));
|
|
|
|
m_confirm->SetBackgroundColor(btn_bg_green);
|
|
m_confirm->SetBorderColor(wxColour(0, 174, 66));
|
|
m_confirm->SetTextColor(wxColour(255, 255, 255));
|
|
m_confirm->SetSize(TIPS_DIALOG_BUTTON_SIZE);
|
|
m_confirm->SetMinSize(TIPS_DIALOG_BUTTON_SIZE);
|
|
m_confirm->SetCornerRadius(12);
|
|
m_confirm->Bind(wxEVT_LEFT_DOWN, &TipsDialog::on_ok, this);
|
|
m_sizer_right->Add(m_confirm, 0, wxALL, FromDIP(5));
|
|
|
|
m_sizer_bottom->Add(m_sizer_right, 0, wxEXPAND, FromDIP(5));
|
|
m_sizer_main->Add(m_sizer_bottom, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(40));
|
|
m_sizer_main->Add(0, 0, 0, wxEXPAND | wxTOP, FromDIP(20));
|
|
|
|
SetSizer(m_sizer_main);
|
|
Layout();
|
|
Fit();
|
|
Centre(wxBOTH);
|
|
}
|
|
|
|
wxBoxSizer *TipsDialog::create_item_checkbox(wxString title, wxWindow *parent, wxString tooltip, std::string param)
|
|
{
|
|
wxBoxSizer *m_sizer_checkbox = new wxBoxSizer(wxHORIZONTAL);
|
|
|
|
m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 5);
|
|
|
|
auto checkbox = new ::CheckBox(parent);
|
|
m_sizer_checkbox->Add(checkbox, 0, wxALIGN_CENTER, 0);
|
|
m_sizer_checkbox->Add(0, 0, 0, wxEXPAND | wxLEFT, 8);
|
|
|
|
auto checkbox_title = new wxStaticText(parent, wxID_ANY, title, wxDefaultPosition, wxSize(-1, -1), 0);
|
|
checkbox_title->SetForegroundColour(wxColour(144, 144, 144));
|
|
checkbox_title->SetFont(::Label::Body_13);
|
|
checkbox_title->Wrap(-1);
|
|
m_sizer_checkbox->Add(checkbox_title, 0, wxALIGN_CENTER | wxALL, 3);
|
|
|
|
m_show_again = wxGetApp().app_config->get(param) == "true" ? true : false;
|
|
checkbox->SetValue(m_show_again);
|
|
|
|
checkbox->Bind(wxEVT_TOGGLEBUTTON, [this, checkbox, param](wxCommandEvent &e) {
|
|
m_show_again = m_show_again ? false : true;
|
|
e.Skip();
|
|
});
|
|
|
|
return m_sizer_checkbox;
|
|
}
|
|
|
|
void TipsDialog::on_dpi_changed(const wxRect &suggested_rect)
|
|
{
|
|
if (m_confirm) m_confirm->SetMinSize(TIPS_DIALOG_BUTTON_SIZE);
|
|
if (m_cancel) m_cancel->SetMinSize(TIPS_DIALOG_BUTTON_SIZE);
|
|
Fit();
|
|
Refresh();
|
|
}
|
|
|
|
void TipsDialog::on_ok(wxMouseEvent &event)
|
|
{
|
|
if (m_show_again) {
|
|
wxGetApp().app_config->set_bool("do_not_show_modifer_tips", m_show_again);
|
|
}
|
|
EndModal(wxID_OK);
|
|
}
|
|
|
|
void ParamsPanel::Highlighter::set_timer_owner(wxEvtHandler *owner, int timerid /* = wxID_ANY*/)
|
|
{
|
|
m_timer.SetOwner(owner, timerid);
|
|
}
|
|
|
|
void ParamsPanel::Highlighter::init(std::pair<wxStaticBitmap *, bool *> params, wxWindow *parent)
|
|
{
|
|
if (m_timer.IsRunning()) invalidate();
|
|
if (!params.first || !params.second) return;
|
|
|
|
m_timer.Start(300, false);
|
|
|
|
m_bitmap = params.first;
|
|
m_show_blink_ptr = params.second;
|
|
m_parent = parent;
|
|
|
|
*m_show_blink_ptr = true;
|
|
}
|
|
|
|
void ParamsPanel::Highlighter::invalidate()
|
|
{
|
|
m_timer.Stop();
|
|
|
|
if (m_bitmap && m_show_blink_ptr) {
|
|
*m_show_blink_ptr = false;
|
|
m_bitmap->Show(*m_show_blink_ptr);
|
|
if (m_parent) {
|
|
m_parent->Layout();
|
|
m_parent->Refresh();
|
|
}
|
|
m_show_blink_ptr = nullptr;
|
|
m_bitmap = nullptr;
|
|
m_parent = nullptr;
|
|
}
|
|
|
|
m_blink_counter = 0;
|
|
}
|
|
|
|
void ParamsPanel::Highlighter::blink()
|
|
{
|
|
if (m_bitmap && m_show_blink_ptr) {
|
|
*m_show_blink_ptr = !*m_show_blink_ptr;
|
|
m_bitmap->Show(*m_show_blink_ptr);
|
|
if (m_parent) {
|
|
m_parent->Layout();
|
|
m_parent->Refresh();
|
|
}
|
|
} else
|
|
return;
|
|
|
|
if ((++m_blink_counter) == 11) invalidate();
|
|
}
|
|
|
|
ParamsPanel::ParamsPanel( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name )
|
|
: wxPanel( parent, id, pos, size, style, name )
|
|
{
|
|
init_bitmaps();
|
|
// BBS: new layout
|
|
SetBackgroundColour(*wxWHITE);
|
|
#if __WXOSX__
|
|
m_top_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
m_top_sizer->SetSizeHints(this);
|
|
this->SetSizer(m_top_sizer);
|
|
|
|
// Create additional panel to Fit() it from OnActivate()
|
|
// It's needed for tooltip showing on OSX
|
|
m_tmp_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL);
|
|
auto sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
m_tmp_panel->SetSizer(sizer);
|
|
m_tmp_panel->Layout();
|
|
|
|
#else
|
|
ParamsPanel*panel = this;
|
|
m_top_sizer = new wxBoxSizer(wxHORIZONTAL);
|
|
m_top_sizer->SetSizeHints(panel);
|
|
panel->SetSizer(m_top_sizer);
|
|
#endif //__WXOSX__
|
|
|
|
if (dynamic_cast<Notebook*>(parent)) {
|
|
// BBS: new layout
|
|
m_top_panel = new StaticBox(this, wxID_ANY, wxDefaultPosition);
|
|
m_top_panel->SetBackgroundColor(0xF8F8F8);
|
|
m_top_panel->SetBackgroundColor2(0xF1F1F1);
|
|
|
|
m_process_icon = new ScalableButton(m_top_panel, wxID_ANY, "process");
|
|
|
|
m_title_label = new Label(Label::Body_14, _L("Process"), m_top_panel);
|
|
m_title_label->Wrap( -1 );
|
|
|
|
//int width, height;
|
|
// BBS: new layout
|
|
m_mode_region = new SwitchButton(m_top_panel);
|
|
m_mode_region->SetMaxSize({em_unit(this) * 12, -1});
|
|
m_mode_region->SetLabels(_L("Global"), _L("Objects"));
|
|
//m_mode_region->GetSize(&width, &height);
|
|
m_tips_arrow = new wxStaticBitmap(m_top_panel, wxID_ANY, m_tips_arrow_icon);
|
|
m_tips_arrow->Hide();
|
|
|
|
m_title_view = new Label(Label::Body_14, _L("Advance"), m_top_panel);
|
|
m_title_view->Wrap( -1 );
|
|
m_mode_view = new SwitchButton(m_top_panel, wxID_ABOUT);
|
|
|
|
// BBS: new layout
|
|
//m_search_btn = new ScalableButton(m_top_panel, wxID_ANY, "search", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
|
|
//m_search_btn->SetToolTip(format_wxstr(_L("Search in settings [%1%]"), "Ctrl+F"));
|
|
//m_search_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().plater()->search(false); });
|
|
|
|
m_compare_btn = new ScalableButton(m_top_panel, wxID_ANY, "compare", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
|
|
m_compare_btn->SetToolTip(_L("Compare presets"));
|
|
m_compare_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { wxGetApp().mainframe->diff_dialog.show(); }));
|
|
#if !BBL_RELEASE_TO_PUBLIC
|
|
m_setting_btn = new ScalableButton(m_top_panel, wxID_ANY, "table", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER, true);
|
|
m_setting_btn->SetToolTip(_L("View all object's settings"));
|
|
m_setting_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().plater()->PopupObjectTable(-1, -1, {0, 0}); });
|
|
#endif
|
|
|
|
m_highlighter.set_timer_owner(this, 0);
|
|
this->Bind(wxEVT_TIMER, [this](wxTimerEvent &)
|
|
{
|
|
m_highlighter.blink();
|
|
});
|
|
}
|
|
|
|
m_staticline_filament = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
|
//m_staticline_print = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
|
m_staticline_print_object = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
|
m_staticline_print_part = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
|
|
m_staticline_printer = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
|
|
// BBS: new layout
|
|
//m_staticline_buttons = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
|
|
//m_staticline_middle = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL);
|
|
|
|
//m_export_to_file = new Button( this, wxT("Export To File"), "");
|
|
//m_import_from_file = new Button( this, wxT("Import From File") );
|
|
|
|
// Initialize the page.
|
|
#if __WXOSX__
|
|
auto page_parent = m_tmp_panel;
|
|
#else
|
|
auto page_parent = this;
|
|
#endif
|
|
|
|
// BBS: fix scroll to tip view
|
|
class PageScrolledWindow : public wxScrolledWindow
|
|
{
|
|
public:
|
|
PageScrolledWindow(wxWindow *parent)
|
|
: wxScrolledWindow(parent,
|
|
wxID_ANY,
|
|
wxDefaultPosition,
|
|
wxDefaultSize,
|
|
wxVSCROLL) // hide hori-bar will cause hidden field mis-position
|
|
{
|
|
// ShowScrollBar(GetHandle(), SB_BOTH, FALSE);
|
|
}
|
|
virtual bool ShouldScrollToChildOnFocus(wxWindow *child)
|
|
{
|
|
return false;
|
|
}
|
|
};
|
|
|
|
m_page_view = new PageScrolledWindow(page_parent);
|
|
m_page_view->SetBackgroundColour(*wxWHITE);
|
|
m_page_sizer = new wxBoxSizer(wxVERTICAL);
|
|
|
|
m_page_view->SetSizer(m_page_sizer);
|
|
m_page_view->SetScrollbars(1, 20, 1, 2);
|
|
//m_page_view->SetScrollRate( 5, 5 );
|
|
|
|
if (m_mode_region)
|
|
m_mode_region->Bind(wxEVT_TOGGLEBUTTON, &ParamsPanel::OnToggled, this);
|
|
if (m_mode_view)
|
|
m_mode_view->Bind(wxEVT_TOGGLEBUTTON, &ParamsPanel::OnToggled, this);
|
|
Bind(wxEVT_TOGGLEBUTTON, &ParamsPanel::OnToggled, this); // For Tab's mode switch
|
|
//Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().plater()->search(false); }, wxID_FIND);
|
|
//m_export_to_file->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().mainframe->export_config(); });
|
|
//m_import_from_file->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { wxGetApp().mainframe->load_config_file(); });
|
|
}
|
|
|
|
void ParamsPanel::init_bitmaps()
|
|
{
|
|
m_tips_arrow_icon = create_scaled_bitmap("tips_arrow", nullptr, 24);
|
|
}
|
|
|
|
void ParamsPanel::create_layout()
|
|
{
|
|
#ifdef __WINDOWS__
|
|
this->SetDoubleBuffered(true);
|
|
m_page_view->SetDoubleBuffered(true);
|
|
#endif //__WINDOWS__
|
|
|
|
m_left_sizer = new wxBoxSizer( wxVERTICAL );
|
|
// BBS: new layout
|
|
m_left_sizer->SetMinSize( wxSize(40 * em_unit(this), -1 ) );
|
|
|
|
if (m_top_panel) {
|
|
m_mode_sizer = new wxBoxSizer( wxHORIZONTAL );
|
|
m_mode_sizer->AddSpacer(FromDIP(11));
|
|
m_mode_sizer->Add(m_process_icon, 0, wxALIGN_CENTER);
|
|
m_mode_sizer->AddSpacer(FromDIP(11));
|
|
m_mode_sizer->Add( m_title_label, 0, wxALIGN_CENTER );
|
|
m_mode_sizer->AddSpacer(FromDIP(9));
|
|
m_mode_sizer->Add( m_mode_region, 0, wxALIGN_CENTER );
|
|
m_mode_sizer->AddSpacer(FromDIP(9));
|
|
m_mode_sizer->Add( m_tips_arrow, 0, wxALIGN_CENTER);
|
|
m_mode_sizer->AddStretchSpacer(1);
|
|
m_mode_sizer->Add( m_title_view, 0, wxALIGN_CENTER );
|
|
m_mode_sizer->AddSpacer(FromDIP(9));
|
|
m_mode_sizer->Add( m_mode_view, 0, wxALIGN_CENTER );
|
|
#if !BBL_RELEASE_TO_PUBLIC
|
|
m_mode_sizer->AddSpacer(FromDIP(16));
|
|
m_mode_sizer->Add( m_setting_btn, 0, wxALIGN_CENTER );
|
|
#endif
|
|
m_mode_sizer->AddSpacer(FromDIP(16));
|
|
m_mode_sizer->Add( m_compare_btn, 0, wxALIGN_CENTER );
|
|
|
|
m_mode_sizer->AddSpacer(FromDIP(8));
|
|
//m_mode_sizer->Add( m_search_btn, 0, wxALIGN_CENTER );
|
|
//m_mode_sizer->AddSpacer(16);
|
|
m_mode_sizer->SetMinSize(-1, FromDIP(30));
|
|
m_top_panel->SetSizer(m_mode_sizer);
|
|
//m_left_sizer->Add( m_top_panel, 0, wxEXPAND );
|
|
}
|
|
|
|
if (m_tab_print) {
|
|
if (m_staticline_print)
|
|
m_left_sizer->Add( m_staticline_print, 0, wxEXPAND );
|
|
//m_print_sizer = new wxBoxSizer( wxHORIZONTAL );
|
|
//m_print_sizer->Add( m_tab_print, 1, wxEXPAND | wxALL, 5 );
|
|
//m_left_sizer->Add( m_print_sizer, 1, wxEXPAND, 5 );
|
|
m_left_sizer->Add( m_tab_print, 0, wxEXPAND );
|
|
}
|
|
|
|
if (m_tab_print_object) {
|
|
m_left_sizer->Add( m_staticline_print_object, 0, wxEXPAND );
|
|
m_left_sizer->Add( m_tab_print_object, 0, wxEXPAND );
|
|
}
|
|
|
|
if (m_tab_print_part) {
|
|
m_left_sizer->Add( m_staticline_print_part, 0, wxEXPAND );
|
|
m_left_sizer->Add( m_tab_print_part, 0, wxEXPAND );
|
|
}
|
|
|
|
if (m_tab_filament) {
|
|
m_left_sizer->Add( m_staticline_filament, 0, wxEXPAND );
|
|
//m_filament_sizer = new wxBoxSizer( wxVERTICAL );
|
|
//m_filament_sizer->Add( m_tab_filament, 1, wxEXPAND | wxALL, 5 );
|
|
// m_left_sizer->Add( m_filament_sizer, 1, wxEXPAND, 5 );
|
|
m_left_sizer->Add( m_tab_filament, 0, wxEXPAND );
|
|
}
|
|
|
|
if (m_tab_printer) {
|
|
m_left_sizer->Add( m_staticline_printer, 0, wxEXPAND );
|
|
//m_printer_sizer = new wxBoxSizer( wxVERTICAL );
|
|
//m_printer_sizer->Add( m_tab_printer, 1, wxEXPAND | wxALL, 5 );
|
|
m_left_sizer->Add( m_tab_printer, 0, wxEXPAND );
|
|
}
|
|
|
|
//m_left_sizer->Add( m_printer_sizer, 1, wxEXPAND, 1 );
|
|
|
|
//m_button_sizer = new wxBoxSizer( wxHORIZONTAL );
|
|
|
|
//m_button_sizer->Add( m_export_to_file, 0, wxALL, 5 );
|
|
|
|
//m_button_sizer->Add( m_import_from_file, 0, wxALL, 5 );
|
|
|
|
//m_left_sizer->Add( m_staticline_buttons, 0, wxEXPAND );
|
|
//m_left_sizer->Add( m_button_sizer, 0, wxALIGN_CENTER, 5 );
|
|
|
|
m_top_sizer->Add(m_left_sizer, 1, wxEXPAND);
|
|
//m_top_sizer->Add(m_staticline_middle, 0, wxEXPAND, 0);
|
|
|
|
//m_right_sizer = new wxBoxSizer( wxVERTICAL );
|
|
|
|
//m_right_sizer->Add( m_page_view, 1, wxEXPAND | wxALL, 5 );
|
|
|
|
//m_top_sizer->Add( m_right_sizer, 1, wxEXPAND, 5 );
|
|
// BBS: new layout
|
|
#if __WXOSX__
|
|
m_left_sizer->Add(m_tmp_panel, 1, wxEXPAND | wxALL, 0);
|
|
m_tmp_panel->GetSizer()->Add( m_page_view, 1, wxEXPAND );
|
|
#else
|
|
m_left_sizer->Add( m_page_view, 1, wxEXPAND );
|
|
#endif
|
|
|
|
//this->SetSizer( m_top_sizer );
|
|
this->Layout();
|
|
}
|
|
|
|
void ParamsPanel::rebuild_panels()
|
|
{
|
|
refresh_tabs();
|
|
free_sizers();
|
|
create_layout();
|
|
}
|
|
|
|
void ParamsPanel::refresh_tabs()
|
|
{
|
|
auto& tabs_list = wxGetApp().tabs_list;
|
|
auto print_tech = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
|
|
for (auto tab : tabs_list)
|
|
if (tab->supports_printer_technology(print_tech))
|
|
{
|
|
if (tab->GetParent() != this) continue;
|
|
switch (tab->type())
|
|
{
|
|
case Preset::TYPE_PRINT:
|
|
case Preset::TYPE_SLA_PRINT:
|
|
m_tab_print = tab;
|
|
break;
|
|
|
|
case Preset::TYPE_FILAMENT:
|
|
case Preset::TYPE_SLA_MATERIAL:
|
|
m_tab_filament = tab;
|
|
break;
|
|
|
|
case Preset::TYPE_PRINTER:
|
|
m_tab_printer = tab;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
if (m_top_panel) {
|
|
m_tab_print_object = wxGetApp().get_model_tab();
|
|
m_tab_print_part = wxGetApp().get_model_tab(true);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void ParamsPanel::clear_page()
|
|
{
|
|
if (m_page_sizer)
|
|
m_page_sizer->Clear(true);
|
|
}
|
|
|
|
|
|
void ParamsPanel::OnActivate()
|
|
{
|
|
if (m_current_tab == NULL)
|
|
{
|
|
//the first time
|
|
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": first time opened, set current tab to print");
|
|
// BBS: open/close tab
|
|
//m_current_tab = m_tab_print;
|
|
set_active_tab(m_tab_print ? m_tab_print : m_tab_filament);
|
|
}
|
|
Tab* cur_tab = dynamic_cast<Tab *> (m_current_tab);
|
|
if (cur_tab)
|
|
cur_tab->OnActivate();
|
|
}
|
|
|
|
void ParamsPanel::OnToggled(wxCommandEvent& event)
|
|
{
|
|
if (m_mode_region && m_mode_region->GetId() == event.GetId()) {
|
|
wxWindowUpdateLocker locker(GetParent());
|
|
set_active_tab(nullptr);
|
|
event.Skip();
|
|
return;
|
|
}
|
|
|
|
if (wxID_ABOUT != event.GetId()) {
|
|
return;
|
|
}
|
|
|
|
// this is from tab's mode switch
|
|
bool value = dynamic_cast<SwitchButton*>(event.GetEventObject())->GetValue();
|
|
int mode_id;
|
|
|
|
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": Advanced mode toogle to %1%") % value;
|
|
|
|
if (value)
|
|
{
|
|
//m_mode_region->SetBitmap(m_toggle_on_icon);
|
|
mode_id = comAdvanced;
|
|
}
|
|
else
|
|
{
|
|
//m_mode_region->SetBitmap(m_toggle_off_icon);
|
|
mode_id = comSimple;
|
|
}
|
|
|
|
Slic3r::GUI::wxGetApp().save_mode(mode_id);
|
|
}
|
|
|
|
// This is special, DO NOT call it from outer except from Tab
|
|
void ParamsPanel::set_active_tab(wxPanel* tab)
|
|
{
|
|
Tab* cur_tab = dynamic_cast<Tab *> (tab);
|
|
|
|
if (cur_tab == nullptr) {
|
|
if (!m_mode_region->GetValue()) {
|
|
cur_tab = (Tab*) m_tab_print;
|
|
} else if (m_tab_print_part && ((TabPrintModel*) m_tab_print_part)->has_model_config()) {
|
|
cur_tab = (Tab*) m_tab_print_part;
|
|
} else if (m_tab_print_object && ((TabPrintModel*) m_tab_print_object)->has_model_config()) {
|
|
cur_tab = (Tab*) m_tab_print_object;
|
|
}
|
|
Show(cur_tab != nullptr);
|
|
wxGetApp().sidebar().show_object_list(m_mode_region->GetValue());
|
|
if (m_current_tab == cur_tab)
|
|
return;
|
|
if (cur_tab)
|
|
cur_tab->restore_last_select_item();
|
|
return;
|
|
}
|
|
|
|
m_current_tab = tab;
|
|
BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": set current to %1%, type=%2%") % cur_tab % cur_tab?cur_tab->type():-1;
|
|
update_mode();
|
|
|
|
// BBS: open/close tab
|
|
for (auto t : std::vector<std::pair<wxPanel*, wxStaticLine*>>({
|
|
{m_tab_print, m_staticline_print},
|
|
{m_tab_print_object, m_staticline_print_object},
|
|
{m_tab_print_part, m_staticline_print_part},
|
|
{m_tab_filament, m_staticline_filament},
|
|
{m_tab_printer, m_staticline_printer}})) {
|
|
if (!t.first) continue;
|
|
t.first->Show(tab == t.first);
|
|
if (!t.second) continue;
|
|
t.second->Show(tab == t.first);
|
|
//m_left_sizer->GetItem(t)->SetProportion(tab == t ? 1 : 0);
|
|
}
|
|
m_left_sizer->Layout();
|
|
if (auto dialog = dynamic_cast<wxDialog*>(GetParent())) {
|
|
wxString title = cur_tab->type() == Preset::TYPE_FILAMENT ? _L("Filament settings") : _L("Printer settings");
|
|
dialog->SetTitle(title);
|
|
}
|
|
}
|
|
|
|
bool ParamsPanel::is_active_and_shown_tab(wxPanel* tab)
|
|
{
|
|
if (m_current_tab == tab)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
void ParamsPanel::update_mode()
|
|
{
|
|
int app_mode = Slic3r::GUI::wxGetApp().get_mode();
|
|
SwitchButton * mode_view = m_current_tab ? dynamic_cast<Tab*>(m_current_tab)->m_mode_view : nullptr;
|
|
if (mode_view == nullptr) mode_view = m_mode_view;
|
|
if (mode_view == nullptr) return;
|
|
|
|
//BBS: disable the mode tab and return directly when enable develop mode
|
|
if (app_mode == comDevelop)
|
|
{
|
|
mode_view->Disable();
|
|
return;
|
|
}
|
|
if (!mode_view->IsEnabled())
|
|
mode_view->Enable();
|
|
|
|
if (app_mode == comAdvanced)
|
|
{
|
|
mode_view->SetValue(true);
|
|
}
|
|
else
|
|
{
|
|
mode_view->SetValue(false);
|
|
}
|
|
}
|
|
|
|
void ParamsPanel::msw_rescale()
|
|
{
|
|
if (m_process_icon) m_process_icon->msw_rescale();
|
|
#if !BBL_RELEASE_TO_PUBLIC
|
|
if (m_setting_btn) m_setting_btn->msw_rescale();
|
|
#endif
|
|
if (m_search_btn) m_search_btn->msw_rescale();
|
|
if (m_compare_btn) m_compare_btn->msw_rescale();
|
|
m_left_sizer->SetMinSize(wxSize(40 * em_unit(this), -1));
|
|
if (m_mode_sizer)
|
|
m_mode_sizer->SetMinSize(-1, 3 * em_unit(this));
|
|
if (m_mode_region)
|
|
((SwitchButton* )m_mode_region)->Rescale();
|
|
if (m_mode_view)
|
|
((SwitchButton* )m_mode_view)->Rescale();
|
|
for (auto tab : {m_tab_print, m_tab_print_object, m_tab_print_part, m_tab_filament, m_tab_printer}) {
|
|
if (tab) dynamic_cast<Tab*>(tab)->msw_rescale();
|
|
}
|
|
//((Button*)m_export_to_file)->Rescale();
|
|
//((Button*)m_import_from_file)->Rescale();
|
|
}
|
|
|
|
void ParamsPanel::switch_to_global()
|
|
{
|
|
m_mode_region->SetValue(false);
|
|
set_active_tab(nullptr);
|
|
}
|
|
|
|
void ParamsPanel::switch_to_object(bool with_tips)
|
|
{
|
|
m_mode_region->SetValue(true);
|
|
set_active_tab(nullptr);
|
|
if (with_tips) {
|
|
m_highlighter.init(std::pair(m_tips_arrow, &m_tips_arror_blink), m_top_panel);
|
|
m_highlighter.blink();
|
|
}
|
|
}
|
|
|
|
void ParamsPanel::free_sizers()
|
|
{
|
|
if (m_top_sizer)
|
|
{
|
|
m_top_sizer->Clear(false);
|
|
//m_top_sizer = nullptr;
|
|
}
|
|
|
|
m_left_sizer = nullptr;
|
|
//m_right_sizer = nullptr;
|
|
m_mode_sizer = nullptr;
|
|
//m_print_sizer = nullptr;
|
|
//m_filament_sizer = nullptr;
|
|
//m_printer_sizer = nullptr;
|
|
m_button_sizer = nullptr;
|
|
}
|
|
|
|
void ParamsPanel::delete_subwindows()
|
|
{
|
|
if (m_title_label)
|
|
{
|
|
delete m_title_label;
|
|
m_title_label = nullptr;
|
|
}
|
|
|
|
if (m_mode_region)
|
|
{
|
|
delete m_mode_region;
|
|
m_mode_region = nullptr;
|
|
}
|
|
|
|
if (m_mode_view)
|
|
{
|
|
delete m_mode_view;
|
|
m_mode_view = nullptr;
|
|
}
|
|
|
|
if (m_title_view)
|
|
{
|
|
delete m_title_view;
|
|
m_title_view = nullptr;
|
|
}
|
|
|
|
if (m_search_btn)
|
|
{
|
|
delete m_search_btn;
|
|
m_search_btn = nullptr;
|
|
}
|
|
|
|
if (m_staticline_print)
|
|
{
|
|
delete m_staticline_print;
|
|
m_staticline_print = nullptr;
|
|
}
|
|
|
|
if (m_staticline_print_part)
|
|
{
|
|
delete m_staticline_print_part;
|
|
m_staticline_print_part = nullptr;
|
|
}
|
|
|
|
if (m_staticline_print_object)
|
|
{
|
|
delete m_staticline_print_object;
|
|
m_staticline_print_object = nullptr;
|
|
}
|
|
|
|
if (m_staticline_filament)
|
|
{
|
|
delete m_staticline_filament;
|
|
m_staticline_filament = nullptr;
|
|
}
|
|
|
|
if (m_staticline_printer)
|
|
{
|
|
delete m_staticline_printer;
|
|
m_staticline_printer = nullptr;
|
|
}
|
|
|
|
//// BBS: new layout
|
|
//if (m_staticline_buttons)
|
|
//{
|
|
// delete m_staticline_buttons;
|
|
// m_staticline_buttons = nullptr;
|
|
//}
|
|
|
|
//if (m_staticline_middle)
|
|
//{
|
|
// delete m_staticline_middle;
|
|
// m_staticline_middle = nullptr;
|
|
//}
|
|
|
|
if (m_export_to_file)
|
|
{
|
|
delete m_export_to_file;
|
|
m_export_to_file = nullptr;
|
|
}
|
|
|
|
if (m_import_from_file)
|
|
{
|
|
delete m_import_from_file;
|
|
m_import_from_file = nullptr;
|
|
}
|
|
|
|
if (m_page_view)
|
|
{
|
|
delete m_page_view;
|
|
m_page_view = nullptr;
|
|
}
|
|
}
|
|
|
|
ParamsPanel::~ParamsPanel()
|
|
{
|
|
#if 0
|
|
free_sizers();
|
|
delete m_top_sizer;
|
|
|
|
delete_subwindows();
|
|
#endif
|
|
// BBS: fix double destruct of OG_CustomCtrl
|
|
Tab* cur_tab = dynamic_cast<Tab*> (m_current_tab);
|
|
if (cur_tab)
|
|
cur_tab->clear_pages();
|
|
}
|
|
|
|
} // GUI
|
|
} // Slic3r
|