Merge remote-tracking branch 'remotes/origin/master' into vb_wold_object_manipulation
This commit is contained in:
commit
ebb7981d16
@ -2266,7 +2266,7 @@ void PrintConfigDef::init_sla_params()
|
||||
def->tooltip = L("Printer scaling correction");
|
||||
def->min = 0;
|
||||
def->mode = comExpert;
|
||||
def->default_value = new ConfigOptionFloats( { 1., 1., 1. } );
|
||||
def->default_value = new ConfigOptionFloats( { 1., 1. } );
|
||||
|
||||
def = this->add("absolute_correction", coFloat);
|
||||
def->label = L("Printer absolute correction");
|
||||
@ -2323,7 +2323,7 @@ void PrintConfigDef::init_sla_params()
|
||||
def->tooltip = L("Correction for expansion");
|
||||
def->min = 0;
|
||||
def->mode = comExpert;
|
||||
def->default_value = new ConfigOptionFloats( { 1. , 1., 1. } );
|
||||
def->default_value = new ConfigOptionFloats( { 1. , 1. } );
|
||||
|
||||
def = this->add("material_notes", coString);
|
||||
def->label = L("SLA print material notes");
|
||||
|
@ -1174,8 +1174,9 @@ void SLAPrint::process()
|
||||
for(const SliceRecord& record : layer.slices()) {
|
||||
const SLAPrintObject *po = record.print_obj();
|
||||
|
||||
const ExPolygons &rawmodelslices = record.get_slice(soModel);
|
||||
const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
|
||||
// const ExPolygons &rawmodelslices = record.get_slice(soModel);
|
||||
// const ExPolygons &modelslices = clpr_back_offs != 0 ? offset_ex(rawmodelslices, clpr_back_offs) : rawmodelslices;
|
||||
const ExPolygons &modelslices = record.get_slice(soModel);
|
||||
|
||||
bool is_lefth = record.print_obj()->is_left_handed();
|
||||
if (!modelslices.empty()) {
|
||||
@ -1183,8 +1184,9 @@ void SLAPrint::process()
|
||||
for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp));
|
||||
}
|
||||
|
||||
const ExPolygons &rawsupportslices = record.get_slice(soSupport);
|
||||
const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
|
||||
// const ExPolygons &rawsupportslices = record.get_slice(soSupport);
|
||||
// const ExPolygons &supportslices = clpr_back_offs != 0 ? offset_ex(rawsupportslices, clpr_back_offs) : rawsupportslices;
|
||||
const ExPolygons &supportslices = record.get_slice(soSupport);
|
||||
|
||||
if (!supportslices.empty()) {
|
||||
ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth);
|
||||
@ -1662,16 +1664,16 @@ Vec3d SLAPrint::relative_correction() const
|
||||
{
|
||||
Vec3d corr(1., 1., 1.);
|
||||
|
||||
if(printer_config().relative_correction.values.size() == 2) {
|
||||
if(printer_config().relative_correction.values.size() >= 2) {
|
||||
corr(X) = printer_config().relative_correction.values[0];
|
||||
corr(Y) = printer_config().relative_correction.values[0];
|
||||
corr(Z) = printer_config().relative_correction.values[1];
|
||||
}
|
||||
corr(Z) = printer_config().relative_correction.values.back();
|
||||
}
|
||||
|
||||
if(material_config().material_correction.values.size() == 2) {
|
||||
if(material_config().material_correction.values.size() >= 2) {
|
||||
corr(X) *= material_config().material_correction.values[0];
|
||||
corr(Y) *= material_config().material_correction.values[0];
|
||||
corr(Z) *= material_config().material_correction.values[1];
|
||||
corr(Z) *= material_config().material_correction.values.back();
|
||||
}
|
||||
|
||||
return corr;
|
||||
|
@ -149,7 +149,10 @@ set(SLIC3R_GUI_SOURCES
|
||||
)
|
||||
|
||||
if (APPLE)
|
||||
list(APPEND SLIC3R_GUI_SOURCES Utils/RetinaHelperImpl.mm)
|
||||
list(APPEND SLIC3R_GUI_SOURCES
|
||||
Utils/RetinaHelperImpl.mm
|
||||
Utils/MacDarkMode.mm
|
||||
)
|
||||
endif ()
|
||||
|
||||
add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES})
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include "GUI_App.hpp"
|
||||
#include "PresetBundle.hpp"
|
||||
#include "Gizmos/GLGizmoBase.hpp"
|
||||
|
||||
#include <GL/glew.h>
|
||||
|
||||
@ -232,7 +233,7 @@ void Bed3D::Axes::render() const
|
||||
glsafe(::glEnable(GL_LIGHTING));
|
||||
|
||||
// x axis
|
||||
glsafe(::glColor3f(1.0f, 0.0f, 0.0f));
|
||||
glsafe(::glColor3fv(AXES_COLOR[0]));
|
||||
glsafe(::glPushMatrix());
|
||||
glsafe(::glTranslated(origin(0), origin(1), origin(2)));
|
||||
glsafe(::glRotated(90.0, 0.0, 1.0, 0.0));
|
||||
@ -240,7 +241,7 @@ void Bed3D::Axes::render() const
|
||||
glsafe(::glPopMatrix());
|
||||
|
||||
// y axis
|
||||
glsafe(::glColor3f(0.0f, 1.0f, 0.0f));
|
||||
glsafe(::glColor3fv(AXES_COLOR[1]));
|
||||
glsafe(::glPushMatrix());
|
||||
glsafe(::glTranslated(origin(0), origin(1), origin(2)));
|
||||
glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0));
|
||||
@ -248,7 +249,7 @@ void Bed3D::Axes::render() const
|
||||
glsafe(::glPopMatrix());
|
||||
|
||||
// z axis
|
||||
glsafe(::glColor3f(0.0f, 0.0f, 1.0f));
|
||||
glsafe(::glColor3fv(AXES_COLOR[2]));
|
||||
glsafe(::glPushMatrix());
|
||||
glsafe(::glTranslated(origin(0), origin(1), origin(2)));
|
||||
render_axis(length(2));
|
||||
|
@ -649,12 +649,6 @@ void PageTemperatures::apply_custom_config(DynamicPrintConfig &config)
|
||||
|
||||
ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent)
|
||||
: wxPanel(parent)
|
||||
/* #ys_FIXME_delete_after_testing by VK
|
||||
, bg(GUI::from_u8(Slic3r::var("Slic3r_192px_transparent.png")), wxBITMAP_TYPE_PNG)
|
||||
, bullet_black(GUI::from_u8(Slic3r::var("bullet_black.png")), wxBITMAP_TYPE_PNG)
|
||||
, bullet_blue(GUI::from_u8(Slic3r::var("bullet_blue.png")), wxBITMAP_TYPE_PNG)
|
||||
, bullet_white(GUI::from_u8(Slic3r::var("bullet_white.png")), wxBITMAP_TYPE_PNG)
|
||||
*/
|
||||
, bg(ScalableBitmap(parent, "Slic3r_192px_transparent.png", 192))
|
||||
, bullet_black(ScalableBitmap(parent, "bullet_black.png"))
|
||||
, bullet_blue(ScalableBitmap(parent, "bullet_blue.png"))
|
||||
@ -675,9 +669,6 @@ ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent)
|
||||
// In some cases it didn't work at all. And so wxStaticBitmap is used here instead,
|
||||
// because it has all the platform quirks figured out.
|
||||
auto *sizer = new wxBoxSizer(wxVERTICAL);
|
||||
/* #ys_FIXME_delete_after_testing by VK
|
||||
auto *logo = new wxStaticBitmap(this, wxID_ANY, bg);
|
||||
*/
|
||||
logo = new wxStaticBitmap(this, wxID_ANY, bg.bmp());
|
||||
sizer->AddStretchSpacer();
|
||||
sizer->Add(logo);
|
||||
@ -786,10 +777,6 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
|
||||
|
||||
wxPaintDC dc(this);
|
||||
|
||||
/* #ys_FIXME_delete_after_testing by VK
|
||||
const auto bullet_w = bullet_black.GetSize().GetWidth();
|
||||
const auto bullet_h = bullet_black.GetSize().GetHeight();
|
||||
*/
|
||||
const auto bullet_w = bullet_black.bmp().GetSize().GetWidth();
|
||||
const auto bullet_h = bullet_black.bmp().GetSize().GetHeight();
|
||||
const int yoff_icon = bullet_h < em_h ? (em_h - bullet_h) / 2 : 0;
|
||||
@ -804,12 +791,6 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt)
|
||||
unsigned x = em_w/2 + item.indent * em_w;
|
||||
|
||||
if (i == item_active || item_hover >= 0 && i == (size_t)item_hover) {
|
||||
/*#ys_FIXME_delete_after_testing by VK
|
||||
dc.DrawBitmap(bullet_blue, x, y + yoff_icon, false);
|
||||
}
|
||||
else if (i < item_active) { dc.DrawBitmap(bullet_black, x, y + yoff_icon, false); }
|
||||
else if (i > item_active) { dc.DrawBitmap(bullet_white, x, y + yoff_icon, false); }
|
||||
*/
|
||||
dc.DrawBitmap(bullet_blue.bmp(), x, y + yoff_icon, false);
|
||||
}
|
||||
else if (i < item_active) { dc.DrawBitmap(bullet_black.bmp(), x, y + yoff_icon, false); }
|
||||
@ -848,6 +829,10 @@ void ConfigWizardIndex::on_mouse_move(wxMouseEvent &evt)
|
||||
|
||||
void ConfigWizardIndex::msw_rescale()
|
||||
{
|
||||
const wxSize size = GetTextExtent("m");
|
||||
em_w = size.x;
|
||||
em_h = size.y;
|
||||
|
||||
bg.msw_rescale();
|
||||
SetMinSize(bg.bmp().GetSize());
|
||||
logo->SetBitmap(bg.bmp());
|
||||
@ -897,6 +882,29 @@ void ConfigWizard::priv::load_pages(bool custom_setup)
|
||||
q->Layout();
|
||||
}
|
||||
|
||||
void ConfigWizard::priv::init_dialog_size()
|
||||
{
|
||||
// Clamp the Wizard size based on screen dimensions
|
||||
|
||||
const auto idx = wxDisplay::GetFromWindow(q);
|
||||
wxDisplay display(idx != wxNOT_FOUND ? idx : 0u);
|
||||
|
||||
const auto disp_rect = display.GetClientArea();
|
||||
wxRect window_rect(
|
||||
disp_rect.x + disp_rect.width / 20,
|
||||
disp_rect.y + disp_rect.height / 20,
|
||||
9*disp_rect.width / 10,
|
||||
9*disp_rect.height / 10);
|
||||
|
||||
const int width_hint = index->GetSize().GetWidth() + page_fff->get_width() + 30 * em(); // XXX: magic constant, I found no better solution
|
||||
if (width_hint < window_rect.width) {
|
||||
window_rect.x += (window_rect.width - width_hint) / 2;
|
||||
window_rect.width = width_hint;
|
||||
}
|
||||
|
||||
q->SetSize(window_rect);
|
||||
}
|
||||
|
||||
bool ConfigWizard::priv::check_first_variant() const
|
||||
{
|
||||
return run_reason == RR_DATA_EMPTY || run_reason == RR_DATA_LEGACY;
|
||||
@ -982,10 +990,11 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
|
||||
|
||||
size_t size_sum = 0;
|
||||
for (const auto &model : vendor->second) { size_sum += model.second.size(); }
|
||||
if (size_sum == 0) { continue; }
|
||||
|
||||
// This vendor needs to be installed
|
||||
install_bundles.emplace_back(vendor_rsrc.second);
|
||||
if (size_sum > 0) {
|
||||
// This vendor needs to be installed
|
||||
install_bundles.emplace_back(vendor_rsrc.second);
|
||||
}
|
||||
}
|
||||
|
||||
// Decide whether to create snapshot based on run_reason and the reset profile checkbox
|
||||
@ -1011,9 +1020,26 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
|
||||
app_config->set_vendors(appconfig_vendors);
|
||||
app_config->set("version_check", page_update->version_check ? "1" : "0");
|
||||
app_config->set("preset_update", page_update->preset_update ? "1" : "0");
|
||||
app_config->reset_selections();
|
||||
preset_bundle->load_presets(*app_config);
|
||||
|
||||
std::string preferred_model;
|
||||
|
||||
// Figure out the default pre-selected printer based on the seletions in the picker.
|
||||
// The default is the first selected printer model (one with at least 1 variant selected).
|
||||
// The default is only applied by load_presets() if the user doesn't have a (visible) printer
|
||||
// selected already.
|
||||
const auto vendor_prusa = vendors.find("PrusaResearch");
|
||||
const auto config_prusa = enabled_vendors.find("PrusaResearch");
|
||||
if (vendor_prusa != vendors.end() && config_prusa != enabled_vendors.end()) {
|
||||
for (const auto &model : vendor_prusa->second.models) {
|
||||
const auto model_it = config_prusa->second.find(model.id);
|
||||
if (model_it != config_prusa->second.end() && model_it->second.size() > 0) {
|
||||
preferred_model = model.id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
preset_bundle->load_presets(*app_config, preferred_model);
|
||||
|
||||
if (page_custom->custom_wanted()) {
|
||||
page_firmware->apply_custom_config(*custom_config);
|
||||
@ -1107,25 +1133,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent, RunReason reason)
|
||||
p->hscroll->SetScrollRate(30, 30);
|
||||
|
||||
on_window_geometry(this, [this]() {
|
||||
// Clamp the Wizard size based on screen dimensions
|
||||
|
||||
const auto idx = wxDisplay::GetFromWindow(this);
|
||||
wxDisplay display(idx != wxNOT_FOUND ? idx : 0u);
|
||||
|
||||
const auto disp_rect = display.GetClientArea();
|
||||
wxRect window_rect(
|
||||
disp_rect.x + disp_rect.width / 20,
|
||||
disp_rect.y + disp_rect.height / 20,
|
||||
9*disp_rect.width / 10,
|
||||
9*disp_rect.height / 10);
|
||||
|
||||
const int width_hint = p->index->GetSize().GetWidth() + p->page_fff->get_width() + 30 * p->em(); // XXX: magic constant, I found no better solution
|
||||
if (width_hint < window_rect.width) {
|
||||
window_rect.x += (window_rect.width - width_hint) / 2;
|
||||
window_rect.width = width_hint;
|
||||
}
|
||||
|
||||
SetSize(window_rect);
|
||||
p->init_dialog_size();
|
||||
});
|
||||
|
||||
p->btn_prev->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_prev(); });
|
||||
@ -1194,7 +1202,7 @@ void ConfigWizard::on_dpi_changed(const wxRect &suggested_rect)
|
||||
for (auto printer_picker: p->page_fff->printer_pickers)
|
||||
msw_buttons_rescale(this, em, printer_picker->get_button_indexes());
|
||||
|
||||
// FIXME VK SetSize(???)
|
||||
p->init_dialog_size();
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
@ -292,6 +292,7 @@ struct ConfigWizard::priv
|
||||
priv(ConfigWizard *q) : q(q) {}
|
||||
|
||||
void load_pages(bool custom_setup);
|
||||
void init_dialog_size();
|
||||
|
||||
bool check_first_variant() const;
|
||||
void load_vendors();
|
||||
|
@ -5019,6 +5019,10 @@ bool GLCanvas3D::_travel_paths_by_tool(const GCodePreviewData& preview_data, con
|
||||
// creates a new volume for each tool
|
||||
for (Tool& tool : tools)
|
||||
{
|
||||
// tool.value could be invalid (as it was with https://github.com/prusa3d/Slic3r/issues/2179), we better check
|
||||
if (tool.value >= tool_colors.size())
|
||||
continue;
|
||||
|
||||
GLVolume* volume = new GLVolume(tool_colors.data() + tool.value * 4);
|
||||
if (volume == nullptr)
|
||||
return false;
|
||||
@ -5033,7 +5037,7 @@ bool GLCanvas3D::_travel_paths_by_tool(const GCodePreviewData& preview_data, con
|
||||
for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
|
||||
{
|
||||
ToolsList::iterator tool = std::find(tools.begin(), tools.end(), Tool(polyline.extruder_id));
|
||||
if (tool != tools.end())
|
||||
if (tool != tools.end() && tool->volume != nullptr)
|
||||
{
|
||||
tool->volume->print_zs.push_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
|
||||
tool->volume->offsets.push_back(tool->volume->indexed_vertex_array.quad_indices.size());
|
||||
|
@ -125,9 +125,6 @@ void config_wizard(int reason)
|
||||
if (! wxGetApp().check_unsaved_changes())
|
||||
return;
|
||||
|
||||
// save selected preset before config wizard running
|
||||
const auto printer_preset_name = wxGetApp().preset_bundle->printers.get_edited_preset().name;
|
||||
|
||||
try {
|
||||
ConfigWizard wizard(nullptr, static_cast<ConfigWizard::RunReason>(reason));
|
||||
wizard.run(wxGetApp().preset_bundle, wxGetApp().preset_updater);
|
||||
@ -136,10 +133,8 @@ void config_wizard(int reason)
|
||||
show_error(nullptr, e.what());
|
||||
}
|
||||
|
||||
// select old(before config wizard running) preset
|
||||
wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(printer_preset_name);
|
||||
// If old preset if invisible now, then first visible preset will be selected
|
||||
// So, let control the case if multi-part object is on the scene and first visible preset is SLA
|
||||
wxGetApp().load_current_presets();
|
||||
|
||||
if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA &&
|
||||
wxGetApp().obj_list()->has_multi_part_objects())
|
||||
{
|
||||
|
@ -34,6 +34,7 @@
|
||||
|
||||
#include "../Utils/PresetUpdater.hpp"
|
||||
#include "../Utils/PrintHost.hpp"
|
||||
#include "../Utils/MacDarkMode.hpp"
|
||||
#include "ConfigWizard.hpp"
|
||||
#include "slic3r/Config/Snapshot.hpp"
|
||||
#include "ConfigSnapshotDialog.hpp"
|
||||
@ -284,10 +285,24 @@ unsigned GUI_App::get_colour_approx_luma(const wxColour &colour)
|
||||
));
|
||||
}
|
||||
|
||||
bool GUI_App::dark_mode()
|
||||
{
|
||||
const unsigned luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
|
||||
return luma < 128;
|
||||
}
|
||||
|
||||
bool GUI_App::dark_mode_menus()
|
||||
{
|
||||
#if __APPLE__
|
||||
return mac_dark_mode();
|
||||
#else
|
||||
return dark_mode();
|
||||
#endif
|
||||
}
|
||||
|
||||
void GUI_App::init_label_colours()
|
||||
{
|
||||
auto luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
|
||||
if (luma >= 128) {
|
||||
if (dark_mode()) {
|
||||
m_color_label_modified = wxColour(252, 77, 1);
|
||||
m_color_label_sys = wxColour(26, 132, 57);
|
||||
}
|
||||
@ -451,7 +466,7 @@ void GUI_App::update_ui_from_settings()
|
||||
mainframe->update_ui_from_settings();
|
||||
}
|
||||
|
||||
void GUI_App::persist_window_geometry(wxTopLevelWindow *window)
|
||||
void GUI_App::persist_window_geometry(wxTopLevelWindow *window, bool default_maximized)
|
||||
{
|
||||
const std::string name = into_u8(window->GetName());
|
||||
|
||||
@ -460,7 +475,7 @@ void GUI_App::persist_window_geometry(wxTopLevelWindow *window)
|
||||
event.Skip();
|
||||
});
|
||||
|
||||
window_pos_restore(window, name);
|
||||
window_pos_restore(window, name, default_maximized);
|
||||
|
||||
on_window_geometry(window, [=]() {
|
||||
window_pos_sanitize(window);
|
||||
@ -868,15 +883,21 @@ void GUI_App::window_pos_save(wxTopLevelWindow* window, const std::string &name)
|
||||
app_config->save();
|
||||
}
|
||||
|
||||
void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name)
|
||||
void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized)
|
||||
{
|
||||
if (name.empty()) { return; }
|
||||
const auto config_key = (boost::format("window_%1%") % name).str();
|
||||
|
||||
if (! app_config->has(config_key)) { return; }
|
||||
if (! app_config->has(config_key)) {
|
||||
window->Maximize(default_maximized);
|
||||
return;
|
||||
}
|
||||
|
||||
auto metrics = WindowMetrics::deserialize(app_config->get(config_key));
|
||||
if (! metrics) { return; }
|
||||
if (! metrics) {
|
||||
window->Maximize(default_maximized);
|
||||
return;
|
||||
}
|
||||
|
||||
window->SetSize(metrics->get_rect());
|
||||
window->Maximize(metrics->get_maximized());
|
||||
|
@ -94,7 +94,9 @@ public:
|
||||
|
||||
GUI_App();
|
||||
|
||||
unsigned get_colour_approx_luma(const wxColour &colour);
|
||||
static unsigned get_colour_approx_luma(const wxColour &colour);
|
||||
static bool dark_mode();
|
||||
static bool dark_mode_menus();
|
||||
void init_label_colours();
|
||||
void update_label_colours_from_appconfig();
|
||||
void init_fonts();
|
||||
@ -122,7 +124,7 @@ public:
|
||||
const std::string& err);
|
||||
// void notify(/*message*/);
|
||||
|
||||
void persist_window_geometry(wxTopLevelWindow *window);
|
||||
void persist_window_geometry(wxTopLevelWindow *window, bool default_maximized = false);
|
||||
void update_ui_from_settings();
|
||||
|
||||
bool select_language(wxArrayString & names, wxArrayLong & identifiers);
|
||||
@ -174,7 +176,7 @@ public:
|
||||
private:
|
||||
bool on_init_inner();
|
||||
void window_pos_save(wxTopLevelWindow* window, const std::string &name);
|
||||
void window_pos_restore(wxTopLevelWindow* window, const std::string &name);
|
||||
void window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false);
|
||||
void window_pos_sanitize(wxTopLevelWindow* window);
|
||||
};
|
||||
DECLARE_APP(GUI_App)
|
||||
|
@ -23,7 +23,7 @@ namespace GUI {
|
||||
static const float DEFAULT_BASE_COLOR[3] = { 0.625f, 0.625f, 0.625f };
|
||||
static const float DEFAULT_DRAG_COLOR[3] = { 1.0f, 1.0f, 1.0f };
|
||||
static const float DEFAULT_HIGHLIGHT_COLOR[3] = { 1.0f, 0.38f, 0.0f };
|
||||
static const float AXES_COLOR[3][3] = { { 1.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 1.0f } };
|
||||
static const float AXES_COLOR[3][3] = { { 0.75f, 0.0f, 0.0f }, { 0.0f, 0.75f, 0.0f }, { 0.0f, 0.0f, 0.75f } };
|
||||
|
||||
|
||||
|
||||
|
@ -129,7 +129,7 @@ DPIFrame(NULL, wxID_ANY, SLIC3R_BUILD, wxDefaultPosition, wxDefaultSize, wxDEFAU
|
||||
event.Skip();
|
||||
});
|
||||
|
||||
wxGetApp().persist_window_geometry(this);
|
||||
wxGetApp().persist_window_geometry(this, true);
|
||||
|
||||
update_ui_from_settings(); // FIXME (?)
|
||||
}
|
||||
|
@ -1330,4 +1330,15 @@ const Preset& PrinterPresetCollection::default_preset_for(const DynamicPrintConf
|
||||
return this->default_preset((opt_printer_technology == nullptr || opt_printer_technology->value == ptFFF) ? 0 : 1);
|
||||
}
|
||||
|
||||
const Preset* PrinterPresetCollection::find_by_model_id(const std::string &model_id) const
|
||||
{
|
||||
if (model_id.empty()) { return nullptr; }
|
||||
|
||||
const auto it = std::find_if(cbegin(), cend(), [&](const Preset &preset) {
|
||||
return preset.config.opt_string("printer_model") == model_id;
|
||||
});
|
||||
|
||||
return it != cend() ? &*it : nullptr;
|
||||
}
|
||||
|
||||
} // namespace Slic3r
|
||||
|
@ -312,7 +312,7 @@ public:
|
||||
const Preset& get_edited_preset() const { return m_edited_preset; }
|
||||
|
||||
// used to update preset_choice from Tab
|
||||
const std::deque<Preset>& get_presets() { return m_presets; }
|
||||
const std::deque<Preset>& get_presets() const { return m_presets; }
|
||||
int get_idx_selected() { return m_idx_selected; }
|
||||
static const std::string& get_suffix_modified();
|
||||
|
||||
@ -503,6 +503,8 @@ public:
|
||||
PrinterPresetCollection(Preset::Type type, const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name = "- default -") :
|
||||
PresetCollection(type, keys, defaults, default_name) {}
|
||||
const Preset& default_preset_for(const DynamicPrintConfig &config) const override;
|
||||
|
||||
const Preset* find_by_model_id(const std::string &model_id) const;
|
||||
};
|
||||
|
||||
} // namespace Slic3r
|
||||
|
@ -191,7 +191,7 @@ void PresetBundle::setup_directories()
|
||||
}
|
||||
}
|
||||
|
||||
void PresetBundle::load_presets(const AppConfig &config)
|
||||
void PresetBundle::load_presets(const AppConfig &config, const std::string &preferred_model_id)
|
||||
{
|
||||
// First load the vendor specific system presets.
|
||||
std::string errors_cummulative = this->load_system_presets();
|
||||
@ -234,7 +234,7 @@ void PresetBundle::load_presets(const AppConfig &config)
|
||||
if (! errors_cummulative.empty())
|
||||
throw std::runtime_error(errors_cummulative);
|
||||
|
||||
this->load_selections(config);
|
||||
this->load_selections(config, preferred_model_id);
|
||||
}
|
||||
|
||||
// Load system presets into this PresetBundle.
|
||||
@ -324,7 +324,7 @@ void PresetBundle::load_installed_printers(const AppConfig &config)
|
||||
|
||||
// Load selections (current print, current filaments, current printer) from config.ini
|
||||
// This is done on application start up or after updates are applied.
|
||||
void PresetBundle::load_selections(const AppConfig &config)
|
||||
void PresetBundle::load_selections(const AppConfig &config, const std::string &preferred_model_id)
|
||||
{
|
||||
// Update visibility of presets based on application vendor / model / variant configuration.
|
||||
this->load_installed_printers(config);
|
||||
@ -336,11 +336,21 @@ void PresetBundle::load_selections(const AppConfig &config)
|
||||
std::string initial_sla_material_profile_name = remove_ini_suffix(config.get("presets", "sla_material"));
|
||||
std::string initial_printer_profile_name = remove_ini_suffix(config.get("presets", "printer"));
|
||||
|
||||
// Activate print / filament / printer profiles from the config.
|
||||
// If the printer profile enumerated by the config are not visible, select an alternate preset.
|
||||
// Activate print / filament / printer profiles from either the config,
|
||||
// or from the preferred_model_id suggestion passed in by ConfigWizard.
|
||||
// If the printer profile enumerated by the config are not visible, select an alternate preset.
|
||||
// Do not select alternate profiles for the print / filament profiles as those presets
|
||||
// will be selected by the following call of this->update_compatible(true).
|
||||
printers.select_preset_by_name(initial_printer_profile_name, true);
|
||||
|
||||
const Preset *initial_printer = printers.find_preset(initial_printer_profile_name);
|
||||
const Preset *preferred_printer = printers.find_by_model_id(preferred_model_id);
|
||||
|
||||
if (preferred_printer != nullptr && (initial_printer == nullptr || !initial_printer->is_visible)) {
|
||||
printers.select_preset_by_name(preferred_printer->name, true);
|
||||
} else {
|
||||
printers.select_preset_by_name(initial_printer_profile_name, true);
|
||||
}
|
||||
|
||||
PrinterTechnology printer_technology = printers.get_selected_preset().printer_technology();
|
||||
if (printer_technology == ptFFF) {
|
||||
prints.select_preset_by_name_strict(initial_print_profile_name);
|
||||
|
@ -31,7 +31,7 @@ public:
|
||||
// Load ini files of all types (print, filament, printer) from Slic3r::data_dir() / presets.
|
||||
// Load selections (current print, current filaments, current printer) from config.ini
|
||||
// This is done just once on application start up.
|
||||
void load_presets(const AppConfig &config);
|
||||
void load_presets(const AppConfig &config, const std::string &preferred_model_id = "");
|
||||
|
||||
// Export selections (current print, current filaments, current printer) into config.ini
|
||||
void export_selections(AppConfig &config);
|
||||
@ -143,7 +143,7 @@ private:
|
||||
|
||||
// Load selections (current print, current filaments, current printer) from config.ini
|
||||
// This is done just once on application start up.
|
||||
void load_selections(const AppConfig &config);
|
||||
void load_selections(const AppConfig &config, const std::string &preferred_model_id = "");
|
||||
|
||||
// Load print, filament & printer presets from a config. If it is an external config, then the name is extracted from the external path.
|
||||
// and the external config is just referenced, not stored into user profile directory.
|
||||
|
@ -2351,8 +2351,9 @@ void ModeButton::SetState(const bool state)
|
||||
|
||||
void ModeButton::focus_button(const bool focus)
|
||||
{
|
||||
wxFont font = GetFont();
|
||||
const wxFont& new_font = focus ? font.Bold() : font.GetBaseFont();
|
||||
const wxFont& new_font = focus ?
|
||||
Slic3r::GUI::wxGetApp().bold_font() :
|
||||
Slic3r::GUI::wxGetApp().normal_font();
|
||||
|
||||
SetFont(new_font);
|
||||
|
||||
|
15
src/slic3r/Utils/MacDarkMode.hpp
Normal file
15
src/slic3r/Utils/MacDarkMode.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef slic3r_MacDarkMode_hpp_
|
||||
#define slic3r_MacDarkMode_hpp_
|
||||
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
#if __APPLE__
|
||||
extern bool mac_dark_mode();
|
||||
#endif
|
||||
|
||||
|
||||
} // namespace GUI
|
||||
} // namespace Slic3r
|
||||
|
||||
#endif // MacDarkMode_h
|
22
src/slic3r/Utils/MacDarkMode.mm
Normal file
22
src/slic3r/Utils/MacDarkMode.mm
Normal file
@ -0,0 +1,22 @@
|
||||
#import "MacDarkMode.hpp"
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
|
||||
@implementation MacDarkMode
|
||||
|
||||
namespace Slic3r {
|
||||
namespace GUI {
|
||||
|
||||
bool mac_dark_mode()
|
||||
{
|
||||
NSString *style = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];
|
||||
return style && [style isEqualToString:@"Dark"];
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in New Issue
Block a user