⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preferenceswindow.cpp

📁 VLC媒体播放程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * PreferencesWindow.cpp: beos interface ***************************************************************************** * Copyright (C) 1999, 2000, 2001 VideoLAN * $Id: PreferencesWindow.cpp,v 1.27 2003/12/22 00:06:05 titer Exp $ * * Authors: Eric Petit <titer@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************/#include <stdlib.h> /* atoi(), strtod() */#include <String.h>#include <vlc/vlc.h>#include <vlc/intf.h>#include <vlc_keys.h>#include "PreferencesWindow.h"/* TODO:    - add the needed LockLooper()s    - fix window resizing *//* We use this function to order the items of the BOutlineView */static int compare_func( const BListItem * _first,                         const BListItem * _second ){    StringItemWithView * first = (StringItemWithView*) _first;    StringItemWithView * second = (StringItemWithView*) _second;    /* The Modules tree at last */    if( !strcmp( first->Text(), _( "Modules" ) ) )        return 1;    if( !strcmp( second->Text(), _( "Modules" ) ) )        return -1;    /* alphabetic order */    return( strcmp( first->Text(), second->Text() ) );}/***************************************************************************** * PreferencesWindow::PreferencesWindow *****************************************************************************/PreferencesWindow::PreferencesWindow( intf_thread_t * p_interface,                                      BRect frame, const char * name )    : BWindow( frame, name, B_FLOATING_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,               B_NOT_ZOOMABLE | B_NOT_RESIZABLE ),      fConfigScroll( NULL ),      p_intf( p_interface ){    SetSizeLimits( PREFS_WINDOW_WIDTH, PREFS_WINDOW_WIDTH,                   200, 2000 );    BRect rect;    /* The "background" view */    fPrefsView = new BView( Bounds(), NULL, B_FOLLOW_ALL, B_WILL_DRAW );    fPrefsView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );    AddChild( fPrefsView );    /* Create the preferences tree */    rect = Bounds();    rect.InsetBy( 10, 10 );    rect.right = rect.left + 150;    fOutline = new BOutlineListView( rect, "preferences tree",                                     B_SINGLE_SELECTION_LIST,                                     B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM );    BScrollView * scrollview =        new BScrollView( "scrollview", fOutline,                         B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,                         0, false, true );    fPrefsView->AddChild( scrollview );    /* We need to be informed if the user selects an item */    fOutline->SetSelectionMessage( new BMessage( PREFS_ITEM_SELECTED ) );    /* Create a dummy view so we can correctly place the real config       views later */    rect.bottom -= 40;    rect.left = rect.right + 15 + B_V_SCROLL_BAR_WIDTH;    rect.right = Bounds().right - 15;    fDummyView = new BView( rect, "", B_FOLLOW_ALL_SIDES, B_WILL_DRAW );    fDummyView->SetViewColor( ui_color( B_PANEL_BACKGROUND_COLOR ) );    fPrefsView->AddChild( fDummyView );    /* Add a category for modules configuration */    StringItemWithView * modulesItem;    modulesItem = new StringItemWithView( _("Modules") );    fOutline->AddItem( modulesItem );    /* Fill the tree */    vlc_list_t * p_list;    p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE );    if( !p_list )    {        msg_Warn( p_intf, "couldn't find any module !" );        return;    }    /* First, handle the main module */    module_t * p_module = NULL;    module_config_t * p_item;    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" ) &&            ( p_item = p_module->p_config ) )            break;        else            p_module = NULL;    }    if( p_module )    {        /* We found the main module */        while( p_item->i_type == CONFIG_HINT_CATEGORY )        {            StringItemWithView * stringItem;            stringItem = new StringItemWithView( p_item->psz_text );            p_item++;            BuildConfigView( stringItem, &p_item, true );            fOutline->AddItem( stringItem );        }    }    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" ) )            continue;        /* If the module has no config option, ignore it */        p_item = p_module->p_config;        if( !p_item )        {            continue;        }        do        {            if( p_item->i_type & CONFIG_ITEM )            {                break;            }        } while( p_item->i_type != CONFIG_HINT_END && p_item++ );        if( p_item->i_type == CONFIG_HINT_END )        {            continue;        }        /* Create the capability tree if it doesn't already exist */        char * psz_capability;        psz_capability = p_module->psz_capability;        if( !psz_capability || !*psz_capability )        {            /* Empty capability ? Let's look at the submodules */            module_t * p_submodule;            for( int j = 0; j < p_module->i_children; j++ )            {                p_submodule = (module_t*)p_module->pp_children[ j ];                if( p_submodule->psz_capability &&                        *p_submodule->psz_capability )                {                    psz_capability = p_submodule->psz_capability;                    break;                }            }        }        StringItemWithView * capabilityItem;        capabilityItem = NULL;        for( int j = 0;             j < fOutline->CountItemsUnder( modulesItem, true ); j++ )        {            if( !strcmp( ((StringItemWithView*)                fOutline->ItemUnderAt( modulesItem, true, j ))->Text(),                         psz_capability ) )            {                capabilityItem = (StringItemWithView*)                    fOutline->ItemUnderAt( modulesItem, true, j );                break;            }        }        if( !capabilityItem )        {             capabilityItem = new StringItemWithView( psz_capability );             fOutline->AddUnder( capabilityItem, modulesItem );        }        /* Now add the item ! */        StringItemWithView * stringItem;        stringItem = new StringItemWithView( p_module->psz_object_name );        BuildConfigView( stringItem, &p_item, false );        fOutline->AddUnder( stringItem, capabilityItem );    }    vlc_list_release( p_list );    /* Set the correct values */    ApplyChanges( false );    /* Sort items, collapse the tree */    fOutline->FullListSortItems( compare_func );    fOutline->Collapse( modulesItem );    for( int i = 0; i < fOutline->CountItemsUnder( modulesItem, true ); i++ )        fOutline->Collapse( fOutline->ItemUnderAt( modulesItem, true, i ) );    /* Select the first item */    fOutline->Select( 0 );    /* Add the buttons */    BButton * button;    rect = Bounds();    rect.InsetBy( 10, 10 );    rect.left = rect.right - 80;    rect.top = rect.bottom - 25;    button = new BButton( rect, "", _("Apply"), new BMessage( PREFS_APPLY ),                          B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );    button->MakeDefault( true );    fPrefsView->AddChild( button );    rect.OffsetBy( -90, 0 );    button = new BButton( rect, "", _("Save"), new BMessage( PREFS_SAVE ),                          B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );    fPrefsView->AddChild( button );    rect.OffsetBy( -90, 0 );    button = new BButton( rect, "", _("Defaults"),                          new BMessage( PREFS_DEFAULTS ),                          B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM );    fPrefsView->AddChild( button );    Hide();    Show();}/***************************************************************************** * PreferencesWindow::~PreferencesWindow *****************************************************************************/PreferencesWindow::~PreferencesWindow(){}/***************************************************************************** * PreferencesWindow::QuitRequested *****************************************************************************/bool PreferencesWindow::QuitRequested(){    if( !IsHidden() )    {        Hide();    }	return false;}/***************************************************************************** * PreferencesWindow::MessageReceived *****************************************************************************/void PreferencesWindow::MessageReceived( BMessage * message ){    switch( message->what )    {        case PREFS_ITEM_SELECTED:            Update();            break;        case PREFS_DEFAULTS:            config_ResetAll( p_intf );            ApplyChanges( false );            break;        case PREFS_APPLY:            ApplyChanges( true );            break;        case PREFS_SAVE:            SaveChanges();            break;        default:            BWindow::MessageReceived( message );    }}/***************************************************************************** * PreferencesWindow::FrameResized *****************************************************************************/void PreferencesWindow::FrameResized( float width, float height ){    BWindow::FrameResized( width, height );    UpdateScrollBar();}/***************************************************************************** * PreferencesWindow::Update *****************************************************************************/void PreferencesWindow::Update(){    /* Get the selected item, if any */    if( fOutline->CurrentSelection() < 0 )        return;    fCurrent = (StringItemWithView*)        fOutline->ItemAt( fOutline->CurrentSelection() );    if( !fCurrent->fConfigBox )        /* This is a category */        return;    /* Detach the old item */    if( fDummyView->CountChildren() > 0 )        fDummyView->RemoveChild( fDummyView->ChildAt( 0 ) );    /* Resize and show the new config box */    fCurrent->fConfigBox->ResizeTo( fDummyView->Bounds().Width(),                                    fDummyView->Bounds().Height() );    fDummyView->AddChild( fCurrent->fConfigBox );    /* Force redrawing of its children */    BRect rect = fCurrent->fConfigBox->Bounds();    rect.InsetBy( 10,10 );    rect.top += 10;    fCurrent->fConfigScroll->ResizeTo( rect.Width(), rect.Height() );    fCurrent->fConfigScroll->Draw( fCurrent->fConfigScroll->Bounds() );    UpdateScrollBar();}/***************************************************************************** * PreferencesWindow::UpdateScrollBar *****************************************************************************/void PreferencesWindow::UpdateScrollBar(){    /* We have to fix the scrollbar manually because it doesn't handle       correctly simple BViews */    if( !fCurrent )    {        return;    }    /* Get the available BRect for display */    BRect display = fCurrent->fConfigScroll->Bounds();    display.right -= B_V_SCROLL_BAR_WIDTH;    /* Fix the scrollbar */    BScrollBar * scrollBar;    long max;	BRect visible = display & fCurrent->fConfigView->Bounds();	BRect total = display | fCurrent->fConfigView->Bounds();    scrollBar = fCurrent->fConfigScroll->ScrollBar( B_VERTICAL );    max = (long)( fCurrent->fConfigView->Bounds().Height() - visible.Height() );    if( max < 0 ) max = 0;    scrollBar->SetRange( 0, max );    scrollBar->SetProportion( visible.Height() / total.Height() );    scrollBar->SetSteps( 10, 100 );}/***************************************************************************** * PreferencesWindow::ApplyChanges * Apply changes if doIt is true, revert them otherwise *****************************************************************************/void PreferencesWindow::ApplyChanges( bool doIt ){    StringItemWithView * item;    BView              * view;    ConfigWidget       * child;    BString              string;    for( int i = 0; i < fOutline->CountItems(); i++ )    {        item = (StringItemWithView*) fOutline->ItemAt( i );        view = item->fConfigView;        if( !view )        {            /* This is a category */            continue;        }        for( int j = 0; j < view->CountChildren(); j++ )        {            child = (ConfigWidget*) view->ChildAt( j );            child->Apply( p_intf, doIt );        }    }}/***************************************************************************** * PreferencesWindow::SaveChanges *****************************************************************************/void PreferencesWindow::SaveChanges(){    ApplyChanges( true );    config_SaveConfigFile( p_intf, NULL );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -