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