1#import "GeneralPage.h"
2#import "Preferences.h"
3#import "LDViewCategories.h"
4
5#include <LDLib/LDPreferences.h>
6#include <TCFoundation/TCUserDefaults.h>
7
8@implementation GeneralPage
9
10- (void)dealloc
11{
12	[saveDirPopUps release];
13	[saveDirFields release];
14	[saveDirButtons release];
15	[saveDirs release];
16	[super dealloc];
17}
18
19- (NSString *)defaultSaveDirForOp:(LDPreferences::SaveOp)op modelFilename:(NSString *)filename
20{
21	return [NSString stringWithUTF8String:ldPreferences->getDefaultSaveDir(op, [filename UTF8String]).c_str()];
22}
23
24//- (void)setSnapshotsDir:(NSString *)value
25//{
26//	if (value != snapshotsDir)
27//	{
28//		[snapshotsDir release];
29//		snapshotsDir = [value retain];
30//	}
31//}
32//
33//- (void)setPartsListsDir:(NSString *)value
34//{
35//	if (value != partsListsDir)
36//	{
37//		[partsListsDir release];
38//		partsListsDir = [value retain];
39//	}
40//}
41
42- (void)updateDirField:(NSTextField *)field browseButton:(NSButton *)browseButton mode:(int)mode value:(NSString *)value
43{
44	if (mode == LDPreferences::DDMSpecificDir)
45	{
46		[field setStringValue:value];
47		[field setEnabled:YES];
48		[browseButton setEnabled:YES];
49	}
50	else
51	{
52		[field setStringValue:@""];
53		[field setEnabled:NO];
54		[browseButton setEnabled:NO];
55	}
56}
57
58- (void)updateSaveDirForOp:(int)op
59{
60	NSString *value = [saveDirs objectAtIndex:op];
61	int mode = (int)[[saveDirPopUps objectAtIndex:op] selectedTag];
62	NSTextField *field = [saveDirFields objectAtIndex:op];
63	NSButton *browseButton = [saveDirButtons objectAtIndex:op];
64
65	if (mode == LDPreferences::DDMSpecificDir)
66	{
67		[field setStringValue:value];
68		[field setEnabled:YES];
69		[browseButton setEnabled:YES];
70	}
71	else
72	{
73		[field setStringValue:@""];
74		[field setEnabled:NO];
75		[browseButton setEnabled:NO];
76	}
77}
78
79- (void)setup
80{
81	int r, g, b;
82	int i;
83
84	[super setup];
85	[self setCheck:promptAtStartupCheck value:[self promptAtStartup]];
86	[self setCheck:newModelWindowsCheck value:[self newModelWindows]];
87	[self setCheck:antialiasedLinesCheck
88		value:ldPreferences->getLineSmoothing()];
89	[self setCheck:showFrameRateCheck value:ldPreferences->getShowFps()];
90	[self setCheck:showAxesCheck value:ldPreferences->getShowAxes()];
91	[self setCheck:showErrorsCheck value:ldPreferences->getShowErrors()];
92	[self setCheck:disableSmpCheck value:ldPreferences->getDisableSmp()];
93	[self setCheck:processLDConfigCheck
94		value:ldPreferences->getProcessLdConfig()];
95	[self setCheck:randomColorsCheck value:ldPreferences->getRandomColors()];
96	ldPreferences->getBackgroundColor(r, g, b);
97	[self setColorWell:backgroundColorWell r:r g:g b:b];
98	ldPreferences->getDefaultColor(r, g, b);
99	[self setColorWell:defaultColorWell r:r g:g b:b];
100	[self setCheck:transparentDefaultCheck
101		value:ldPreferences->getTransDefaultColor()];
102	[fovField setFloatValue:ldPreferences->getFov()];
103	[memoryUsagePopUp selectItemWithTag:ldPreferences->getMemoryUsage()];
104	saveDirPopUps = [[NSArray alloc] initWithObjects:snapshotsDirPopUp, partsListsDirPopUp, exportsDirPopUp, nil];
105	saveDirFields = [[NSArray alloc] initWithObjects:snapshotsDirField, partsListsDirField, exportsDirField, nil];
106	saveDirButtons = [[NSArray alloc] initWithObjects:snapshotsBrowseButton, partsListsBrowseButton, exportsBrowseButton, nil];
107	saveDirs = [[NSMutableArray alloc] init];
108	for (i = LDPreferences::SOFirst; i <= LDPreferences::SOLast && i < [saveDirPopUps count]; i++)
109	{
110		LDPreferences::SaveOp op = (LDPreferences::SaveOp)i;
111
112		[saveDirs addObject:[NSString stringWithUTF8String:ldPreferences->getSaveDir(op).c_str()]];
113		[[saveDirPopUps objectAtIndex:i] selectItemWithTag:ldPreferences->getSaveDirMode(op)];
114		[self updateSaveDirForOp:i];
115	}
116}
117
118- (bool)promptAtStartup
119{
120	return TCUserDefaults::boolForKey("PromptForModelAtStartup", true, false);
121}
122
123- (bool)newModelWindows
124{
125	return TCUserDefaults::boolForKey("OpenModelsInNewWindows", false, false);
126}
127
128- (bool)showErrorsIfNeeded
129{
130	return ldPreferences->getShowErrors();
131}
132
133- (bool)updateLdPreferences
134{
135	int r, g, b, i;
136
137	TCUserDefaults::setBoolForKey([self getCheck:promptAtStartupCheck], "PromptForModelAtStartup", false);
138	TCUserDefaults::setBoolForKey([self getCheck:newModelWindowsCheck], "OpenModelsInNewWindows", false);
139	ldPreferences->setLineSmoothing([self getCheck:antialiasedLinesCheck]);
140	ldPreferences->setProcessLdConfig([self getCheck:processLDConfigCheck]);
141	ldPreferences->setRandomColors([self getCheck:randomColorsCheck]);
142	ldPreferences->setShowErrors([self getCheck:showErrorsCheck]);
143	ldPreferences->setDisableSmp([disableSmpCheck getCheck]);
144	ldPreferences->setShowFps([self getCheck:showFrameRateCheck]);
145	ldPreferences->setShowAxes([self getCheck:showAxesCheck]);
146	[self getColorWell:backgroundColorWell r:&r g:&g b:&b];
147	ldPreferences->setBackgroundColor(r,g,b);
148	[self getColorWell:defaultColorWell r:&r g:&g b:&b];
149	ldPreferences->setDefaultColor(r,g,b);
150	ldPreferences->setTransDefaultColor(
151		[self getCheck:transparentDefaultCheck]);
152	ldPreferences->setFov([fovField floatValue]);
153	ldPreferences->setMemoryUsage((int)[[memoryUsagePopUp selectedItem] tag]);
154	for (i = LDPreferences::SOFirst; i <= LDPreferences::SOLast; i++)
155	{
156		if (i < [saveDirs count])
157		{
158			LDPreferences::SaveOp op = (LDPreferences::SaveOp)i;
159
160			ldPreferences->setSaveDirMode(op, (LDPreferences::DefaultDirMode)[[saveDirPopUps objectAtIndex:i] selectedTag]);
161			ldPreferences->setSaveDir(op, [[saveDirs objectAtIndex:i] UTF8String]);
162		}
163	}
164	return [super updateLdPreferences];
165}
166
167- (IBAction)resetPage:(id)sender
168{
169	ldPreferences->loadDefaultGeneralSettings(false);
170	[super resetPage:sender];
171}
172
173- (IBAction)saveDirMode:(id)sender
174{
175	int tag = (int)[sender tag];
176
177	[self updateSaveDirForOp:tag];
178}
179
180- (void)textDidChange:(NSNotification *)aNotification
181{
182	id sender = [aNotification object];
183	int tag = (int)[sender tag];
184
185	if (tag < [saveDirFields count] && [saveDirFields objectAtIndex:tag] == sender)
186	{
187		[saveDirs replaceObjectAtIndex:tag withObject:[sender stringValue]];
188	}
189	[super textDidChange:aNotification];
190}
191
192- (void)openPanelDidEnd:(NSOpenPanel *)openPanel returnCode:(NSModalResponse)returnCode contextInfo:(void  *)contextInfo
193{
194	if (returnCode == NSModalResponseOK)
195	{
196		int tag = (int)[(id)contextInfo tag];
197
198		if (tag < [saveDirFields count])
199		{
200			NSTextField *textField = [saveDirFields objectAtIndex:tag];
201
202			[textField setStringValue:[openPanel ldvFilename]];
203			[[NSNotificationCenter defaultCenter] postNotificationName:NSControlTextDidChangeNotification object:textField];
204		}
205	}
206}
207
208- (IBAction)saveDirBrowse:(id)sender
209{
210	int tag = (int)[sender tag];
211
212	if (tag < [saveDirs count])
213	{
214		NSString *dir = [saveDirs objectAtIndex:tag];
215
216		if ([dir length] > 0)
217		{
218			[self browseForFolder:sender initialDir:dir];
219			return;
220		}
221	}
222	[self browseForFolder:sender];
223}
224
225- (int)saveDirModeForOp:(LDPreferences::SaveOp)op
226{
227	return ldPreferences->getSaveDirMode(op);
228}
229
230- (NSString *)saveDirForOp:(LDPreferences::SaveOp)op
231{
232	return [NSString stringWithUTF8String:ldPreferences->getSaveDir(op).c_str()];
233}
234
235@end
236