summaryrefslogtreecommitdiffstats
path: root/macosx/HBLanguagesSelection.m
blob: 0ffe3e52acbfc0941214a71031fe4a3ac8c7df53 (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
/*  HBLanguagesSelection.m $

 This file is part of the HandBrake source code.
 Homepage: <http://handbrake.fr/>.
 It may be used under the terms of the GNU General Public License. */

#import "HBLanguagesSelection.h"
#include "lang.h"

@implementation HBLang

- (instancetype)initWithLanguage:(NSString *)value iso639_2code:(NSString *)code
{
    self = [super init];
    if (self)
    {
        _language = [value retain];
        _iso639_2 = [code retain];
    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
    [_language release];
}

@end

@implementation HBLanguagesSelection

- (instancetype)initWithLanguages:(NSArray *)languages
{
    self = [super init];
    if (self)
    {
        NSMutableArray *internal = [[NSMutableArray alloc] init];

        int insertedItems = 0;
        const iso639_lang_t *lang = lang_get_next(NULL);
        for (lang = lang_get_next(lang); lang != NULL; lang = lang_get_next(lang))
        {
            NSString *nativeLanguage = strlen(lang->native_name) ? @(lang->native_name) : @(lang->eng_name);

            HBLang *item = [[[HBLang alloc] initWithLanguage:nativeLanguage
                                                iso639_2code:@(lang->iso639_2)] autorelease];
            if ([languages containsObject:item.iso639_2])
            {
                item.isSelected = YES;
                [internal insertObject:item atIndex:insertedItems++];
            }
            else
            {
                [internal addObject:item];
            }
        }

        // Add the (Any) item.
        HBLang *item = [[[HBLang alloc] initWithLanguage:@"(Any)"
                                            iso639_2code:@"und"] autorelease];
        if ([languages containsObject:item.iso639_2])
        {
            item.isSelected = YES;
        }
        [internal insertObject:item atIndex:0];

        _languagesArray = internal;
    }

    return self;
}

- (NSArray *)selectedLanguages
{
    NSMutableArray *selected = [[[NSMutableArray alloc] init] autorelease];
    for (HBLang *lang in self.languagesArray)
    {
        if (lang.isSelected)
        {
            [selected addObject:lang.iso639_2];
        }
    }

    return [[selected copy] autorelease];
}

- (void)dealloc
{
    [super dealloc];
    [_languagesArray release];
}

@end

NSString *kHBLanguagesDragRowsType = @"kHBLanguagesDragRowsType";

@implementation HBLanguageArrayController

- (void)setShowSelectedOnly:(BOOL)showSelectedOnly
{
    _showSelectedOnly = showSelectedOnly;
    [self rearrangeObjects];
}

- (NSArray *)arrangeObjects:(NSArray *)objects
{
    if (!self.showSelectedOnly) {
        return [super arrangeObjects:objects];
    }

    // Returns a filtered array with only the selected items
    NSMutableArray *filteredObjects = [NSMutableArray arrayWithCapacity:[objects count]];
    for (id item in objects)
    {
        if ([[item valueForKeyPath:@"isSelected"] boolValue])
        {
            [filteredObjects addObject:item];
        }
    }

    return [super arrangeObjects:filteredObjects];
}

@end