OrcaSlicer/src/slic3r/GUI/Notebook.cpp
lane.wei e9e4d75877 Update the codes to 01.01.00.10 for the formal release
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. ...
2022-07-22 20:35:34 +08:00

245 lines
7.8 KiB
C++

#include "Notebook.hpp"
//#ifdef _WIN32
#include "GUI_App.hpp"
#include "wxExtensions.hpp"
#include "Widgets/Button.hpp"
//BBS set font size
#include "Widgets/Label.hpp"
#include <wx/button.h>
#include <wx/sizer.h>
wxDEFINE_EVENT(wxCUSTOMEVT_NOTEBOOK_SEL_CHANGED, wxCommandEvent);
ButtonsListCtrl::ButtonsListCtrl(wxWindow *parent, wxBoxSizer* side_tools) :
wxControl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxTAB_TRAVERSAL)
{
#ifdef __WINDOWS__
SetDoubleBuffered(true);
#endif //__WINDOWS__
wxColour default_btn_bg("#3B4446"); // Gradient #414B4E
SetBackgroundColour(default_btn_bg);
int em = em_unit(this);// Slic3r::GUI::wxGetApp().em_unit();
// BBS: no gap
m_btn_margin = 0; // std::lround(0.3 * em);
m_line_margin = std::lround(0.1 * em);
m_sizer = new wxBoxSizer(wxHORIZONTAL);
this->SetSizer(m_sizer);
m_buttons_sizer = new wxFlexGridSizer(1, m_btn_margin, m_btn_margin);
m_sizer->Add(m_buttons_sizer, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxBOTTOM, m_btn_margin);
if (side_tools != NULL) {
m_sizer->AddStretchSpacer(1);
for (size_t idx = 0; idx < side_tools->GetItemCount(); idx++) {
wxSizerItem* item = side_tools->GetItem(idx);
wxWindow* item_win = item->GetWindow();
if (item_win) {
item_win->Reparent(this);
}
}
m_sizer->Add(side_tools, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxBOTTOM, m_btn_margin);
}
// BBS: disable custom paint
//this->Bind(wxEVT_PAINT, &ButtonsListCtrl::OnPaint, this);
}
void ButtonsListCtrl::OnPaint(wxPaintEvent&)
{
Slic3r::GUI::wxGetApp().UpdateDarkUI(this);
const wxSize sz = GetSize();
wxPaintDC dc(this);
if (m_selection < 0 || m_selection >= (int)m_pageButtons.size())
return;
wxColour selected_btn_bg("#1F8EEA");
wxColour default_btn_bg("#3B4446"); // Gradient #414B4E
const wxColour& btn_marker_color = Slic3r::GUI::wxGetApp().get_color_hovered_btn_label();
// highlight selected notebook button
for (int idx = 0; idx < int(m_pageButtons.size()); idx++) {
Button* btn = m_pageButtons[idx];
btn->SetBackgroundColor(idx == m_selection ? selected_btn_bg : default_btn_bg);
wxPoint pos = btn->GetPosition();
wxSize size = btn->GetSize();
const wxColour& clr = idx == m_selection ? btn_marker_color : default_btn_bg;
dc.SetPen(clr);
dc.SetBrush(clr);
dc.DrawRectangle(pos.x, pos.y + size.y, size.x, sz.y - size.y);
}
#if 0
// highlight selected mode button
if (m_mode_sizer) {
const std::vector<ModeButton*>& mode_btns = m_mode_sizer->get_btns();
for (int idx = 0; idx < int(mode_btns.size()); idx++) {
ModeButton* btn = mode_btns[idx];
btn->SetBackgroundColor(btn->is_selected() ? selected_btn_bg : default_btn_bg);
//wxPoint pos = btn->GetPosition();
//wxSize size = btn->GetSize();
//const wxColour& clr = btn->is_selected() ? btn_marker_color : default_btn_bg;
//dc.SetPen(clr);
//dc.SetBrush(clr);
//dc.DrawRectangle(pos.x, pos.y + size.y, size.x, sz.y - size.y);
}
}
#endif
// Draw orange bottom line
dc.SetPen(btn_marker_color);
dc.SetBrush(btn_marker_color);
dc.DrawRectangle(1, sz.y - m_line_margin, sz.x, m_line_margin);
}
void ButtonsListCtrl::UpdateMode()
{
//m_mode_sizer->SetMode(Slic3r::GUI::wxGetApp().get_mode());
}
void ButtonsListCtrl::Rescale()
{
//m_mode_sizer->msw_rescale();
int em = em_unit(this);
for (Button* btn : m_pageButtons) {
//BBS
btn->SetMinSize({(btn->GetLabel().empty() ? 40 : 132) * em / 10, 36 * em / 10});
btn->Rescale();
}
// BBS: no gap
//m_btn_margin = std::lround(0.3 * em);
//m_line_margin = std::lround(0.1 * em);
//m_buttons_sizer->SetVGap(m_btn_margin);
//m_buttons_sizer->SetHGap(m_btn_margin);
m_sizer->Layout();
}
void ButtonsListCtrl::SetSelection(int sel)
{
if (m_selection == sel)
return;
// BBS: change button color
wxColour selected_btn_bg("#00AE42"); // Gradient #00AE42
if (m_selection >= 0) {
StateColor bg_color = StateColor(
std::pair{wxColour(107, 107, 107), (int) StateColor::Hovered},
std::pair{wxColour(59, 68, 70), (int) StateColor::Normal});
m_pageButtons[m_selection]->SetBackgroundColor(bg_color);
StateColor text_color = StateColor(
std::pair{wxColour(255, 255, 255), (int) StateColor::Hovered},
std::pair{wxColour(238,238, 238), (int) StateColor::Normal}
);
m_pageButtons[m_selection]->SetSelected(false);
m_pageButtons[m_selection]->SetTextColor(text_color);
}
m_selection = sel;
StateColor bg_color = StateColor(
std::pair{wxColour(0, 174, 66), (int) StateColor::Hovered},
std::pair{wxColour(0,174, 66), (int) StateColor::Normal});
m_pageButtons[m_selection]->SetBackgroundColor(bg_color);
StateColor text_color = StateColor(
std::pair{wxColour(255, 255, 255), (int) StateColor::Hovered},
std::pair{wxColour(255, 255, 255), (int) StateColor::Normal}
);
m_pageButtons[m_selection]->SetSelected(true);
m_pageButtons[m_selection]->SetTextColor(text_color);
Refresh();
}
bool ButtonsListCtrl::InsertPage(size_t n, const wxString &text, bool bSelect /* = false*/, const std::string &bmp_name /* = ""*/, const std::string &inactive_bmp_name)
{
Button * btn = new Button(this, text.empty() ? text : " " + text, bmp_name, wxNO_BORDER);
btn->SetCornerRadius(0);
int em = em_unit(this);
//BBS set size for button
btn->SetMinSize({(text.empty() ? 40 : 136) * em / 10, 36 * em / 10});
StateColor bg_color = StateColor(
std::pair{wxColour(107, 107, 107), (int) StateColor::Hovered},
std::pair{wxColour(59, 68, 70), (int) StateColor::Normal});
btn->SetBackgroundColor(bg_color);
StateColor text_color = StateColor(
std::pair{wxColour(255, 255, 255), (int) StateColor::Hovered},
std::pair{wxColour(238,238, 238), (int) StateColor::Normal});
btn->SetTextColor(text_color);
btn->SetInactiveIcon(inactive_bmp_name);
btn->SetSelected(false);
btn->Bind(wxEVT_BUTTON, [this, btn](wxCommandEvent& event) {
if (auto it = std::find(m_pageButtons.begin(), m_pageButtons.end(), btn); it != m_pageButtons.end()) {
auto sel = it - m_pageButtons.begin();
//do it later
//SetSelection(sel);
wxCommandEvent evt = wxCommandEvent(wxCUSTOMEVT_NOTEBOOK_SEL_CHANGED);
evt.SetId(sel);
wxPostEvent(this->GetParent(), evt);
}
});
Slic3r::GUI::wxGetApp().UpdateDarkUI(btn);
m_pageButtons.insert(m_pageButtons.begin() + n, btn);
m_buttons_sizer->Insert(n, new wxSizerItem(btn));
m_buttons_sizer->SetCols(m_buttons_sizer->GetCols() + 1);
m_sizer->Layout();
return true;
}
void ButtonsListCtrl::RemovePage(size_t n)
{
Button* btn = m_pageButtons[n];
m_pageButtons.erase(m_pageButtons.begin() + n);
m_buttons_sizer->Remove(n);
#if __WXOSX__
RemoveChild(btn);
#else
btn->Reparent(nullptr);
#endif
btn->Destroy();
m_sizer->Layout();
}
bool ButtonsListCtrl::SetPageImage(size_t n, const std::string& bmp_name) const
{
if (n >= m_pageButtons.size())
return false;
// BBS
//return m_pageButtons[n]->SetBitmap_(bmp_name);
ScalableBitmap bitmap(NULL, bmp_name);
//m_pageButtons[n]->SetBitmap_(bitmap);
return true;
}
void ButtonsListCtrl::SetPageText(size_t n, const wxString& strText)
{
Button* btn = m_pageButtons[n];
btn->SetLabel(strText);
}
wxString ButtonsListCtrl::GetPageText(size_t n) const
{
Button* btn = m_pageButtons[n];
return btn->GetLabel();
}
//#endif // _WIN32