Added SavePresetWindow dialog.

This commit is contained in:
YuSanka 2018-01-18 11:45:25 +01:00
parent d6568f9ce7
commit 5162cddd5e
2 changed files with 97 additions and 19 deletions

View file

@ -15,6 +15,7 @@
#include "PresetBundle.hpp"
#include "PresetHints.hpp"
#include "../../libslic3r/Utils.hpp"
#include <boost/algorithm/string/predicate.hpp>
namespace Slic3r {
namespace GUI {
@ -69,7 +70,8 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle)
m_hsizer->Add(m_left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 3);
// tree
m_treectrl = new wxTreeCtrl(panel, wxID_ANY/*ID_TAB_TREE*/, wxDefaultPosition, wxSize(185, -1), wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE | wxTR_NO_LINES | wxBORDER_SUNKEN | wxWANTS_CHARS);
m_treectrl = new wxTreeCtrl(panel, wxID_ANY, wxDefaultPosition, wxSize(185, -1),
wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE | wxTR_NO_LINES | wxBORDER_SUNKEN | wxWANTS_CHARS);
m_left_sizer->Add(m_treectrl, 1, wxEXPAND);
m_icons = new wxImageList(16, 16, true, 1/*, 1*/);
// Index of the last icon inserted into $self->{icons}.
@ -87,11 +89,11 @@ void Tab::create_preset_tab(PresetBundle *preset_bundle)
select_preset(m_presets_choice->GetStringSelection());
}));
m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e){
save_preset(m_presets_choice->GetStringSelection().ToStdString());
m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e){ save_preset(); }));
m_btn_delete_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e){ delete_preset(); }));
m_btn_hide_incompatible_presets->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e){
toggle_show_hide_incompatible();
}));
m_btn_delete_preset->Bind(wxEVT_BUTTON, &Tab::delete_preset, this);
m_btn_hide_incompatible_presets->Bind(wxEVT_BUTTON, &Tab::toggle_show_hide_incompatible, this);
// Initialize the DynamicPrintConfig by default keys/values.
// Possible %params keys: no_controller
@ -131,7 +133,7 @@ PageShp Tab::add_options_page(wxString title, std::string icon, bool is_extruder
// comparing the selected preset config with $self->{config}.
void Tab::update_dirty(){
m_presets->update_dirty_ui(m_presets_choice);
// _on_presets_changed;
on_presets_changed();
}
void Tab::update_tab_ui()
@ -1475,17 +1477,34 @@ void Tab::save_preset(std::string name /*= ""*/)
auto preset = m_presets->get_selected_preset();
auto default_name = preset.is_default ? "Untitled" : preset.name;
// $default_name = ~s / \.[iI][nN][iI]$//;
// my $dlg = Slic3r::GUI::SavePresetWindow->new($self,
// title = > lc($self->title),
// default = > $default_name,
// values = > [map $_->name, grep !$_->default && !$_->external, @{$self->{presets}}],
// );
// return unless $dlg->ShowModal == wxID_OK;
// name = $dlg->get_name;
bool have_extention = boost::iends_with(default_name, ".ini");
if (have_extention)
{
size_t len = default_name.length()-4;
default_name.resize(len);
}
//[map $_->name, grep !$_->default && !$_->external, @{$self->{presets}}],
std::vector<std::string> values;
for (size_t i = 0; i < m_presets->size(); ++i) {
const Preset &preset = m_presets->preset(i);
if (preset.is_default || preset.is_external)
continue;
values.push_back(preset.name);
}
auto dlg = new SavePresetWindow(parent());
dlg->build(title(), default_name, values);
if (dlg->ShowModal() != wxID_OK)
return;
name = dlg->get_name();
if (name == ""){
show_error(this, "The supplied name is empty. It can't be saved.");
return;
}
}
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
try
{
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
m_presets->save_current_preset(name);
}
catch (const std::exception &e)
@ -1502,7 +1521,7 @@ void Tab::save_preset(std::string name /*= ""*/)
}
// Called for a currently selected preset.
void Tab::delete_preset(wxCommandEvent &event)
void Tab::delete_preset()
{
auto current_preset = m_presets->get_selected_preset();
// Don't let the user delete the ' - default - ' configuration.
@ -1524,7 +1543,7 @@ void Tab::delete_preset(wxCommandEvent &event)
load_current_preset();
}
void Tab::toggle_show_hide_incompatible(wxCommandEvent &event)
void Tab::toggle_show_hide_incompatible()
{
m_show_incompatible_presets = !m_show_incompatible_presets;
update_show_hide_incompatible_button();
@ -1672,5 +1691,50 @@ ConfigOptionsGroupShp Page::new_optgroup(std::string title, int noncommon_label_
return optgroup;
}
void SavePresetWindow::build(wxString title, std::string default_name, std::vector<std::string> &values)
{
auto text = new wxStaticText(this, wxID_ANY, "Save " + title + " as:", wxDefaultPosition, wxDefaultSize);
m_combo = new wxComboBox(this, wxID_ANY, default_name, wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER);
for (auto value : values)
m_combo->Append(value);
auto buttons = CreateStdDialogButtonSizer(wxOK | wxCANCEL);
auto sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(text, 0, wxEXPAND | wxALL, 10);
sizer->Add(m_combo, 0, wxEXPAND | wxLEFT | wxRIGHT, 10);
sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 10);
wxButton* btn = static_cast<wxButton*>(FindWindowById(wxID_OK, this));
btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { accept(); });
m_combo->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent&) { accept(); });
SetSizer(sizer);
sizer->SetSizeHints(this);
}
void SavePresetWindow::accept()
{
m_chosen_name = normalize_utf8_nfc(m_combo->GetValue().c_str());
if (!m_chosen_name.empty()) {
const char* unusable_symbols = "<>:/\\|?*\"";
bool is_unusable_symbol = false;
for (size_t i = 0; i < std::strlen(unusable_symbols); i++){
if (m_chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos){
is_unusable_symbol = true;
break;
}
}
if (is_unusable_symbol) {
show_error(this, "The supplied name is not valid; the following characters are not allowed: <>:/\\|?*\"");
}
else if (m_chosen_name.compare("- default -") == 0) {
show_error(this, "The supplied name is not available.");
}
else {
EndModal(wxID_OK);
}
}
}
} // GUI
} // Slic3r

View file

@ -105,7 +105,7 @@ public:
PresetCollection* m_presets;
DynamicPrintConfig* m_config;
t_change m_on_value_change{ nullptr };
std::function<void(/*PresetCollection*, std::vector<std::string>*/)> m_on_presets_changed{ nullptr };
std::function<void()> m_on_presets_changed{ nullptr };
public:
Tab() {}
@ -137,8 +137,8 @@ public:
void OnKeyDown(wxKeyEvent& event);
void OnComboBox(wxCommandEvent& event) { select_preset(m_presets_choice->GetStringSelection()); }
void save_preset(std::string name = "");
void delete_preset(wxCommandEvent &event);
void toggle_show_hide_incompatible(wxCommandEvent &event);
void delete_preset();
void toggle_show_hide_incompatible();
void update_show_hide_incompatible_button();
void update_ui_from_settings();
@ -213,5 +213,19 @@ public:
void on_preset_loaded() override;
};
class SavePresetWindow :public wxDialog
{
public:
SavePresetWindow(wxWindow* parent ) :wxDialog(parent, wxID_ANY, "Save preset"){}
~SavePresetWindow(){}
std::string m_chosen_name;
wxComboBox* m_combo;
void build(wxString title, std::string default_name, std::vector<std::string> &values);
void accept();
std::string get_name() { return m_chosen_name; }
};
} // GUI
} // Slic3r