📄 preferences_dialog.cpp
字号:
if (!radio) throw "Can't get wxRadioBox*"; \ newValue = radio->GetStringSelection().c_str(); \ if (newValue != oldValue) { \ if (!RegistrySetString((section), (name), newValue)) \ throw "RegistrySetString() failed"; \ if (changedPtr) *((bool*) changedPtr) = true; \ } \ } while (0)#define SET_STRING_REGISTRY_VALUE_IF_DIFFERENT(section, name, textCtrl) \ do { \ string oldValue, newValue; \ if (!RegistryGetString((section), (name), &oldValue)) throw "RegistryGetString() failed"; \ newValue = (textCtrl)->GetValue().c_str(); \ if (newValue != oldValue) { \ if (!RegistrySetString((section), (name), newValue)) \ throw "RegistrySetString() failed"; \ } \ } while (0)// same as hitting done buttonvoid PreferencesDialog::OnCloseWindow(wxCloseEvent& event){ bool okay = true, qualityChanged = false; // set values if changed try { SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_QUALITY_ATOM_SLICES, iAtomSlices, &qualityChanged); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_QUALITY_ATOM_STACKS, iAtomStacks, &qualityChanged); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_QUALITY_BOND_SIDES, iBondSides, &qualityChanged); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_QUALITY_WORM_SIDES, iWormSides, &qualityChanged); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_QUALITY_WORM_SEGMENTS, iWormSegments, &qualityChanged); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_QUALITY_HELIX_SIDES, iHelixSides, &qualityChanged); SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_HIGHLIGHTS_ON, ID_C_HIGHLIGHT, &qualityChanged); SET_RADIO_REGISTRY_VALUE_IF_DIFFERENT(REG_QUALITY_SECTION, REG_PROJECTION_TYPE, ID_RADIOBOX, &qualityChanged); SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_CACHE_SECTION, REG_CACHE_ENABLED, ID_C_CACHE_ON, NULL); DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tCache, ID_T_CACHE_FOLDER, wxTextCtrl) SET_STRING_REGISTRY_VALUE_IF_DIFFERENT(REG_CACHE_SECTION, REG_CACHE_FOLDER, tCache); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_CACHE_SECTION, REG_CACHE_MAX_SIZE, iCacheSize, NULL); SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_CDD_ANNOT_READONLY, ID_C_ANNOT_RO, NULL);#ifdef __WXGTK__ DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tLaunch, ID_T_LAUNCH, wxTextCtrl) SET_STRING_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_BROWSER_LAUNCH, tLaunch);#endif SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_MAX_N_STRUCTS, iMaxStructs, NULL); SET_INTEGER_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_FOOTPRINT_RES, iFootRes, NULL); SET_DOUBLE_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_STEREO_SEPARATION, fSeparation, NULL); SET_BOOL_REGISTRY_VALUE_IF_DIFFERENT(REG_ADVANCED_SECTION, REG_PROXIMAL_STEREO, ID_C_PROXIMAL, NULL); // Limit cache size to current value now int size; if (iCacheSize->GetInteger(&size)) TruncateCache(size); } catch (const char *err) { ERRORMSG("Error setting registry values - " << err); okay = false; } // close dialog only if all user values are legit if (okay) { if (qualityChanged) GlobalMessenger()->PostRedrawAllStructures(); EndModal(wxOK); } else { if (event.CanVeto()) event.Veto(); }}void PreferencesDialog::OnButton(wxCommandEvent& event){ switch (event.GetId()) { case ID_B_DONE: { wxCloseEvent fake; OnCloseWindow(fake); // handle on-exit stuff there break; } case ID_B_CANCEL: EndModal(wxCANCEL); break; // quality page stuff case ID_B_Q_LOW: iWormSegments->SetInteger(2); iWormSides->SetInteger(4); iBondSides->SetInteger(4); iHelixSides->SetInteger(8); iAtomSlices->SetInteger(5); iAtomStacks->SetInteger(3); break; case ID_B_Q_MED: iWormSegments->SetInteger(6); iWormSides->SetInteger(6); iBondSides->SetInteger(6); iHelixSides->SetInteger(12); iAtomSlices->SetInteger(10); iAtomStacks->SetInteger(8); break; case ID_B_Q_HIGH: iWormSegments->SetInteger(10); iWormSides->SetInteger(20); iBondSides->SetInteger(16); iHelixSides->SetInteger(30); iAtomSlices->SetInteger(20); iAtomStacks->SetInteger(14); break; // cache page stuff case ID_B_CACHE_BROWSE: { DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(tCache, ID_T_CACHE_FOLDER, wxTextCtrl) wxString path; path = wxDirSelector("Select a cache folder:", tCache->GetValue()); if (path.size() > 0 && wxDirExists(path.c_str())) tCache->SetValue(path); break; } case ID_B_CACHE_CLEAR: TruncateCache(0); break; default: event.Skip(); }}void PreferencesDialog::OnCheckbox(wxCommandEvent& event){ if (event.GetId() == ID_C_CACHE_ON) { DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(c, ID_C_CACHE_ON, wxCheckBox) DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(st1, ID_T_CACHE_1, wxStaticText) DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(b1, ID_B_CACHE_BROWSE, wxButton) DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(t, ID_T_CACHE_FOLDER, wxTextCtrl) DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(st2, ID_T_CACHE_2, wxStaticText) DECLARE_AND_FIND_WINDOW_RETURN_ON_ERR(b2, ID_B_CACHE_CLEAR, wxButton) st1->Enable(c->GetValue()); b1->Enable(c->GetValue()); t->Enable(c->GetValue()); st2->Enable(c->GetValue()); b2->Enable(c->GetValue()); iCacheSize->GetTextCtrl()->Enable(c->GetValue()); iCacheSize->GetSpinButton()->Enable(c->GetValue()); }}END_SCOPE(Cn3D)USING_SCOPE(Cn3D);////////////////////////////////////////////////////////////////////////////////////////////////// The following is taken *unmodified* from wxDesigner's C++ code from preferences_dialog.wdr////////////////////////////////////////////////////////////////////////////////////////////////wxSizer *SetupPreferencesNotebook( wxWindow *parent, bool call_fit, bool set_sizer ){ wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); wxNotebook *item2 = new wxNotebook( parent, ID_NOTEBOOK, wxDefaultPosition, wxDefaultSize, 0 ); wxNotebookSizer *item1 = new wxNotebookSizer( item2 ); wxPanel *item3 = new wxPanel( item2, -1 ); SetupQualityPage( item3, FALSE ); item2->AddPage( item3, "Quality" ); wxPanel *item4 = new wxPanel( item2, -1 ); SetupCachePage( item4, FALSE ); item2->AddPage( item4, "Cache" ); wxPanel *item5 = new wxPanel( item2, -1 ); SetupAdvancedPage( item5, FALSE ); item2->AddPage( item5, "Advanced" ); item0->Add( item1, 0, wxALIGN_CENTRE|wxALL, 5 ); wxBoxSizer *item6 = new wxBoxSizer( wxHORIZONTAL ); wxButton *item7 = new wxButton( parent, ID_B_DONE, "Done", wxDefaultPosition, wxDefaultSize, 0 ); item7->SetDefault(); item6->Add( item7, 0, wxALIGN_CENTRE|wxALL, 5 ); item6->Add( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 ); wxButton *item8 = new wxButton( parent, ID_B_CANCEL, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ); item6->Add( item8, 0, wxALIGN_CENTRE|wxALL, 5 ); item0->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 ); if (set_sizer) { parent->SetAutoLayout( TRUE ); parent->SetSizer( item0 ); if (call_fit) { item0->Fit( parent ); item0->SetSizeHints( parent ); } } return item0;}////////////////////////////////////////////////////////////////////////////////////////////////// The following is modified from wxDesigner's C++ code from preferences_dialog.wdr////////////////////////////////////////////////////////////////////////////////////////////////wxSizer *SetupAdvancedPage( wxWindow *parent, bool call_fit, bool set_sizer ){ wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); wxStaticBox *item2 = new wxStaticBox( parent, -1, "Advanced" ); wxStaticBoxSizer *item1 = new wxStaticBoxSizer( item2, wxVERTICAL ); wxCheckBox *item3 = new wxCheckBox( parent, ID_C_ANNOT_RO, "CDD annotations are read-only", wxDefaultPosition, wxDefaultSize, 0 ); item3->SetValue( TRUE ); item1->Add( item3, 0, wxALIGN_CENTRE|wxALL, 5 );#ifdef __WXGTK__ wxFlexGridSizer *item4 = new wxFlexGridSizer( 1, 0, 0, 0 ); item4->AddGrowableCol( 0 ); wxTextCtrl *item5 = new wxTextCtrl( parent, ID_T_LAUNCH, "", wxDefaultPosition, wxSize(80,-1), 0 ); item4->Add( item5, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); wxStaticText *item6 = new wxStaticText( parent, ID_TEXT, "Browser launch", wxDefaultPosition, wxDefaultSize, 0 ); item4->Add( item6, 0, wxALIGN_CENTRE|wxALL, 5 ); item1->Add( item4, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 );#endif wxFlexGridSizer *item7 = new wxFlexGridSizer( 2, 0, 0, 0 ); item7->AddGrowableCol( 0 ); wxStaticText *item8 = new wxStaticText( parent, ID_TEXT, "Max structures to load:", wxDefaultPosition, wxDefaultSize, 0 ); item7->Add( item8, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); giMaxStructs = new IntegerSpinCtrl(parent, 0, 100, 1, 10, wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0, wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT)); item7->Add(giMaxStructs->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5); item7->Add(giMaxStructs->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5); wxStaticText *item11 = new wxStaticText( parent, ID_TEXT, "Footprint excess residues:", wxDefaultPosition, wxDefaultSize, 0 ); item7->Add( item11, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); giFootRes = new IntegerSpinCtrl(parent, 0, 1000, 5, 15, wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0, wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT)); item7->Add(giFootRes->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5); item7->Add(giFootRes->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5); item1->Add( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); item0->Add( item1, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); wxStaticBox *item15 = new wxStaticBox( parent, -1, wxT("Stereo Settings") ); wxStaticBoxSizer *item14 = new wxStaticBoxSizer( item15, wxVERTICAL ); wxFlexGridSizer *item16 = new wxFlexGridSizer( 3, 0, 0 ); item16->AddGrowableCol( 0 ); wxStaticText *item17 = new wxStaticText( parent, ID_TEXT, wxT("Eye separation (degrees):"), wxDefaultPosition, wxDefaultSize, 0 ); item16->Add( item17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); gfSeparation = new FloatingPointSpinCtrl(parent, 0.0, 15.0, 0.1, 5.0, wxDefaultPosition, wxSize(80,SPIN_CTRL_HEIGHT), 0, wxDefaultPosition, wxSize(-1,SPIN_CTRL_HEIGHT)); item16->Add(gfSeparation->GetTextCtrl(), 0, wxALIGN_CENTRE|wxLEFT|wxTOP|wxBOTTOM, 5); item16->Add(gfSeparation->GetSpinButton(), 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5); wxStaticText *item20 = new wxStaticText( parent, ID_TEXT, wxT("Proximal (cross-eyed):"), wxDefaultPosition, wxDefaultSize, 0 ); item16->Add( item20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); wxCheckBox *item21 = new wxCheckBox( parent, ID_C_PROXIMAL, wxT(""), wxDefaultPosition, wxDefaultSize, 0 ); item16->Add( item21, 0, wxALIGN_CENTRE|wxALL, 5 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -