PreferencesWindow.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:27k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * PreferencesWindow.cpp: beos interface
  3.  *****************************************************************************
  4.  * Copyright (C) 1999, 2000, 2001 VideoLAN
  5.  * $Id: PreferencesWindow.cpp 6961 2004-03-05 17:34:23Z sam $
  6.  *
  7.  * Authors: Eric Petit <titer@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. #include <stdlib.h> /* atoi(), strtod() */
  24. #include <String.h>
  25. #include <vlc/vlc.h>
  26. #include <vlc/intf.h>
  27. #include <vlc_keys.h>
  28. #include "PreferencesWindow.h"
  29. /* TODO:
  30.     - add the needed LockLooper()s
  31.     - fix window resizing */
  32. /* We use this function to order the items of the BOutlineView */
  33. static int compare_func( const BListItem * _first,
  34.                          const BListItem * _second )
  35. {
  36.     StringItemWithView * first = (StringItemWithView*) _first;
  37.     StringItemWithView * second = (StringItemWithView*) _second;
  38.     /* The Modules tree at last */
  39.     if( !strcmp( first->Text(), _( "Modules" ) ) )
  40.         return 1;
  41.     if( !strcmp( second->Text(), _( "Modules" ) ) )
  42.         return -1;
  43.     /* alphabetic order */
  44.     return( strcmp( first->Text(), second->Text() ) );
  45. }
  46. /*****************************************************************************
  47.  * PreferencesWindow::PreferencesWindow
  48.  *****************************************************************************/
  49. PreferencesWindow::PreferencesWindow( intf_thread_t * p_interface,
  50.                                       BRect frame, const char * name )
  51.     : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
  52.                B_NOT_ZOOMABLE | B_NOT_RESIZABLE ),
  53.       fConfigScroll( NULL ),
  54.       p_intf( p_interface )
  55. {
  56.     SetSizeLimits( PREFS_WINDOW_WIDTH, PREFS_WINDOW_WIDTH,
  57.                    200, 2000 );
  58.     BRect rect;
  59.     /* The "background" view */
  60.     fPrefsView = new BView( Bounds(), NULL, B_FOLLOW_ALL, B_WILL_DRAW );
  61.     fPrefsView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  62.     AddChild( fPrefsView );
  63.     /* Create the preferences tree */
  64.     rect = Bounds();
  65.     rect.InsetBy( 10, 10 );
  66.     rect.right = rect.left + 150;
  67.     fOutline = new BOutlineListView( rect, "preferences tree",
  68.                                      B_SINGLE_SELECTION_LIST,
  69.                                      B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM );
  70.     BScrollView * scrollview =
  71.         new BScrollView( "scrollview", fOutline,
  72.                          B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,
  73.                          0, false, true );
  74.     fPrefsView->AddChild( scrollview );
  75.     /* We need to be informed if the user selects an item */
  76.     fOutline->SetSelectionMessage( new BMessage( PREFS_ITEM_SELECTED ) );
  77.     /* Create a dummy view so we can correctly place the real config
  78.        views later */
  79.     rect.bottom -= 40;
  80.     rect.left = rect.right + 15 + B_V_SCROLL_BAR_WIDTH;
  81.     rect.right = Bounds().right - 15;
  82.     fDummyView = new BView( rect, "", B_FOLLOW_ALL_SIDES, B_WILL_DRAW );
  83.     fDummyView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  84.     fPrefsView->AddChild( fDummyView );
  85.     /* Add a category for modules configuration */
  86.     StringItemWithView * modulesItem;
  87.     modulesItem = new StringItemWithView( _("Modules") );
  88.     fOutline->AddItem( modulesItem );
  89.     /* Fill the tree */
  90.     vlc_list_t * p_list;
  91.     p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );
  92.     if( !p_list )
  93.     {
  94.         msg_Warn( p_intf, "couldn't find any module !" );
  95.         return;
  96.     }
  97.     /* First, handle the main module */
  98.     module_t * p_module = NULL;
  99.     module_config_t * p_item;
  100.     for( int i = 0; i < p_list->i_count; i++ )
  101.     {
  102.         p_module = (module_t*) p_list->p_values[i].p_object;
  103.         if( !strcmp( p_module->psz_object_name, "main" ) &&
  104.             ( p_item = p_module->p_config ) )
  105.             break;
  106.         else
  107.             p_module = NULL;
  108.     }
  109.     if( p_module )
  110.     {
  111.         /* We found the main module */
  112.         while( p_item->i_type == CONFIG_HINT_CATEGORY )
  113.         {
  114.             StringItemWithView * stringItem;
  115.             stringItem = new StringItemWithView( p_item->psz_text );
  116.             p_item++;
  117.             BuildConfigView( stringItem, &p_item, true );
  118.             fOutline->AddItem( stringItem );
  119.         }
  120.     }
  121.     for( int i = 0; i < p_list->i_count; i++ )
  122.     {
  123.         p_module = (module_t*) p_list->p_values[i].p_object;
  124.         if( !strcmp( p_module->psz_object_name, "main" ) )
  125.             continue;
  126.         /* If the module has no config option, ignore it */
  127.         p_item = p_module->p_config;
  128.         if( !p_item )
  129.         {
  130.             continue;
  131.         }
  132.         do
  133.         {
  134.             if( p_item->i_type & CONFIG_ITEM )
  135.             {
  136.                 break;
  137.             }
  138.         } while( p_item->i_type != CONFIG_HINT_END && p_item++ );
  139.         if( p_item->i_type == CONFIG_HINT_END )
  140.         {
  141.             continue;
  142.         }
  143.         /* Create the capability tree if it doesn't already exist */
  144.         char * psz_capability;
  145.         psz_capability = p_module->psz_capability;
  146.         if( !psz_capability || !*psz_capability )
  147.         {
  148.             /* Empty capability ? Let's look at the submodules */
  149.             module_t * p_submodule;
  150.             for( int j = 0; j < p_module->i_children; j++ )
  151.             {
  152.                 p_submodule = (module_t*)p_module->pp_children[ j ];
  153.                 if( p_submodule->psz_capability &&
  154.                         *p_submodule->psz_capability )
  155.                 {
  156.                     psz_capability = p_submodule->psz_capability;
  157.                     break;
  158.                 }
  159.             }
  160.         }
  161.         StringItemWithView * capabilityItem;
  162.         capabilityItem = NULL;
  163.         for( int j = 0;
  164.              j < fOutline->CountItemsUnder( modulesItem, true ); j++ )
  165.         {
  166.             if( !strcmp( ((StringItemWithView*)
  167.                 fOutline->ItemUnderAt( modulesItem, true, j ))->Text(),
  168.                          psz_capability ) )
  169.             {
  170.                 capabilityItem = (StringItemWithView*)
  171.                     fOutline->ItemUnderAt( modulesItem, true, j );
  172.                 break;
  173.             }
  174.         }
  175.         if( !capabilityItem )
  176.         {
  177.              capabilityItem = new StringItemWithView( psz_capability );
  178.              fOutline->AddUnder( capabilityItem, modulesItem );
  179.         }
  180.         /* Now add the item ! */
  181.         StringItemWithView * stringItem;
  182.         stringItem = new StringItemWithView( p_module->psz_object_name );
  183.         BuildConfigView( stringItem, &p_item, false );
  184.         fOutline->AddUnder( stringItem, capabilityItem );
  185.     }
  186.     vlc_list_release( p_list );
  187.     /* Set the correct values */
  188.     ApplyChanges( false );
  189.     /* Sort items, collapse the tree */
  190.     fOutline->FullListSortItems( compare_func );
  191.     fOutline->Collapse( modulesItem );
  192.     for( int i = 0; i < fOutline->CountItemsUnder( modulesItem, true ); i++ )
  193.         fOutline->Collapse( fOutline->ItemUnderAt( modulesItem, true, i ) );
  194.     /* Select the first item */
  195.     fOutline->Select( 0 );
  196.     /* Add the buttons */
  197.     BButton * button;
  198.     rect = Bounds();
  199.     rect.InsetBy( 10, 10 );
  200.     rect.left = rect.right - 80;
  201.     rect.top = rect.bottom - 25;
  202.     button = new BButton( rect, "", _("Apply"), new BMessage( PREFS_APPLY ),
  203.                           B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
  204.     button->MakeDefault( true );
  205.     fPrefsView->AddChild( button );
  206.     rect.OffsetBy( -90, 0 );
  207.     button = new BButton( rect, "", _("Save"), new BMessage( PREFS_SAVE ),
  208.                           B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
  209.     fPrefsView->AddChild( button );
  210.     rect.OffsetBy( -90, 0 );
  211.     button = new BButton( rect, "", _("Defaults"),
  212.                           new BMessage( PREFS_DEFAULTS ),
  213.                           B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );
  214.     fPrefsView->AddChild( button );
  215.     Hide();
  216.     Show();
  217. }
  218. /*****************************************************************************
  219.  * PreferencesWindow::~PreferencesWindow
  220.  *****************************************************************************/
  221. PreferencesWindow::~PreferencesWindow()
  222. {
  223. }
  224. /*****************************************************************************
  225.  * PreferencesWindow::QuitRequested
  226.  *****************************************************************************/
  227. bool PreferencesWindow::QuitRequested()
  228. {
  229.     if( !IsHidden() )
  230.     {
  231.         Hide();
  232.     }
  233. return false;
  234. }
  235. /*****************************************************************************
  236.  * PreferencesWindow::MessageReceived
  237.  *****************************************************************************/
  238. void PreferencesWindow::MessageReceived( BMessage * message )
  239. {
  240.     switch( message->what )
  241.     {
  242.         case PREFS_ITEM_SELECTED:
  243.             Update();
  244.             break;
  245.         case PREFS_DEFAULTS:
  246.             config_ResetAll( p_intf );
  247.             ApplyChanges( false );
  248.             break;
  249.         case PREFS_APPLY:
  250.             ApplyChanges( true );
  251.             break;
  252.         case PREFS_SAVE:
  253.             SaveChanges();
  254.             break;
  255.         default:
  256.             BWindow::MessageReceived( message );
  257.     }
  258. }
  259. /*****************************************************************************
  260.  * PreferencesWindow::FrameResized
  261.  *****************************************************************************/
  262. void PreferencesWindow::FrameResized( float width, float height )
  263. {
  264.     BWindow::FrameResized( width, height );
  265.     UpdateScrollBar();
  266. }
  267. /*****************************************************************************
  268.  * PreferencesWindow::Update
  269.  *****************************************************************************/
  270. void PreferencesWindow::Update()
  271. {
  272.     /* Get the selected item, if any */
  273.     if( fOutline->CurrentSelection() < 0 )
  274.         return;
  275.     fCurrent = (StringItemWithView*)
  276.         fOutline->ItemAt( fOutline->CurrentSelection() );
  277.     if( !fCurrent->fConfigBox )
  278.         /* This is a category */
  279.         return;
  280.     /* Detach the old item */
  281.     if( fDummyView->CountChildren() > 0 )
  282.         fDummyView->RemoveChild( fDummyView->ChildAt( 0 ) );
  283.     /* Resize and show the new config box */
  284.     fCurrent->fConfigBox->ResizeTo( fDummyView->Bounds().Width(),
  285.                                     fDummyView->Bounds().Height() );
  286.     fDummyView->AddChild( fCurrent->fConfigBox );
  287.     /* Force redrawing of its children */
  288.     BRect rect = fCurrent->fConfigBox->Bounds();
  289.     rect.InsetBy( 10,10 );
  290.     rect.top += 10;
  291.     fCurrent->fConfigScroll->ResizeTo( rect.Width(), rect.Height() );
  292.     fCurrent->fConfigScroll->Draw( fCurrent->fConfigScroll->Bounds() );
  293.     UpdateScrollBar();
  294. }
  295. /*****************************************************************************
  296.  * PreferencesWindow::UpdateScrollBar
  297.  *****************************************************************************/
  298. void PreferencesWindow::UpdateScrollBar()
  299. {
  300.     /* We have to fix the scrollbar manually because it doesn't handle
  301.        correctly simple BViews */
  302.     if( !fCurrent )
  303.     {
  304.         return;
  305.     }
  306.     /* Get the available BRect for display */
  307.     BRect display = fCurrent->fConfigScroll->Bounds();
  308.     display.right -= B_V_SCROLL_BAR_WIDTH;
  309.     /* Fix the scrollbar */
  310.     BScrollBar * scrollBar;
  311.     long max;
  312. BRect visible = display & fCurrent->fConfigView->Bounds();
  313. BRect total = display | fCurrent->fConfigView->Bounds();
  314.     scrollBar = fCurrent->fConfigScroll->ScrollBar( B_VERTICAL );
  315.     max = (long)( fCurrent->fConfigView->Bounds().Height() - visible.Height() );
  316.     if( max < 0 ) max = 0;
  317.     scrollBar->SetRange( 0, max );
  318.     scrollBar->SetProportion( visible.Height() / total.Height() );
  319.     scrollBar->SetSteps( 10, 100 );
  320. }
  321. /*****************************************************************************
  322.  * PreferencesWindow::ApplyChanges
  323.  * Apply changes if doIt is true, revert them otherwise
  324.  *****************************************************************************/
  325. void PreferencesWindow::ApplyChanges( bool doIt )
  326. {
  327.     StringItemWithView * item;
  328.     BView              * view;
  329.     ConfigWidget       * child;
  330.     BString              string;
  331.     for( int i = 0; i < fOutline->CountItems(); i++ )
  332.     {
  333.         item = (StringItemWithView*) fOutline->ItemAt( i );
  334.         view = item->fConfigView;
  335.         if( !view )
  336.         {
  337.             /* This is a category */
  338.             continue;
  339.         }
  340.         for( int j = 0; j < view->CountChildren(); j++ )
  341.         {
  342.             child = (ConfigWidget*) view->ChildAt( j );
  343.             child->Apply( p_intf, doIt );
  344.         }
  345.     }
  346. }
  347. /*****************************************************************************
  348.  * PreferencesWindow::SaveChanges
  349.  *****************************************************************************/
  350. void PreferencesWindow::SaveChanges()
  351. {
  352.     ApplyChanges( true );
  353.     config_SaveConfigFile( p_intf, NULL );
  354. }
  355. /*****************************************************************************
  356.  * PreferencesWindow::ReallyQuit
  357.  *****************************************************************************/
  358. void PreferencesWindow::ReallyQuit()
  359. {
  360.     Lock();
  361.     Hide();
  362.     Quit();
  363. }
  364. /*****************************************************************************
  365.  * PreferencesWindow::BuildConfigView
  366.  *****************************************************************************/
  367. void PreferencesWindow::BuildConfigView( StringItemWithView * stringItem,
  368.                                          module_config_t ** pp_item,
  369.                                          bool stop_after_category )
  370. {
  371.     /* Build the BBox */
  372.     BRect rect = fDummyView->Bounds();
  373.     stringItem->fConfigBox = new BBox( rect, "config box", B_FOLLOW_ALL );
  374.     stringItem->fConfigBox->SetLabel( stringItem->fText );
  375.     /* Build the BView */
  376.     rect = stringItem->fConfigBox->Bounds();
  377.     rect.InsetBy( 10,10 );
  378.     rect.top += 10;
  379.     rect.right -= B_V_SCROLL_BAR_WIDTH + 5;
  380.     stringItem->fConfigView = new BView( rect, "config view",
  381.                                          B_FOLLOW_NONE, B_WILL_DRAW );
  382.     stringItem->fConfigView->SetViewColor(
  383.             ui_color( B_PANEL_BACKGROUND_COLOR ) );
  384.     /* Add all the settings options */
  385.     rect = stringItem->fConfigView->Bounds();
  386.     rect.InsetBy( 10, 10 );
  387.     ConfigTextControl * textControl;
  388.     ConfigCheckBox    * checkBox;
  389.     ConfigMenuField   * menuField;
  390.     ConfigSlider      * slider;
  391.     ConfigKey         * keyConfig;
  392.     for( ; (*pp_item)->i_type != CONFIG_HINT_END; (*pp_item)++ )
  393.     {
  394.         if( stop_after_category &&
  395.             (*pp_item)->i_type == CONFIG_HINT_CATEGORY )
  396.         {
  397.             break;
  398.         }
  399.         switch( (*pp_item)->i_type )
  400.         {
  401.             case CONFIG_ITEM_STRING:
  402.             case CONFIG_ITEM_FILE:
  403.             case CONFIG_ITEM_MODULE:
  404.             case CONFIG_ITEM_DIRECTORY:
  405.                 if( (*pp_item)->ppsz_list && (*pp_item)->ppsz_list[0] )
  406.                 {
  407.                     menuField = new ConfigMenuField( rect,
  408.                             (*pp_item)->i_type, (*pp_item)->psz_text,
  409.                             (*pp_item)->psz_name, (*pp_item)->ppsz_list );
  410.                     stringItem->fConfigView->AddChild( menuField );
  411.                     rect.top += menuField->Bounds().Height();
  412.                 }
  413.                 else
  414.                 {
  415.                     textControl = new ConfigTextControl( rect,
  416.                             (*pp_item)->i_type, (*pp_item)->psz_text,
  417.                             (*pp_item)->psz_name );
  418.                     stringItem->fConfigView->AddChild( textControl );
  419.                     rect.top += textControl->Bounds().Height();
  420.                 }
  421.                 break;
  422.             case CONFIG_ITEM_INTEGER:
  423.                 if( (*pp_item)->i_min == (*pp_item)->i_max )
  424.                 {
  425.                     textControl = new ConfigTextControl( rect,
  426.                             CONFIG_ITEM_INTEGER, (*pp_item)->psz_text,
  427.                             (*pp_item)->psz_name );
  428.                     stringItem->fConfigView->AddChild( textControl );
  429.                     rect.top += textControl->Bounds().Height();
  430.                 }
  431.                 else
  432.                 {
  433.                     slider = new ConfigSlider( rect, CONFIG_ITEM_INTEGER,
  434.                             (*pp_item)->psz_text, (*pp_item)->psz_name,
  435.                             (*pp_item)->i_min, (*pp_item)->i_max );
  436.                     stringItem->fConfigView->AddChild( slider );
  437.                     rect.top += slider->Bounds().Height();
  438.                 }
  439.                 break;
  440.             case CONFIG_ITEM_FLOAT:
  441.                 if( (*pp_item)->f_min == (*pp_item)->f_max )
  442.                 {
  443.                     textControl = new ConfigTextControl( rect,
  444.                             CONFIG_ITEM_FLOAT, (*pp_item)->psz_text,
  445.                             (*pp_item)->psz_name );
  446.                     stringItem->fConfigView->AddChild( textControl );
  447.                     rect.top += textControl->Bounds().Height();
  448.                 }
  449.                 else
  450.                 {
  451.                     slider = new ConfigSlider( rect, CONFIG_ITEM_FLOAT,
  452.                             (*pp_item)->psz_text, (*pp_item)->psz_name,
  453.                             100 * (*pp_item)->f_min, 100 * (*pp_item)->f_max );
  454.                     stringItem->fConfigView->AddChild( slider );
  455.                     rect.top += slider->Bounds().Height();
  456.                 }
  457.                 break;
  458.             case CONFIG_ITEM_BOOL:
  459.                 checkBox = new ConfigCheckBox( rect,
  460.                         CONFIG_ITEM_BOOL, (*pp_item)->psz_text,
  461.                         (*pp_item)->psz_name );
  462.                 stringItem->fConfigView->AddChild( checkBox );
  463.                 rect.top += checkBox->Bounds().Height();
  464.                 break;
  465.             case CONFIG_ITEM_KEY:
  466.                 keyConfig = new ConfigKey( rect, CONFIG_ITEM_KEY,
  467.                         (*pp_item)->psz_text, (*pp_item)->psz_name );
  468.                 stringItem->fConfigView->AddChild( keyConfig );
  469.                 rect.top += keyConfig->Bounds().Height();
  470.         }
  471.     }
  472.     /* Put the BView into a BScrollView */
  473.     stringItem->fConfigScroll =
  474.         new BScrollView( "config scroll", stringItem->fConfigView,
  475.                          B_FOLLOW_ALL, 0, false, true, B_FANCY_BORDER );
  476.     stringItem->fConfigScroll->SetViewColor(
  477.             ui_color( B_PANEL_BACKGROUND_COLOR ) );
  478.     stringItem->fConfigBox->AddChild( stringItem->fConfigScroll );
  479.     /* Adjust the configView size */
  480.     stringItem->fConfigView->ResizeTo(
  481.         stringItem->fConfigView->Bounds().Width(), rect.top );
  482. }
  483. ConfigWidget::ConfigWidget( BRect rect, int type, char * configName )
  484.     : BView( rect, NULL, B_FOLLOW_ALL, B_WILL_DRAW )
  485. {
  486.     fConfigType = type;
  487.     fConfigName = strdup( configName );
  488.     SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );
  489. }
  490. ConfigTextControl::ConfigTextControl( BRect rect, int type, char * label,
  491.                                       char * configName )
  492.     : ConfigWidget( BRect( rect.left, rect.top,
  493.                            rect.right, rect.top + 25 ),
  494.                     type, configName )
  495. {
  496.     fTextControl = new BTextControl( Bounds(), NULL, label, NULL,
  497.                                      new BMessage() );
  498.     AddChild( fTextControl );
  499. }
  500. void ConfigTextControl::Apply( intf_thread_t * p_intf, bool doIt )
  501. {
  502.     char string[1024];
  503.     switch( fConfigType )
  504.     {
  505.         case CONFIG_ITEM_STRING:
  506.         case CONFIG_ITEM_FILE:
  507.         case CONFIG_ITEM_MODULE:
  508.         case CONFIG_ITEM_DIRECTORY:
  509.             if( doIt )
  510.             {
  511.                 config_PutPsz( p_intf, fConfigName, fTextControl->Text() );
  512.             }
  513.             else
  514.             {
  515.                 fTextControl->SetText( config_GetPsz( p_intf, fConfigName ) );
  516.             }
  517.             break;
  518.         case CONFIG_ITEM_INTEGER:
  519.             if( doIt )
  520.             {
  521.                 config_PutInt( p_intf, fConfigName,
  522.                                atoi( fTextControl->Text() ) );
  523.             }
  524.             else
  525.             {
  526.                 memset( string, 0, 1024 );
  527.                 snprintf( string, 1023, "%d",
  528.                           config_GetInt( p_intf, fConfigName ) );
  529.                 fTextControl->SetText( string );
  530.             }
  531.             break;
  532.         case CONFIG_ITEM_FLOAT:
  533.             if( doIt )
  534.             {
  535.                 config_PutFloat( p_intf, fConfigName,
  536.                                  strtod( fTextControl->Text(), NULL ) );
  537.             }
  538.             else
  539.             {
  540.                 memset( string, 0, 1024 );
  541.                 snprintf( string, 1023, "%f",
  542.                           config_GetFloat( p_intf, fConfigName ) );
  543.                 fTextControl->SetText( string );
  544.             }
  545.             break;
  546.     }
  547. }
  548. ConfigCheckBox::ConfigCheckBox( BRect rect, int type, char * label,
  549.                                 char * configName )
  550.     : ConfigWidget( BRect( rect.left, rect.top,
  551.                            rect.right, rect.top + 25 ),
  552.                     type, configName )
  553. {
  554.     fCheckBox = new BCheckBox( Bounds(), NULL, label, new BMessage() );
  555.     AddChild( fCheckBox );
  556. }
  557. void ConfigCheckBox::Apply( intf_thread_t * p_intf, bool doIt )
  558. {
  559.     if( doIt )
  560.     {
  561.         config_PutInt( p_intf, fConfigName, fCheckBox->Value() );
  562.     }
  563.     else
  564.     {
  565.         fCheckBox->SetValue( config_GetInt( p_intf, fConfigName ) );
  566.     }
  567. }
  568. ConfigMenuField::ConfigMenuField( BRect rect, int type, char * label,
  569.                                   char * configName, char ** list )
  570.     : ConfigWidget( BRect( rect.left, rect.top,
  571.                            rect.right, rect.top + 25 ),
  572.                     type, configName )
  573. {
  574.     BMenuItem * menuItem;
  575.     fPopUpMenu = new BPopUpMenu( "" );
  576.     fMenuField = new BMenuField( Bounds(), NULL, label, fPopUpMenu );
  577.     for( int i = 0; list[i]; i++ )
  578.     {
  579.         menuItem = new BMenuItem( list[i], new BMessage() );
  580.         fPopUpMenu->AddItem( menuItem );
  581.     }
  582.     AddChild( fMenuField );
  583. }
  584. void ConfigMenuField::Apply( intf_thread_t * p_intf, bool doIt )
  585. {
  586.     BMenuItem * menuItem;
  587.     if( doIt )
  588.     {
  589.         menuItem = fPopUpMenu->FindMarked();
  590.         if( menuItem )
  591.         {
  592.             config_PutPsz( p_intf, fConfigName, menuItem->Label() );
  593.         }
  594.     }
  595.     else
  596.     {
  597.         char * value = config_GetPsz( p_intf, fConfigName );
  598.         if( !value )
  599.         {
  600.             value = "";
  601.         }
  602.         for( int i = 0; i < fPopUpMenu->CountItems(); i++ )
  603.         {
  604.             menuItem = fPopUpMenu->ItemAt( i );
  605.             if( !strcmp( value, menuItem->Label() ) )
  606.             {
  607.                 menuItem->SetMarked( true );
  608.                 break;
  609.             }
  610.         }
  611.     }
  612. }
  613. ConfigSlider::ConfigSlider( BRect rect, int type, char * label,
  614.                             char * configName, int min, int max )
  615.     : ConfigWidget( BRect( rect.left, rect.top,
  616.                            rect.right, rect.top + 40 ),
  617.                     type, configName )
  618. {
  619.     fSlider = new BSlider( Bounds(), NULL, label, new BMessage(),
  620.                            min, max, B_TRIANGLE_THUMB );
  621.     AddChild( fSlider );
  622. }
  623. void ConfigSlider::Apply( intf_thread_t * p_intf, bool doIt )
  624. {
  625.     switch( fConfigType )
  626.     {
  627.         case CONFIG_ITEM_INTEGER:
  628.             if( doIt )
  629.             {
  630.                 config_PutInt( p_intf, fConfigName, fSlider->Value() );
  631.             }
  632.             else
  633.             {
  634.                 fSlider->SetValue( config_GetInt( p_intf, fConfigName ) );
  635.             }
  636.             break;
  637.         case CONFIG_ITEM_FLOAT:
  638.             if( doIt )
  639.             {
  640.                 config_PutFloat( p_intf, fConfigName,
  641.                                  (float) fSlider->Value() / 100.0 );
  642.             }
  643.             else
  644.             {
  645.                 fSlider->SetValue( 100 *
  646.                         config_GetFloat( p_intf, fConfigName ) );
  647.             }
  648.             break;
  649.     }
  650. }
  651. ConfigKey::ConfigKey( BRect rect, int type, char * label,
  652.                             char * configName )
  653.     : ConfigWidget( BRect( rect.left, rect.top,
  654.                            rect.right, rect.top + 25 ),
  655.                     type, configName )
  656. {
  657.     BRect r = Bounds();
  658.     BMenuItem * menuItem;
  659.     r.left = r.right - 60;
  660.     fPopUpMenu = new BPopUpMenu( "" );
  661.     fMenuField = new BMenuField( r, NULL, NULL, fPopUpMenu );
  662.     for( unsigned i = 0;
  663.          i < sizeof( vlc_keys ) / sizeof( key_descriptor_t ); i++ )
  664.     {
  665.         menuItem = new BMenuItem( vlc_keys[i].psz_key_string, NULL );
  666.         fPopUpMenu->AddItem( menuItem );
  667.     }
  668.     r.right = r.left - 10; r.left = r.left - 60;
  669.     fShiftCheck = new BCheckBox( r, NULL, "Shift", new BMessage );
  670.     r.right = r.left - 10; r.left = r.left - 60;
  671.     fCtrlCheck = new BCheckBox( r, NULL, "Ctrl", new BMessage );
  672.     r.right = r.left - 10; r.left = r.left - 60;
  673.     fAltCheck = new BCheckBox( r, NULL, "Alt", new BMessage );
  674.     /* Can someone tell me how we're supposed to get GUI items aligned ? */
  675.     r.right = r.left - 10; r.left = 0;
  676.     r.bottom -= 10;
  677.     fStringView = new BStringView( r, NULL, label );
  678.     AddChild( fStringView );
  679.     AddChild( fAltCheck );
  680.     AddChild( fCtrlCheck );
  681.     AddChild( fShiftCheck );
  682.     AddChild( fMenuField );
  683. }
  684. void ConfigKey::Apply( intf_thread_t * p_intf, bool doIt )
  685. {
  686.     BMenuItem * menuItem;
  687.     if( doIt )
  688.     {
  689.         menuItem = fPopUpMenu->FindMarked();
  690.         if( menuItem )
  691.         {
  692.             int value = vlc_keys[fPopUpMenu->IndexOf( menuItem )].i_key_code;
  693.             if( fAltCheck->Value() )
  694.             {
  695.                 value |= KEY_MODIFIER_ALT;
  696.             }
  697.             if( fCtrlCheck->Value() )
  698.             {
  699.                 value |= KEY_MODIFIER_CTRL;
  700.             }
  701.             if( fShiftCheck->Value() )
  702.             {
  703.                 value |= KEY_MODIFIER_SHIFT;
  704.             }
  705.             config_PutInt( p_intf, fConfigName, value );
  706.         }
  707.     }
  708.     else
  709.     {
  710.         int value = config_GetInt( p_intf, fConfigName );
  711.         fAltCheck->SetValue( value & KEY_MODIFIER_ALT );
  712.         fCtrlCheck->SetValue( value & KEY_MODIFIER_CTRL );
  713.         fShiftCheck->SetValue( value & KEY_MODIFIER_SHIFT );
  714.         for( unsigned i = 0;
  715.              i < sizeof( vlc_keys ) / sizeof( key_descriptor_t ); i++ )
  716.         {
  717.             if( (unsigned) vlc_keys[i].i_key_code ==
  718.                     ( value & ~KEY_MODIFIER ) )
  719.             {
  720.                 menuItem = fPopUpMenu->ItemAt( i );
  721.                 menuItem->SetMarked( true );
  722.                 break;
  723.             }
  724.         }
  725.     }
  726. }