📄 dynamicpreferencesctrl.cpp
字号:
{ if (GetNodeSize(node) == wxDefaultSize) { sizer_v3->Add(add_item(parent, node, panel), 1, wxGROW | wxALIGN_RIGHT | wxLEFT, 5); } else { sizer_v3->Add(add_item(parent, node, panel), 0, wxALIGN_RIGHT | wxLEFT, 5); } } } if (orient == 1) { sizer->Add(sizer_v1, 0); sizer->Add(sizer_v3, 1, wxGROW | wxALIGN_RIGHT); } else { sizer_v2->Add(sizer_v3, 1, wxALIGN_RIGHT); sizer->Add(sizer_v1, 1); sizer->Add(sizer_v2, 1, wxGROW | wxALIGN_RIGHT); } node = parent_node2; panel->SetSizer(sizer); panel->SetAutoLayout(true); parent->AppendWindow(current_item, panel, 340); } else if (node->GetName() == wxT("group")) { current_item = parent->AppendNode(current_item, node->GetPropVal(wxT("name"), wxT(""))); parse_xml(parent, node->GetChildren(), current_item); current_item = parent->GetItemParent(current_item); } } while (node = node->GetNext());}wxSize GetNodeSize(wxXmlNode* node){ long width, height; wxString size = node->GetPropVal(wxT("size"), wxEmptyString); if (size.IsEmpty() == true) { return wxSize(120, -1); } if ((size.BeforeFirst(wxT(',')).ToLong(&width) == false) || (size.AfterLast(wxT(',')).ToLong(&height) == false)) { wxLogError(wxT("Invalid size coordinates:") + size); return wxSize(120, -1); } return wxSize(width, height);}void RegisterControl(const wxString& preference, const short int type){ controls.push_front(std::make_pair(preference, type));}inline wxString ControlName(const wxString& in){ wxString name(in); name.Remove(0, 1); return name;}};wxWindow* add_item(wxTreeMultiCtrl* parent, wxXmlNode* node, wxPanel* panel){ wxString type(node->GetPropVal(wxT("type"), wxT(""))); if (panel == NULL) { panel = parent; } wxString name(node->GetPropVal(wxT("name"), wxT(""))); if (type == wxT("label")) { return new wxStaticText(panel, -1, GetNodeText(node), wxDefaultPosition, GetNodeSize(node)); } else if (type == wxT("text")) { RegisterControl(name, DynamicPreferences::T_TEXT); return new wxTextCtrl(panel, -1, wxEmptyString, wxDefaultPosition, GetNodeSize(node), 0, wxDefaultValidator, wxT("s") + name); } else if (type == wxT("select")) { wxXmlNode* tmp_node = node->GetChildren(); wxComboBox* combobox = new wxComboBox(panel, -1, wxEmptyString, wxDefaultPosition, GetNodeSize(node), 0, NULL, wxCB_READONLY); combobox->SetName(wxT("c") + name); while (tmp_node != NULL) { if (tmp_node->GetName() == wxT("option")) { combobox->Append(GetNodeText(tmp_node)); } tmp_node = tmp_node->GetNext(); } combobox->SetAutoLayout(true); RegisterControl(name, DynamicPreferences::T_SELECT); return combobox; } else if (type == wxT("bool")) { long value; node->GetPropVal(wxT("value"), wxT("0")).ToLong(&value); RegisterControl(name, DynamicPreferences::T_CHECK); wxCheckBox* checkbox = new wxCheckBox(panel, -1, GetNodeText(node), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, wxT("b") + name); if (value == 1) { cout << "Setting value of " << name << " to true." << endl; checkbox->SetValue(true); static_cast<DynamicPreferencesCtrl *>(parent)->dynprefs->Add(name, true); } return checkbox; } else if (type == wxT("float")) { RegisterControl(name, DynamicPreferences::T_DTEXT); return new wxTextCtrl(panel, -1, "", wxDefaultPosition, GetNodeSize(node), 0, wxTextValidator(wxFILTER_NUMERIC, new wxString), wxT("f") + name); } else if (type == wxT("long")) { RegisterControl(name, DynamicPreferences::T_LTEXT); return new wxTextCtrl(panel, -1, "", wxDefaultPosition, GetNodeSize(node), 0, wxTextValidator(wxFILTER_NUMERIC, new wxString), wxT("l") + name); } else if (type == wxT("separator")) { return new wxStaticLine(panel, -1, wxDefaultPosition, wxSize(200, -1)); } else if (type == wxT("browse1")) { RegisterControl(name, DynamicPreferences::T_DIR); wxPanel* panel2 = new wxPanel(panel, -1, wxDefaultPosition, wxSize(250, 20)); wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxTextCtrl(panel2, -1, wxEmptyString, wxDefaultPosition, GetNodeSize(node), 0, wxDefaultValidator, wxT("d") + name), 1, wxEXPAND | wxALIGN_RIGHT | wxRIGHT, 5); sizer->Add(new wxButton(panel2, E_BROWSE1, _("Browse"), wxDefaultPosition, wxSize(45, 20), 0, wxDefaultValidator, wxT("b") + name), 0, wxALIGN_RIGHT); parent->Connect(E_BROWSE1, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) &DynamicPreferencesCtrl::OnBrowse1); ++E_BROWSE1; panel2->SetSizer(sizer); return panel2; } else if (type == wxT("slider")) { RegisterControl(name, DynamicPreferences::T_SLIDER); wxPanel* panel2 = new wxPanel(panel, -1, wxDefaultPosition, wxSize(250, 30)); wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); long min, max; node->GetPropVal(wxT("min"), wxT("0")).ToLong(&min); node->GetPropVal(wxT("max"), wxT("0")).ToLong(&max);#warning The "z" needs a rename. SmartSlider* slider = new SmartSlider(panel2, E_BROWSE1, 0, min, max, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL, wxDefaultValidator, wxT("z") + name); slider->m_string = GetNodeText(node); sizer->Add(new wxStaticText(panel2, -1, wxString::Format(slider->m_string, 0), wxDefaultPosition, GetNodeSize(node), wxADJUST_MINSIZE, wxT("z") + name + wxT("_2")), 0); sizer->Add(slider, 1, wxEXPAND | wxALIGN_RIGHT); parent->Connect(E_BROWSE1, wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)(wxScrollEventFunction) &DynamicPreferencesCtrl::OnSlider); ++E_BROWSE1; panel2->SetSizer(sizer); return panel2; } else if (type == wxT("colorlist")) { RegisterControl(name, DynamicPreferences::T_LLONG); wxPanel* panel2 = new wxPanel(panel, -1, wxDefaultPosition, wxSize(250, 20)); wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); wxComboBox* combobox = new wxComboBox(panel2, E_BROWSE1, wxEmptyString, wxDefaultPosition, GetNodeSize(node), 0, NULL, wxCB_READONLY, wxDefaultValidator, wxT("1") + name); sizer->Add(combobox, 1, wxEXPAND); sizer->Add(new wxButton(panel2, E_BROWSE2, wxT("Color"), wxDefaultPosition, wxSize(-1, 20), 0, wxDefaultValidator, wxT("2") + name), 0); parent->Connect(E_BROWSE1, wxEVT_COMMAND_COMBOBOX_SELECTED, (wxObjectEventFunction) &DynamicPreferencesCtrl::OnCombo); ++E_BROWSE1; ++E_BROWSE2; wxXmlNode* tmp_node = node->GetChildren(); while (tmp_node != NULL) { if (tmp_node->GetName() == wxT("option")) { combobox->Append(GetNodeText(tmp_node)); } tmp_node = tmp_node->GetNext(); } delete tmp_node; panel2->SetSizer(sizer);#warning This entire colorlist thing needs to be re-implemented :-/ return panel2; } else { return new wxWindow(panel, -1); }}void DynamicPreferencesCtrl::OnChangedPrefs(const wxEvent& event){ list< std::pair<const wxString, const short int > >::iterator it; for (it = controls.begin(); it != controls.end(); ++it) { wxString name((*it).first); const short int id((*it).second); if (id == DynamicPreferences::T_CHECK) { dynamic_cast<wxCheckBox*>(FindWindow(wxT("b") + name))->SetValue(dynprefs->Get<bool>(name)); } else if (id == DynamicPreferences::T_TEXT) { dynamic_cast<wxTextCtrl*>(FindWindow(wxT("s") + name))->SetValue(dynprefs->Get<wxString>(name)); } else if (id == DynamicPreferences::T_DTEXT) { dynamic_cast<wxTextCtrl*>(FindWindow(wxT("f") + name))->SetValue(wxString::Format("%f", dynprefs->Get<double>(name))); } else if (id == DynamicPreferences::T_LTEXT) { dynamic_cast<wxTextCtrl*>(FindWindow(wxT("l") + name))->SetValue(wxString::Format("%ld", dynprefs->Get<long>(name))); } else if (id == DynamicPreferences::T_SELECT) { dynamic_cast<wxComboBox*>(FindWindow(wxT("c") + name))->SetSelection(dynprefs->Get<long>(name)); } else if (id == DynamicPreferences::T_DIR) { dynamic_cast<wxTextCtrl*>(FindWindow(wxT("d") + name))->SetValue(dynprefs->Get<wxString>(name)); } else if (id == DynamicPreferences::T_SLIDER) { SmartSlider* tmp = (SmartSlider *)FindWindow(wxT("z") + name); dynamic_cast<wxStaticText *>(FindWindow(wxT("z") + name + wxT("_2")))->SetLabel(wxString::Format(tmp->m_string, dynprefs->Get<long>(name))); tmp->SetValue(dynprefs->Get<long>(name)); } }}void DynamicPreferencesCtrl::OnBrowse1(wxCommandEvent& event){ cout << "2. Name: " << this->FindWindowById(event.GetId())->GetName() << endl; wxString name(this->FindWindowById(event.GetId())->GetName()); wxDirDialog dirbox(this, "Choose a Folder that you wan't to share.", "~"); if (dirbox.ShowModal() == wxID_OK) { dynamic_cast<wxTextCtrl*>(FindWindow(wxT("d") + ControlName(name)))->SetValue(dirbox.GetPath() + wxT("/")); } }void DynamicPreferencesCtrl::OnCombo(wxCommandEvent& event){ static int old_id, old_value; int id, value; id = event.GetId(); value = event.GetInt(); if (id != old_id || value != old_value) { old_id = id; old_value = value; dynprefs->Add(ControlName(this->FindWindowById(event.GetId())->GetName()), static_cast<long>(value)); }}void DynamicPreferencesCtrl::OnSlider(wxScrollEvent& event){ long pos(static_cast<long>(event.GetPosition())); wxString name(this->FindWindowById(event.GetId())->GetName()); SmartSlider* tmp = dynamic_cast<SmartSlider *>(event.GetEventObject()); if (pos > 0) { dynamic_cast<wxStaticText *>(FindWindow(name + wxT("_2")))->SetLabel(wxString::Format(tmp->m_string, pos)); } else { wxString sTemp; sTemp = tmp->m_string.Left(tmp->m_string.Find(wxT(":")) + 2) + _("disabled"); dynamic_cast<wxStaticText *>(FindWindow(name + wxT("_2")))->SetLabel(sTemp); } dynprefs->Add(ControlName(name), pos);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -