mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-09-17 05:23:17 +08:00
WIP: Experiments with New simple top bar
This commit is contained in:
parent
5f34abf473
commit
ada1fc37ff
@ -252,6 +252,8 @@ set(SLIC3R_GUI_SOURCES
|
|||||||
GUI/DoubleSlider.hpp
|
GUI/DoubleSlider.hpp
|
||||||
GUI/Notebook.cpp
|
GUI/Notebook.cpp
|
||||||
GUI/Notebook.hpp
|
GUI/Notebook.hpp
|
||||||
|
GUI/TopBar.cpp
|
||||||
|
GUI/TopBar.hpp
|
||||||
GUI/ObjectDataViewModel.cpp
|
GUI/ObjectDataViewModel.cpp
|
||||||
GUI/ObjectDataViewModel.hpp
|
GUI/ObjectDataViewModel.hpp
|
||||||
GUI/InstanceCheck.cpp
|
GUI/InstanceCheck.cpp
|
||||||
|
@ -103,7 +103,8 @@
|
|||||||
#include "WebViewDialog.hpp"
|
#include "WebViewDialog.hpp"
|
||||||
|
|
||||||
#include "BitmapCache.hpp"
|
#include "BitmapCache.hpp"
|
||||||
#include "Notebook.hpp"
|
//#include "Notebook.hpp"
|
||||||
|
#include "TopBar.hpp"
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
#include <dbt.h>
|
#include <dbt.h>
|
||||||
@ -1519,16 +1520,16 @@ void GUI_App::init_ui_colours()
|
|||||||
m_mode_palette = get_mode_default_palette();
|
m_mode_palette = get_mode_default_palette();
|
||||||
|
|
||||||
bool is_dark_mode = dark_mode();
|
bool is_dark_mode = dark_mode();
|
||||||
#ifdef _WIN32
|
//#ifdef _WIN32
|
||||||
m_color_label_default = is_dark_mode ? wxColour(250, 250, 250): wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
|
m_color_label_default = is_dark_mode ? wxColour(250, 250, 250): wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
|
||||||
m_color_highlight_label_default = is_dark_mode ? wxColour(230, 230, 230): wxSystemSettings::GetColour(/*wxSYS_COLOUR_HIGHLIGHTTEXT*/wxSYS_COLOUR_WINDOWTEXT);
|
m_color_highlight_label_default = is_dark_mode ? wxColour(230, 230, 230): wxSystemSettings::GetColour(/*wxSYS_COLOUR_HIGHLIGHTTEXT*/wxSYS_COLOUR_WINDOWTEXT);
|
||||||
m_color_highlight_default = is_dark_mode ? wxColour(78, 78, 78) : wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT);
|
m_color_highlight_default = is_dark_mode ? wxColour(78, 78, 78) : wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT);
|
||||||
m_color_hovered_btn_label = is_dark_mode ? wxColour(253, 111, 40) : wxColour(252, 77, 1);
|
m_color_hovered_btn_label = is_dark_mode ? wxColour(253, 111, 40) : wxColour(252, 77, 1);
|
||||||
m_color_default_btn_label = is_dark_mode ? wxColour(255, 181, 100): wxColour(203, 61, 0);
|
m_color_default_btn_label = is_dark_mode ? wxColour(255, 181, 100): wxColour(203, 61, 0);
|
||||||
m_color_selected_btn_bg = is_dark_mode ? wxColour(95, 73, 62) : wxColour(228, 220, 216);
|
m_color_selected_btn_bg = is_dark_mode ? wxColour(95, 73, 62) : wxColour(228, 220, 216);
|
||||||
#else
|
//#else
|
||||||
m_color_label_default = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
|
// m_color_label_default = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
|
||||||
#endif
|
//#endif
|
||||||
m_color_window_default = is_dark_mode ? wxColour(43, 43, 43) : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
m_color_window_default = is_dark_mode ? wxColour(43, 43, 43) : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1564,12 +1565,13 @@ void GUI_App::update_label_colours()
|
|||||||
tab->update_label_colours();
|
tab->update_label_colours();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if 0//def _WIN32
|
||||||
static bool is_focused(HWND hWnd)
|
static bool is_focused(HWND hWnd)
|
||||||
{
|
{
|
||||||
HWND hFocusedWnd = ::GetFocus();
|
HWND hFocusedWnd = ::GetFocus();
|
||||||
return hFocusedWnd && hWnd == hFocusedWnd;
|
return hFocusedWnd && hWnd == hFocusedWnd;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool is_default(wxWindow* win)
|
static bool is_default(wxWindow* win)
|
||||||
{
|
{
|
||||||
@ -1579,7 +1581,6 @@ static bool is_default(wxWindow* win)
|
|||||||
|
|
||||||
return win == tlw->GetDefaultItem();
|
return win == tlw->GetDefaultItem();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void GUI_App::UpdateDarkUI(wxWindow* window, bool highlited/* = false*/, bool just_font/* = false*/)
|
void GUI_App::UpdateDarkUI(wxWindow* window, bool highlited/* = false*/, bool just_font/* = false*/)
|
||||||
{
|
{
|
||||||
@ -1592,6 +1593,7 @@ void GUI_App::UpdateDarkUI(wxWindow* window, bool highlited/* = false*/, bool ju
|
|||||||
highlited = true;
|
highlited = true;
|
||||||
}
|
}
|
||||||
// button marking
|
// button marking
|
||||||
|
if (!dynamic_cast<TopBarItemsCtrl*>(window->GetParent())) // don't marking the button if it is from TopBar
|
||||||
{
|
{
|
||||||
auto mark_button = [this, btn, highlited](const bool mark) {
|
auto mark_button = [this, btn, highlited](const bool mark) {
|
||||||
if (btn->GetLabel().IsEmpty())
|
if (btn->GetLabel().IsEmpty())
|
||||||
@ -1604,12 +1606,12 @@ void GUI_App::UpdateDarkUI(wxWindow* window, bool highlited/* = false*/, bool ju
|
|||||||
|
|
||||||
// hovering
|
// hovering
|
||||||
btn->Bind(wxEVT_ENTER_WINDOW, [mark_button](wxMouseEvent& event) { mark_button(true); event.Skip(); });
|
btn->Bind(wxEVT_ENTER_WINDOW, [mark_button](wxMouseEvent& event) { mark_button(true); event.Skip(); });
|
||||||
btn->Bind(wxEVT_LEAVE_WINDOW, [mark_button, btn](wxMouseEvent& event) { mark_button(is_focused(btn->GetHWND())); event.Skip(); });
|
btn->Bind(wxEVT_LEAVE_WINDOW, [mark_button, btn](wxMouseEvent& event) { mark_button(btn->HasFocus()); event.Skip(); });
|
||||||
// focusing
|
// focusing
|
||||||
btn->Bind(wxEVT_SET_FOCUS, [mark_button](wxFocusEvent& event) { mark_button(true); event.Skip(); });
|
btn->Bind(wxEVT_SET_FOCUS, [mark_button](wxFocusEvent& event) { mark_button(true); event.Skip(); });
|
||||||
btn->Bind(wxEVT_KILL_FOCUS, [mark_button](wxFocusEvent& event) { mark_button(false); event.Skip(); });
|
btn->Bind(wxEVT_KILL_FOCUS, [mark_button](wxFocusEvent& event) { mark_button(false); event.Skip(); });
|
||||||
|
|
||||||
is_focused_button = is_focused(btn->GetHWND());
|
is_focused_button = btn->HasFocus();// is_focused(btn->GetHWND());
|
||||||
is_default_button = is_default(btn);
|
is_default_button = is_default(btn);
|
||||||
if (is_focused_button || is_default_button)
|
if (is_focused_button || is_default_button)
|
||||||
mark_button(is_focused_button);
|
mark_button(is_focused_button);
|
||||||
@ -2471,10 +2473,8 @@ void GUI_App::update_mode()
|
|||||||
{
|
{
|
||||||
sidebar().update_mode();
|
sidebar().update_mode();
|
||||||
|
|
||||||
#ifdef _WIN32 //_MSW_DARK_MODE
|
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(mainframe->m_tabpanel)->UpdateMode();
|
dynamic_cast<TopBar*>(mainframe->m_tabpanel)->UpdateMode();
|
||||||
#endif
|
|
||||||
|
|
||||||
for (auto tab : tabs_list)
|
for (auto tab : tabs_list)
|
||||||
tab->update_mode();
|
tab->update_mode();
|
||||||
@ -2483,7 +2483,8 @@ void GUI_App::update_mode()
|
|||||||
plater()->canvas3D()->update_gizmos_on_off_state();
|
plater()->canvas3D()->update_gizmos_on_off_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI_App::add_config_menu(wxMenuBar *menu)
|
//void GUI_App::add_config_menu(wxMenuBar *menu)
|
||||||
|
wxMenu* GUI_App::get_config_menu()
|
||||||
{
|
{
|
||||||
auto local_menu = new wxMenu();
|
auto local_menu = new wxMenu();
|
||||||
wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt));
|
wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt));
|
||||||
@ -2518,6 +2519,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
|||||||
"\tCtrl+P",
|
"\tCtrl+P",
|
||||||
#endif
|
#endif
|
||||||
_L("Application preferences"));
|
_L("Application preferences"));
|
||||||
|
/*
|
||||||
wxMenu* mode_menu = nullptr;
|
wxMenu* mode_menu = nullptr;
|
||||||
if (is_editor()) {
|
if (is_editor()) {
|
||||||
local_menu->AppendSeparator();
|
local_menu->AppendSeparator();
|
||||||
@ -2532,6 +2534,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
|||||||
|
|
||||||
local_menu->AppendSubMenu(mode_menu, _L("Mode"), wxString::Format(_L("%s View Mode"), SLIC3R_APP_NAME));
|
local_menu->AppendSubMenu(mode_menu, _L("Mode"), wxString::Format(_L("%s View Mode"), SLIC3R_APP_NAME));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
local_menu->AppendSeparator();
|
local_menu->AppendSeparator();
|
||||||
local_menu->Append(config_id_base + ConfigMenuLanguage, _L("&Language"));
|
local_menu->Append(config_id_base + ConfigMenuLanguage, _L("&Language"));
|
||||||
if (is_editor()) {
|
if (is_editor()) {
|
||||||
@ -2677,6 +2680,10 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
return local_menu;
|
||||||
|
#else
|
||||||
|
|
||||||
using std::placeholders::_1;
|
using std::placeholders::_1;
|
||||||
|
|
||||||
if (mode_menu != nullptr) {
|
if (mode_menu != nullptr) {
|
||||||
@ -2687,6 +2694,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
menu->Append(local_menu, _L("&Configuration"));
|
menu->Append(local_menu, _L("&Configuration"));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void GUI_App::update_config_menu()
|
void GUI_App::update_config_menu()
|
||||||
{
|
{
|
||||||
|
@ -146,12 +146,13 @@ private:
|
|||||||
wxColour m_color_label_sys;
|
wxColour m_color_label_sys;
|
||||||
wxColour m_color_label_default;
|
wxColour m_color_label_default;
|
||||||
wxColour m_color_window_default;
|
wxColour m_color_window_default;
|
||||||
#ifdef _WIN32
|
//#ifdef _WIN32
|
||||||
wxColour m_color_highlight_label_default;
|
wxColour m_color_highlight_label_default;
|
||||||
wxColour m_color_hovered_btn_label;
|
wxColour m_color_hovered_btn_label;
|
||||||
wxColour m_color_default_btn_label;
|
wxColour m_color_default_btn_label;
|
||||||
wxColour m_color_highlight_default;
|
wxColour m_color_highlight_default;
|
||||||
wxColour m_color_selected_btn_bg;
|
wxColour m_color_selected_btn_bg;
|
||||||
|
#ifdef _WIN32
|
||||||
bool m_force_colors_update { false };
|
bool m_force_colors_update { false };
|
||||||
#endif
|
#endif
|
||||||
std::vector<std::string> m_mode_palette;
|
std::vector<std::string> m_mode_palette;
|
||||||
@ -251,7 +252,7 @@ public:
|
|||||||
std::vector<wxColour> get_mode_palette();
|
std::vector<wxColour> get_mode_palette();
|
||||||
void set_mode_palette(const std::vector<wxColour> &palette);
|
void set_mode_palette(const std::vector<wxColour> &palette);
|
||||||
|
|
||||||
#ifdef _WIN32
|
//#ifdef _WIN32
|
||||||
const wxColour& get_label_highlight_clr() { return m_color_highlight_label_default; }
|
const wxColour& get_label_highlight_clr() { return m_color_highlight_label_default; }
|
||||||
const wxColour& get_highlight_default_clr() { return m_color_highlight_default; }
|
const wxColour& get_highlight_default_clr() { return m_color_highlight_default; }
|
||||||
const wxColour& get_color_hovered_btn_label() { return m_color_hovered_btn_label; }
|
const wxColour& get_color_hovered_btn_label() { return m_color_hovered_btn_label; }
|
||||||
@ -260,7 +261,7 @@ public:
|
|||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _MSW_DARK_MODE
|
||||||
void force_menu_update();
|
void force_menu_update();
|
||||||
#endif //_MSW_DARK_MODE
|
#endif //_MSW_DARK_MODE
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
const wxFont& small_font() { return m_small_font; }
|
const wxFont& small_font() { return m_small_font; }
|
||||||
const wxFont& bold_font() { return m_bold_font; }
|
const wxFont& bold_font() { return m_bold_font; }
|
||||||
@ -297,7 +298,8 @@ public:
|
|||||||
bool save_mode(const /*ConfigOptionMode*/int mode) ;
|
bool save_mode(const /*ConfigOptionMode*/int mode) ;
|
||||||
void update_mode();
|
void update_mode();
|
||||||
|
|
||||||
void add_config_menu(wxMenuBar *menu);
|
// void add_config_menu(wxMenuBar *menu);
|
||||||
|
wxMenu* get_config_menu();
|
||||||
void update_config_menu();
|
void update_config_menu();
|
||||||
bool has_unsaved_preset_changes() const;
|
bool has_unsaved_preset_changes() const;
|
||||||
bool has_current_preset_changes() const;
|
bool has_current_preset_changes() const;
|
||||||
|
@ -56,7 +56,8 @@
|
|||||||
#include "GUI_App.hpp"
|
#include "GUI_App.hpp"
|
||||||
#include "UnsavedChangesDialog.hpp"
|
#include "UnsavedChangesDialog.hpp"
|
||||||
#include "MsgDialog.hpp"
|
#include "MsgDialog.hpp"
|
||||||
#include "Notebook.hpp"
|
//#include "Notebook.hpp"
|
||||||
|
#include "TopBar.hpp"
|
||||||
#include "GUI_Factories.hpp"
|
#include "GUI_Factories.hpp"
|
||||||
#include "GUI_ObjectList.hpp"
|
#include "GUI_ObjectList.hpp"
|
||||||
#include "GalleryDialog.hpp"
|
#include "GalleryDialog.hpp"
|
||||||
@ -457,13 +458,15 @@ void MainFrame::update_layout()
|
|||||||
case ESettingsLayout::Old:
|
case ESettingsLayout::Old:
|
||||||
{
|
{
|
||||||
m_plater->Reparent(m_tabpanel);
|
m_plater->Reparent(m_tabpanel);
|
||||||
#ifdef _MSW_DARK_MODE
|
|
||||||
m_plater->Layout();
|
m_plater->Layout();
|
||||||
|
#ifdef _WIN32
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->InsertPage(0, m_plater, _L("Plater"), std::string("plater"), true);
|
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
|
dynamic_cast<TopBar*>(m_tabpanel)->InsertPage(0, m_plater, _L("Plater"), std::string("plater"), true);
|
||||||
|
#ifdef _WIN32
|
||||||
|
else
|
||||||
m_tabpanel->InsertPage(0, m_plater, _L("Plater"));
|
m_tabpanel->InsertPage(0, m_plater, _L("Plater"));
|
||||||
|
#endif
|
||||||
m_main_sizer->Add(m_tabpanel, 1, wxEXPAND | wxTOP, 1);
|
m_main_sizer->Add(m_tabpanel, 1, wxEXPAND | wxTOP, 1);
|
||||||
m_plater->Show();
|
m_plater->Show();
|
||||||
m_tabpanel->Show();
|
m_tabpanel->Show();
|
||||||
@ -483,12 +486,14 @@ void MainFrame::update_layout()
|
|||||||
m_tabpanel->Hide();
|
m_tabpanel->Hide();
|
||||||
m_main_sizer->Add(m_tabpanel, 1, wxEXPAND);
|
m_main_sizer->Add(m_tabpanel, 1, wxEXPAND);
|
||||||
m_plater_page = new wxPanel(m_tabpanel);
|
m_plater_page = new wxPanel(m_tabpanel);
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _WIN32
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->InsertPage(0, m_plater_page, _L("Plater"), std::string("plater"), true);
|
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
|
dynamic_cast<TopBar*>(m_tabpanel)->InsertPage(0, m_plater_page, _L("Plater"), std::string("plater"), true);
|
||||||
|
#ifdef _WIN32
|
||||||
|
else
|
||||||
m_tabpanel->InsertPage(0, m_plater_page, _L("Plater")); // empty panel just for Plater tab */
|
m_tabpanel->InsertPage(0, m_plater_page, _L("Plater")); // empty panel just for Plater tab */
|
||||||
|
#endif
|
||||||
m_plater->Show();
|
m_plater->Show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -500,7 +505,7 @@ void MainFrame::update_layout()
|
|||||||
m_tabpanel->Show();
|
m_tabpanel->Show();
|
||||||
m_plater->Show();
|
m_plater->Show();
|
||||||
|
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _WIN32
|
||||||
if (wxGetApp().tabs_as_menu())
|
if (wxGetApp().tabs_as_menu())
|
||||||
show_tabs_menu(false);
|
show_tabs_menu(false);
|
||||||
#endif
|
#endif
|
||||||
@ -697,22 +702,14 @@ void MainFrame::init_tabpanel()
|
|||||||
// wxGetApp().UpdateDarkUI(m_tabpanel);
|
// wxGetApp().UpdateDarkUI(m_tabpanel);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_tabpanel = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME, true);
|
|
||||||
#else
|
|
||||||
m_tabpanel = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME);
|
|
||||||
#endif
|
#endif
|
||||||
|
m_tabpanel = new TopBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME, true);
|
||||||
wxGetApp().UpdateDarkUI(m_tabpanel);
|
|
||||||
|
|
||||||
m_tabpanel->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
m_tabpanel->SetFont(Slic3r::GUI::wxGetApp().normal_font());
|
||||||
m_tabpanel->Hide();
|
m_tabpanel->Hide();
|
||||||
m_settings_dialog.set_tabpanel(m_tabpanel);
|
m_settings_dialog.set_tabpanel(m_tabpanel);
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
|
||||||
m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {
|
m_tabpanel->Bind(wxEVT_BOOKCTRL_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {
|
||||||
#else
|
|
||||||
m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxBookCtrlEvent& e) {
|
|
||||||
#endif
|
|
||||||
if (int old_selection = e.GetOldSelection();
|
if (int old_selection = e.GetOldSelection();
|
||||||
old_selection != wxNOT_FOUND && old_selection < static_cast<int>(m_tabpanel->GetPageCount())) {
|
old_selection != wxNOT_FOUND && old_selection < static_cast<int>(m_tabpanel->GetPageCount())) {
|
||||||
Tab* old_tab = dynamic_cast<Tab*>(m_tabpanel->GetPage(old_selection));
|
Tab* old_tab = dynamic_cast<Tab*>(m_tabpanel->GetPage(old_selection));
|
||||||
@ -853,12 +850,14 @@ void MainFrame::add_created_tab(Tab* panel, const std::string& bmp_name /*= ""*
|
|||||||
const auto printer_tech = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology();
|
const auto printer_tech = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology();
|
||||||
|
|
||||||
if (panel->supports_printer_technology(printer_tech))
|
if (panel->supports_printer_technology(printer_tech))
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _WIN32
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->AddPage(panel, panel->title(), bmp_name);
|
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
|
dynamic_cast<TopBar*>(m_tabpanel)->AddPage(panel, panel->title(), bmp_name);
|
||||||
|
#ifdef _WIN32
|
||||||
|
else
|
||||||
m_tabpanel->AddPage(panel, panel->title());
|
m_tabpanel->AddPage(panel, panel->title());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MainFrame::is_active_and_shown_tab(Tab* tab)
|
bool MainFrame::is_active_and_shown_tab(Tab* tab)
|
||||||
@ -1041,10 +1040,10 @@ void MainFrame::on_dpi_changed(const wxRect& suggested_rect)
|
|||||||
wxGetApp().update_fonts(this);
|
wxGetApp().update_fonts(this);
|
||||||
this->SetFont(this->normal_font());
|
this->SetFont(this->normal_font());
|
||||||
|
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _WIN32
|
||||||
// update common mode sizer
|
// update common mode sizer
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->Rescale();
|
dynamic_cast<TopBar*>(m_tabpanel)->Rescale();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// update Plater
|
// update Plater
|
||||||
@ -1089,12 +1088,9 @@ void MainFrame::on_sys_color_changed()
|
|||||||
wxGetApp().update_ui_colours_from_appconfig();
|
wxGetApp().update_ui_colours_from_appconfig();
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
wxGetApp().UpdateDarkUI(m_tabpanel);
|
wxGetApp().UpdateDarkUI(m_tabpanel);
|
||||||
#ifdef _MSW_DARK_MODE
|
|
||||||
// update common mode sizer
|
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->OnColorsChanged();
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
dynamic_cast<TopBar*>(m_tabpanel)->OnColorsChanged();
|
||||||
|
|
||||||
// update Plater
|
// update Plater
|
||||||
wxGetApp().plater()->sys_color_changed();
|
wxGetApp().plater()->sys_color_changed();
|
||||||
@ -1112,13 +1108,9 @@ void MainFrame::on_sys_color_changed()
|
|||||||
|
|
||||||
void MainFrame::update_mode_markers()
|
void MainFrame::update_mode_markers()
|
||||||
{
|
{
|
||||||
#ifdef __WXMSW__
|
|
||||||
#ifdef _MSW_DARK_MODE
|
|
||||||
// update markers in common mode sizer
|
// update markers in common mode sizer
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->UpdateModeMarkers();
|
dynamic_cast<TopBar*>(m_tabpanel)->UpdateModeMarkers();
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// update mode markers on side_bar
|
// update mode markers on side_bar
|
||||||
wxGetApp().sidebar().update_mode_markers();
|
wxGetApp().sidebar().update_mode_markers();
|
||||||
@ -1547,6 +1539,28 @@ void MainFrame::init_menubar_as_editor()
|
|||||||
// Help menu
|
// Help menu
|
||||||
auto helpMenu = generate_help_menu();
|
auto helpMenu = generate_help_menu();
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// append menus for Menu button from TopBar
|
||||||
|
|
||||||
|
TopBar* top_bar = dynamic_cast<TopBar*>(m_tabpanel);
|
||||||
|
top_bar->AppendMenuItem(fileMenu, _L("&File"));
|
||||||
|
if (editMenu)
|
||||||
|
top_bar->AppendMenuItem(editMenu, _L("&Edit"));
|
||||||
|
|
||||||
|
top_bar->AppendMenuSeparaorItem();
|
||||||
|
|
||||||
|
top_bar->AppendMenuItem(windowMenu, _L("&Window"));
|
||||||
|
if (viewMenu)
|
||||||
|
top_bar->AppendMenuItem(viewMenu, _L("&View"));
|
||||||
|
|
||||||
|
top_bar->AppendMenuItem(wxGetApp().get_config_menu(), _L("&Configuration"));
|
||||||
|
|
||||||
|
top_bar->AppendMenuSeparaorItem();
|
||||||
|
|
||||||
|
top_bar->AppendMenuItem(helpMenu, _L("&Help"));
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
// menubar
|
// menubar
|
||||||
// assign menubar to frame after appending items, otherwise special items
|
// assign menubar to frame after appending items, otherwise special items
|
||||||
// will not be handled correctly
|
// will not be handled correctly
|
||||||
@ -1569,6 +1583,8 @@ void MainFrame::init_menubar_as_editor()
|
|||||||
#endif
|
#endif
|
||||||
SetMenuBar(m_menubar);
|
SetMenuBar(m_menubar);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _MSW_DARK_MODE
|
||||||
if (wxGetApp().tabs_as_menu())
|
if (wxGetApp().tabs_as_menu())
|
||||||
m_menubar->EnableTop(6, false);
|
m_menubar->EnableTop(6, false);
|
||||||
@ -1662,7 +1678,7 @@ void MainFrame::init_menubar_as_gcodeviewer()
|
|||||||
m_menubar->Append(fileMenu, _L("&File"));
|
m_menubar->Append(fileMenu, _L("&File"));
|
||||||
if (viewMenu != nullptr) m_menubar->Append(viewMenu, _L("&View"));
|
if (viewMenu != nullptr) m_menubar->Append(viewMenu, _L("&View"));
|
||||||
// Add additional menus from C++
|
// Add additional menus from C++
|
||||||
wxGetApp().add_config_menu(m_menubar);
|
// wxGetApp().add_config_menu(m_menubar);
|
||||||
m_menubar->Append(helpMenu, _L("&Help"));
|
m_menubar->Append(helpMenu, _L("&Help"));
|
||||||
SetMenuBar(m_menubar);
|
SetMenuBar(m_menubar);
|
||||||
|
|
||||||
@ -2243,10 +2259,10 @@ void SettingsDialog::on_dpi_changed(const wxRect& suggested_rect)
|
|||||||
const int& em = em_unit();
|
const int& em = em_unit();
|
||||||
const wxSize& size = wxSize(85 * em, 50 * em);
|
const wxSize& size = wxSize(85 * em, 50 * em);
|
||||||
|
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _WIN32
|
||||||
// update common mode sizer
|
// update common mode sizer
|
||||||
if (!wxGetApp().tabs_as_menu())
|
if (!wxGetApp().tabs_as_menu())
|
||||||
dynamic_cast<Notebook*>(m_tabpanel)->Rescale();
|
dynamic_cast<TopBar*>(m_tabpanel)->Rescale();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// update Tabs
|
// update Tabs
|
||||||
|
@ -67,7 +67,8 @@
|
|||||||
#include "SavePresetDialog.hpp"
|
#include "SavePresetDialog.hpp"
|
||||||
#include "EditGCodeDialog.hpp"
|
#include "EditGCodeDialog.hpp"
|
||||||
#include "MsgDialog.hpp"
|
#include "MsgDialog.hpp"
|
||||||
#include "Notebook.hpp"
|
//#include "Notebook.hpp"
|
||||||
|
#include "TopBar.hpp"
|
||||||
|
|
||||||
#include "Widgets/CheckBox.hpp"
|
#include "Widgets/CheckBox.hpp"
|
||||||
|
|
||||||
@ -3648,13 +3649,6 @@ void Tab::load_current_preset()
|
|||||||
|
|
||||||
// m_undo_to_sys_btn->Enable(!preset.is_default);
|
// m_undo_to_sys_btn->Enable(!preset.is_default);
|
||||||
|
|
||||||
#if 0
|
|
||||||
// use CallAfter because some field triggers schedule on_change calls using CallAfter,
|
|
||||||
// and we don't want them to be called after this update_dirty() as they would mark the
|
|
||||||
// preset dirty again
|
|
||||||
// (not sure this is true anymore now that update_dirty is idempotent)
|
|
||||||
wxTheApp->CallAfter([this]
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
// checking out if this Tab exists till this moment
|
// checking out if this Tab exists till this moment
|
||||||
if (!wxGetApp().checked_tab(this))
|
if (!wxGetApp().checked_tab(this))
|
||||||
@ -3682,16 +3676,15 @@ void Tab::load_current_preset()
|
|||||||
}
|
}
|
||||||
if (tab->supports_printer_technology(printer_technology))
|
if (tab->supports_printer_technology(printer_technology))
|
||||||
{
|
{
|
||||||
#ifdef _MSW_DARK_MODE
|
#ifdef _WIN32
|
||||||
if (!wxGetApp().tabs_as_menu()) {
|
if (!wxGetApp().tabs_as_menu()) {
|
||||||
std::string bmp_name = tab->type() == Slic3r::Preset::TYPE_FILAMENT ? "spool" :
|
#endif
|
||||||
tab->type() == Slic3r::Preset::TYPE_SLA_MATERIAL ? "resin" : "cog";
|
dynamic_cast<TopBar*>(wxGetApp().tab_panel())->InsertPage(wxGetApp().tab_panel()->FindPage(this), tab, tab->title(),"");
|
||||||
tab->Hide(); // #ys_WORKAROUND : Hide tab before inserting to avoid unwanted rendering of the tab
|
#ifdef _WIN32
|
||||||
dynamic_cast<Notebook*>(wxGetApp().tab_panel())->InsertPage(wxGetApp().tab_panel()->FindPage(this), tab, tab->title(), bmp_name);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
wxGetApp().tab_panel()->InsertPage(wxGetApp().tab_panel()->FindPage(this), tab, tab->title());
|
wxGetApp().tab_panel()->InsertPage(wxGetApp().tab_panel()->FindPage(this), tab, tab->title());
|
||||||
|
#endif
|
||||||
#ifdef __linux__ // the tabs apparently need to be explicitly shown on Linux (pull request #1563)
|
#ifdef __linux__ // the tabs apparently need to be explicitly shown on Linux (pull request #1563)
|
||||||
int page_id = wxGetApp().tab_panel()->FindPage(tab);
|
int page_id = wxGetApp().tab_panel()->FindPage(tab);
|
||||||
wxGetApp().tab_panel()->GetPage(page_id)->Show(true);
|
wxGetApp().tab_panel()->GetPage(page_id)->Show(true);
|
||||||
@ -3705,10 +3698,6 @@ void Tab::load_current_preset()
|
|||||||
}
|
}
|
||||||
static_cast<TabPrinter*>(this)->m_printer_technology = printer_technology;
|
static_cast<TabPrinter*>(this)->m_printer_technology = printer_technology;
|
||||||
m_active_page = tmp_page;
|
m_active_page = tmp_page;
|
||||||
#ifdef _MSW_DARK_MODE
|
|
||||||
if (!wxGetApp().tabs_as_menu())
|
|
||||||
dynamic_cast<Notebook*>(wxGetApp().tab_panel())->SetPageImage(wxGetApp().tab_panel()->FindPage(this), printer_technology == ptFFF ? "printer" : "sla_printer");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
on_presets_changed();
|
on_presets_changed();
|
||||||
if (printer_technology == ptFFF) {
|
if (printer_technology == ptFFF) {
|
||||||
|
@ -478,7 +478,8 @@ class TabFilament : public Tab
|
|||||||
std::map<std::string, wxWindow*> m_overrides_options;
|
std::map<std::string, wxWindow*> m_overrides_options;
|
||||||
public:
|
public:
|
||||||
TabFilament(wxBookCtrlBase* parent) :
|
TabFilament(wxBookCtrlBase* parent) :
|
||||||
Tab(parent, _(L("Filament Settings")), Slic3r::Preset::TYPE_FILAMENT) {}
|
// Tab(parent, _(L("Filament Settings")), Slic3r::Preset::TYPE_FILAMENT) {}
|
||||||
|
Tab(parent, _L("Filaments"), Slic3r::Preset::TYPE_FILAMENT) {}
|
||||||
~TabFilament() {}
|
~TabFilament() {}
|
||||||
|
|
||||||
void build() override;
|
void build() override;
|
||||||
@ -536,7 +537,8 @@ public:
|
|||||||
PrinterTechnology m_printer_technology = ptFFF;
|
PrinterTechnology m_printer_technology = ptFFF;
|
||||||
|
|
||||||
TabPrinter(wxBookCtrlBase* parent) :
|
TabPrinter(wxBookCtrlBase* parent) :
|
||||||
Tab(parent, _L("Printer Settings"), Slic3r::Preset::TYPE_PRINTER) {}
|
// Tab(parent, _L("Printer Settings"), Slic3r::Preset::TYPE_PRINTER) {}
|
||||||
|
Tab(parent, _L("Printers"), Slic3r::Preset::TYPE_PRINTER) {}
|
||||||
~TabPrinter() {}
|
~TabPrinter() {}
|
||||||
|
|
||||||
void build() override;
|
void build() override;
|
||||||
@ -574,7 +576,8 @@ class TabSLAMaterial : public Tab
|
|||||||
std::map<std::string, wxWindow*> m_overrides_options;
|
std::map<std::string, wxWindow*> m_overrides_options;
|
||||||
public:
|
public:
|
||||||
TabSLAMaterial(wxBookCtrlBase* parent) :
|
TabSLAMaterial(wxBookCtrlBase* parent) :
|
||||||
Tab(parent, _(L("Material Settings")), Slic3r::Preset::TYPE_SLA_MATERIAL) {}
|
// Tab(parent, _(L("Material Settings")), Slic3r::Preset::TYPE_SLA_MATERIAL) {}
|
||||||
|
Tab(parent, _L("Materials"), Slic3r::Preset::TYPE_SLA_MATERIAL) {}
|
||||||
~TabSLAMaterial() {}
|
~TabSLAMaterial() {}
|
||||||
|
|
||||||
void build() override;
|
void build() override;
|
||||||
|
308
src/slic3r/GUI/TopBar.cpp
Normal file
308
src/slic3r/GUI/TopBar.cpp
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
#include "TopBar.hpp"
|
||||||
|
|
||||||
|
#include "GUI_App.hpp"
|
||||||
|
#include "Plater.hpp"
|
||||||
|
//#include "wxExtensions.hpp"
|
||||||
|
#include "format.hpp"
|
||||||
|
#include "I18N.hpp"
|
||||||
|
|
||||||
|
#include <wx/button.h>
|
||||||
|
#include <wx/sizer.h>
|
||||||
|
|
||||||
|
wxDEFINE_EVENT(wxCUSTOMEVT_TOPBAR_SEL_CHANGED, wxCommandEvent);
|
||||||
|
|
||||||
|
using namespace Slic3r::GUI;
|
||||||
|
|
||||||
|
#define down_arrow L"\u23f7";
|
||||||
|
|
||||||
|
|
||||||
|
TopBarItemsCtrl::Button::Button(wxWindow* parent, const wxString& label, const std::string& icon_name, const int px_cnt)
|
||||||
|
:ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, wxNO_BORDER, px_cnt)
|
||||||
|
{
|
||||||
|
int btn_margin = em_unit(this);
|
||||||
|
wxSize size = GetTextExtent(label) + wxSize(6 * btn_margin, int(1.5 * btn_margin));
|
||||||
|
if (icon_name.empty())
|
||||||
|
this->SetMinSize(size);
|
||||||
|
else
|
||||||
|
this->SetMinSize(wxSize(-1, size.y));
|
||||||
|
|
||||||
|
const wxColour& selected_btn_bg = wxGetApp().get_label_clr_default();
|
||||||
|
const wxColour& default_btn_bg = wxGetApp().get_window_default_clr();
|
||||||
|
|
||||||
|
this->Bind(wxEVT_SET_FOCUS, [this, selected_btn_bg, default_btn_bg](wxFocusEvent& event) {
|
||||||
|
this->SetBackgroundColour(selected_btn_bg);
|
||||||
|
this->SetForegroundColour(default_btn_bg);
|
||||||
|
event.Skip();
|
||||||
|
});
|
||||||
|
this->Bind(wxEVT_KILL_FOCUS, [this, selected_btn_bg, default_btn_bg](wxFocusEvent& event) {
|
||||||
|
if (!m_is_selected) {
|
||||||
|
this->SetBackgroundColour(default_btn_bg);
|
||||||
|
this->SetForegroundColour(selected_btn_bg);
|
||||||
|
}
|
||||||
|
event.Skip();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
TopBarItemsCtrl::ButtonWithPopup::ButtonWithPopup(wxWindow* parent, const wxString& label, const std::string& icon_name)
|
||||||
|
:TopBarItemsCtrl::Button(parent, label, icon_name, 24)
|
||||||
|
{
|
||||||
|
this->SetLabel(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::ButtonWithPopup::SetLabel(const wxString& label)
|
||||||
|
{
|
||||||
|
wxString full_label = " " + label + " " + down_arrow;
|
||||||
|
ScalableButton::SetLabel(full_label);
|
||||||
|
}
|
||||||
|
|
||||||
|
static wxString get_workspace_name(Slic3r::ConfigOptionMode mode)
|
||||||
|
{
|
||||||
|
return mode == Slic3r::ConfigOptionMode::comSimple ? _L("Beginner workspace") :
|
||||||
|
mode == Slic3r::ConfigOptionMode::comAdvanced ? _L("Regular workspace") : _L("Josef Prusa's workspace");
|
||||||
|
}
|
||||||
|
|
||||||
|
TopBarItemsCtrl::TopBarItemsCtrl(wxWindow *parent, bool add_mode_buttons/* = false*/) :
|
||||||
|
wxControl(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBORDER_NONE | wxTAB_TRAVERSAL)
|
||||||
|
{
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
SetDoubleBuffered(true);
|
||||||
|
#endif //__WINDOWS__
|
||||||
|
|
||||||
|
int em = em_unit(this);// Slic3r::GUI::wxGetApp().em_unit();
|
||||||
|
m_btn_margin = std::lround(0.9 * em);
|
||||||
|
m_line_margin = std::lround(0.1 * em);
|
||||||
|
|
||||||
|
m_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
this->SetSizer(m_sizer);
|
||||||
|
|
||||||
|
m_menu_btn = new ButtonWithPopup(this, _L("Menu"), wxGetApp().logo_name());
|
||||||
|
m_sizer->Add(m_menu_btn, 1, wxALIGN_CENTER_VERTICAL | wxALL, m_btn_margin);
|
||||||
|
|
||||||
|
m_buttons_sizer = new wxFlexGridSizer(1, m_btn_margin, m_btn_margin);
|
||||||
|
m_sizer->Add(m_buttons_sizer, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 2 * m_btn_margin);
|
||||||
|
|
||||||
|
if (add_mode_buttons) {
|
||||||
|
m_mode_sizer = new ModeSizer(this, m_btn_margin);
|
||||||
|
m_sizer->AddStretchSpacer(20);
|
||||||
|
m_sizer->Add(m_mode_sizer, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxBOTTOM, m_btn_margin);
|
||||||
|
|
||||||
|
m_mode_sizer->ShowItems(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_workspace_btn = new ButtonWithPopup(this, _L("Workspace"), "mode_simple");
|
||||||
|
m_sizer->AddStretchSpacer(20);
|
||||||
|
m_sizer->Add(m_workspace_btn, 1, wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT | wxRIGHT, 2 * m_btn_margin);
|
||||||
|
|
||||||
|
// create modes menu
|
||||||
|
{
|
||||||
|
for (const Slic3r::ConfigOptionMode& mode : { Slic3r::ConfigOptionMode::comSimple, Slic3r::ConfigOptionMode::comAdvanced, Slic3r::ConfigOptionMode::comExpert } ) {
|
||||||
|
const wxString label = get_workspace_name(mode);
|
||||||
|
append_menu_item(&m_workspace_modes, wxID_ANY, label, label,
|
||||||
|
[this, mode](wxCommandEvent&) {
|
||||||
|
if (wxGetApp().get_mode() != mode)
|
||||||
|
wxGetApp().save_mode(mode);
|
||||||
|
}, get_bmp_bundle("mode", 16, -1, wxGetApp().get_mode_btn_color(mode)), nullptr, []() { return true; }, this);
|
||||||
|
|
||||||
|
if (mode < Slic3r::ConfigOptionMode::comExpert)
|
||||||
|
m_workspace_modes.AppendSeparator();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
this->Bind(wxEVT_PAINT, &TopBarItemsCtrl::OnPaint, this);
|
||||||
|
|
||||||
|
m_menu_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) {
|
||||||
|
wxPoint pos = m_menu_btn->GetPosition();
|
||||||
|
wxGetApp().plater()->PopupMenu(&m_menu, pos);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_menu.Bind(wxEVT_MENU_CLOSE, [this](wxMenuEvent&) {
|
||||||
|
if (m_menu_btn->HasFocus()) {
|
||||||
|
wxPostEvent(m_menu_btn->GetEventHandler(), wxFocusEvent(wxEVT_KILL_FOCUS));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
m_workspace_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& event) {
|
||||||
|
wxPoint pos = m_workspace_btn->GetPosition();
|
||||||
|
wxGetApp().plater()->PopupMenu(&m_workspace_modes, pos);
|
||||||
|
});
|
||||||
|
|
||||||
|
m_workspace_modes.Bind(wxEVT_MENU_CLOSE, [this](wxMenuEvent&) {
|
||||||
|
if (m_workspace_btn->HasFocus()) {
|
||||||
|
wxPostEvent(m_workspace_btn->GetEventHandler(), wxFocusEvent(wxEVT_KILL_FOCUS));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::OnPaint(wxPaintEvent&)
|
||||||
|
{
|
||||||
|
wxGetApp().UpdateDarkUI(this);
|
||||||
|
const wxSize sz = GetSize();
|
||||||
|
wxPaintDC dc(this);
|
||||||
|
|
||||||
|
if (m_selection < 0 || m_selection >= (int)m_pageButtons.size())
|
||||||
|
return;
|
||||||
|
|
||||||
|
const wxColour& selected_btn_bg = wxGetApp().get_label_clr_default();
|
||||||
|
const wxColour& default_btn_bg = wxGetApp().get_window_default_clr();
|
||||||
|
const wxColour& btn_marker_color = wxGetApp().get_highlight_default_clr();
|
||||||
|
|
||||||
|
// highlight selected notebook button
|
||||||
|
|
||||||
|
for (int idx = 0; idx < int(m_pageButtons.size()); idx++) {
|
||||||
|
wxButton* btn = m_pageButtons[idx];
|
||||||
|
|
||||||
|
btn->SetBackgroundColour(idx == m_selection ? selected_btn_bg : default_btn_bg);
|
||||||
|
btn->SetForegroundColour(idx == m_selection ? default_btn_bg : selected_btn_bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// highlight selected mode button
|
||||||
|
|
||||||
|
//bool mode_is_focused = m_workspace_btn->HasFocus();
|
||||||
|
|
||||||
|
//m_workspace_btn->SetBackgroundColour(mode_is_focused ? selected_btn_bg : default_btn_bg);
|
||||||
|
//m_workspace_btn->SetForegroundColour(mode_is_focused ? default_btn_bg : selected_btn_bg);
|
||||||
|
|
||||||
|
//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->SetBackgroundColour(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);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
// 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 TopBarItemsCtrl::UpdateMode()
|
||||||
|
{
|
||||||
|
auto mode = wxGetApp().get_mode();
|
||||||
|
m_mode_sizer->SetMode(mode);
|
||||||
|
|
||||||
|
|
||||||
|
auto m_bmp = *get_bmp_bundle("mode", 16, -1, wxGetApp().get_mode_btn_color(mode));
|
||||||
|
|
||||||
|
m_workspace_btn->SetBitmap(m_bmp);
|
||||||
|
m_workspace_btn->SetBitmapCurrent(m_bmp);
|
||||||
|
m_workspace_btn->SetBitmapPressed(m_bmp);
|
||||||
|
m_workspace_btn->SetLabel(get_workspace_name(mode));
|
||||||
|
|
||||||
|
m_workspace_btn->SetBitmapMargins(int(0.5 * em_unit(this)), 0);
|
||||||
|
this->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::Rescale()
|
||||||
|
{
|
||||||
|
int em = em_unit(this);
|
||||||
|
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 TopBarItemsCtrl::OnColorsChanged()
|
||||||
|
{
|
||||||
|
m_menu_btn->sys_color_changed();
|
||||||
|
|
||||||
|
for (ScalableButton* btn : m_pageButtons)
|
||||||
|
btn->sys_color_changed();
|
||||||
|
|
||||||
|
m_mode_sizer->sys_color_changed();
|
||||||
|
|
||||||
|
m_sizer->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::UpdateModeMarkers()
|
||||||
|
{
|
||||||
|
m_mode_sizer->update_mode_markers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::UpdateSelection()
|
||||||
|
{
|
||||||
|
for (Button* btn : m_pageButtons)
|
||||||
|
btn->set_selected(false);
|
||||||
|
|
||||||
|
if (m_selection >= 0)
|
||||||
|
m_pageButtons[m_selection]->set_selected(true);
|
||||||
|
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::SetSelection(int sel)
|
||||||
|
{
|
||||||
|
if (m_selection == sel)
|
||||||
|
return;
|
||||||
|
m_selection = sel;
|
||||||
|
UpdateSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TopBarItemsCtrl::InsertPage(size_t n, const wxString& text, bool bSelect/* = false*/, const std::string& bmp_name/* = ""*/)
|
||||||
|
{
|
||||||
|
Button* btn = new Button(this, text);
|
||||||
|
btn->Bind(wxEVT_BUTTON, [this, btn](wxCommandEvent& event) {
|
||||||
|
if (auto it = std::find(m_pageButtons.begin(), m_pageButtons.end(), btn); it != m_pageButtons.end()) {
|
||||||
|
m_selection = it - m_pageButtons.begin();
|
||||||
|
wxCommandEvent evt = wxCommandEvent(wxCUSTOMEVT_TOPBAR_SEL_CHANGED);
|
||||||
|
evt.SetId(m_selection);
|
||||||
|
wxPostEvent(this->GetParent(), evt);
|
||||||
|
UpdateSelection();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
m_pageButtons.insert(m_pageButtons.begin() + n, btn);
|
||||||
|
m_buttons_sizer->Insert(n, new wxSizerItem(btn, 0, wxALIGN_CENTER_VERTICAL));
|
||||||
|
m_buttons_sizer->SetCols(m_buttons_sizer->GetCols() + 1);
|
||||||
|
m_sizer->Layout();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::RemovePage(size_t n)
|
||||||
|
{
|
||||||
|
ScalableButton* btn = m_pageButtons[n];
|
||||||
|
m_pageButtons.erase(m_pageButtons.begin() + n);
|
||||||
|
m_buttons_sizer->Remove(n);
|
||||||
|
btn->Reparent(nullptr);
|
||||||
|
btn->Destroy();
|
||||||
|
m_sizer->Layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::SetPageText(size_t n, const wxString& strText)
|
||||||
|
{
|
||||||
|
ScalableButton* btn = m_pageButtons[n];
|
||||||
|
btn->SetLabel(strText);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString TopBarItemsCtrl::GetPageText(size_t n) const
|
||||||
|
{
|
||||||
|
ScalableButton* btn = m_pageButtons[n];
|
||||||
|
return btn->GetLabel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::AppendMenuItem(wxMenu* menu, const wxString& title)
|
||||||
|
{
|
||||||
|
append_submenu(&m_menu, menu, wxID_ANY, title, "cog");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::AppendMenuSeparaorItem()
|
||||||
|
{
|
||||||
|
m_menu.AppendSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TopBarItemsCtrl::ShowMenu()
|
||||||
|
{
|
||||||
|
wxPoint pos = m_menu_btn->GetPosition();
|
||||||
|
wxGetApp().plater()->PopupMenu(&m_menu, pos);
|
||||||
|
}
|
459
src/slic3r/GUI/TopBar.hpp
Normal file
459
src/slic3r/GUI/TopBar.hpp
Normal file
@ -0,0 +1,459 @@
|
|||||||
|
#ifndef slic3r_TopBar_hpp_
|
||||||
|
#define slic3r_TopBar_hpp_
|
||||||
|
|
||||||
|
//#ifdef _WIN32
|
||||||
|
|
||||||
|
#include <wx/bookctrl.h>
|
||||||
|
#include "wxExtensions.hpp"
|
||||||
|
|
||||||
|
class ModeSizer;
|
||||||
|
//class ScalableButton;
|
||||||
|
|
||||||
|
// custom message the TopBarItemsCtrl sends to its parent (TopBar) to notify a selection change:
|
||||||
|
wxDECLARE_EVENT(wxCUSTOMEVT_TOPBAR_SEL_CHANGED, wxCommandEvent);
|
||||||
|
|
||||||
|
class TopBarItemsCtrl : public wxControl
|
||||||
|
{
|
||||||
|
class Button : public ScalableButton
|
||||||
|
{
|
||||||
|
bool m_is_selected{ false };
|
||||||
|
public:
|
||||||
|
Button() {};
|
||||||
|
Button( wxWindow* parent,
|
||||||
|
const wxString& label,
|
||||||
|
const std::string& icon_name = "",
|
||||||
|
const int px_cnt = 16);
|
||||||
|
|
||||||
|
~Button() {}
|
||||||
|
|
||||||
|
void set_selected(bool selected) { m_is_selected = selected; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class ButtonWithPopup : public Button
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ButtonWithPopup() {};
|
||||||
|
ButtonWithPopup(wxWindow* parent,
|
||||||
|
const wxString& label,
|
||||||
|
const std::string& icon_name = "");
|
||||||
|
|
||||||
|
~ButtonWithPopup() {}
|
||||||
|
|
||||||
|
void SetLabel(const wxString& label) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
MenuWithSeparators m_menu;
|
||||||
|
MenuWithSeparators m_workspace_modes;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TopBarItemsCtrl(wxWindow* parent, bool add_mode_buttons = false);
|
||||||
|
~TopBarItemsCtrl() {}
|
||||||
|
|
||||||
|
void OnPaint(wxPaintEvent&);
|
||||||
|
void SetSelection(int sel);
|
||||||
|
void UpdateMode();
|
||||||
|
void Rescale();
|
||||||
|
void OnColorsChanged();
|
||||||
|
void UpdateModeMarkers();
|
||||||
|
void UpdateSelection();
|
||||||
|
bool InsertPage(size_t n, const wxString& text, bool bSelect = false, const std::string& bmp_name = "");
|
||||||
|
void RemovePage(size_t n);
|
||||||
|
void SetPageText(size_t n, const wxString& strText);
|
||||||
|
wxString GetPageText(size_t n) const;
|
||||||
|
|
||||||
|
void AppendMenuItem(wxMenu* menu, const wxString& title);
|
||||||
|
void AppendMenuSeparaorItem();
|
||||||
|
void ShowMenu();
|
||||||
|
void AddModeItem();
|
||||||
|
void ShowModes();
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxWindow* m_parent;
|
||||||
|
wxFlexGridSizer* m_buttons_sizer;
|
||||||
|
wxBoxSizer* m_sizer;
|
||||||
|
ButtonWithPopup* m_menu_btn {nullptr};
|
||||||
|
ButtonWithPopup* m_workspace_btn {nullptr};
|
||||||
|
std::vector<Button*> m_pageButtons;
|
||||||
|
int m_selection {-1};
|
||||||
|
int m_btn_margin;
|
||||||
|
int m_line_margin;
|
||||||
|
ModeSizer* m_mode_sizer {nullptr};
|
||||||
|
};
|
||||||
|
|
||||||
|
class TopBar : public wxBookCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TopBar(wxWindow * parent,
|
||||||
|
wxWindowID winid = wxID_ANY,
|
||||||
|
const wxPoint & pos = wxDefaultPosition,
|
||||||
|
const wxSize & size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
bool add_mode_buttons = false)
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
Create(parent, winid, pos, size, style, add_mode_buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Create(wxWindow * parent,
|
||||||
|
wxWindowID winid = wxID_ANY,
|
||||||
|
const wxPoint & pos = wxDefaultPosition,
|
||||||
|
const wxSize & size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
bool add_mode_buttons = false)
|
||||||
|
{
|
||||||
|
if (!wxBookCtrlBase::Create(parent, winid, pos, size, style | wxBK_TOP))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_bookctrl = new TopBarItemsCtrl(this, add_mode_buttons);
|
||||||
|
|
||||||
|
wxSizer* mainSizer = new wxBoxSizer(IsVertical() ? wxVERTICAL : wxHORIZONTAL);
|
||||||
|
|
||||||
|
if (style & wxBK_RIGHT || style & wxBK_BOTTOM)
|
||||||
|
mainSizer->Add(0, 0, 1, wxEXPAND, 0);
|
||||||
|
|
||||||
|
m_controlSizer = new wxBoxSizer(IsVertical() ? wxHORIZONTAL : wxVERTICAL);
|
||||||
|
m_controlSizer->Add(m_bookctrl, wxSizerFlags(1).Expand());
|
||||||
|
wxSizerFlags flags;
|
||||||
|
if (IsVertical())
|
||||||
|
flags.Expand();
|
||||||
|
else
|
||||||
|
flags.CentreVertical();
|
||||||
|
mainSizer->Add(m_controlSizer, flags.Border(wxALL, m_controlMargin));
|
||||||
|
SetSizer(mainSizer);
|
||||||
|
|
||||||
|
this->Bind(wxCUSTOMEVT_TOPBAR_SEL_CHANGED, [this](wxCommandEvent& evt)
|
||||||
|
{
|
||||||
|
if (int page_idx = evt.GetId(); page_idx >= 0)
|
||||||
|
SetSelection(page_idx);
|
||||||
|
});
|
||||||
|
|
||||||
|
this->Bind(wxEVT_NAVIGATION_KEY, &TopBar::OnNavigationKey, this);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Methods specific to this class.
|
||||||
|
|
||||||
|
// A method allowing to add a new page without any label (which is unused
|
||||||
|
// by this control) and show it immediately.
|
||||||
|
bool ShowNewPage(wxWindow * page)
|
||||||
|
{
|
||||||
|
return AddPage(page, wxString(), ""/*true *//* select it */);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set effect to use for showing/hiding pages.
|
||||||
|
void SetEffects(wxShowEffect showEffect, wxShowEffect hideEffect)
|
||||||
|
{
|
||||||
|
m_showEffect = showEffect;
|
||||||
|
m_hideEffect = hideEffect;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Or the same effect for both of them.
|
||||||
|
void SetEffect(wxShowEffect effect)
|
||||||
|
{
|
||||||
|
SetEffects(effect, effect);
|
||||||
|
}
|
||||||
|
|
||||||
|
// And the same for time outs.
|
||||||
|
void SetEffectsTimeouts(unsigned showTimeout, unsigned hideTimeout)
|
||||||
|
{
|
||||||
|
m_showTimeout = showTimeout;
|
||||||
|
m_hideTimeout = hideTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetEffectTimeout(unsigned timeout)
|
||||||
|
{
|
||||||
|
SetEffectsTimeouts(timeout, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Implement base class pure virtual methods.
|
||||||
|
|
||||||
|
// adds a new page to the control
|
||||||
|
bool AddPage(wxWindow* page,
|
||||||
|
const wxString& text,
|
||||||
|
const std::string& bmp_name,
|
||||||
|
bool bSelect = false)
|
||||||
|
{
|
||||||
|
DoInvalidateBestSize();
|
||||||
|
return InsertPage(GetPageCount(), page, text, bmp_name, bSelect);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Page management
|
||||||
|
virtual bool InsertPage(size_t n,
|
||||||
|
wxWindow * page,
|
||||||
|
const wxString & text,
|
||||||
|
bool bSelect = false,
|
||||||
|
int imageId = NO_IMAGE) override
|
||||||
|
{
|
||||||
|
if (!wxBookCtrlBase::InsertPage(n, page, text, bSelect, imageId))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetTopBarItemsCtrl()->InsertPage(n, text, bSelect);
|
||||||
|
|
||||||
|
if (!DoSetSelectionAfterInsertion(n, bSelect))
|
||||||
|
page->Hide();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InsertPage(size_t n,
|
||||||
|
wxWindow * page,
|
||||||
|
const wxString & text,
|
||||||
|
const std::string& bmp_name = "",
|
||||||
|
bool bSelect = false)
|
||||||
|
{
|
||||||
|
if (!wxBookCtrlBase::InsertPage(n, page, text, bSelect))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GetTopBarItemsCtrl()->InsertPage(n, text, bSelect, bmp_name);
|
||||||
|
|
||||||
|
if (bSelect)
|
||||||
|
SetSelection(n);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int SetSelection(size_t n) override
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->SetSelection(n);
|
||||||
|
int ret = DoSetSelection(n, SetSelection_SendEvent);
|
||||||
|
|
||||||
|
// check that only the selected page is visible and others are hidden:
|
||||||
|
for (size_t page = 0; page < m_pages.size(); page++)
|
||||||
|
if (page != n)
|
||||||
|
m_pages[page]->Hide();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int ChangeSelection(size_t n) override
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->SetSelection(n);
|
||||||
|
return DoSetSelection(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Neither labels nor images are supported but we still store the labels
|
||||||
|
// just in case the user code attaches some importance to them.
|
||||||
|
virtual bool SetPageText(size_t n, const wxString & strText) override
|
||||||
|
{
|
||||||
|
wxCHECK_MSG(n < GetPageCount(), false, wxS("Invalid page"));
|
||||||
|
|
||||||
|
GetTopBarItemsCtrl()->SetPageText(n, strText);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual wxString GetPageText(size_t n) const override
|
||||||
|
{
|
||||||
|
wxCHECK_MSG(n < GetPageCount(), wxString(), wxS("Invalid page"));
|
||||||
|
return GetTopBarItemsCtrl()->GetPageText(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool SetPageImage(size_t WXUNUSED(n), int WXUNUSED(imageId)) override
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual int GetPageImage(size_t WXUNUSED(n)) const override
|
||||||
|
{
|
||||||
|
return NO_IMAGE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Override some wxWindow methods too.
|
||||||
|
virtual void SetFocus() override
|
||||||
|
{
|
||||||
|
wxWindow* const page = GetCurrentPage();
|
||||||
|
if (page)
|
||||||
|
page->SetFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
TopBarItemsCtrl* GetTopBarItemsCtrl() const { return static_cast<TopBarItemsCtrl*>(m_bookctrl); }
|
||||||
|
|
||||||
|
void UpdateMode()
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->UpdateMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Rescale()
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->Rescale();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnColorsChanged()
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->OnColorsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateModeMarkers()
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->UpdateModeMarkers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnNavigationKey(wxNavigationKeyEvent& event)
|
||||||
|
{
|
||||||
|
if (event.IsWindowChange()) {
|
||||||
|
// change pages
|
||||||
|
AdvanceSelection(event.GetDirection());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// we get this event in 3 cases
|
||||||
|
//
|
||||||
|
// a) one of our pages might have generated it because the user TABbed
|
||||||
|
// out from it in which case we should propagate the event upwards and
|
||||||
|
// our parent will take care of setting the focus to prev/next sibling
|
||||||
|
//
|
||||||
|
// or
|
||||||
|
//
|
||||||
|
// b) the parent panel wants to give the focus to us so that we
|
||||||
|
// forward it to our selected page. We can't deal with this in
|
||||||
|
// OnSetFocus() because we don't know which direction the focus came
|
||||||
|
// from in this case and so can't choose between setting the focus to
|
||||||
|
// first or last panel child
|
||||||
|
//
|
||||||
|
// or
|
||||||
|
//
|
||||||
|
// c) we ourselves (see MSWTranslateMessage) generated the event
|
||||||
|
//
|
||||||
|
wxWindow* const parent = GetParent();
|
||||||
|
|
||||||
|
// the wxObject* casts are required to avoid MinGW GCC 2.95.3 ICE
|
||||||
|
const bool isFromParent = event.GetEventObject() == (wxObject*)parent;
|
||||||
|
const bool isFromSelf = event.GetEventObject() == (wxObject*)this;
|
||||||
|
const bool isForward = event.GetDirection();
|
||||||
|
|
||||||
|
if (isFromSelf && !isForward)
|
||||||
|
{
|
||||||
|
// focus is currently on notebook tab and should leave
|
||||||
|
// it backwards (Shift-TAB)
|
||||||
|
event.SetCurrentFocus(this);
|
||||||
|
parent->HandleWindowEvent(event);
|
||||||
|
}
|
||||||
|
else if (isFromParent || isFromSelf)
|
||||||
|
{
|
||||||
|
// no, it doesn't come from child, case (b) or (c): forward to a
|
||||||
|
// page but only if entering notebook page (i.e. direction is
|
||||||
|
// backwards (Shift-TAB) comething from out-of-notebook, or
|
||||||
|
// direction is forward (TAB) from ourselves),
|
||||||
|
if (m_selection != wxNOT_FOUND &&
|
||||||
|
(!event.GetDirection() || isFromSelf))
|
||||||
|
{
|
||||||
|
// so that the page knows that the event comes from it's parent
|
||||||
|
// and is being propagated downwards
|
||||||
|
event.SetEventObject(this);
|
||||||
|
|
||||||
|
wxWindow* page = m_pages[m_selection];
|
||||||
|
if (!page->HandleWindowEvent(event))
|
||||||
|
{
|
||||||
|
page->SetFocus();
|
||||||
|
}
|
||||||
|
//else: page manages focus inside it itself
|
||||||
|
}
|
||||||
|
else // otherwise set the focus to the notebook itself
|
||||||
|
{
|
||||||
|
SetFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// it comes from our child, case (a), pass to the parent, but only
|
||||||
|
// if the direction is forwards. Otherwise set the focus to the
|
||||||
|
// notebook itself. The notebook is always the 'first' control of a
|
||||||
|
// page.
|
||||||
|
if (!isForward)
|
||||||
|
{
|
||||||
|
SetFocus();
|
||||||
|
}
|
||||||
|
else if (parent)
|
||||||
|
{
|
||||||
|
event.SetCurrentFocus(this);
|
||||||
|
parent->HandleWindowEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Methods for extensions of this class
|
||||||
|
|
||||||
|
void AppendMenuItem(wxMenu* menu, const wxString& title) {
|
||||||
|
GetTopBarItemsCtrl()->AppendMenuItem(menu, title);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppendMenuSeparaorItem() {
|
||||||
|
GetTopBarItemsCtrl()->AppendMenuSeparaorItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void UpdateSelectedPage(size_t WXUNUSED(newsel)) override
|
||||||
|
{
|
||||||
|
// Nothing to do here, but must be overridden to avoid the assert in
|
||||||
|
// the base class version.
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual wxBookCtrlEvent * CreatePageChangingEvent() const override
|
||||||
|
{
|
||||||
|
return new wxBookCtrlEvent(wxEVT_BOOKCTRL_PAGE_CHANGING,
|
||||||
|
GetId());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void MakeChangedEvent(wxBookCtrlEvent & event) override
|
||||||
|
{
|
||||||
|
event.SetEventType(wxEVT_BOOKCTRL_PAGE_CHANGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual wxWindow * DoRemovePage(size_t page) override
|
||||||
|
{
|
||||||
|
wxWindow* const win = wxBookCtrlBase::DoRemovePage(page);
|
||||||
|
if (win)
|
||||||
|
{
|
||||||
|
GetTopBarItemsCtrl()->RemovePage(page);
|
||||||
|
DoSetSelectionAfterRemoval(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void DoSize() override
|
||||||
|
{
|
||||||
|
wxWindow* const page = GetCurrentPage();
|
||||||
|
if (page)
|
||||||
|
page->SetSize(GetPageRect());
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void DoShowPage(wxWindow * page, bool show) override
|
||||||
|
{
|
||||||
|
if (show)
|
||||||
|
page->ShowWithEffect(m_showEffect, m_showTimeout);
|
||||||
|
else
|
||||||
|
page->HideWithEffect(m_hideEffect, m_hideTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void Init()
|
||||||
|
{
|
||||||
|
// We don't need any border as we don't have anything to separate the
|
||||||
|
// page contents from.
|
||||||
|
SetInternalBorder(0);
|
||||||
|
|
||||||
|
// No effects by default.
|
||||||
|
m_showEffect =
|
||||||
|
m_hideEffect = wxSHOW_EFFECT_NONE;
|
||||||
|
|
||||||
|
m_showTimeout =
|
||||||
|
m_hideTimeout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxShowEffect m_showEffect,
|
||||||
|
m_hideEffect;
|
||||||
|
|
||||||
|
unsigned m_showTimeout,
|
||||||
|
m_hideTimeout;
|
||||||
|
|
||||||
|
TopBarItemsCtrl* m_ctrl{ nullptr };
|
||||||
|
|
||||||
|
};
|
||||||
|
//#endif // _WIN32
|
||||||
|
#endif // slic3r_TopBar_hpp_
|
@ -906,6 +906,8 @@ int ScalableButton::GetBitmapHeight()
|
|||||||
|
|
||||||
void ScalableButton::sys_color_changed()
|
void ScalableButton::sys_color_changed()
|
||||||
{
|
{
|
||||||
|
if (m_current_icon_name.empty())
|
||||||
|
return;
|
||||||
Slic3r::GUI::wxGetApp().UpdateDarkUI(this, m_has_border);
|
Slic3r::GUI::wxGetApp().UpdateDarkUI(this, m_has_border);
|
||||||
|
|
||||||
wxBitmapBundle bmp = *get_bmp_bundle(m_current_icon_name, m_bmp_width, m_bmp_height);
|
wxBitmapBundle bmp = *get_bmp_bundle(m_current_icon_name, m_bmp_width, m_bmp_height);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user