1 // On the Mac, TREGL.h has to be included prior to anything else that might
2 // include GL/gl.h, or the wrong version of glext.h gets used, and things don't
3 // compile.  This is annoying, but it doesn't appear to hurt anything.
4 #include <TRE/TREGLExtensions.h>
5 #include <LDLoader/LDLModel.h>
6 #include <LDLoader/LDLPalette.h>
7 #include <TCFoundation/TCUserDefaults.h>
8 #include <TCFoundation/mystring.h>
9 #include "LDLib/LDUserDefaultsKeys.h"
10 #include <TCFoundation/TCMacros.h>
11 #include <TCFoundation/TCWebClient.h>
12 #include <QColor>
13 #include <QInputDialog>
14 #include <QMessageBox>
15 #include <QColorDialog>
16 #include <TCFoundation/TCLocalStrings.h>
17 #include "ModelViewerWidget.h"
18 #include "Preferences.h"
19 #include <LDLib/LDPreferences.h>
20 #include <LDLib/LDrawModelViewer.h>
21 
22 #define DEFAULT_PREF_SET TCLocalStrings::get("DefaultPrefSet")
23 
Preferences(QWidget * parent,ModelViewerWidget * modelWidget)24 Preferences::Preferences(QWidget *parent, ModelViewerWidget *modelWidget)
25 	:QDialog(parent),PreferencesPanel(),
26 	modelWidget(modelWidget),
27 	modelViewer(modelWidget->getModelViewer()),
28 	ldPrefs(new LDPreferences(modelViewer)),
29 	checkAbandon(true),
30 	proxyPortValidator(new QIntValidator(1,65535,this))
31 {
32 	setupUi(this);
33     connect( applyButton, SIGNAL( pressed() ), this, SLOT( doApply() ) );
34     connect( okButton, SIGNAL( clicked() ), this, SLOT( doOk() ) );
35     connect( cancelButton, SIGNAL( clicked() ), this, SLOT( doCancel() ) );
36     connect( primitvesResetButton, SIGNAL( clicked() ), this, SLOT( doResetPrimitives() ) );
37     connect( seamWidthButton, SIGNAL( clicked() ), this, SLOT( enableApply() ) );
38     connect( seamWidthSpin, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
39     connect( fieldOfViewSpin, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
40     connect( memoryUsageBox, SIGNAL( activated(int) ), this, SLOT( enableApply() ) );
41     connect( snapshotSaveDirBox, SIGNAL( activated(int) ), this, SLOT( snapshotSaveDirBoxChanged() ) );
42     connect( partsListsSaveDirBox, SIGNAL( activated(int) ), this, SLOT( partsListsSaveDirBoxChanged() ) );
43     connect( exportsListsSaveDirBox, SIGNAL( activated(int) ), this, SLOT( exportsListsSaveDirBoxChanged() ) );
44     connect( snapshotSaveDirButton, SIGNAL( clicked() ), this, SLOT( snapshotSaveDirBrowse() ) );
45     connect( partsListsSaveDirButton, SIGNAL( clicked() ), this, SLOT( partsListsSaveDirBrowse() ) );
46     connect( exportsSaveDirButton, SIGNAL( clicked() ), this, SLOT( exportsSaveDirBrowse() ) );
47     connect( transparentButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
48     connect( wireframeThicknessSlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
49     connect( edgesOnlyButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
50     connect( conditionalLinesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
51     connect( conditionalLinesButton, SIGNAL( toggled(bool) ), this, SLOT( doConditionalShow(bool) ) );
52     connect( conditionalShowAllButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
53     connect( conditionalShowControlPtsButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
54     connect( wireframeFogButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
55     connect( wireframeRemoveHiddenLineButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
56     connect( highQualityLinesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
57     connect( alwaysBlackLinesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
58     connect( edgeThicknessSlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
59     connect( showErrorsButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
60     connect( processLdconfigLdrButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
61     connect( randomColorsButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
62     connect( frameRateButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
63     connect( showAxesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
64     connect( partBoundingBoxOnlyBox, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
65     connect( aaLinesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
66     connect( qualityLightingButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
67     connect( subduedLightingButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
68     connect( specularLightingButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
69     connect( alternateLightingButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
70     connect( crossEyedStereoButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
71     connect( parallelStereoButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
72     connect( stereoAmountSlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
73     connect( colorCutawayButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
74     connect( monochromeCutawayButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
75     connect( sortTransparencyButton, SIGNAL( toggled(bool) ), this, SLOT( doSortTransparency(bool) ) );
76     connect( cutawayOpacitySlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
77     connect( cutawayThicknessSlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
78     connect( stippleTransparencyButton, SIGNAL( toggled(bool) ), this, SLOT( doStippleTransparency(bool) ) );
79     connect( flatShadingButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
80     connect( smoothCurvesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
81     connect( nearestFilteringButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
82     connect( bilinearFilteringButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
83     connect( trilinearFilteringButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
84     connect( anisotropicFilteringButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
85     connect( anisotropicFilteringButton, SIGNAL( toggled(bool) ), this, SLOT( doAnisotropic() ) );
86     connect( anisotropicFilteringSlider, SIGNAL( valueChanged(int) ), this, SLOT( doAnisotropicSlider(int) ) );
87     connect( anisotropicFilteringSlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
88     connect( curveQualitySlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
89     connect( lowQualityStudsButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
90     connect( hiresPrimitivesButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
91     connect( generalResetButton, SIGNAL( clicked() ), this, SLOT( doResetGeneral() ) );
92     connect( geometryResetButton, SIGNAL( clicked() ), this, SLOT( doResetGeometry() ) );
93     connect( effectsResetButton, SIGNAL( clicked() ), this, SLOT( doResetEffects() ) );
94     connect( updatesResetButton, SIGNAL( clicked() ), this, SLOT( doResetUpdates() ) );
95 	connect (updatesResetTimesButton, SIGNAL( clicked () ), this, SLOT (doResetTimesUpdates() ) );
96     connect( wireframeButton, SIGNAL( toggled(bool) ), this, SLOT( doWireframe(bool) ) );
97     connect( enableBFCButton, SIGNAL( toggled(bool) ), this, SLOT( doBFC(bool) ) );
98     connect( enableBFCButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
99     connect( bfcRedBackFaceButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
100     connect( bfcGreenFrontFaceButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
101     connect( bfcBlueNeutralFaceButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
102     connect( wireframeButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
103     connect( edgeLinesButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
104     connect( edgeLinesButton, SIGNAL( toggled(bool) ), this, SLOT( doEdgeLines(bool) ) );
105     connect( lightingButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
106     connect( lightingButton, SIGNAL( toggled(bool) ), this, SLOT( doLighting(bool) ) );
107     connect( lightingDir11, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
108     connect( lightingDir12, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
109     connect( lightingDir13, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
110     connect( lightingDir21, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
111     connect( lightingDir22, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
112     connect( lightingDir23, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
113     connect( lightingDir31, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
114     connect( lightingDir32, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
115     connect( lightingDir33, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
116     connect( effectsUseLIGHTDATButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
117     connect( effectsUseLIGHTDATButton, SIGNAL( toggled(bool) ), this, SLOT( doDrawLightDats() ) );
118     connect( effectsReplaceStandarLightButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
119     connect( effectsHideLIGHTButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
120     connect( stereoButton, SIGNAL( toggled(bool) ), this, SLOT( doStereo(bool) ) );
121     connect( stereoButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
122     connect( wireframeCutawayButton, SIGNAL( toggled(bool) ), this, SLOT( doWireframeCutaway(bool) ) );
123     connect( wireframeCutawayButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
124     connect( primitiveSubstitutionButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
125     connect( primitiveSubstitutionButton, SIGNAL( toggled(bool) ), this, SLOT( doPrimitiveSubstitution(bool) ) );
126     connect( textureStudsButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
127     connect( textureStudsButton, SIGNAL( toggled(bool) ), this, SLOT( doTextureStuds(bool) ) );
128 	connect( useTextureMapsButton, SIGNAL( stateChanged(int) ), this, SLOT( enableApply() ) );
129 	connect( useTextureMapsButton, SIGNAL( toggled(bool) ), this, SLOT( doTextureStuds(bool) ) );
130     connect( newPreferenceSetButton, SIGNAL( clicked() ), this, SLOT( doNewPreferenceSet() ) );
131     connect( delPreferenceSetButton, SIGNAL( clicked() ), this, SLOT( doDelPreferenceSet() ) );
132     connect( hotkeyPreferenceSetButton, SIGNAL( clicked() ), this, SLOT( doHotkeyPreferenceSet() ) );
133     connect( preferenceSetList, SIGNAL( currentItemChanged(QListWidgetItem *,QListWidgetItem *) ), this, SLOT( doPrefSetSelected(QListWidgetItem *,QListWidgetItem *) ) );
134     connect( backgroundColorButton, SIGNAL( clicked() ), this, SLOT( doBackgroundColor() ) );
135     connect( defaultColorButton, SIGNAL( clicked() ), this, SLOT( doDefaultColor() ) );
136     connect( updatesNoproxyButton, SIGNAL( toggled(bool) ), this, SLOT( disableProxy() ) );
137     connect( updatesProxyButton, SIGNAL( toggled(bool) ), this, SLOT( enableProxy() ) );
138     connect( updatesMissingpartsButton, SIGNAL( toggled(bool) ), this, SLOT( doUpdateMissingparts(bool) ) );
139     connect( updatesMissingpartsButton, SIGNAL( toggled(bool) ), this, SLOT( enableApply() ) );
140 	connect( transparentOffsetSlider, SIGNAL( valueChanged(int) ), this, SLOT( enableApply() ) );
141 
142 	portEdit->setValidator(proxyPortValidator);
143 	modelViewer = modelWidget->getModelViewer();
144 	resize(10, 10);
145 	loadSettings();
146 	ldPrefs->applySettings();
147 	reflectSettings();
148 #ifdef DEBUG
149 	setDebugLevel((int)TCUserDefaults::longForKey(DEBUG_LEVEL_KEY, 1, false));
150 #else // DEBUG
151 	setDebugLevel((int)TCUserDefaults::longForKey(DEBUG_LEVEL_KEY, 0, false));
152 #endif // DEBUG
153 	QStyle *style = defaultColorButton->style();
154 	if (style != NULL)
155 	{
156 		QString styleName = style->metaObject()->className();
157 		if (styleName == "QGtkStyle")
158 		{
159 			// QGtkStyle uses an image for the background, and doesn't show
160 			// the background color at all, so update the color buttons to use
161 			// the QWindowsStyle instead.
162 			// In Qt5 no need for changing the style, background color can be
163 			// set
164 #if QT_VERSION < 0x50000
165 			defaultColorButton->setStyle(&qlStyle);
166 			backgroundColorButton->setStyle(&qlStyle);
167 #else
168 			defaultColorButton->setStyle(QStyleFactory::create("Windows"));
169 			backgroundColorButton->setStyle(QStyleFactory::create("Windows"));
170 #endif
171 		}
172 	}
173 }
174 
~Preferences(void)175 Preferences::~Preferences(void)
176 {
177 }
178 
show(void)179 void Preferences::show(void)
180 {
181 	applyButton->setEnabled(false);
182 	QDialog::show();
183 	raise();
184 //	setActiveWindow();
185 }
186 
doPrefSetsApply(void)187 void Preferences::doPrefSetsApply(void)
188 {
189 	TCStringArray *oldPrefSetNames = TCUserDefaults::getAllSessionNames();
190 	int i;
191 	int b;
192 	int count = oldPrefSetNames->getCount();
193 //	char *prefSetName = NULL;
194 	const char *sessionName = TCUserDefaults::getSessionName();
195 	bool changed = false;
196 
197 	for (i = 0; i < count; i++)
198 	{
199 		char *oldPrefSetName = oldPrefSetNames->stringAtIndex(i);
200 		int index=-1;
201 		for(b = 0; b < preferenceSetList->count(); b++)
202 		{
203 			if (strcmp(oldPrefSetNames->stringAtIndex(i),
204 						preferenceSetList->item(b)->text().toUtf8().constData()) == 0)
205 			{
206 				index = b;
207 			}
208 		}
209 		if (index == -1)
210 		{
211 			TCUserDefaults::removeSession(oldPrefSetName);
212 		}
213 	}
214 	count=preferenceSetList->count();
215 	for(i = 1; i < count; i++)
216 	{
217 		if (oldPrefSetNames->indexOfString(getPrefSet(i)) < 0)
218 		{
219 			TCUserDefaults::setSessionName(getPrefSet(i), PREFERENCE_SET_KEY);
220 		}
221 	}
222 	oldPrefSetNames->release();
223 	if (getSelectedPrefSet() &&
224 		(strcmp(getSelectedPrefSet(), DEFAULT_PREF_SET) == 0))
225 	{
226 		if (sessionName && sessionName[0])
227         {
228 			TCUserDefaults::setSessionName(NULL, PREFERENCE_SET_KEY);
229 			changed = true;
230 		}
231 	}
232 	else
233 	{
234 		const char *selectedPrefSet = getSelectedPrefSet();
235 		if (!sessionName || !selectedPrefSet ||
236 			strcmp(sessionName, selectedPrefSet) != 0)
237 		{
238 			TCUserDefaults::setSessionName(selectedPrefSet, PREFERENCE_SET_KEY);
239 			changed = true;
240 		}
241 	}
242 	if (changed)
243 	{
244 		loadSettings();
245 		reflectSettings();
246 
247 		doGeneralApply();
248     	doGeometryApply();
249     	doEffectsApply();
250     	doPrimitivesApply();
251     	applyButton->setEnabled(false);
252     	if (modelWidget)
253     	{
254         	modelWidget->reflectSettings();
255         	modelWidget->doApply();
256         	setupDefaultRotationMatrix();
257     	}
258     	checkAbandon = true;
259 
260 	}
261 }
262 
doGeneralApply(void)263 void Preferences::doGeneralApply(void)
264 {
265 	QColor cTemp;
266 	int r, g, b;
267 
268 	ldPrefs->setLineSmoothing(aaLinesButton->checkState());
269 	ldPrefs->setShowFps(frameRateButton->checkState());
270 	ldPrefs->setShowAxes(showAxesButton->checkState());
271 	if (modelWidget)
272 		modelWidget->setShowFPS(ldPrefs->getShowFps());
273 	ldPrefs->setShowErrors(showErrorsButton->checkState());
274 	ldPrefs->setProcessLdConfig(processLdconfigLdrButton->checkState());
275 	ldPrefs->setRandomColors(randomColorsButton->checkState());
276 	cTemp = backgroundColorButton->palette().color(QPalette::Button);
277 	cTemp.getRgb(&r, &g, &b);
278 	ldPrefs->setBackgroundColor(r, g, b);
279 	cTemp = defaultColorButton->palette().color(QPalette::Button);
280 	cTemp.getRgb(&r, &g, &b);
281 	ldPrefs->setDefaultColor(r, g, b);
282 	ldPrefs->setFov(fieldOfViewSpin->value());
283 	ldPrefs->setMemoryUsage(memoryUsageBox->currentIndex());
284 	ldPrefs->setTransDefaultColor(transparentButton->checkState());
285 	LDPreferences::DefaultDirMode snapshotDirMode, partsListDirMode, exportDirMode;
286 	ldPrefs->setSnapshotsDirMode(snapshotDirMode =
287 				(LDPreferences::DefaultDirMode)snapshotSaveDirBox->currentIndex());
288 	if (snapshotDirMode == LDPreferences::DDMSpecificDir)
289 	{
290 		snapshotDir = snapshotSaveDirEdit->text();
291 		if(snapshotDir.length()>0)
292 		{
293 			ldPrefs->setSnapshotsDir(snapshotDir.toUtf8().constData());
294 		}
295 		else
296 		{
297 			ldPrefs->setSnapshotsDirMode(LDPreferences::DDMLastDir);
298 		}
299 	}
300 	ldPrefs->setPartsListsDirMode(partsListDirMode =
301 			(LDPreferences::DefaultDirMode)partsListsSaveDirBox->currentIndex());
302 	if (partsListDirMode == LDPreferences::DDMSpecificDir)
303 	{
304 		partsListDir = partsListsSaveDirEdit->text();
305 		if (partsListDir.length() > 0)
306 		{
307 			ldPrefs->setPartsListsDir(partsListDir.toUtf8().constData());
308 		}
309 		else
310 		{
311 			ldPrefs->setPartsListsDirMode(LDPreferences::DDMLastDir);
312 		}
313 	}
314 	ldPrefs->setSaveDirMode(LDPreferences::SOExport, exportDirMode =
315 			(LDPreferences::DefaultDirMode)exportsListsSaveDirBox->currentIndex());
316 	if (exportDirMode == LDPreferences::DDMSpecificDir)
317 	{
318 		exportDir = exportsSaveDirEdit->text();
319 		if (exportDir.length() > 0)
320 		{
321 			ldPrefs->setSaveDir(LDPreferences::SOExport, exportDir.toUtf8().constData());
322 		}
323 		else
324 		{
325 			ldPrefs->setSaveDirMode(LDPreferences::SOExport,
326                     LDPreferences::DDMLastDir);
327 		}
328 	}
329 	ldPrefs->applyGeneralSettings();
330 	ldPrefs->commitGeneralSettings();
331 }
332 
doGeometryApply(void)333 void Preferences::doGeometryApply(void)
334 {
335 	ldPrefs->setUseSeams(seamWidthButton->isChecked());
336 	ldPrefs->setBoundingBoxesOnly(partBoundingBoxOnlyBox->isChecked());
337 	ldPrefs->setSeamWidth(seamWidthSpin->value());
338 	ldPrefs->setDrawWireframe(wireframeButton->isChecked());
339 	if (ldPrefs->getDrawWireframe())
340 	{
341 		ldPrefs->setUseWireframeFog(wireframeFogButton->isChecked());
342 		ldPrefs->setRemoveHiddenLines(
343 			wireframeRemoveHiddenLineButton->isChecked());
344 	}
345 	ldPrefs->setBfc(enableBFCButton->isChecked());
346 	if (ldPrefs->getBfc())
347 	{
348 		ldPrefs->setRedBackFaces(bfcRedBackFaceButton->isChecked());
349 		ldPrefs->setGreenFrontFaces(bfcGreenFrontFaceButton->isChecked());
350 		ldPrefs->setBlueNeutralFaces(bfcBlueNeutralFaceButton->isChecked());
351 	}
352 	ldPrefs->setWireframeThickness(wireframeThicknessSlider->value());
353 	ldPrefs->setShowHighlightLines(edgeLinesButton->isChecked());
354 	if (ldPrefs->getShowHighlightLines())
355 	{
356 		ldPrefs->setEdgesOnly(edgesOnlyButton->isChecked());
357 		ldPrefs->setDrawConditionalHighlights(
358 			conditionalLinesButton->isChecked());
359 		if (ldPrefs->getDrawConditionalHighlights())
360 		{
361 			ldPrefs->setShowAllConditionalLines(
362 				conditionalShowAllButton->isChecked());
363 			ldPrefs->setShowConditionalControlPoints(
364 				conditionalShowControlPtsButton->isChecked());
365 		}
366 		ldPrefs->setUsePolygonOffset(highQualityLinesButton->isChecked());
367 		ldPrefs->setBlackHighlights(alwaysBlackLinesButton->isChecked());
368 		ldPrefs->setEdgeThickness(edgeThicknessSlider->value());
369 	}
370 	ldPrefs->applyGeometrySettings();
371 	ldPrefs->commitGeometrySettings();
372 }
373 
getSelectedLightDirection(void)374 LDPreferences::LightDirection Preferences::getSelectedLightDirection(void)
375 {
376 	LDPreferences::LightDirection lightDirection =
377 		LDPreferences::CustomDirection;
378     if(lightingDir11->isChecked())
379     {
380         lightDirection = LDPreferences::UpperLeft;
381     }
382     else if (lightingDir12->isChecked())
383     {
384     lightDirection = LDPreferences::UpperMiddle;
385     }
386     else if (lightingDir13->isChecked())
387     {
388         lightDirection = LDPreferences::UpperRight;
389     }
390     else if (lightingDir21->isChecked())
391     {
392         lightDirection = LDPreferences::MiddleLeft;
393     }
394     else if (lightingDir22->isChecked())
395     {
396         lightDirection = LDPreferences::MiddleMiddle;
397     }
398     else if (lightingDir23->isChecked())
399     {
400         lightDirection = LDPreferences::MiddleRight;
401     }
402     else if (lightingDir31->isChecked())
403     {
404         lightDirection = LDPreferences::LowerLeft;
405     }
406     else if (lightingDir32->isChecked())
407     {
408         lightDirection = LDPreferences::LowerMiddle;
409     }
410     else if (lightingDir33->isChecked())
411     {
412         lightDirection = LDPreferences::LowerRight;
413     }
414 	return lightDirection;
415 }
416 
doEffectsApply(void)417 void Preferences::doEffectsApply(void)
418 {
419 	LDVStereoMode smTemp = LDVStereoNone;
420 	LDVCutawayMode cmTemp = LDVCutawayNormal;
421 
422 	ldPrefs->setUseLighting(lightingButton->isChecked());
423 	if (ldPrefs->getUseLighting())
424 	{
425 		LDPreferences::LightDirection lightDirection =
426 			getSelectedLightDirection();
427 		ldPrefs->setQualityLighting(qualityLightingButton->isChecked());
428 		ldPrefs->setSubduedLighting(subduedLightingButton->isChecked());
429 		ldPrefs->setUseSpecular(specularLightingButton->isChecked());
430 		ldPrefs->setOneLight(alternateLightingButton->isChecked());
431 		if (lightDirection != LDPreferences::CustomDirection)
432 		{
433 			ldPrefs->setLightDirection(lightDirection);
434 		}
435 		if (effectsUseLIGHTDATButton->isChecked())
436 		{
437 			ldPrefs->setDrawLightDats(true);
438 			ldPrefs->setOptionalStandardLight(
439 				effectsReplaceStandarLightButton->isChecked());
440 		}
441 		else
442 		{
443 			ldPrefs->setDrawLightDats(false);
444 		}
445 	}
446 	ldPrefs->setNoLightGeom(effectsHideLIGHTButton->isChecked());
447 	if (!stereoButton->isChecked())
448 	{
449 		smTemp = LDVStereoNone;
450 	}
451 	else if (crossEyedStereoButton->isChecked())
452 	{
453 		smTemp = LDVStereoCrossEyed;
454 	}
455 	else if (parallelStereoButton->isChecked())
456 	{
457 		smTemp = LDVStereoParallel;
458 	}
459 	ldPrefs->setStereoMode(smTemp);
460 	ldPrefs->setStereoEyeSpacing(stereoAmountSlider->value());
461 	if (!wireframeCutawayButton->isChecked())
462 	{
463 		cmTemp = LDVCutawayNormal;
464 	}
465 	else if (colorCutawayButton->isChecked())
466 	{
467 		cmTemp = LDVCutawayWireframe;
468 	}
469 	else if (monochromeCutawayButton->isChecked())
470 	{
471 		cmTemp = LDVCutawayStencil;
472 	}
473 	ldPrefs->setCutawayMode(cmTemp);
474 	ldPrefs->setCutawayAlpha(cutawayOpacitySlider->value());
475 	ldPrefs->setCutawayThickness(cutawayThicknessSlider->value());
476 	ldPrefs->setSortTransparent(sortTransparencyButton->isChecked());
477 	ldPrefs->setUseStipple(stippleTransparencyButton->isChecked());
478 	ldPrefs->setUseFlatShading(flatShadingButton->isChecked());
479 	ldPrefs->setPerformSmoothing(smoothCurvesButton->isChecked());
480 	ldPrefs->applyEffectsSettings();
481 	ldPrefs->commitEffectsSettings();
482 }
483 
setAniso(int value)484 void Preferences::setAniso(int value)
485 {
486     QString s;
487 	int intLevel = 1 << value;
488     s = s.setNum(intLevel);
489     s+="x";
490 	if (value < 1 ) s = "";
491     anisotropicLabel->setText(s);
492 	anisotropicFilteringSlider->setValue(value);
493 	ldPrefs->setAnisoLevel(intLevel);
494 }
495 
doPrimitivesApply(void)496 void Preferences::doPrimitivesApply(void)
497 {
498 	int aniso = 0;
499 	bool aps,texmaps;
500 	ldPrefs->setTexmaps(texmaps = useTextureMapsButton->isChecked());
501 	ldPrefs->setAllowPrimitiveSubstitution(aps =
502 		primitiveSubstitutionButton->isChecked());
503 	if (ldPrefs->getAllowPrimitiveSubstitution())
504 	{
505 		ldPrefs->setTextureStuds(textureStudsButton->isChecked());
506 		ldPrefs->setCurveQuality(curveQualitySlider->value());
507 	}
508 	if (texmaps)
509 	{
510 		ldPrefs->setTextureOffsetFactor(transparentOffsetSlider->value()/10.0f);
511 	}
512 	if ((aps && ldPrefs->getTextureStuds()) || texmaps)
513 	{
514 		int iTemp = GL_NEAREST_MIPMAP_NEAREST;
515 
516 		if (nearestFilteringButton->isChecked())
517 		{
518 			iTemp = GL_NEAREST_MIPMAP_NEAREST;
519 		}
520 		else if (bilinearFilteringButton->isChecked())
521 		{
522 			iTemp = GL_LINEAR_MIPMAP_NEAREST;
523 		}
524 		else if (trilinearFilteringButton->isChecked())
525 		{
526 			iTemp = GL_LINEAR_MIPMAP_LINEAR;
527 		}
528 		else if (anisotropicFilteringButton->isChecked())
529 		{
530 			iTemp = GL_LINEAR_MIPMAP_LINEAR;
531 			aniso = anisotropicFilteringSlider->value();
532 		}
533 		ldPrefs->setTextureFilterType(iTemp);
534 		setAniso(aniso);
535 	}
536 	ldPrefs->setQualityStuds(!lowQualityStudsButton->isChecked());
537 	ldPrefs->setHiResPrimitives(hiresPrimitivesButton->isChecked());
538 	ldPrefs->applyPrimitivesSettings();
539 	ldPrefs->commitPrimitivesSettings();
540 }
541 
doUpdatesApply()542 void Preferences::doUpdatesApply()
543 {
544 	int  iTemp;
545 	bool ok;
546 
547 	ldPrefs->setCheckPartTracker(updatesMissingpartsButton->isChecked());
548 	if (updatesProxyButton->isChecked())
549 	{
550 		ldPrefs->setProxyType(2);
551 	}
552 	else
553 	{
554 		ldPrefs->setProxyType(0);
555 	}
556 	iTemp = portEdit->text().toInt(&ok);
557 	if (ok)
558 	{
559 		ldPrefs->setProxyPort(iTemp);
560 	}
561 	iTemp = daymissingpartcheckText->text().toInt(&ok);
562 	if (ok)
563     {
564 		ldPrefs->setMissingPartWait(iTemp);
565 	}
566 	iTemp = dayupdatedpartcheckText->text().toInt(&ok);
567 	if (ok)
568 	{
569 		ldPrefs->setUpdatedPartWait(iTemp);
570 	}
571 	ldPrefs->setProxyServer(proxyEdit->text().toLatin1().constData());
572 	ldPrefs->applyUpdatesSettings();
573 	ldPrefs->commitUpdatesSettings();
574 }
575 
doBackgroundColor()576 void Preferences::doBackgroundColor()
577 {
578 	int r,g,b;
579 
580 	ldPrefs->getBackgroundColor(r, g, b);
581 	QColor color = QColorDialog::getColor(QColor(r,g,b));
582 	if(color.isValid())
583 	{
584 		QPalette palette;
585 		palette.setColor(QPalette::Button, color);
586 		backgroundColorButton->setPalette(palette);
587 		applyButton->setEnabled(true);
588 	}
589 }
590 
doDefaultColor()591 void Preferences::doDefaultColor()
592 {
593 	int r, g, b, a, i;
594 	QRgb old[16];
595 
596     for (i = 0 ; i < 16; i++)
597     {
598 #if QT_VERSION < 0x50000
599 		old[i] = QColorDialog::customColor(i);
600 #else
601 		old[i] = QColorDialog::customColor(i).rgb();
602 #endif
603         LDLPalette::getDefaultRGBA(i, r, g, b, a);
604         QColorDialog::setCustomColor(i, qRgb(r, g, b));
605     }
606 	ldPrefs->getDefaultColor(r, g, b);
607 	QColor color = QColorDialog::getColor(QColor(r,g,b));
608 	if(color.isValid())
609 	{
610 		QPalette palette;
611 		palette.setColor(QPalette::Button, color);
612 		defaultColorButton->setPalette(palette);
613 		applyButton->setEnabled(true);
614 	}
615 	for (i = 0 ; i <16 ; i++)
616 		QColorDialog::setCustomColor(i, old[i]);
617 }
618 
doApply(void)619 void Preferences::doApply(void)
620 {
621 	doGeneralApply();
622 	doGeometryApply();
623 	doEffectsApply();
624 	doPrimitivesApply();
625 	doUpdatesApply();
626 	doPrefSetsApply();
627 	applyButton->setEnabled(false);
628 	if (modelWidget)
629 	{
630 		modelWidget->reflectSettings();
631 		modelWidget->doApply();
632 		setupDefaultRotationMatrix();
633 	}
634 	checkAbandon = true;
635 }
636 
doOk(void)637 void Preferences::doOk(void)
638 {
639 	doApply();
640 	QDialog::close();
641 }
642 
doCancel(void)643 void Preferences::doCancel(void)
644 {
645 	loadSettings();
646 	reflectSettings();
647 	QDialog::close();
648 }
649 
doAnisotropic(void)650 void Preferences::doAnisotropic(void)
651 {
652 	bool x = anisotropicFilteringButton->isChecked();
653 	anisotropicFilteringSlider->setEnabled(x);
654 	anisotropicLabel->setEnabled(x);
655 	doAnisotropicSlider(anisotropicFilteringSlider->value());
656 }
657 
doAnisotropicSlider(int i)658 void Preferences::doAnisotropicSlider(int i)
659 {
660 	QString s;
661 	s = s.setNum(1 << i);
662 	s+="x";
663 	anisotropicLabel->setText(s);
664 }
665 
getAllowPrimitiveSubstitution(void)666 bool Preferences::getAllowPrimitiveSubstitution(void)
667 {
668 	return ldPrefs->getAllowPrimitiveSubstitution();
669 }
670 
setButtonState(QCheckBox * button,bool state)671 void Preferences::setButtonState(QCheckBox *button, bool state)
672 {
673 	bool buttonState = button->isChecked();
674 
675 	if (state != buttonState)
676 	{
677 		button->toggle();
678 	}
679 }
680 
setButtonState(QRadioButton * button,bool state)681 void Preferences::setButtonState(QRadioButton *button, bool state)
682 {
683 	bool buttonState = button->isChecked();
684 
685 	if (state != buttonState)
686 	{
687 		button->toggle();
688 	}
689 }
690 
setRangeValue(QSpinBox * rangeControl,int value)691 void Preferences::setRangeValue(QSpinBox *rangeControl, int value)
692 {
693 	int rangeValue = rangeControl->value();
694 
695 	if (value != rangeValue)
696 	{
697 		rangeControl->setValue(value);
698 	}
699 }
700 
setRangeValue(QSlider * rangeControl,int value)701 void Preferences::setRangeValue(QSlider *rangeControl, int value)
702 {
703 	int rangeValue = rangeControl->value();
704 
705 	if (value != rangeValue)
706 	{
707 		rangeControl->setValue(value);
708 	}
709 }
710 
loadSettings(void)711 void Preferences::loadSettings(void)
712 {
713 	ldPrefs->loadSettings();
714 	loadOtherSettings();
715 }
716 
loadOtherSettings(void)717 void Preferences::loadOtherSettings(void)
718 {
719 	loadDefaultOtherSettings();
720 	statusBar = TCUserDefaults::longForKey(STATUS_BAR_KEY, (long)statusBar,
721 		false) != 0;
722 	toolBar  = TCUserDefaults::longForKey(TOOLBAR_KEY, (long)toolBar,
723         false) != 0;
724 	windowWidth = TCUserDefaults::longForKey(WINDOW_WIDTH_KEY, 640, false);
725 	windowHeight = TCUserDefaults::longForKey(WINDOW_HEIGHT_KEY, 480, false);
726 }
727 
loadDefaultOtherSettings(void)728 void Preferences::loadDefaultOtherSettings(void)
729 {
730 	statusBar = true;
731 	toolBar = true;
732 }
733 
setDrawWireframe(bool value)734 void Preferences::setDrawWireframe(bool value)
735 {
736     if (value != ldPrefs->getDrawWireframe())
737     {
738 		ldPrefs->setDrawWireframe(value, true, true);
739 		reflectWireframeSettings();
740 	}
741 }
742 
setUseWireframeFog(bool value)743 void Preferences::setUseWireframeFog(bool value)
744 {
745     if (value != ldPrefs->getUseWireframeFog())
746 	{
747 		ldPrefs->setUseWireframeFog(value, true, true);
748 		reflectWireframeSettings();
749 	}
750 }
751 
setRemoveHiddenLines(bool value)752 void Preferences::setRemoveHiddenLines(bool value)
753 {
754 	if (value != ldPrefs->getRemoveHiddenLines())
755 	{
756 		ldPrefs->setRemoveHiddenLines(value, true, true);
757 		reflectWireframeSettings();
758 	}
759 }
760 
setTextureStud(bool value)761 void Preferences::setTextureStud(bool value)
762 {
763     if (value != ldPrefs->getTextureStuds())
764 	{
765 		ldPrefs->setTextureStuds(value, true, true);
766         reflectPrimitivesSettings();
767 	}
768 }
769 
setEdgeOnly(bool value)770 void Preferences::setEdgeOnly(bool value)
771 {
772 	if (value != ldPrefs->getEdgesOnly())
773 	{
774 		ldPrefs->setEdgesOnly(value, true, true);
775 		reflectGeometrySettings();
776 	}
777 }
778 
setConditionalLine(bool value)779 void Preferences::setConditionalLine(bool value)
780 {
781 	if (value != ldPrefs->getDrawConditionalHighlights())
782 	{
783 		ldPrefs->setDrawConditionalHighlights(value, true, true);
784 		reflectGeometrySettings();
785 	}
786 }
787 
setHighQuality(bool value)788 void Preferences::setHighQuality(bool value)
789 {
790 	if (value != ldPrefs->getUsePolygonOffset())
791 	{
792 		ldPrefs->setUsePolygonOffset(value, true, true);
793 		reflectGeometrySettings();
794 	}
795 }
796 
setAlwaysBlack(bool value)797 void Preferences::setAlwaysBlack(bool value)
798 {
799 	if (value != ldPrefs->getBlackHighlights())
800 	{
801 		ldPrefs->setBlackHighlights(value, true, true);
802 		reflectGeometrySettings();
803 	}
804 }
805 
setRedBackFaces(bool value)806 void Preferences::setRedBackFaces(bool value)
807 {
808 	if (value != ldPrefs->getRedBackFaces())
809 	{
810 		ldPrefs->setRedBackFaces(value, true, true);
811 		reflectGeometrySettings();
812 	}
813 }
814 
setGreenFrontFaces(bool value)815 void Preferences::setGreenFrontFaces(bool value)
816 {
817 	if (value != ldPrefs->getGreenFrontFaces())
818 	{
819 		ldPrefs->setGreenFrontFaces(value, true, true);
820 		reflectGeometrySettings();
821 	}
822 }
823 
setBlueNeutralFaces(bool value)824 void Preferences::setBlueNeutralFaces(bool value)
825 {
826 	if (value != ldPrefs->getBlueNeutralFaces())
827 	{
828 		ldPrefs->setBlueNeutralFaces(value, true, true);
829 		reflectGeometrySettings();
830 	}
831 }
832 
setShowsHighlightLines(bool value)833 void Preferences::setShowsHighlightLines(bool value)
834 {
835 	if (value != ldPrefs->getShowHighlightLines())
836 	{
837 		ldPrefs->setShowHighlightLines(value, true, true);
838 		reflectGeometrySettings();
839 	}
840 }
841 
setAllowPrimitiveSubstitution(bool value)842 void Preferences::setAllowPrimitiveSubstitution(bool value)
843 {
844 	if (value != ldPrefs->getAllowPrimitiveSubstitution())
845 	{
846 		ldPrefs->setAllowPrimitiveSubstitution(value, true, true);
847 		reflectPrimitivesSettings();
848 	}
849 }
850 
setUseLighting(bool value)851 void Preferences::setUseLighting(bool value)
852 {
853     if (value != ldPrefs->getUseLighting())
854 	{
855 		ldPrefs->setUseLighting(value, true, true);
856 		reflectEffectsSettings();
857 	}
858 }
859 
setUseBFC(bool value)860 void Preferences::setUseBFC(bool value)
861 {
862 	if (value != ldPrefs->getBfc())
863 	{
864 		ldPrefs->setBfc(value, true, true);
865 		reflectGeometrySettings();
866 	}
867 }
868 
setShowAxes(bool value)869 void Preferences::setShowAxes(bool value)
870 {
871     if (value != ldPrefs->getShowAxes())
872     {
873         ldPrefs->setShowAxes(value, true, true);
874         reflectGeneralSettings();
875 	}
876 }
877 
setUseSeams(bool value)878 void Preferences::setUseSeams(bool value)
879 {
880     if (value != ldPrefs->getUseSeams())
881 	{
882 		ldPrefs->setUseSeams(value, true, true);
883 		reflectGeometrySettings();
884 	}
885 }
886 
reflectSettings(void)887 void Preferences::reflectSettings(void)
888 {
889 	reflectGeneralSettings();
890 	reflectGeometrySettings();
891 	reflectEffectsSettings();
892 	reflectPrimitivesSettings();
893 	reflectUpdatesSettings();
894 	setupPrefSetsList();
895 }
896 
reflectGeneralSettings(void)897 void Preferences::reflectGeneralSettings(void)
898 {
899 	int r, g, b;
900 
901 	setButtonState(aaLinesButton, ldPrefs->getLineSmoothing());
902 	setButtonState(frameRateButton, ldPrefs->getShowFps());
903 	setButtonState(showAxesButton, ldPrefs->getShowAxes());
904 	setButtonState(showErrorsButton, ldPrefs->getShowErrors());
905 	setButtonState(processLdconfigLdrButton,
906 		ldPrefs->getProcessLdConfig());
907 	setButtonState(randomColorsButton,ldPrefs->getRandomColors());
908 	ldPrefs->getBackgroundColor(r, g, b);
909 	QPalette palette0;
910 	palette0.setColor(QPalette::Button, QColor( r, g, b ));
911 	backgroundColorButton->setPalette(palette0);
912 	ldPrefs->getDefaultColor(r, g, b);
913 	QPalette palette;
914 	palette.setColor(QPalette::Button, QColor( r, g, b ));
915 	defaultColorButton->setPalette(palette);
916 	setRangeValue(fieldOfViewSpin, (int)ldPrefs->getFov());
917 	setButtonState(transparentButton, ldPrefs->getTransDefaultColor());
918 	memoryUsageBox->setCurrentIndex(ldPrefs->getMemoryUsage());
919 	setupSaveDirs();
920 }
921 
reflectGeometrySettings(void)922 void Preferences::reflectGeometrySettings(void)
923 {
924 	setButtonState(seamWidthButton, ldPrefs->getUseSeams());
925 	setRangeValue(seamWidthSpin, ldPrefs->getSeamWidth());
926 	partBoundingBoxOnlyBox->setChecked(ldPrefs->getBoundingBoxesOnly());
927 //	seamWidthSpin->setValue(seamWidth);
928 	reflectWireframeSettings();
929 	reflectBFCSettings();
930 //	wireframeThicknessSlider->setValue(wireframeThickness);
931 	edgeLinesButton->setChecked(ldPrefs->getShowHighlightLines());
932 	if (ldPrefs->getShowHighlightLines())
933 	{
934 		enableEdgeLines();
935 	}
936 	else
937 	{
938 		disableEdgeLines();
939 	}
940 	setRangeValue(edgeThicknessSlider, ldPrefs->getEdgeThickness());
941 //	edgeThicknessSlider->setValue(edgeThickness);
942 }
943 
reflectWireframeSettings(void)944 void Preferences::reflectWireframeSettings(void)
945 {
946 	wireframeButton->setChecked(ldPrefs->getDrawWireframe());
947 	setRangeValue(wireframeThicknessSlider,
948 		ldPrefs->getWireframeThickness());
949 	if (ldPrefs->getDrawWireframe())
950 	{
951 		enableWireframe();
952 	}
953 	else
954 	{
955 		disableWireframe();
956 	}
957 }
958 
reflectBFCSettings()959 void Preferences::reflectBFCSettings()
960 {
961 	enableBFCButton->setChecked(ldPrefs->getBfc());
962 	if (ldPrefs->getBfc())
963 	{
964 		enableBFC();
965 	}
966 	else
967 	{
968 		disableBFC();
969 	}
970 }
971 
reflectEffectsSettings(void)972 void Preferences::reflectEffectsSettings(void)
973 {
974 	lightingButton->setChecked(ldPrefs->getUseLighting());
975 	if (ldPrefs->getUseLighting())
976 	{
977 		enableLighting();
978 	}
979 	else
980 	{
981 		disableLighting();
982 	}
983 	setButtonState(effectsHideLIGHTButton, ldPrefs->getNoLightGeom());
984 	if (ldPrefs->getStereoMode() != LDVStereoNone)
985 	{
986 		stereoButton->setChecked(true);
987 		enableStereo();
988 	}
989 	else
990 	{
991 		stereoButton->setChecked(false);
992 		disableStereo();
993 	}
994 	stereoAmountSlider->setValue(ldPrefs->getStereoEyeSpacing());
995 	if (ldPrefs->getCutawayMode() != LDVCutawayNormal)
996 	{
997 		wireframeCutawayButton->setChecked(true);
998 		enableWireframeCutaway();
999 	}
1000 	else
1001 	{
1002 		wireframeCutawayButton->setChecked(false);
1003 		disableWireframeCutaway();
1004 	}
1005 	cutawayOpacitySlider->setValue(ldPrefs->getCutawayAlpha());
1006 	cutawayThicknessSlider->setValue(ldPrefs->getCutawayThickness());
1007 	setButtonState(sortTransparencyButton,
1008 		ldPrefs->getSortTransparent());
1009 	setButtonState(stippleTransparencyButton, ldPrefs->getUseStipple());
1010 	setButtonState(flatShadingButton, ldPrefs->getUseFlatShading());
1011 	setButtonState(smoothCurvesButton, ldPrefs->getPerformSmoothing());
1012 }
1013 
reflectPrimitivesSettings(void)1014 void Preferences::reflectPrimitivesSettings(void)
1015 {
1016 	primitiveSubstitutionButton->setChecked(
1017 		ldPrefs->getAllowPrimitiveSubstitution());
1018 	if (ldPrefs->getAllowPrimitiveSubstitution())
1019 	{
1020 		enablePrimitiveSubstitution();
1021 	}
1022 	else
1023 	{
1024 		disablePrimitiveSubstitution();
1025 	}
1026 	curveQualitySlider->setValue(ldPrefs->getCurveQuality());
1027 	setButtonState(lowQualityStudsButton, !ldPrefs->getQualityStuds());
1028 	setButtonState(hiresPrimitivesButton, ldPrefs->getHiResPrimitives());
1029 	useTextureMapsButton->setChecked(ldPrefs->getTexmaps());
1030 	if (ldPrefs->getTexmaps())
1031 	{
1032 		transparentOffsetSlider->setValue(ldPrefs->getTextureOffsetFactor()*10);
1033 	}
1034 }
1035 
reflectUpdatesSettings(void)1036 void Preferences::reflectUpdatesSettings(void)
1037 {
1038 	if (ldPrefs->getProxyType())
1039 	{
1040 		enableProxyServer();
1041 		updatesProxyButton->setChecked(true);
1042 	}
1043 	else
1044 	{
1045 		disableProxyServer();
1046 		updatesNoproxyButton->setChecked(true);
1047 	}
1048 	setButtonState(updatesMissingpartsButton,
1049 		ldPrefs->getCheckPartTracker());
1050 	proxyEdit->setText(ldPrefs->getProxyServer());
1051 	portEdit->setText(QString::number(ldPrefs->getProxyPort()));
1052 	daymissingpartcheckText->setValue(ldPrefs->getMissingPartWait());
1053 	dayupdatedpartcheckText->setValue(ldPrefs->getUpdatedPartWait());
1054 	doUpdateMissingparts(ldPrefs->getCheckPartTracker());
1055 }
1056 
doResetGeneral(void)1057 void Preferences::doResetGeneral(void)
1058 {
1059 	ldPrefs->loadDefaultGeneralSettings(false);
1060 	reflectGeneralSettings();
1061 }
1062 
doResetGeometry(void)1063 void Preferences::doResetGeometry(void)
1064 {
1065 	ldPrefs->loadDefaultGeometrySettings(false);
1066 	reflectGeometrySettings();
1067 }
1068 
doResetEffects(void)1069 void Preferences::doResetEffects(void)
1070 {
1071 	ldPrefs->loadDefaultEffectsSettings(false);
1072 	reflectEffectsSettings();
1073 }
1074 
doResetPrimitives(void)1075 void Preferences::doResetPrimitives(void)
1076 {
1077 	ldPrefs->loadDefaultPrimitivesSettings(false);
1078 	reflectPrimitivesSettings();
1079 }
1080 
doResetUpdates(void)1081 void Preferences::doResetUpdates(void)
1082 {
1083 	ldPrefs->loadDefaultUpdatesSettings(false);
1084 	reflectUpdatesSettings();
1085 }
1086 
doResetTimesUpdates(void)1087 void Preferences::doResetTimesUpdates(void)
1088 {
1089 	LDrawModelViewer::resetUnofficialDownloadTimes();
1090 }
1091 
getRGB(int color,int & r,int & g,int & b)1092 void Preferences::getRGB(int color, int &r, int &g, int &b)
1093 {
1094 	r = color & 0xFF;
1095 	g = (color >> 8) & 0xFF;
1096 	b = (color >> 16) & 0xFF;
1097 }
1098 
setStatusBar(bool value)1099 void Preferences::setStatusBar(bool value)
1100 {
1101 	if (value != statusBar)
1102 	{
1103 		statusBar = value;
1104 		TCUserDefaults::setLongForKey(statusBar ? 1 : 0, STATUS_BAR_KEY, false);
1105 	}
1106 }
1107 
setToolBar(bool value)1108 void Preferences::setToolBar(bool value)
1109 {
1110     if (value != toolBar)
1111 	{
1112 		toolBar = value;
1113 		 TCUserDefaults::setLongForKey(toolBar ? 1 : 0, TOOLBAR_KEY, false);
1114 	}
1115 }
1116 
getLastOpenPath(char * pathKey)1117 char *Preferences::getLastOpenPath(char *pathKey)
1118 {
1119 	char *path;
1120 	const char *constPathKey;
1121 
1122 	if (pathKey)
1123 	{
1124 		constPathKey = pathKey;
1125 	}
1126 	else
1127 	{
1128 		constPathKey = LAST_OPEN_PATH_KEY;
1129 	}
1130 	path = TCUserDefaults::stringForKey(constPathKey, NULL, false);
1131 	if (!path)
1132 	{
1133 		path = copyString("/dos/c/ldraw");
1134 	}
1135 	return path;
1136 }
1137 
setLastOpenPath(const char * path,char * pathKey)1138 void Preferences::setLastOpenPath(const char *path, char *pathKey)
1139 {
1140 	const char *constPathKey;
1141 
1142 	if (pathKey)
1143 	{
1144 		constPathKey = pathKey;
1145 	}
1146 	else
1147 	{
1148 		constPathKey = LAST_OPEN_PATH_KEY;
1149 	}
1150 	TCUserDefaults::setStringForKey(path, constPathKey, false);
1151 }
1152 
getLDrawDir(void)1153 char *Preferences::getLDrawDir(void)
1154 {
1155 	return TCUserDefaults::stringForKey(LDRAWDIR_KEY, NULL, false);
1156 }
1157 
setLDrawDir(const char * path)1158 void Preferences::setLDrawDir(const char *path)
1159 {
1160 	TCUserDefaults::setStringForKey(path, LDRAWDIR_KEY, false);
1161 }
1162 
getMaxRecentFiles(void)1163 long Preferences::getMaxRecentFiles(void)
1164 {
1165 	return TCUserDefaults::longForKey(MAX_RECENT_FILES_KEY, 10, false);
1166 }
1167 
getRecentFileKey(int index)1168 const QString &Preferences::getRecentFileKey(int index)
1169 {
1170 	static QString key;
1171 
1172 	key = QString("%1/File%2").arg(RECENT_FILES_KEY).arg(index,2,10,QLatin1Char('0'));
1173 	return key;
1174 }
1175 
getRecentFile(int index)1176 char *Preferences::getRecentFile(int index)
1177 {
1178 	return TCUserDefaults::stringForKey(getRecentFileKey(index).toLatin1().constData(), NULL, false);
1179 }
1180 
setRecentFile(int index,char * filename)1181 void Preferences::setRecentFile(int index, char *filename)
1182 {
1183 	if (filename)
1184 	{
1185 		TCUserDefaults::setStringForKey(filename, getRecentFileKey(index).toLatin1().constData(), false);
1186 	}
1187 	else
1188 	{
1189 		TCUserDefaults::removeValue(getRecentFileKey(index).toLatin1().constData(), false);
1190 	}
1191 }
1192 
getPollMode(void)1193 LDVPollMode Preferences::getPollMode(void)
1194 {
1195 	return (LDVPollMode)TCUserDefaults::longForKey(POLL_KEY, 0, false);
1196 }
1197 
setPollMode(LDVPollMode value)1198 void Preferences::setPollMode(LDVPollMode value)
1199 {
1200 	TCUserDefaults::setLongForKey(value, POLL_KEY, false);
1201 }
1202 
getViewMode(void)1203 LDInputHandler::ViewMode Preferences::getViewMode(void)
1204 {
1205 	return (LDInputHandler::ViewMode)TCUserDefaults::longForKey(VIEW_MODE_KEY, 0 , false);
1206 }
1207 
setViewMode(LDInputHandler::ViewMode value)1208 void Preferences::setViewMode(LDInputHandler::ViewMode value)
1209 {
1210 	TCUserDefaults::setLongForKey(value, VIEW_MODE_KEY, false);
1211 }
1212 
getLatLongMode(void)1213 bool Preferences::getLatLongMode(void)
1214 {
1215 	return TCUserDefaults::longForKey(EXAMINE_MODE_KEY, LDrawModelViewer::EMFree ,false);
1216 }
1217 
setLatLongMode(bool value)1218 void Preferences::setLatLongMode(bool value)
1219 {
1220 	TCUserDefaults::setLongForKey(value, EXAMINE_MODE_KEY, false);
1221 }
1222 
getKeepRightSideUp(void)1223 bool Preferences::getKeepRightSideUp(void)
1224 {
1225 	return TCUserDefaults::longForKey(KEEP_RIGHT_SIDE_UP_KEY, false, false);
1226 }
1227 
setKeepRightSideUp(bool value)1228 void Preferences::setKeepRightSideUp(bool value)
1229 {
1230 	TCUserDefaults::setLongForKey(value, KEEP_RIGHT_SIDE_UP_KEY, false);
1231 }
1232 
getPovAspectRatio(void)1233 bool Preferences::getPovAspectRatio(void)
1234 {
1235 	return TCUserDefaults::boolForKey(POV_CAMERA_ASPECT_KEY, false, false);
1236 }
1237 
setWindowSize(int width,int height)1238 void Preferences::setWindowSize(int width, int height)
1239 {
1240 	if (width != windowWidth)
1241 	{
1242 		windowWidth = width;
1243 		TCUserDefaults::setLongForKey(width, WINDOW_WIDTH_KEY, false);
1244 	}
1245 	if (height != windowHeight)
1246 	{
1247 		windowHeight = height;
1248 		TCUserDefaults::setLongForKey(height, WINDOW_HEIGHT_KEY, false);
1249 	}
1250 }
1251 
getWindowWidth(void)1252 int Preferences::getWindowWidth(void)
1253 {
1254 	return windowWidth;
1255 }
1256 
getWindowHeight(void)1257 int Preferences::getWindowHeight(void)
1258 {
1259 	return windowHeight;
1260 }
1261 
doWireframeCutaway(bool value)1262 void Preferences::doWireframeCutaway(bool value)
1263 {
1264 	if (value)
1265 	{
1266 		enableWireframeCutaway();
1267 	}
1268 	else
1269 	{
1270 		disableWireframeCutaway();
1271 	}
1272 }
1273 
doProxyServer(bool value)1274 void Preferences::doProxyServer(bool value)
1275 {
1276 	if (value)
1277 		enableProxyServer();
1278 	else
1279 		disableProxyServer();
1280 }
1281 
doUpdateMissingparts(bool value)1282 void Preferences::doUpdateMissingparts(bool value)
1283 {
1284     daymissingpartcheckText->setEnabled(value);
1285 	daymissingpartcheckLabel->setEnabled(value);
1286 	dayupdatedpartcheckLabel->setEnabled(value);
1287 	dayupdatedpartcheckText->setEnabled(value);
1288 }
1289 
doLighting(bool value)1290 void Preferences::doLighting(bool value)
1291 {
1292 	if (value)
1293 	{
1294 		enableLighting();
1295 	}
1296 	else
1297 	{
1298 		disableLighting();
1299 	}
1300 }
1301 
doDrawLightDats()1302 void Preferences::doDrawLightDats()
1303 {
1304 	bool checked = effectsUseLIGHTDATButton->isChecked();
1305 	effectsReplaceStandarLightButton->setEnabled(checked);
1306 	bool enabled = ldPrefs->getOptionalStandardLight() ? true : false;
1307 	if (!checked) enabled = false;
1308 	setButtonState(effectsReplaceStandarLightButton , enabled);
1309 }
1310 
doSaveDefaultViewAngle()1311 void Preferences::doSaveDefaultViewAngle()
1312 {
1313 	ldPrefs->saveDefaultView();
1314 }
1315 
doStereo(bool value)1316 void Preferences::doStereo(bool value)
1317 {
1318 	if (value)
1319 	{
1320 		enableStereo();
1321 	}
1322 	else
1323 	{
1324 		disableStereo();
1325 	}
1326 }
1327 
doSortTransparency(bool value)1328 void Preferences::doSortTransparency(bool value)
1329 {
1330 	if(value)
1331 	{
1332 		setButtonState(stippleTransparencyButton,false);
1333 	}
1334 	applyButton->setEnabled(true);
1335 }
1336 
doStippleTransparency(bool value)1337 void Preferences::doStippleTransparency(bool value)
1338 {
1339 	if(value)
1340 	{
1341 		setButtonState(sortTransparencyButton,false);
1342 	}
1343 	applyButton->setEnabled(true);
1344 }
1345 
doWireframe(bool value)1346 void Preferences::doWireframe(bool value)
1347 {
1348 	if (value)
1349 	{
1350 		enableWireframe();
1351 	}
1352 	else
1353 	{
1354 		disableWireframe();
1355 	}
1356 }
1357 
doBFC(bool value)1358 void Preferences::doBFC(bool value)
1359 {
1360 	if (value)
1361 	{
1362 		enableBFC();
1363 	}
1364 	else
1365 	{
1366 		disableBFC();
1367 	}
1368 }
1369 
doEdgeLines(bool value)1370 void Preferences::doEdgeLines(bool value)
1371 {
1372 	if (value)
1373 	{
1374 		enableEdgeLines();
1375 	}
1376 	else
1377 	{
1378 		disableEdgeLines();
1379 	}
1380 }
1381 
doConditionalShow(bool value)1382 void Preferences::doConditionalShow(bool value)
1383 {
1384     if (value)
1385     {
1386         enableConditionalShow();
1387 	}
1388 	else
1389 	{
1390 		disableConditionalShow();
1391 	}
1392 }
1393 
doPrimitiveSubstitution(bool value)1394 void Preferences::doPrimitiveSubstitution(bool value)
1395 {
1396 	if (value)
1397 	{
1398 		enablePrimitiveSubstitution();
1399 	}
1400 	else
1401 	{
1402 		disablePrimitiveSubstitution();
1403 	}
1404 }
1405 
doTextureStuds(bool value)1406 void Preferences::doTextureStuds(bool value)
1407 {
1408 	if (value || useTextureMapsButton->isChecked())
1409 	{
1410 		enableTextureStuds();
1411 	}
1412 	else
1413 	{
1414 		disableTextureStuds();
1415 	}
1416 	updateTexmapsEnabled();
1417 }
1418 
doNewPreferenceSet()1419 void Preferences::doNewPreferenceSet()
1420 {
1421     bool ok;
1422     QString name = QInputDialog::getText(this,QString("LDView New Preference Set"),
1423                    QString("Enter name of the new PreferenceSet"), QLineEdit::Normal,QString(),
1424                     &ok);
1425     if (ok && !name.isEmpty())
1426 	{
1427 		for(int i = 0; i < preferenceSetList->count(); i++)
1428 		{
1429 			if (getPrefSet(i) && strcmp(getPrefSet(i), name.toUtf8().constData())==0)
1430 			{
1431 				QMessageBox::warning(this,
1432 					QString::fromWCharArray(TCLocalStrings::get(L"PrefSetAlreadyExists")),
1433 					QString::fromWCharArray(TCLocalStrings::get(L"DuplicateName")),
1434 					QMessageBox::Ok,0);
1435 				return;
1436 			}
1437 		}
1438 		if (name.indexOf('/')!=-1)
1439 		{
1440 			QMessageBox::warning(this,
1441 				QString::fromWCharArray(TCLocalStrings::get(L"PrefSetNameBadChars")),
1442 				QString::fromWCharArray(TCLocalStrings::get(L"InvalidName")),
1443 				QMessageBox::Ok,0);
1444 				return;
1445 		}
1446 		new QListWidgetItem(name,preferenceSetList);
1447 		selectPrefSet(name.toUtf8().constData());
1448 		return;
1449 	}
1450 	if (name.isEmpty() && ok)
1451 	{
1452 		QMessageBox::warning(this,
1453 			QString::fromWCharArray(TCLocalStrings::get(L"PrefSetNameRequired")),
1454 			QString::fromWCharArray(TCLocalStrings::get(L"EmptyName")),
1455 			QMessageBox::Ok,0);
1456 		return;
1457 	}
1458 }
1459 
doDelPreferenceSet()1460 void Preferences::doDelPreferenceSet()
1461 {
1462 	const char *selectedPrefSet = getSelectedPrefSet();
1463 	if (selectedPrefSet)
1464 	{
1465 		int selectedIndex = preferenceSetList->currentRow();
1466 		if (checkAbandon && applyButton->isEnabled())
1467 		{
1468 			if(QMessageBox::warning(this,
1469 				QString::fromWCharArray(TCLocalStrings::get(L"AbandonChanges")),
1470 				QString::fromWCharArray(TCLocalStrings::get(L"PrefSetAbandonConfirm")),
1471 				 QMessageBox::Yes, QMessageBox::No)== QMessageBox::Yes)
1472 			{
1473 				abandonChanges();
1474 			}
1475 			else
1476 			{
1477 				return;
1478 			}
1479 		}
1480 		checkAbandon = false;
1481 		delete preferenceSetList->currentItem();
1482 		selectedIndex = preferenceSetList->currentRow();
1483 		selectedPrefSet = getPrefSet(selectedIndex);
1484 		selectPrefSet(selectedPrefSet, true);
1485 	}
1486 }
1487 
doHotkeyPreferenceSet()1488 void Preferences::doHotkeyPreferenceSet()
1489 {
1490 	hotKeyIndex = getCurrentHotKey();
1491 
1492 	if (hotKeyIndex == -1)
1493 	{
1494 		hotKeyIndex++;
1495 	}
1496 	else if (hotKeyIndex == 0)
1497 	{
1498 		hotKeyIndex = 10;
1499 	}
1500 	QStringList lst;
1501 	lst << TCLocalStrings::get("<None>") << "1" << "2" << "3" <<
1502 	"4" << "5" << "6" << "7" << "8" << "9" << "0";
1503 	bool ok;
1504 	QString res = QInputDialog::getItem(this,getSelectedPrefSet(),
1505 			"Select a hot key to automatically select this Preference Set:\nAlt + ",
1506 			lst, hotKeyIndex, false, &ok);
1507 	if (ok)
1508 	{
1509 		hotKeyIndex = lst.indexOf(res);
1510 		if(hotKeyIndex != -1)
1511 		{
1512 			saveCurrentHotKey();
1513 		}
1514 	}
1515 
1516 }
1517 
getHotKey(int index)1518 char *Preferences::getHotKey(int index)
1519 {
1520     char key[128];
1521 
1522     sprintf(key, "%s/Key%d", HOT_KEYS_KEY, index);
1523     return TCUserDefaults::stringForKey(key, NULL, false);
1524 }
1525 
getHotKey(const char * currentPrefSetName)1526 int Preferences::getHotKey(const char *currentPrefSetName)
1527 {
1528     int i;
1529     int retValue = -1;
1530 
1531     for (i = 0; i < 10 && retValue == -1; i++)
1532     {
1533         char *prefSetName = getHotKey(i);
1534 
1535         if (prefSetName)
1536         {
1537             if (strcmp(prefSetName, currentPrefSetName) == 0)
1538             {
1539                 retValue = i;
1540             }
1541             delete prefSetName;
1542         }
1543     }
1544     return retValue;
1545 }
1546 
performHotKey(int hotKeyIndex)1547 void Preferences::performHotKey(int hotKeyIndex)
1548 {
1549     char *hotKeyPrefSetName = getHotKey(hotKeyIndex);
1550     bool retValue = false;
1551     if (hotKeyPrefSetName)
1552     {
1553         const char *currentSessionName = TCUserDefaults::getSessionName();
1554         bool hotKeyIsDefault = strcmp(hotKeyPrefSetName, DEFAULT_PREF_SET) == 0;
1555 
1556         if (currentSessionName)
1557         {
1558             if (strcmp(currentSessionName, hotKeyPrefSetName) == 0)
1559             {
1560                 retValue = true;
1561             }
1562         }
1563         else if (hotKeyIsDefault)
1564         {
1565             retValue = true;
1566         }
1567         if (!retValue)
1568         {
1569             bool changed = false;
1570 
1571             if (hotKeyIsDefault)
1572             {
1573                 TCUserDefaults::setSessionName(NULL, PREFERENCE_SET_KEY);
1574                 changed = true;
1575             }
1576             else
1577             {
1578                 TCStringArray *sessionNames =
1579                     TCUserDefaults::getAllSessionNames();
1580 
1581                 if (sessionNames->indexOfString(hotKeyPrefSetName) != -1)
1582                 {
1583                     TCUserDefaults::setSessionName(hotKeyPrefSetName,
1584                         PREFERENCE_SET_KEY);
1585                     {
1586                         changed = true;
1587                     }
1588                 }
1589                 sessionNames->release();
1590             }
1591             if (changed)
1592             {
1593                 loadSettings();
1594 				reflectSettings();
1595                 doApply();
1596                 retValue = true;
1597             }
1598         }
1599     }
1600 	delete hotKeyPrefSetName;
1601 }
1602 
1603 
getCurrentHotKey(void)1604 int Preferences::getCurrentHotKey(void)
1605 {
1606 	int retValue = -1;
1607 
1608 	if (getSelectedPrefSet())
1609 	{
1610 		return getHotKey(getSelectedPrefSet());
1611 	}
1612 	return retValue;
1613 }
1614 
saveCurrentHotKey(void)1615 void Preferences::saveCurrentHotKey(void)
1616 {
1617     int currentHotKey = getCurrentHotKey();
1618 
1619     if (currentHotKey >= 0)
1620     {
1621         char key[128];
1622 
1623         sprintf(key, "%s/Key%d", HOT_KEYS_KEY, currentHotKey);
1624         TCUserDefaults::removeValue(key, false);
1625     }
1626     if (hotKeyIndex > 0)
1627     {
1628         char key[128];
1629 
1630         sprintf(key, "%s/Key%d", HOT_KEYS_KEY, hotKeyIndex % 10);
1631         TCUserDefaults::setStringForKey(getSelectedPrefSet(), key, false);
1632     }
1633 }
1634 
abandonChanges(void)1635 void Preferences::abandonChanges(void)
1636 {
1637 	applyButton->setEnabled(false);
1638 	loadSettings();
1639 	reflectSettings();
1640 }
1641 
getPrefSet(int index)1642 const char *Preferences::getPrefSet(int index)
1643 {
1644 	return copyString(preferenceSetList->item(index)->text().toUtf8().constData());
1645 }
1646 
getSelectedPrefSet(void)1647 const char *Preferences::getSelectedPrefSet(void)
1648 {
1649     int selectedIndex = preferenceSetList->currentRow();
1650 	if (selectedIndex!=-1)
1651 	{
1652 		return copyString(preferenceSetList->currentItem()->text().toUtf8().constData());
1653 	}
1654 	return NULL;
1655 }
doPrefSetSelected(bool force)1656 bool Preferences::doPrefSetSelected(bool force)
1657 {
1658     const char *selectedPrefSet = getSelectedPrefSet();
1659     bool needToReselect = false;
1660 
1661 	if (checkAbandon && applyButton->isEnabled() && !force)
1662     {
1663         char *savedSession =
1664             TCUserDefaults::getSavedSessionNameFromKey(PREFERENCE_SET_KEY);
1665 
1666         if (!savedSession || !savedSession[0])
1667         {
1668             delete savedSession;
1669             savedSession = copyString(DEFAULT_PREF_SET);
1670         }
1671         if (selectedPrefSet && (strcmp(savedSession, selectedPrefSet) != 0))
1672         {
1673             needToReselect = true;
1674             selectPrefSet(NULL, true);
1675 			QMessageBox::warning(this,QString::fromWCharArray(TCLocalStrings::get(L"Error")),
1676 				"You have made changes to the current preference set.  You must either apply those changes or abandon them before you can select a new preference set.");
1677 		}
1678 		delete savedSession;
1679 	}
1680 	if (selectedPrefSet)
1681     {
1682         bool enabled = true;
1683 
1684         if (needToReselect)
1685         {
1686             selectPrefSet(selectedPrefSet);
1687         }
1688 		if (strcmp(selectedPrefSet, DEFAULT_PREF_SET) == 0)
1689         {
1690             enabled = false;
1691         }
1692 		delPreferenceSetButton->setEnabled(enabled);
1693 		delete selectedPrefSet;
1694     }
1695 	applyButton->setEnabled(true);
1696 	checkAbandon = false;
1697     return false;
1698 }
1699 
selectPrefSet(const char * prefSet,bool force)1700 void Preferences::selectPrefSet(const char *prefSet, bool force)
1701 {
1702     if (prefSet)
1703     {
1704 		for (int i=0;i<preferenceSetList->count();i++)
1705 		{
1706 			if (strcmp(prefSet,preferenceSetList->item(i)->text().toUtf8().constData())==0)
1707 			{
1708 				preferenceSetList->setCurrentRow(i);
1709 			}
1710 		}
1711 		doPrefSetSelected(force);
1712 	}
1713     else
1714     {
1715         char *savedSession =
1716             TCUserDefaults::getSavedSessionNameFromKey(PREFERENCE_SET_KEY);
1717 
1718         if (savedSession && savedSession[0])
1719         {
1720             selectPrefSet(savedSession, force);
1721         }
1722         else
1723         {
1724             selectPrefSet(DEFAULT_PREF_SET, force);
1725         }
1726         delete savedSession;
1727     }
1728 }
setupPrefSetsList(void)1729 void Preferences::setupPrefSetsList(void)
1730 {
1731     TCStringArray *sessionNames = TCUserDefaults::getAllSessionNames();
1732     int i;
1733     int count = sessionNames->getCount();
1734 	preferenceSetList->clear();
1735     new QListWidgetItem(QString(DEFAULT_PREF_SET),preferenceSetList);
1736     for (i = 0; i < count; i++)
1737     {
1738         new QListWidgetItem(sessionNames->stringAtIndex(i),preferenceSetList);
1739     }
1740     selectPrefSet();
1741 	sessionNames->release();
1742 }
1743 
enableWireframeCutaway(void)1744 void Preferences::enableWireframeCutaway(void)
1745 {
1746 	colorCutawayButton->setEnabled(true);
1747 	monochromeCutawayButton->setEnabled(true);
1748 	cutawayOpacitySlider->setEnabled(true);
1749 	cutawayThicknessSlider->setEnabled(true);
1750 	cutawayOpacityLabel->setEnabled(true);
1751 	cutawayThicknessLabel->setEnabled(true);
1752 	setButtonState(colorCutawayButton, false);
1753 	setButtonState(monochromeCutawayButton, false);
1754 	switch (ldPrefs->getCutawayMode())
1755 	{
1756 	case LDVCutawayNormal:
1757 	case LDVCutawayWireframe:
1758 		colorCutawayButton->toggle();
1759 		break;
1760 	case LDVCutawayStencil:
1761 		monochromeCutawayButton->toggle();
1762 		break;
1763 	}
1764 }
1765 
selectLightDirection(LDPreferences::LightDirection ld)1766 void Preferences::selectLightDirection(LDPreferences::LightDirection ld)
1767 {
1768     switch (ld)
1769     {
1770     case LDPreferences::UpperLeft:
1771         lightingDir11->setChecked(true);
1772         break;
1773     case LDPreferences::UpperMiddle:
1774         lightingDir12->setChecked(true);
1775         break;
1776     case LDPreferences::UpperRight:
1777         lightingDir13->setChecked(true);
1778         break;
1779     case LDPreferences::MiddleLeft:
1780         lightingDir21->setChecked(true);
1781         break;
1782     case LDPreferences::MiddleMiddle:
1783         lightingDir22->setChecked(true);
1784         break;
1785     case LDPreferences::MiddleRight:
1786         lightingDir23->setChecked(true);
1787         break;
1788     case LDPreferences::LowerLeft:
1789         lightingDir31->setChecked(true);
1790         break;
1791     case LDPreferences::LowerMiddle:
1792         lightingDir32->setChecked(true);
1793         break;
1794     case LDPreferences::LowerRight:
1795         lightingDir33->setChecked(true);
1796         break;
1797     case LDPreferences::CustomDirection:
1798         break;
1799     }
1800 }
1801 
enableLighting(void)1802 void Preferences::enableLighting(void)
1803 {
1804 	qualityLightingButton->setEnabled(true);
1805 	subduedLightingButton->setEnabled(true);
1806 	specularLightingButton->setEnabled(true);
1807 	alternateLightingButton->setEnabled(true);
1808 	effectsUseLIGHTDATButton->setEnabled(true);
1809 	lightingDir11->setEnabled(true);
1810 	lightingDir12->setEnabled(true);
1811 	lightingDir13->setEnabled(true);
1812 	lightingDir21->setEnabled(true);
1813 	lightingDir22->setEnabled(true);
1814 	lightingDir23->setEnabled(true);
1815 	lightingDir31->setEnabled(true);
1816 	lightingDir32->setEnabled(true);
1817 	lightingDir33->setEnabled(true);
1818 	setButtonState(qualityLightingButton, ldPrefs->getQualityLighting());
1819 	setButtonState(subduedLightingButton, ldPrefs->getSubduedLighting());
1820 	setButtonState(specularLightingButton, ldPrefs->getUseSpecular());
1821 	setButtonState(alternateLightingButton, ldPrefs->getOneLight());
1822 	setButtonState(effectsUseLIGHTDATButton, ldPrefs->getDrawLightDats());
1823 	selectLightDirection(ldPrefs->getLightDirection());
1824 	doDrawLightDats();
1825 }
1826 
enableStereo(void)1827 void Preferences::enableStereo(void)
1828 {
1829 	crossEyedStereoButton->setEnabled(true);
1830 	parallelStereoButton->setEnabled(true);
1831 	stereoAmountSlider->setEnabled(true);
1832 	stereoAmountLabel->setEnabled(true);
1833 	setButtonState(crossEyedStereoButton, false);
1834 	setButtonState(parallelStereoButton, false);
1835 	switch (ldPrefs->getStereoMode())
1836 	{
1837 	case LDVStereoNone:
1838 	case LDVStereoCrossEyed:
1839 		crossEyedStereoButton->toggle();
1840 		break;
1841 	case LDVStereoParallel:
1842 		parallelStereoButton->toggle();
1843 		break;
1844 	default:
1845 		break;
1846 	}
1847 }
1848 
enableWireframe(void)1849 void Preferences::enableWireframe(void)
1850 {
1851 	wireframeFogButton->setEnabled(true);
1852 	wireframeRemoveHiddenLineButton->setEnabled(true);
1853 	wireframeThicknessSlider->setEnabled(true);
1854 	wireframeThicknessLabel->setEnabled(true);
1855 	setButtonState(wireframeFogButton, ldPrefs->getUseWireframeFog());
1856     setButtonState(wireframeRemoveHiddenLineButton,
1857 		ldPrefs->getRemoveHiddenLines());
1858 }
1859 
enableBFC(void)1860 void Preferences::enableBFC(void)
1861 {
1862 	bfcRedBackFaceButton->setEnabled(true);
1863         bfcGreenFrontFaceButton->setEnabled(true);
1864         bfcBlueNeutralFaceButton->setEnabled(true);
1865 	setButtonState(bfcRedBackFaceButton, ldPrefs->getRedBackFaces());
1866 	setButtonState(bfcGreenFrontFaceButton,
1867 		ldPrefs->getGreenFrontFaces());
1868 	setButtonState(bfcBlueNeutralFaceButton,
1869 		ldPrefs->getBlueNeutralFaces());
1870 }
1871 
enableEdgeLines(void)1872 void Preferences::enableEdgeLines(void)
1873 {
1874 	conditionalLinesButton->setEnabled(true);
1875 	edgesOnlyButton->setEnabled(true);
1876 	highQualityLinesButton->setEnabled(true);
1877 	alwaysBlackLinesButton->setEnabled(true);
1878 	edgeThicknessLabel->setEnabled(true);
1879 	edgeThicknessSlider->setEnabled(true);
1880 	setButtonState(conditionalLinesButton,
1881 		ldPrefs->getDrawConditionalHighlights());
1882 	setButtonState(edgesOnlyButton, ldPrefs->getEdgesOnly());
1883 	setButtonState(highQualityLinesButton,
1884 		ldPrefs->getUsePolygonOffset());
1885 	setButtonState(alwaysBlackLinesButton,
1886 		ldPrefs->getBlackHighlights());
1887 	if (ldPrefs->getDrawConditionalHighlights())
1888 	{
1889 		enableConditionalShow();
1890 	}
1891 	else
1892 	{
1893 		disableConditionalShow();
1894 	}
1895 }
1896 
enableConditionalShow(void)1897 void Preferences::enableConditionalShow(void)
1898 {
1899 	conditionalShowAllButton->setEnabled(true);
1900 	conditionalShowControlPtsButton->setEnabled(true);
1901 	setButtonState(conditionalShowAllButton,
1902 		ldPrefs->getShowAllConditionalLines());
1903 	setButtonState(conditionalShowControlPtsButton,
1904 		ldPrefs->getShowConditionalControlPoints());
1905 }
1906 
1907 
enablePrimitiveSubstitution(void)1908 void Preferences::enablePrimitiveSubstitution(void)
1909 {
1910 	textureStudsButton->setEnabled(true);
1911 	curveQualityLabel->setEnabled(true);
1912 	curveQualitySlider->setEnabled(true);
1913 	setButtonState(textureStudsButton, ldPrefs->getTextureStuds());
1914 	if (ldPrefs->getTextureStuds() || ldPrefs->getTexmaps())
1915 	{
1916 		enableTextureStuds();
1917 	}
1918 	else
1919 	{
1920 		disableTextureStuds();
1921 	}
1922 }
1923 
enableTextureStuds(void)1924 void Preferences::enableTextureStuds(void)
1925 {
1926 	GLfloat maxAniso = TREGLExtensions::getMaxAnisoLevel();
1927 	TCFloat32 anisoLevel = ldPrefs->getAnisoLevel();
1928 	short numAnisoLevels = (short)(log(maxAniso)/log(2.0) + 0.5f);
1929 	if (numAnisoLevels)
1930 		anisotropicFilteringSlider->setMaximum(numAnisoLevels);
1931 	nearestFilteringButton->setEnabled(true);
1932 	bilinearFilteringButton->setEnabled(true);
1933 	trilinearFilteringButton->setEnabled(true);
1934 	anisotropicFilteringButton->setEnabled(
1935 		TREGLExtensions::haveAnisoExtension());
1936 	setButtonState(nearestFilteringButton, false);
1937 	setButtonState(bilinearFilteringButton, false);
1938 	setButtonState(trilinearFilteringButton, false);
1939 	setButtonState(anisotropicFilteringButton, false);
1940 	switch (ldPrefs->getTextureFilterType())
1941 	{
1942 	case GL_NEAREST_MIPMAP_NEAREST:
1943 		nearestFilteringButton->toggle();
1944 		break;
1945 	case GL_LINEAR_MIPMAP_NEAREST:
1946 		bilinearFilteringButton->toggle();
1947 		break;
1948 	case GL_LINEAR_MIPMAP_LINEAR:
1949 		trilinearFilteringButton->toggle();
1950 		break;
1951 	}
1952 	if (anisoLevel > 1.0)
1953 	{
1954 	 	anisotropicFilteringButton->toggle();
1955 	 	setAniso((int)(log(anisoLevel)/log(2.0)+0.5f));
1956 	}
1957 	if (anisoLevel > maxAniso)
1958 	{
1959 		anisoLevel = (TCFloat32)maxAniso;
1960 	}
1961 	if (anisoLevel < 2.0f)
1962 	{
1963 		anisoLevel = 2.0f;
1964 	}
1965 	doAnisotropic();
1966 }
1967 
enableTexmaps(void)1968 void Preferences::enableTexmaps(void)
1969 {
1970 	transparentTextureOffsetLabel->setEnabled(true);
1971 	transparentOffsetSlider->setEnabled(true);
1972 	transparentOffsetSlider->setValue(ldPrefs->getTexturesAfterTransparent()*10.0);
1973 
1974 }
1975 
1976 
enableProxyServer(void)1977 void Preferences::enableProxyServer(void)
1978 {
1979 	proxyLabel->setEnabled(true);
1980 	proxyEdit->setEnabled(true);
1981 	portLabel->setEnabled(true);
1982 	portEdit->setEnabled(true);
1983 	proxyEdit->setText(ldPrefs->getProxyServer());
1984 }
1985 
disableWireframeCutaway(void)1986 void Preferences::disableWireframeCutaway(void)
1987 {
1988 	colorCutawayButton->setEnabled(false);
1989 	monochromeCutawayButton->setEnabled(false);
1990 	cutawayOpacitySlider->setEnabled(false);
1991 	cutawayThicknessSlider->setEnabled(false);
1992 	cutawayOpacityLabel->setEnabled(false);
1993 	cutawayThicknessLabel->setEnabled(false);
1994 	setButtonState(colorCutawayButton, false);
1995 	setButtonState(monochromeCutawayButton, false);
1996 }
1997 
uncheckLightDirections(void)1998 void Preferences::uncheckLightDirections(void)
1999 {
2000     lightingDir11->setChecked(false);
2001     lightingDir12->setChecked(false);
2002     lightingDir13->setChecked(false);
2003     lightingDir21->setChecked(false);
2004     lightingDir22->setChecked(false);
2005     lightingDir23->setChecked(false);
2006     lightingDir31->setChecked(false);
2007     lightingDir32->setChecked(false);
2008     lightingDir33->setChecked(false);
2009 }
2010 
disableLighting(void)2011 void Preferences::disableLighting(void)
2012 {
2013 	qualityLightingButton->setEnabled(false);
2014 	subduedLightingButton->setEnabled(false);
2015 	specularLightingButton->setEnabled(false);
2016 	alternateLightingButton->setEnabled(false);
2017     effectsUseLIGHTDATButton->setEnabled(false);
2018     effectsHideLIGHTButton->setEnabled(true);
2019 	lightingDir11->setEnabled(false);
2020 	lightingDir12->setEnabled(false);
2021 	lightingDir13->setEnabled(false);
2022 	lightingDir21->setEnabled(false);
2023 	lightingDir22->setEnabled(false);
2024 	lightingDir23->setEnabled(false);
2025 	lightingDir31->setEnabled(false);
2026 	lightingDir32->setEnabled(false);
2027 	lightingDir33->setEnabled(false);
2028 	setButtonState(qualityLightingButton, false);
2029 	setButtonState(subduedLightingButton, false);
2030 	setButtonState(specularLightingButton, false);
2031 	setButtonState(alternateLightingButton, false);
2032     setButtonState(effectsUseLIGHTDATButton, false);
2033 
2034 	uncheckLightDirections();
2035 }
2036 
disableStereo(void)2037 void Preferences::disableStereo(void)
2038 {
2039 	crossEyedStereoButton->setEnabled(false);
2040 	parallelStereoButton->setEnabled(false);
2041 	stereoAmountSlider->setEnabled(false);
2042 	stereoAmountLabel->setEnabled(false);
2043 	setButtonState(crossEyedStereoButton, false);
2044 	setButtonState(parallelStereoButton, false);
2045 }
2046 
disableWireframe(void)2047 void Preferences::disableWireframe(void)
2048 {
2049 	wireframeFogButton->setEnabled(false);
2050 	wireframeRemoveHiddenLineButton->setEnabled(false);
2051 	wireframeThicknessSlider->setEnabled(false);
2052 	wireframeThicknessLabel->setEnabled(false);
2053 	setButtonState(wireframeFogButton, false);
2054 	setButtonState(wireframeRemoveHiddenLineButton, false);
2055 }
2056 
disableBFC(void)2057 void Preferences::disableBFC(void)
2058 {
2059 	bfcRedBackFaceButton->setEnabled(false);
2060         bfcGreenFrontFaceButton->setEnabled(false);
2061 	bfcBlueNeutralFaceButton->setEnabled(false);
2062 	setButtonState(bfcRedBackFaceButton, false);
2063         setButtonState(bfcGreenFrontFaceButton, false);
2064         setButtonState(bfcBlueNeutralFaceButton, false);
2065 }
2066 
disableEdgeLines(void)2067 void Preferences::disableEdgeLines(void)
2068 {
2069 	conditionalLinesButton->setEnabled(false);
2070 	conditionalShowAllButton->setEnabled(false);
2071 	conditionalShowControlPtsButton->setEnabled(false);
2072 	edgesOnlyButton->setEnabled(false);
2073 	highQualityLinesButton->setEnabled(false);
2074 	alwaysBlackLinesButton->setEnabled(false);
2075 	edgeThicknessLabel->setEnabled(false);
2076 	edgeThicknessSlider->setEnabled(false);
2077 	setButtonState(conditionalLinesButton, false);
2078 	setButtonState(conditionalShowAllButton, false);
2079 	setButtonState(conditionalShowControlPtsButton, false);
2080 	setButtonState(edgesOnlyButton, false);
2081 	setButtonState(highQualityLinesButton, false);
2082 	setButtonState(alwaysBlackLinesButton, false);
2083 }
2084 
disableConditionalShow(void)2085 void Preferences::disableConditionalShow(void)
2086 {
2087 	conditionalShowAllButton->setEnabled(false);
2088     conditionalShowControlPtsButton->setEnabled(false);
2089     setButtonState(conditionalShowAllButton, false);
2090     setButtonState(conditionalShowControlPtsButton, false);
2091 }
2092 
disablePrimitiveSubstitution(void)2093 void Preferences::disablePrimitiveSubstitution(void)
2094 {
2095 	textureStudsButton->setEnabled(false);
2096 	curveQualityLabel->setEnabled(false);
2097 	curveQualitySlider->setEnabled(false);
2098 	setButtonState(textureStudsButton, false);
2099 	if (!useTextureMapsButton->isChecked()) disableTextureStuds();
2100 }
2101 
disableTextureStuds(void)2102 void Preferences::disableTextureStuds(void)
2103 {
2104 	nearestFilteringButton->setEnabled(false);
2105 	bilinearFilteringButton->setEnabled(false);
2106 	trilinearFilteringButton->setEnabled(false);
2107 	anisotropicFilteringButton->setEnabled(false);
2108 	anisotropicFilteringSlider->setEnabled(false);
2109 	anisotropicLabel->setEnabled(false);
2110 	setButtonState(nearestFilteringButton, false);
2111 	setButtonState(bilinearFilteringButton, false);
2112 	setButtonState(trilinearFilteringButton, false);
2113 	setButtonState(anisotropicFilteringButton, false);
2114 }
2115 
disableTexmaps(void)2116 void Preferences::disableTexmaps(void)
2117 {
2118 	transparentTextureOffsetLabel->setEnabled(false);
2119 	transparentOffsetSlider->setEnabled(false);
2120 }
2121 
updateTexmapsEnabled(void)2122 void Preferences::updateTexmapsEnabled(void)
2123 {
2124 	if (useTextureMapsButton->isChecked())
2125 	{
2126 		enableTexmaps();
2127 	} else
2128 	{
2129 		disableTexmaps();
2130 	}
2131 }
2132 
disableProxyServer(void)2133 void Preferences::disableProxyServer(void)
2134 {
2135 	proxyLabel->setEnabled(false);
2136 	proxyEdit->setEnabled(false);
2137 	portLabel->setEnabled(false);
2138 	portEdit->setEnabled(false);
2139 }
2140 
getErrorKey(int errorNumber)2141 char *Preferences::getErrorKey(int errorNumber)
2142 {
2143 	static char key[128];
2144 
2145 	sprintf(key, "%s/Error%02d", SHOW_ERRORS_KEY, errorNumber);
2146 	return key;
2147 }
2148 
setShowError(int errorNumber,bool value)2149 void Preferences::setShowError(int errorNumber, bool value)
2150 {
2151 	TCUserDefaults::setLongForKey(value ? 1 : 0, getErrorKey(errorNumber),
2152 		false);
2153 }
2154 
getShowError(int errorNumber)2155 bool Preferences::getShowError(int errorNumber)
2156 {
2157 	return TCUserDefaults::longForKey(getErrorKey(errorNumber), 1, false) != 0;
2158 }
2159 
setupDefaultRotationMatrix(void)2160 void Preferences::setupDefaultRotationMatrix(void)
2161 {
2162     char *value = TCUserDefaults::stringForKey(DEFAULT_LAT_LONG_KEY);
2163 
2164     if (value)
2165     {
2166         TCFloat latitude;
2167         TCFloat longitude;
2168 
2169         if (sscanf(value, "%f,%f", &latitude, &longitude) == 2)
2170         {
2171             TCFloat leftMatrix[16];
2172             TCFloat rightMatrix[16];
2173             TCFloat resultMatrix[16];
2174             TCFloat cosTheta;
2175             TCFloat sinTheta;
2176 
2177             TCVector::initIdentityMatrix(leftMatrix);
2178             TCVector::initIdentityMatrix(rightMatrix);
2179             latitude = (TCFloat)deg2rad(latitude);
2180             longitude = (TCFloat)deg2rad(longitude);
2181 
2182             // First, apply latitude by rotating around X.
2183             cosTheta = (TCFloat)cos(latitude);
2184             sinTheta = (TCFloat)sin(latitude);
2185             rightMatrix[5] = cosTheta;
2186             rightMatrix[6] = sinTheta;
2187             rightMatrix[9] = -sinTheta;
2188             rightMatrix[10] = cosTheta;
2189             TCVector::multMatrix(leftMatrix, rightMatrix, resultMatrix);
2190 
2191             memcpy(leftMatrix, resultMatrix, sizeof(leftMatrix));
2192             TCVector::initIdentityMatrix(rightMatrix);
2193 
2194             // Next, apply longitude by rotating around Y.
2195             cosTheta = (TCFloat)cos(longitude);
2196             sinTheta = (TCFloat)sin(longitude);
2197             rightMatrix[0] = cosTheta;
2198             rightMatrix[2] = -sinTheta;
2199             rightMatrix[8] = sinTheta;
2200             rightMatrix[10] = cosTheta;
2201             TCVector::multMatrix(leftMatrix, rightMatrix, resultMatrix);
2202 
2203             modelViewer->setDefaultRotationMatrix(resultMatrix);
2204         }
2205         delete value;
2206     }
2207     else
2208     {
2209         value = TCUserDefaults::stringForKey(DEFAULT_MATRIX_KEY);
2210         if (value)
2211         {
2212             TCFloat matrix[16];
2213 
2214             memset(matrix, 0, sizeof(matrix));
2215             matrix[15] = 1.0f;
2216             if (sscanf(value, "%f,%f,%f,%f,%f,%f,%f,%f,%f",
2217                 &matrix[0], &matrix[4], &matrix[8],
2218                 &matrix[1], &matrix[5], &matrix[9],
2219                 &matrix[2], &matrix[6], &matrix[10]) == 9)
2220             {
2221                 modelViewer->setDefaultRotationMatrix(matrix);
2222             }
2223             delete value;
2224         }
2225     }
2226 }
2227 
getBackgroundColor(int & r,int & g,int & b)2228 void Preferences::getBackgroundColor(int &r, int &g, int &b)
2229 {
2230 	ldPrefs->getBackgroundColor(r, g, b);
2231 }
2232 
getShowErrors(void)2233 bool Preferences::getShowErrors(void)
2234 {
2235 	return ldPrefs->getShowErrors();
2236 }
2237 
getDrawWireframe(void)2238 bool Preferences::getDrawWireframe(void)
2239 {
2240 	return ldPrefs->getDrawWireframe();
2241 }
2242 
getUseWireframeFog(void)2243 bool Preferences::getUseWireframeFog(void)
2244 {
2245 	return ldPrefs->getUseWireframeFog();
2246 }
2247 
getRemoveHiddenLines(void)2248 bool Preferences::getRemoveHiddenLines(void)
2249 {
2250 	return ldPrefs->getRemoveHiddenLines();
2251 }
2252 
getTextureStud(void)2253 bool Preferences::getTextureStud(void)
2254 {
2255 	return ldPrefs->getTextureStuds();
2256 }
2257 
getShowsHighlightLines(void)2258 bool Preferences::getShowsHighlightLines(void)
2259 {
2260 	return ldPrefs->getShowHighlightLines();
2261 }
2262 
getUseLighting(void)2263 bool Preferences::getUseLighting(void)
2264 {
2265 	return ldPrefs->getUseLighting();
2266 }
2267 
getUseBFC(void)2268 bool Preferences::getUseBFC(void)
2269 {
2270 	return ldPrefs->getBfc();
2271 }
2272 
getShowAxes(void)2273 bool Preferences::getShowAxes(void)
2274 {
2275 	return ldPrefs->getShowAxes();
2276 }
2277 
getUseSeams(void)2278 bool Preferences::getUseSeams(void)
2279 {
2280 	return ldPrefs->getUseSeams();
2281 }
2282 
userDefaultChangedAlertCallback(TCAlert * alert)2283 void Preferences::userDefaultChangedAlertCallback(TCAlert *alert)
2284 {
2285 	const char *key = alert->getMessage();
2286 
2287 	if (key)
2288 	{
2289 		if (strcmp(key, CHECK_PART_TRACKER_KEY) == 0)
2290 		{
2291 			reflectUpdatesSettings();
2292 		}
2293 	}
2294 }
2295 
checkLightVector(void)2296 void Preferences::checkLightVector(void)
2297 {
2298 	LDPreferences::LightDirection selectedDirection =
2299 		getSelectedLightDirection();
2300 	LDPreferences::LightDirection lightDirection =
2301 		ldPrefs->getLightDirection();
2302 	if (selectedDirection != lightDirection)
2303 	{
2304 		uncheckLightDirections();
2305 		selectLightDirection(lightDirection);
2306 	}
2307 }
2308 
updateSaveDir(QLineEdit * textField,QPushButton * button,LDPreferences::DefaultDirMode dirMode,QString & filename)2309 void Preferences::updateSaveDir(QLineEdit *textField, QPushButton *button,
2310 								LDPreferences::DefaultDirMode dirMode,
2311 								QString &filename)
2312 {
2313 	bool enable = false;
2314 
2315 	if (dirMode == LDPreferences::DDMSpecificDir)
2316 	{
2317 		textField->setText(filename);
2318 		enable = true;
2319 	}
2320 	else
2321 	{
2322 		textField->setText("");
2323 	}
2324 	button->setEnabled(enable);
2325 	textField->setEnabled(enable);
2326 }
2327 
setupSaveDir(QComboBox * comboBox,QLineEdit * textField,QPushButton * button,LDPreferences::DefaultDirMode dirMode,QString & filename)2328 void Preferences::setupSaveDir(QComboBox *comboBox, QLineEdit *textField,
2329 							   QPushButton *button,
2330 							   LDPreferences::DefaultDirMode dirMode,
2331 							   QString &filename)
2332 {
2333 	comboBox->setCurrentIndex(dirMode);
2334 	updateSaveDir(textField, button, dirMode, filename);
2335 }
2336 
setupSaveDirs()2337 void Preferences::setupSaveDirs()
2338 {
2339 	snapshotDir = ldPrefs->getSaveDir(LDPreferences::SOSnapshot).c_str();
2340 	setupSaveDir(snapshotSaveDirBox, snapshotSaveDirEdit,
2341 				 snapshotSaveDirButton,
2342 				 ldPrefs->getSaveDirMode(LDPreferences::SOSnapshot),
2343 				 snapshotDir);
2344 	partsListDir =ldPrefs->getSaveDir(LDPreferences::SOPartsList).c_str();
2345 	setupSaveDir(partsListsSaveDirBox, partsListsSaveDirEdit,
2346 				 partsListsSaveDirButton,
2347 				 ldPrefs->getSaveDirMode(LDPreferences::SOPartsList),
2348 				 partsListDir);
2349 	exportDir = ldPrefs->getSaveDir(LDPreferences::SOExport).c_str();
2350 	setupSaveDir(exportsListsSaveDirBox, exportsSaveDirEdit,
2351 				 exportsSaveDirButton,
2352 				 ldPrefs->getSaveDirMode(LDPreferences::SOExport),
2353 				 exportDir);
2354 }
2355 
snapshotSaveDirBoxChanged()2356 void Preferences::snapshotSaveDirBoxChanged()
2357 {
2358 	applyButton->setEnabled(true);
2359 	updateSaveDir(snapshotSaveDirEdit,snapshotSaveDirButton,
2360 		(LDPreferences::DefaultDirMode)snapshotSaveDirBox->currentIndex(),
2361 		snapshotDir);
2362 }
2363 
partsListsSaveDirBoxChanged()2364 void Preferences::partsListsSaveDirBoxChanged()
2365 {
2366 	updateSaveDir(partsListsSaveDirEdit,partsListsSaveDirButton,
2367 		(LDPreferences::DefaultDirMode)partsListsSaveDirBox->currentIndex(),
2368 		partsListDir);
2369 	applyButton->setEnabled(true);
2370 }
2371 
exportsListsSaveDirBoxChanged()2372 void Preferences::exportsListsSaveDirBoxChanged()
2373 {
2374 	updateSaveDir(exportsSaveDirEdit,exportsSaveDirButton,
2375 			(LDPreferences::DefaultDirMode)exportsListsSaveDirBox->currentIndex(),
2376 			exportDir);
2377 	applyButton->setEnabled(true);
2378 }
2379 
snapshotSaveDirBrowse()2380 void Preferences::snapshotSaveDirBrowse()
2381 {
2382 	browseForDir(QString::fromWCharArray(TCLocalStrings::get(L"BrowseForSnapshotDir")),
2383 		snapshotSaveDirEdit, snapshotDir);
2384 }
2385 
partsListsSaveDirBrowse()2386 void Preferences::partsListsSaveDirBrowse()
2387 {
2388 	browseForDir(QString::fromWCharArray(TCLocalStrings::get(L"BrowseForPartsListDir")),
2389 		partsListsSaveDirEdit, partsListDir);
2390 }
2391 
exportsSaveDirBrowse()2392 void Preferences::exportsSaveDirBrowse()
2393 {
2394 	browseForDir(QString::fromWCharArray(TCLocalStrings::get(L"BrowseForExportListDir")),
2395 		exportsSaveDirEdit, exportDir);
2396 }
2397 
browseForDir(QString prompt,QLineEdit * textField,QString & dir)2398 void Preferences::browseForDir(QString prompt, QLineEdit *textField, QString &dir)
2399 {
2400 	QString selectedfile=QFileDialog::getExistingDirectory(this,prompt,dir);
2401     if (!selectedfile.isEmpty())
2402     {
2403 		textField->setText(dir = selectedfile);
2404 		applyButton->setEnabled(true);
2405     }
2406 }
2407 
enableApply(void)2408 void Preferences::enableApply(void)
2409 {
2410 	applyButton->setEnabled(true);
2411 }
2412 
enableProxy(void)2413 void Preferences::enableProxy(void)
2414 {
2415 	doProxyServer(true);
2416 	enableApply();
2417 }
2418 
disableProxy(void)2419 void Preferences::disableProxy(void)
2420 {
2421 	doProxyServer(false);
2422 	enableApply();
2423 }
2424 
2425