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