1// The following is necessary to get rid of some truly screwed up warnings
2#pragma GCC visibility push(default)
3
4#import "LDrawPage.h"
5#import "OCLocalStrings.h"
6#import "LDViewCategories.h"
7
8#include <TCFoundation/TCUserDefaults.h>
9#include <LDLib/LDPreferences.h>
10#include <LDLib/LDUserDefaultsKeys.h>
11
12@implementation LDrawPage
13
14- (void)dealloc
15{
16	[tableViewReorder release];
17	[super dealloc];
18}
19
20- (void)setupExtraFolders:(const StringVector &)extraDirs
21{
22	[extraFolders release];
23	extraFolders = [[NSMutableArray alloc] initWithCapacity:extraDirs.size()];
24	for (size_t i = 0; i < extraDirs.size(); i++)
25	{
26		[extraFolders addObject:[NSString stringWithUTF8String:extraDirs[i].c_str()]];
27	}
28	[extraFoldersTableView reloadData];
29}
30
31- (void)setup
32{
33	[ldrawDirField setStringValue:[NSString stringWithUTF8String:ldPreferences->getLDrawDir()]];
34	[self setupExtraFolders:ldPreferences->getExtraDirs()];
35	[self setCheck:generateThumbnailsCheck value:[self generateThumbnails]];
36	[super setup];
37}
38
39+ (bool)verifyLDrawDir:(NSString *)ldrawDir
40{
41	NSFileManager *fileManager = [NSFileManager defaultManager];
42	BOOL isDir;
43
44	if ([ldrawDir length] == 0 && !TCUserDefaults::boolForKey(VERIFY_LDRAW_DIR_KEY, true, false))
45	{
46		return true;
47	}
48	if ([fileManager fileExistsAtPath:ldrawDir isDirectory:&isDir] && isDir)
49	{
50		NSString *partsDir = [ldrawDir stringByAppendingPathComponent:@"parts"];
51
52		if ([fileManager fileExistsAtPath:partsDir isDirectory:&isDir] && isDir)
53		{
54			NSString *pDir = [ldrawDir stringByAppendingPathComponent:@"p"];
55
56			if ([fileManager fileExistsAtPath:pDir isDirectory:&isDir] && isDir)
57			{
58				return true;
59			}
60		}
61	}
62	return false;
63}
64
65- (void)updateLDrawDir:(NSString *)ldrawDir apply:(BOOL)apply
66{
67	const char *value = [ldrawDir UTF8String];
68
69	ldPreferences->setLDrawDir(value);
70	if (apply)
71	{
72		ldPreferences->applyLDrawSettings();
73		ldPreferences->commitLDrawSettings();
74		[ldrawDirField setStringValue:ldrawDir];
75		LDrawModelViewer::resetUnofficialDownloadTimes();
76	}
77}
78
79- (NSString *)ldrawDir
80{
81	return [NSString stringWithUTF8String:ldPreferences->getLDrawDir()];
82}
83
84- (void)updateLDrawDir:(NSString *)ldrawDir
85{
86	[self updateLDrawDir:ldrawDir apply:YES];
87}
88
89- (void)setGenerateThumbnails:(bool)value
90{
91	BOOL disableThumbnails = value ? NO : YES;
92	NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
93	NSMutableDictionary<NSString *, id>* udDomain = [[sud persistentDomainForName:@"com.cobbsville.LDViewQuickLook"] mutableCopy];
94	[udDomain setObject:[NSNumber numberWithBool:disableThumbnails] forKey:@"DisableThumbnails"];
95	[[NSUserDefaults standardUserDefaults] setPersistentDomain:udDomain forName:@"com.cobbsville.LDViewQuickLook"];
96	[sud synchronize];
97	[udDomain release];
98}
99
100- (bool)updateLdPreferences
101{
102	StringVector extraDirs;
103
104	if (![[self class] verifyLDrawDir:[ldrawDirField stringValue]])
105	{
106		[preferences setApplyFailed:self];
107		NSRunCriticalAlertPanel([OCLocalStrings get:@"InvalidDir"], [OCLocalStrings get:@"LDrawNotInDir"], [OCLocalStrings get:@"OK"], nil, nil);
108		return false;
109	}
110	[self updateLDrawDir:[ldrawDirField stringValue] apply:NO];
111	for (int i = 0; i < [extraFolders count]; i++)
112	{
113		extraDirs.push_back([[extraFolders objectAtIndex:i] UTF8String]);
114	}
115	ldPreferences->setExtraDirs(extraDirs);
116	[self setGenerateThumbnails:[self getCheck:generateThumbnailsCheck]];
117	return [super updateLdPreferences];
118}
119
120- (IBAction)resetPage:(id)sender
121{
122	ldPreferences->loadDefaultLDrawSettings(false);
123	[self setGenerateThumbnails:YES];
124	[super resetPage:sender];
125}
126
127- (void)openPanelDidEnd:(NSOpenPanel *)openPanel returnCode:(NSModalResponse)returnCode contextInfo:(void  *)contextInfo
128{
129	if (returnCode == NSModalResponseOK)
130	{
131		NSString *filename = [openPanel ldvFilename];
132
133		if (filename)
134		{
135			if (contextInfo == ldrawDirField)
136			{
137				[ldrawDirField setStringValue:filename];
138			}
139			else
140			{
141				[extraFolders addObject:filename];
142				[extraFoldersTableView reloadData];
143			}
144			[self valueChanged:self];
145		}
146	}
147}
148
149- (void)addExtraFolder
150{
151	[self browseForFolder:NULL];
152}
153
154- (void)removeExtraFolder
155{
156	NSInteger index = [extraFoldersTableView selectedRow];
157
158	if (index >= 0)
159	{
160		[extraFolders removeObjectAtIndex:index];
161	}
162	[extraFoldersTableView reloadData];
163	[self valueChanged:self];
164}
165
166- (IBAction)addRemoveExtraFolder:(id)sender
167{
168	switch ([addRemoveExtraFolder selectedSegment])
169	{
170		case 0:
171			[self addExtraFolder];
172			break;
173		case 1:
174			[self removeExtraFolder];
175			break;
176	}
177}
178
179- (NSMutableArray *)tableRows:(TableViewReorder *)sender
180{
181	return extraFolders;
182}
183
184- (void)awakeFromNib
185{
186	NSSegmentedCell *segmentCell = [addRemoveExtraFolder cell];
187
188	[segmentCell setToolTip:[OCLocalStrings get:@"AddExtraSearchFolder"] forSegment:0];
189	[segmentCell setToolTip:[OCLocalStrings get:@"RemoveExtraSearchFolder"] forSegment:1];
190	tableViewReorder = [[TableViewReorder alloc] initWithTableView:extraFoldersTableView owner:self dragType:@"LDViewExtraDirsDragType"];
191	[super awakeFromNib];
192}
193
194- (IBAction)extraFolderSelected:(id)sender
195{
196	[addRemoveExtraFolder setEnabled:[extraFoldersTableView selectedRow] != -1 forSegment:1];
197}
198
199- (IBAction)ldrawFolderBrowse:(id)sender
200{
201	[self browseForFolder:ldrawDirField];
202}
203
204- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
205{
206	return (NSInteger)extraFolders.count;
207}
208
209- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
210{
211	return [extraFolders objectAtIndex:rowIndex];
212}
213
214- (void)tableViewReorderDidOccur:(id)sender
215{
216	[self valueChanged:self];
217}
218
219- (bool)generateThumbnails
220{
221	NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
222	NSDictionary<NSString *, id>* udDomain = [sud persistentDomainForName:@"com.cobbsville.LDViewQuickLook"];
223	BOOL disableThumbnails = [[udDomain objectForKey:@"DisableThumbnails"] boolValue];
224	return disableThumbnails ? false : true;
225}
226
227@end
228