PrusaSlicer-NonPlainar/xs/src/slic3r/GUI/OptionsGroup.cpp

125 lines
4.4 KiB
C++
Raw Normal View History

2017-12-05 14:54:01 +00:00
#include "OptionsGroup.hpp"
#include "OptionsGroup/Field.hpp"
#include "Config.hpp"
// Translate the ifdef
#ifdef __WXOSX__
#define wxOSX true
#else
#define wxOSX false
#endif
#define BORDER(a, b) ((wxOSX ? a : b))
namespace Slic3r { namespace GUI {
void OptionsGroup::BUILD() {
if (staticbox) {
wxStaticBox* box = new wxStaticBox(_parent, -1, title);
_sizer = new wxStaticBoxSizer(box, wxVERTICAL);
} else {
_sizer = new wxBoxSizer(wxVERTICAL);
}
size_t num_columns = 1;
if (label_width != 0) ++num_columns;
if (extra_column != 0) ++num_columns;
_grid_sizer = new wxFlexGridSizer(0, num_columns, 0, 0);
_grid_sizer->SetFlexibleDirection(wxHORIZONTAL);
_grid_sizer->AddGrowableCol(label_width > 0);
_sizer->Add(_grid_sizer, 0, wxEXPAND | wxALL, BORDER(0,5));
}
void OptionsGroup::append_line(const Line& line) {
if (line.has_sizer() || (line.has_widget() && line.full_width)) {
wxASSERT(line.sizer() != nullptr);
_sizer->Add( (line.has_sizer() ? line.sizer() : line.widget().sizer()), 0, wxEXPAND | wxALL, BORDER(0, 15));
return;
}
wxSizer* grid_sizer = _grid_sizer;
// If we have an extra column, build it.
// If there's a label, build it.
if (label_width != 0) {
wxStaticText* label = new wxStaticText(_parent, -1, (line.label) + ":", wxDefaultPosition);
label->Wrap(label_width);
if (wxIsEmpty(line.tooltip())) { label->SetToolTip(line.tooltip()); }
grid_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL, 0);
}
// If we have a widget, add it to the sizer
if (line.has_widget()) {
grid_sizer->Add(line.widget().sizer(), 0, wxEXPAND | wxALL, BORDER(0,15));
return;
}
// If we have a single option with no sidetext just add it directly to the grid sizer
if (line.options().size() == 1) {
const ConfigOptionDef& opt = line.options()[0];
if (line.extra_widgets().size() && !wxIsEmpty(opt.sidetext) && line.extra_widgets().size() == 0) {
Field* field = _build_field(opt);
if (field != nullptr) {
if (field->has_sizer()) {
grid_sizer->Add(field->sizer(), 0, (opt.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
} else if (field->has_window()) {
grid_sizer->Add(field->window(), 0, (opt.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
}
}
}
}
// Otherwise, there's more than one option or a single option with sidetext -- make
// a horizontal sizer to arrange things.
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
grid_sizer->Add(sizer, 0, 0, 0);
for (auto& option : line.options()) {
// add label if any
if (!wxIsEmpty(option.label)) {
wxStaticText* field_label = new wxStaticText(_parent, -1, __(option.label) + ":", wxDefaultPosition, wxDefaultSize);
sizer->Add(field_label, 0, wxALIGN_CENTER_VERTICAL,0);
}
// add field
Field* field = _build_field(option);
if (field != nullptr) {
if (field->has_sizer()) {
sizer->Add(field->sizer(), 0, (option.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
} else if (field->has_window()) {
sizer->Add(field->window(), 0, (option.full_width ? wxEXPAND : 0) | wxALIGN_CENTER_VERTICAL, 0);
}
}
if (!wxIsEmpty(option.sidetext)) {
}
// !!! side_widget !!! find out the purpose
// if (option.side_widget.valid()) {
// sizer->Add(option.side_widget.sizer(), 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1);
// }
if (&option != &line.options().back()) {
sizer->AddSpacer(4);
}
// add side text if any
// add side widget if any
}
// Append extra sizers
for (auto& widget : line.extra_widgets()) {
_sizer->Add(widget.sizer(), 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4);
}
}
Field* OptionsGroup::_build_field(const ConfigOptionDef& opt) {
Field* built_field = nullptr;
switch (opt.type) {
case coString:
{
printf("Making new textctrl\n");
TextCtrl* temp = new TextCtrl(_parent, opt);
printf("recasting textctrl\n");
built_field = dynamic_cast<Field*>(temp);
}
break;
default:
break;
}
return built_field;
}
} }