1 
2 #include "options.h"
3 #include "optionssimple.h"
4 #include "optionsdetailed.h"
5 #include "outputdirectory.h"
6 #include "pluginloader.h"
7 #include "config.h"
8 
9 #include <QLayout>
10 
11 #include <KLocale>
12 #include <KTabWidget>
13 
14 
Options(Config * _config,const QString & text,QWidget * parent)15 Options::Options( Config *_config, const QString& text, QWidget *parent )
16     : QWidget( parent ),
17     config( _config )
18 {
19     QGridLayout *gridLayout = new QGridLayout( this );
20     gridLayout->setContentsMargins( 0, 0, 0, 0 );
21 
22     tab = new KTabWidget( this );
23     gridLayout->addWidget( tab, 0, 0 );
24     connect( tab, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)) );
25 
26     optionsSimple = new OptionsSimple( config, text, this );
27     connect( optionsSimple, SIGNAL(optionsChanged()), this, SLOT(simpleOptionsChanged()) );
28     connect( optionsSimple->outputDirectory, SIGNAL(modeChanged(int)), this, SLOT(simpleOutputDirectoryModeChanged(int)) );
29     connect( optionsSimple->outputDirectory, SIGNAL(directoryChanged(const QString&)), this, SLOT(simpleOutputDirectoryChanged(const QString&)) );
30 
31     optionsDetailed = new OptionsDetailed( config, this );
32     connect( optionsDetailed->outputDirectory, SIGNAL(modeChanged(int)), this, SLOT(detailedOutputDirectoryModeChanged(int)) );
33     connect( optionsDetailed, SIGNAL(currentDataRateChanged(int)), optionsSimple, SLOT(currentDataRateChanged(int)) );
34 
35     connect( optionsDetailed, SIGNAL(customProfilesEdited()), optionsSimple, SLOT(updateProfiles()) );
36     connect( optionsSimple, SIGNAL(customProfilesEdited()), optionsDetailed, SLOT(updateProfiles()) );
37 
38     optionsSimple->init();
39     optionsDetailed->init();
40 
41     QString format;
42     const QStringList formats = config->pluginLoader()->formatList(PluginLoader::Encode,PluginLoader::CompressionType(PluginLoader::InferiorQuality|PluginLoader::Lossy|PluginLoader::Lossless|PluginLoader::Hybrid));
43     if( config->data.general.defaultFormat == i18n("Last used") || config->data.general.defaultFormat == "Last used" )
44     {
45         format = config->data.general.lastFormat;
46     }
47     else
48     {
49         format = config->data.general.defaultFormat;
50     }
51     if( !formats.contains(format) )
52         format.clear();
53 
54     if( format.isEmpty() && formats.count() > 0 )
55     {
56         if( formats.contains(config->data.general.lastFormat) )
57             format = config->data.general.lastFormat;
58         else
59             format = formats.at(0);
60     }
61     optionsDetailed->setCurrentFormat( format );
62 
63     QString profile;
64     if( config->data.general.defaultProfile == i18n("Last used") || config->data.general.defaultProfile == "Last used" )
65     {
66         profile = "soundkonverter_last_used";
67     }
68     else
69     {
70         profile = config->data.general.defaultProfile;
71     }
72     if( profile.isEmpty() )
73         profile = i18n("High");
74 
75     optionsDetailed->setCurrentProfile( profile );
76 
77     const int startTab = ( config->data.general.startTab == 0 ) ? config->data.general.lastTab : config->data.general.startTab - 1;
78 
79     tab->addTab( optionsSimple, i18n("Simple") );
80     tab->addTab( optionsDetailed, i18n("Detailed") );
81 
82     tab->setCurrentIndex( startTab );
83 }
84 
~Options()85 Options::~Options()
86 {}
87 
currentConversionOptions()88 ConversionOptions *Options::currentConversionOptions()
89 {
90     return optionsDetailed->currentConversionOptions();
91 }
92 
setCurrentConversionOptions(const ConversionOptions * conversionOptions)93 bool Options::setCurrentConversionOptions( const ConversionOptions *conversionOptions )
94 {
95     const bool success = optionsDetailed->setCurrentConversionOptions( conversionOptions );
96     tabChanged( 0 ); // update optionsSimple
97     return success;
98 }
99 
simpleOutputDirectoryModeChanged(const int mode)100 void Options::simpleOutputDirectoryModeChanged( const int mode )
101 {
102     if( optionsDetailed && optionsDetailed->outputDirectory )
103         optionsDetailed->outputDirectory->setMode( (OutputDirectory::Mode)mode );
104 
105     config->data.general.lastOutputDirectoryMode = mode;
106 }
107 
simpleOutputDirectoryChanged(const QString & directory)108 void Options::simpleOutputDirectoryChanged( const QString& directory )
109 {
110     if( optionsDetailed && optionsDetailed->outputDirectory )
111         optionsDetailed->outputDirectory->setDirectory( directory );
112 }
113 
simpleOptionsChanged()114 void Options::simpleOptionsChanged()
115 {
116     optionsDetailed->setCurrentFormat( optionsSimple->currentFormat() );
117     optionsDetailed->setCurrentProfile( optionsSimple->currentProfile() );
118     optionsDetailed->resetFilterOptions();
119     optionsDetailed->setReplayGainChecked( optionsSimple->isReplayGainChecked() );
120     QString toolTip;
121     const bool replaygainEnabled = optionsDetailed->isReplayGainEnabled( &toolTip );
122     optionsSimple->setReplayGainEnabled( replaygainEnabled, toolTip );
123 }
124 
detailedOutputDirectoryModeChanged(const int mode)125 void Options::detailedOutputDirectoryModeChanged( const int mode )
126 {
127     config->data.general.lastOutputDirectoryMode = mode;
128 }
129 
tabChanged(const int pageIndex)130 void Options::tabChanged( const int pageIndex )
131 {
132     if( pageIndex == 0 )
133     {
134         // NOTE prevent signals from firing back
135         disconnect( optionsSimple, SIGNAL(optionsChanged()), 0, 0 );
136         disconnect( optionsSimple->outputDirectory, SIGNAL(modeChanged(int)), 0, 0 );
137         disconnect( optionsSimple->outputDirectory, SIGNAL(directoryChanged(const QString&)), 0, 0 );
138 
139         optionsSimple->updateProfiles();
140         optionsSimple->setCurrentProfile( optionsDetailed->currentProfile() );
141         optionsSimple->setCurrentFormat( optionsDetailed->currentFormat() );
142         QString toolTip;
143         const bool replaygainEnabled = optionsDetailed->isReplayGainEnabled( &toolTip );
144         const bool replaygainChecked = optionsDetailed->isReplayGainChecked();
145         optionsSimple->setReplayGainEnabled( replaygainEnabled, toolTip );
146         optionsSimple->setReplayGainChecked( replaygainChecked );
147         optionsSimple->setCurrentPlugin( optionsDetailed->getCurrentPlugin() );
148 
149         optionsSimple->outputDirectory->setMode( optionsDetailed->outputDirectory->mode() );
150         optionsSimple->outputDirectory->setDirectory( optionsDetailed->outputDirectory->directory() );
151 
152         connect( optionsSimple, SIGNAL(optionsChanged()), this, SLOT(simpleOptionsChanged()) );
153         connect( optionsSimple->outputDirectory, SIGNAL(modeChanged(int)), this, SLOT(simpleOutputDirectoryModeChanged(int)) );
154         connect( optionsSimple->outputDirectory, SIGNAL(directoryChanged(const QString&)), this, SLOT(simpleOutputDirectoryChanged(const QString&)) );
155     }
156 
157     config->data.general.lastTab = tab->currentIndex();
158 }
159 
setProfile(const QString & profile)160 void Options::setProfile( const QString& profile )
161 {
162     optionsSimple->setCurrentProfile( profile );
163     simpleOptionsChanged();
164 }
165 
setFormat(const QString & format)166 void Options::setFormat( const QString& format )
167 {
168     optionsSimple->setCurrentFormat( format );
169     simpleOptionsChanged();
170 }
171 
setOutputDirectoryMode(int mode)172 void Options::setOutputDirectoryMode( int mode )
173 {
174     QString directory;
175     optionsSimple->setCurrentOutputDirectoryMode( (OutputDirectory::Mode)mode );
176     if( mode == (int)OutputDirectory::Specify )
177         directory = config->data.general.specifyOutputDirectory;
178     else if( mode == (int)OutputDirectory::Source )
179         directory = "";
180     else if( mode == (int)OutputDirectory::MetaData )
181         directory = config->data.general.metaDataOutputDirectory;
182     else if( mode == (int)OutputDirectory::CopyStructure )
183         directory = config->data.general.copyStructureOutputDirectory;
184     optionsSimple->setCurrentOutputDirectory( directory );
185     simpleOutputDirectoryModeChanged( (OutputDirectory::Mode)mode );
186     simpleOutputDirectoryChanged( directory );
187 }
188 
setOutputDirectory(const QString & directory)189 void Options::setOutputDirectory( const QString& directory )
190 {
191     optionsSimple->setCurrentOutputDirectoryMode( OutputDirectory::Specify );
192     optionsSimple->setCurrentOutputDirectory( directory );
193     simpleOutputDirectoryModeChanged( OutputDirectory::Specify );
194     simpleOutputDirectoryChanged( directory );
195 }
196 
accepted()197 void Options::accepted()
198 {
199     const OutputDirectory::Mode mode = (OutputDirectory::Mode)config->data.general.lastOutputDirectoryMode;
200 
201     if( mode == OutputDirectory::MetaData )
202     {
203         const QString path = config->data.general.metaDataOutputDirectory;
204         if( config->data.general.lastMetaDataOutputDirectoryPaths.contains(path) )
205             config->data.general.lastMetaDataOutputDirectoryPaths.removeAll( path );
206         else if( config->data.general.lastMetaDataOutputDirectoryPaths.size() >= 5 )
207             config->data.general.lastMetaDataOutputDirectoryPaths.removeLast();
208         config->data.general.lastMetaDataOutputDirectoryPaths.prepend( path );
209     }
210     else if( mode == OutputDirectory::Specify )
211     {
212         const QString path = config->data.general.specifyOutputDirectory;
213         if( config->data.general.lastNormalOutputDirectoryPaths.contains(path) )
214             config->data.general.lastNormalOutputDirectoryPaths.removeAll( path );
215         else if( config->data.general.lastNormalOutputDirectoryPaths.size() >= 5 )
216             config->data.general.lastNormalOutputDirectoryPaths.removeLast();
217         config->data.general.lastNormalOutputDirectoryPaths.prepend( path );
218     }
219     else if( mode == OutputDirectory::CopyStructure )
220     {
221         const QString path = config->data.general.copyStructureOutputDirectory;
222         if( config->data.general.lastNormalOutputDirectoryPaths.contains(path) )
223             config->data.general.lastNormalOutputDirectoryPaths.removeAll( path );
224         else if( config->data.general.lastNormalOutputDirectoryPaths.size() >= 5 )
225             config->data.general.lastNormalOutputDirectoryPaths.removeLast();
226         config->data.general.lastNormalOutputDirectoryPaths.prepend( path );
227     }
228 }
229