summaryrefslogtreecommitdiffstats
path: root/macosx/HBPreset.m
blob: 05cd455522c07458100dab257a7ddf49ca1494cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//
//  HBBaseNode.m
//  PresetsView
//
//  Created by Damiano Galassi on 14/07/14.
//  Copyright (c) 2014 Damiano Galassi. All rights reserved.
//

#import "HBPreset.h"

@implementation HBPreset

- (instancetype)initWithName:(NSString *)title content:(NSDictionary *)content builtIn:(BOOL)builtIn;
{
    self = [self init];
    if (self)
    {
        _name = [title copy];
        _isBuiltIn = builtIn;
        _content = [content retain];
        _presetDescription = [content[@"PresetDescription"] copy];
    }
    return self;
}

- (instancetype)initWithFolderName:(NSString *)title builtIn:(BOOL)builtIn;
{
    self = [self init];
    if (self)
    {
        _name = [title copy];
        _isBuiltIn = builtIn;
        _isLeaf = NO;
    }
    return self;
}

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        _children = [[NSMutableArray alloc] init];
        _name = @"New Preset";
        _isLeaf = YES;
        _presetDescription = @"";
    }
    return self;
}

- (void)dealloc
{
    [_name release];
    [_content release];
    [_presetDescription release];
    [_children release];

    [super dealloc];
}

- (id)copyWithZone:(NSZone *)zone
{
    HBPreset *node = [[HBPreset alloc] init];
    node->_name = [self.name copy];
    node->_content = [self.content copy];
    node->_presetDescription = [self.presetDescription copy];
    for (HBPreset *children in self.children)
    {
        [node->_children addObject:[[children copy] autorelease]];
    }

    return node;
}

- (NSUInteger)hash
{
    return self.name.hash + self.isBuiltIn + self.isLeaf;
}

#pragma mark - KVC

- (BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError
{
    // Return an error is the name is empty
    if (![*ioValue length])
    {
        if (outError)
        {
            *outError = [[NSError alloc] initWithDomain:@"HBErrorDomain"
                                                   code:0
                                               userInfo:@{NSLocalizedDescriptionKey:@"The preset title cannot be empty.",
                                                          NSLocalizedRecoverySuggestionErrorKey:@"Please enter a title."}];
        }
        return NO;
    }

    return YES;
}

#pragma mark - Enumeration

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSIndexPath *idx, BOOL *stop))block
{
    BOOL stop = NO;
    NSMutableArray *queue = [[NSMutableArray alloc] init];
    NSMutableArray *indexesQueue = [[NSMutableArray alloc] init];

    [queue addObject:self];
    [indexesQueue addObject:[[[NSIndexPath alloc] init] autorelease]];

    HBPreset *node = nil;
    while ((node = [queue lastObject]) != nil)
    {
        // Get the index path of the current object
        NSIndexPath *indexPath = [indexesQueue lastObject];

        // Call the block
        block(node, indexPath, &stop);

        if (stop)
        {
            break;
        }

        [indexesQueue removeLastObject];

        for (int i = 0; i < node.children.count; i++)
        {
            [indexesQueue addObject:[indexPath indexPathByAddingIndex:i]];
        }

        [queue removeLastObject];
        [queue addObjectsFromArray:node.children];

    }

    [queue release];
    [indexesQueue release];
}

@end