preferences.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:11k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * preferences.cpp : Preferences
  3.  *****************************************************************************
  4.  * Copyright (C) 2006-2007 the VideoLAN team
  5.  * $Id: 89864d7a1649fe137020fff8a4592b07039ae227 $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  *          Jean-Baptiste Kempf <jb@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include "dialogs/preferences.hpp"
  28. #include "util/qvlcframe.hpp"
  29. #include "components/complete_preferences.hpp"
  30. #include "components/simple_preferences.hpp"
  31. #include <QHBoxLayout>
  32. #include <QGroupBox>
  33. #include <QRadioButton>
  34. #include <QPushButton>
  35. #include <QMessageBox>
  36. #include <QDialogButtonBox>
  37. PrefsDialog::PrefsDialog( QWidget *parent, intf_thread_t *_p_intf )
  38.             : QVLCDialog( parent, _p_intf )
  39. {
  40.     QGridLayout *main_layout = new QGridLayout( this );
  41.     setWindowTitle( qtr( "Preferences" ) );
  42.     /* Whether we want it or not, we need to destroy on close to get
  43.        consistency when reset */
  44.     setAttribute( Qt::WA_DeleteOnClose );
  45.     /* Create Panels */
  46.     tree_panel = new QWidget;
  47.     tree_panel_l = new QHBoxLayout;
  48.     tree_panel->setLayout( tree_panel_l );
  49.     main_panel = new QWidget;
  50.     main_panel_l = new QHBoxLayout;
  51.     main_panel->setLayout( main_panel_l );
  52.     /* Choice for types */
  53.     types = new QGroupBox( qtr("Show settings") );
  54.     types->setAlignment( Qt::AlignHCenter );
  55.     QHBoxLayout *types_l = new QHBoxLayout;
  56.     types_l->setSpacing( 3 ); types_l->setMargin( 3 );
  57.     small = new QRadioButton( qtr( "Simple" ), types );
  58.     small->setToolTip( qtr( "Switch to simple preferences view" ) );
  59.     types_l->addWidget( small );
  60.     all = new QRadioButton( qtr("All"), types ); types_l->addWidget( all );
  61.     all->setToolTip( qtr( "Switch to full preferences view" ) );
  62.     types->setLayout( types_l );
  63.     small->setChecked( true );
  64.     /* Tree and panel initialisations */
  65.     advanced_tree = NULL;
  66.     simple_tree = NULL;
  67.     current_simple_panel  = NULL;
  68.     advanced_panel = NULL;
  69.     /* Buttons */
  70.     QDialogButtonBox *buttonsBox = new QDialogButtonBox();
  71.     QPushButton *save = new QPushButton( qtr( "&Save" ) );
  72.     save->setToolTip( qtr( "Save and close the dialog" ) );
  73.     QPushButton *cancel = new QPushButton( qtr( "&Cancel" ) );
  74.     QPushButton *reset = new QPushButton( qtr( "&Reset Preferences" ) );
  75.     buttonsBox->addButton( save, QDialogButtonBox::AcceptRole );
  76.     buttonsBox->addButton( cancel, QDialogButtonBox::RejectRole );
  77.     buttonsBox->addButton( reset, QDialogButtonBox::ResetRole );
  78.     /* Layout  */
  79.     main_layout->addWidget( tree_panel, 0, 0, 3, 1 );
  80.     main_layout->addWidget( types, 3, 0, 2, 1 );
  81.     main_layout->addWidget( main_panel, 0, 1, 4, 2 );
  82.     main_layout->addWidget( buttonsBox, 4, 2, 1 ,1 );
  83.     main_layout->setColumnMinimumWidth( 0, 150 );
  84.     main_layout->setColumnMinimumWidth( 1, 10 );
  85.     main_layout->setColumnStretch( 0, 1 );
  86.     main_layout->setColumnStretch( 1, 0 );
  87.     main_layout->setColumnStretch( 2, 10 );
  88.     main_layout->setRowStretch( 2, 4 );
  89.     main_layout->setMargin( 9 );
  90.     setLayout( main_layout );
  91.     /* Margins */
  92.     tree_panel_l->setMargin( 1 );
  93.     main_panel_l->setLayoutMargins( 6, 0, 0, 3, 3 );
  94.     b_small = (p_intf->p_sys->i_screenHeight < 750);
  95.     if( b_small ) msg_Dbg( p_intf, "Small");
  96.     setMaximumHeight( p_intf->p_sys->i_screenHeight );
  97.     for( int i = 0; i < SPrefsMax ; i++ ) simple_panels[i] = NULL;
  98.     if( config_GetInt( p_intf, "qt-advanced-pref" ) || config_GetInt( p_intf, "advanced" ) )
  99.         setAdvanced();
  100.     else
  101.         setSmall();
  102.     BUTTONACT( save, save() );
  103.     BUTTONACT( cancel, cancel() );
  104.     BUTTONACT( reset, reset() );
  105.     BUTTONACT( small, setSmall() );
  106.     BUTTONACT( all, setAdvanced() );
  107.     resize( 780, sizeHint().height() );
  108. }
  109. void PrefsDialog::setAdvanced()
  110. {
  111.     /* We already have a simple TREE, and we just want to hide it */
  112.     if( simple_tree )
  113.         if( simple_tree->isVisible() ) simple_tree->hide();
  114.     /* If don't have already and advanced TREE, then create it */
  115.     if( !advanced_tree )
  116.     {
  117.         /* Creation */
  118.          advanced_tree = new PrefsTree( p_intf, tree_panel );
  119.         /* and connections */
  120.          CONNECT( advanced_tree,
  121.                   currentItemChanged( QTreeWidgetItem *, QTreeWidgetItem * ),
  122.                   this, changeAdvPanel( QTreeWidgetItem * ) );
  123.         tree_panel_l->addWidget( advanced_tree );
  124.     }
  125.     /* Show it */
  126.     advanced_tree->show();
  127.     /* Remove the simple current panel from the main panels*/
  128.     if( current_simple_panel )
  129.         if( current_simple_panel->isVisible() ) current_simple_panel->hide();
  130.     /* If no advanced Panel exist, create one, attach it and show it*/
  131.     if( !advanced_panel )
  132.     {
  133.         advanced_panel = new AdvPrefsPanel( main_panel );
  134.         main_panel_l->addWidget( advanced_panel );
  135.     }
  136.     advanced_panel->show();
  137.     /* Select the first Item of the preferences. Maybe you want to select a specified
  138.        category... */
  139.     advanced_tree->setCurrentIndex(
  140.             advanced_tree->model()->index( 0, 0, QModelIndex() ) );
  141.     all->setChecked( true );
  142. }
  143. void PrefsDialog::setSmall()
  144. {
  145.     /* If an advanced TREE exists, remove and hide it */
  146.     if( advanced_tree )
  147.         if( advanced_tree->isVisible() ) advanced_tree->hide();
  148.     /* If no simple_tree, create one, connect it */
  149.     if( !simple_tree )
  150.     {
  151.          simple_tree = new SPrefsCatList( p_intf, tree_panel, b_small );
  152.          CONNECT( simple_tree,
  153.                   currentItemChanged( int ),
  154.                   this,  changeSimplePanel( int ) );
  155.         tree_panel_l->addWidget( simple_tree );
  156.     }
  157.     /*show it */
  158.     simple_tree->show();
  159.     /* If an Advanced PANEL exists, remove it */
  160.     if( advanced_panel )
  161.         if( advanced_panel->isVisible() ) advanced_panel->hide();
  162.     if( !current_simple_panel )
  163.     {
  164.         current_simple_panel =
  165.             new SPrefsPanel( p_intf, main_panel, SPrefsDefaultCat, b_small );
  166.         simple_panels[SPrefsDefaultCat] =  current_simple_panel;
  167.         main_panel_l->addWidget( current_simple_panel );
  168.     }
  169.     current_simple_panel->show();
  170.     small->setChecked( true );
  171. }
  172. /* Switching from on simple panel to another */
  173. void PrefsDialog::changeSimplePanel( int number )
  174. {
  175.     if( current_simple_panel )
  176.         if( current_simple_panel->isVisible() ) current_simple_panel->hide();
  177.     current_simple_panel = simple_panels[number];
  178.     if( !current_simple_panel )
  179.     {
  180.         current_simple_panel  = new SPrefsPanel( p_intf, main_panel, number, b_small );
  181.         simple_panels[number] = current_simple_panel;
  182.         main_panel_l->addWidget( current_simple_panel );
  183.     }
  184.     current_simple_panel->show();
  185. }
  186. /* Changing from one Advanced Panel to another */
  187. void PrefsDialog::changeAdvPanel( QTreeWidgetItem *item )
  188. {
  189.     if( item == NULL ) return;
  190.     PrefsItemData *data = item->data( 0, Qt::UserRole ).value<PrefsItemData*>();
  191.     if( advanced_panel )
  192.         if( advanced_panel->isVisible() ) advanced_panel->hide();
  193.     if( !data->panel )
  194.     {
  195.         data->panel = new AdvPrefsPanel( p_intf, main_panel , data );
  196.         main_panel_l->addWidget( data->panel );
  197.     }
  198.     advanced_panel = data->panel;
  199.     advanced_panel->show();
  200. }
  201. #if 0
  202. /*Called from extended settings, is not used anymore, but could be useful one day*/
  203. void PrefsDialog::showModulePrefs( char *psz_module )
  204. {
  205.     setAdvanced();
  206.     all->setChecked( true );
  207.     for( int i_cat_index = 0 ; i_cat_index < advanced_tree->topLevelItemCount();
  208.          i_cat_index++ )
  209.     {
  210.         QTreeWidgetItem *cat_item = advanced_tree->topLevelItem( i_cat_index );
  211.         PrefsItemData *data = cat_item->data( 0, Qt::UserRole ).
  212.                                                    value<PrefsItemData *>();
  213.         for( int i_sc_index = 0; i_sc_index < cat_item->childCount();
  214.                                   i_sc_index++ )
  215.         {
  216.             QTreeWidgetItem *subcat_item = cat_item->child( i_sc_index );
  217.             PrefsItemData *sc_data = subcat_item->data(0, Qt::UserRole).
  218.                                                     value<PrefsItemData *>();
  219.             for( int i_module = 0; i_module < subcat_item->childCount();
  220.                                    i_module++ )
  221.             {
  222.                 QTreeWidgetItem *module_item = subcat_item->child( i_module );
  223.                 PrefsItemData *mod_data = module_item->data( 0, Qt::UserRole ).
  224.                                                     value<PrefsItemData *>();
  225.                 if( !strcmp( mod_data->psz_name, psz_module ) ) {
  226.                     advanced_tree->setCurrentItem( module_item );
  227.                 }
  228.             }
  229.         }
  230.     }
  231.     show();
  232. }
  233. #endif
  234. /* Actual apply and save for the preferences */
  235. void PrefsDialog::save()
  236. {
  237.     if( small->isChecked() && simple_tree->isVisible() )
  238.     {
  239.         msg_Dbg( p_intf, "Saving the simple preferences" );
  240.         for( int i = 0 ; i< SPrefsMax; i++ ){
  241.             if( simple_panels[i] )simple_panels[i]->apply();
  242.         }
  243.     }
  244.     else if( all->isChecked() && advanced_tree->isVisible() )
  245.     {
  246.         msg_Dbg( p_intf, "Saving the advanced preferences" );
  247.         advanced_tree->applyAll();
  248.     }
  249.     /* Save to file */
  250.     config_SaveConfigFile( p_intf, NULL );
  251.     accept();
  252. }
  253. /* Clean the preferences, dunno if it does something really */
  254. void PrefsDialog::cancel()
  255. {
  256.     reject();
  257. }
  258. /* Reset all the preferences, when you click the button */
  259. void PrefsDialog::reset()
  260. {
  261.     int ret = QMessageBox::question(
  262.                  this,
  263.                  qtr( "Reset Preferences" ),
  264.                  qtr( "Are you sure you want to reset your VLC media player preferences?" ),
  265.                  QMessageBox::Ok | QMessageBox::Cancel,
  266.                  QMessageBox::Ok);
  267.     if( ret == QMessageBox::Ok )
  268.     {
  269.         config_ResetAll( p_intf );
  270.         config_SaveConfigFile( p_intf, NULL );
  271.         getSettings()->clear();
  272.         accept();
  273.     }
  274. }