📄 preferenceswindow.cpp
字号:
} vlc_list_t * p_list = NULL; module_t * p_module = NULL; if( fType == TYPE_MODULE ) { p_module = (module_t *) vlc_object_get( p_intf, fObjectId ); } else { if( !( p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ) ) ) { return; } for( int i = 0; i < p_list->i_count; i++ ) { p_module = (module_t*) p_list->p_values[i].p_object; if( !strcmp( p_module->psz_object_name, "main" ) ) break; else p_module = NULL; } } if( !p_module || p_module->i_object_type != VLC_OBJECT_MODULE ) { /* Shouldn't happen */ return; } module_config_t * p_item; p_item = fSubModule ? ((module_t *)p_module->p_parent)->p_config : p_module->p_config; if( fType == TYPE_SUBCATEGORY ) { for( ; p_item->i_type != CONFIG_HINT_END; p_item++ ) { if( p_item->i_type == CONFIG_SUBCATEGORY && p_item->i_value == fObjectId ) { break; } } } r = fBox->Bounds(); r = BRect( 10,20,fBox->Bounds().right-B_V_SCROLL_BAR_WIDTH-10, fBox->Bounds().bottom-10 ); fView = new BView( r, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE ); fView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) ); r = fView->Bounds(); r.InsetBy( 10,10 ); ConfigWidget * widget; for( ; p_item->i_type != CONFIG_HINT_END; p_item++ ) { if( ( p_item->i_type == CONFIG_CATEGORY || p_item->i_type == CONFIG_SUBCATEGORY ) && fType == TYPE_SUBCATEGORY && p_item->i_value != fObjectId ) { break; } widget = new ConfigWidget( p_intf, r, p_item ); if( !widget->InitCheck() ) { delete widget; continue; } fView->AddChild( widget ); r.top += widget->Bounds().Height(); } if( fType == TYPE_MODULE ) { vlc_object_release( p_module ); } else { vlc_list_release( p_list ); } /* Create a scroll view around our fView */ fScroll = new BScrollView( NULL, fView, B_FOLLOW_ALL, 0, false, true, B_FANCY_BORDER ); fScroll->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) ); fBox->AddChild( fScroll ); /* Adjust fView's height to the size it actually needs (we do this only now so the BScrollView fits the BBox) */ fView->ResizeTo( fView->Bounds().Width(), r.top + 10 );}/*********************************************************************** * ConfigItem::~ConfigItem *********************************************************************** * **********************************************************************/ConfigItem::~ConfigItem(){ if( fHelp ) { free( fHelp ); }}/***************************************************************************** * ConfigItem::UpdateScrollBar *****************************************************************************/void ConfigItem::UpdateScrollBar(){ /* We have to fix the scrollbar manually because it doesn't handle correctly simple BViews */ if( !fScroll ) { return; } /* Get the available BRect for display */ BRect display = fScroll->Bounds(); display.right -= B_V_SCROLL_BAR_WIDTH; /* Fix the scrollbar */ BScrollBar * scrollBar; BRect visible = display & fView->Bounds(); BRect total = display | fView->Bounds(); scrollBar = fScroll->ScrollBar( B_VERTICAL ); long max = (long)( fView->Bounds().Height() - visible.Height() ); if( max < 0 ) max = 0; scrollBar->SetRange( 0, max ); scrollBar->SetProportion( visible.Height() / total.Height() ); scrollBar->SetSteps( 10, 100 ); /* We have to force redraw to avoid visual bugs when resizing (BeOS bug?) */ fScroll->Invalidate(); fView->Invalidate();}/***************************************************************************** * ConfigItem::ResetScroll *****************************************************************************/void ConfigItem::ResetScroll(){ if( !fScroll ) { return; } fView->ScrollTo( 0, 0 );}/*********************************************************************** * ConfigItem::Apply *********************************************************************** * **********************************************************************/void ConfigItem::Apply( bool doIt ){ if( !fScroll ) { return; } /* Call ConfigWidget::Apply for every child of your fView */ ConfigWidget * widget; for( int i = 0; i < fView->CountChildren(); i++ ) { widget = (ConfigWidget*) fView->ChildAt( i ); widget->Apply( doIt ); }}/*********************************************************************** * ConfigWidget::ConfigWidget *********************************************************************** * Builds a view with the right controls for the given config variable. * rect: the BRect where we place ourselves. All we care is its width * and its top coordinate, since we adapt our height to take only * the place we need **********************************************************************/ConfigWidget::ConfigWidget( intf_thread_t * _p_intf, BRect rect, module_config_t * p_item ) : BView( rect, NULL, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, B_WILL_DRAW ){ p_intf = _p_intf; SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) ); BRect r; BMenuItem * menuItem; /* Skip deprecated options */ if( p_item->psz_current ) { fInitOK = false; return; } fInitOK = true; fType = p_item->i_type; fName = strdup( p_item->psz_name ); switch( fType ) { case CONFIG_ITEM_MODULE: case CONFIG_ITEM_MODULE_CAT: case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_STRING: case CONFIG_ITEM_FILE: case CONFIG_ITEM_DIRECTORY: case CONFIG_ITEM_INTEGER: case CONFIG_ITEM_FLOAT: ResizeTo( Bounds().Width(), 25 ); fTextControl = new VTextControl( Bounds(), NULL, p_item->psz_text, NULL, new BMessage(), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP ); AddChild( fTextControl ); break; case CONFIG_ITEM_KEY: ResizeTo( Bounds().Width(), 25 ); r = Bounds(); r.left = r.right - 100; fPopUpMenu = new BPopUpMenu( "" ); fMenuField = new BMenuField( r, NULL, NULL, fPopUpMenu, B_FOLLOW_RIGHT | B_FOLLOW_TOP ); for( unsigned i = 0; i < sizeof( vlc_keys ) / sizeof( key_descriptor_t ); i++ ) { menuItem = new BMenuItem( vlc_keys[i].psz_key_string, NULL ); fPopUpMenu->AddItem( menuItem ); } r.right = r.left - 10; r.left = r.left - 60; fShiftCheck = new BCheckBox( r, NULL, "Shift", new BMessage(), B_FOLLOW_RIGHT | B_FOLLOW_TOP ); r.right = r.left - 10; r.left = r.left - 60; fCtrlCheck = new BCheckBox( r, NULL, "Ctrl", new BMessage(), B_FOLLOW_RIGHT | B_FOLLOW_TOP ); r.right = r.left - 10; r.left = r.left - 60; fAltCheck = new BCheckBox( r, NULL, "Alt", new BMessage(), B_FOLLOW_RIGHT | B_FOLLOW_TOP ); r.right = r.left - 10; r.left = 0; r.bottom -= 10; fStringView = new BStringView( r, NULL, p_item->psz_text, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP ); AddChild( fStringView ); AddChild( fAltCheck ); AddChild( fCtrlCheck ); AddChild( fShiftCheck ); AddChild( fMenuField ); break; case CONFIG_ITEM_BOOL: ResizeTo( Bounds().Width(), 25 ); fCheckBox = new BCheckBox( Bounds(), NULL, p_item->psz_text, new BMessage(), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP ); AddChild( fCheckBox ); break; case CONFIG_SECTION: fInitOK = false; break; default: fInitOK = false; }}ConfigWidget::~ConfigWidget(){ free( fName );}/*********************************************************************** * ConfigWidget::Apply *********************************************************************** * **********************************************************************/void ConfigWidget::Apply( bool doIt ){ BMenuItem * menuItem; char string[256]; vlc_value_t val; switch( fType ) { case CONFIG_ITEM_STRING: case CONFIG_ITEM_FILE: case CONFIG_ITEM_MODULE: case CONFIG_ITEM_MODULE_CAT: case CONFIG_ITEM_MODULE_LIST_CAT: case CONFIG_ITEM_DIRECTORY: if( doIt ) { config_PutPsz( p_intf, fName, fTextControl->Text() ); } else { fTextControl->SetText( config_GetPsz( p_intf, fName ) ); } break; case CONFIG_ITEM_INTEGER: if( doIt ) { config_PutInt( p_intf, fName, atoi( fTextControl->Text() ) ); } else { snprintf( string, 256, "%d", config_GetInt( p_intf, fName ) ); fTextControl->SetText( string ); } break; case CONFIG_ITEM_FLOAT: if( doIt ) { config_PutFloat( p_intf, fName, atof( fTextControl->Text() ) ); } else { snprintf( string, 256, "%f", config_GetFloat( p_intf, fName ) ); fTextControl->SetText( string ); } break; case CONFIG_ITEM_KEY: if( doIt ) { menuItem = fPopUpMenu->FindMarked(); if( menuItem ) { val.i_int = vlc_keys[fPopUpMenu->IndexOf( menuItem )].i_key_code; if( fAltCheck->Value() ) { val.i_int |= KEY_MODIFIER_ALT; } if( fCtrlCheck->Value() ) { val.i_int |= KEY_MODIFIER_CTRL; } if( fShiftCheck->Value() ) { val.i_int |= KEY_MODIFIER_SHIFT; } var_Set( p_intf->p_vlc, fName, val ); } } else { val.i_int = config_GetInt( p_intf, fName ); fAltCheck->SetValue( val.i_int & KEY_MODIFIER_ALT ); fCtrlCheck->SetValue( val.i_int & KEY_MODIFIER_CTRL ); fShiftCheck->SetValue( val.i_int & KEY_MODIFIER_SHIFT ); for( unsigned i = 0; i < sizeof( vlc_keys ) / sizeof( key_descriptor_t ); i++ ) { if( (unsigned) vlc_keys[i].i_key_code == ( val.i_int & ~KEY_MODIFIER ) ) { menuItem = fPopUpMenu->ItemAt( i ); menuItem->SetMarked( true ); break; } } } break; case CONFIG_ITEM_BOOL: if( doIt ) { config_PutInt( p_intf, fName, fCheckBox->Value() ); } else { fCheckBox->SetValue( config_GetInt( p_intf, fName ) ); } break; default: break; }}VTextView::VTextView( BRect frame, const char *name, uint32 resizingMode, uint32 flags ) : BTextView( frame, name, BRect( 10,10,10,10 ), resizingMode, flags ){ FrameResized( Bounds().Width(), Bounds().Height() );}void VTextView::FrameResized( float width, float height ){ BTextView::FrameResized( width, height ); SetTextRect( BRect( 10,10, width-11, height-11 ) );}VTextControl::VTextControl( BRect frame, const char *name, const char *label, const char *text, BMessage * message, uint32 resizingMode ) : BTextControl( frame, name, label, text, message, resizingMode ){ FrameResized( Bounds().Width(), Bounds().Height() );}void VTextControl::FrameResized( float width, float height ){ BTextControl::FrameResized( width, height ); SetDivider( width / 2 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -