Files
Cydia/Preferences.mm
Victor Bodinaud 954e43aa2f first commit
2025-03-03 13:59:05 +01:00

439 lines
11 KiB
Plaintext

/* Source {{{ */
@interface Source : NSObject {
NSString *description_;
NSString *label_;
NSString *origin_;
NSString *uri_;
NSString *distribution_;
NSString *type_;
BOOL trusted_;
}
- (void) dealloc;
- (Source *) initWithMetaIndex:(metaIndex *)index;
- (BOOL) trusted;
- (NSString *) uri;
- (NSString *) distribution;
- (NSString *) type;
- (NSString *) description;
- (NSString *) label;
- (NSString *) origin;
@end
@implementation Source
- (void) dealloc {
[uri_ release];
[distribution_ release];
[type_ release];
if (description_ != nil)
[description_ release];
if (label_ != nil)
[label_ release];
if (origin_ != nil)
[origin_ release];
[super dealloc];
}
- (Source *) initWithMetaIndex:(metaIndex *)index {
if ((self = [super init]) != nil) {
trusted_ = index->IsTrusted();
uri_ = [[NSString stringWithCString:index->GetURI().c_str()] retain];
distribution_ = [[NSString stringWithCString:index->GetDist().c_str()] retain];
type_ = [[NSString stringWithCString:index->GetType()] retain];
description_ = nil;
label_ = nil;
origin_ = nil;
debReleaseIndex *dindex(dynamic_cast<debReleaseIndex *>(index));
if (dindex != NULL) {
std::ifstream release(dindex->MetaIndexFile("Release").c_str());
std::string line;
while (std::getline(release, line)) {
std::string::size_type colon(line.find(':'));
if (colon == std::string::npos)
continue;
std::string name(line.substr(0, colon));
std::string value(line.substr(colon + 1));
while (!value.empty() && value[0] == ' ')
value = value.substr(1);
if (name == "Description")
description_ = [[NSString stringWithCString:value.c_str()] retain];
else if (name == "Label")
label_ = [[NSString stringWithCString:value.c_str()] retain];
else if (name == "Origin")
origin_ = [[NSString stringWithCString:value.c_str()] retain];
}
}
} return self;
}
- (BOOL) trusted {
return trusted_;
}
- (NSString *) uri {
return uri_;
}
- (NSString *) distribution {
return distribution_;
}
- (NSString *) type {
return type_;
}
- (NSString *) description {
return description_;
}
- (NSString *) label {
return label_;
}
- (NSString *) origin {
return origin_;
}
@end
/* }}} */
/* Source Cell {{{ */
@interface SourceCell : UITableCell {
UITextLabel *description_;
UIRightTextLabel *label_;
UITextLabel *origin_;
}
- (void) dealloc;
- (SourceCell *) initWithSource:(Source *)source;
- (void) _setSelected:(float)fraction;
- (void) setSelected:(BOOL)selected;
- (void) setSelected:(BOOL)selected withFade:(BOOL)fade;
- (void) _setSelectionFadeFraction:(float)fraction;
@end
@implementation SourceCell
- (void) dealloc {
[description_ release];
[label_ release];
[origin_ release];
[super dealloc];
}
- (SourceCell *) initWithSource:(Source *)source {
if ((self = [super init]) != nil) {
GSFontRef bold = GSFontCreateWithName("Helvetica", kGSFontTraitBold, 20);
GSFontRef small = GSFontCreateWithName("Helvetica", kGSFontTraitNone, 14);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
float clear[] = {0, 0, 0, 0};
NSString *description = [source description];
if (description == nil)
description = [source uri];
description_ = [[UITextLabel alloc] initWithFrame:CGRectMake(12, 7, 270, 25)];
[description_ setBackgroundColor:CGColorCreate(space, clear)];
[description_ setFont:bold];
[description_ setText:description];
NSString *label = [source label];
if (label == nil)
label = [source type];
label_ = [[UIRightTextLabel alloc] initWithFrame:CGRectMake(290, 32, 90, 25)];
[label_ setBackgroundColor:CGColorCreate(space, clear)];
[label_ setFont:small];
[label_ setText:label];
NSString *origin = [source origin];
if (origin == nil)
origin = [source distribution];
origin_ = [[UITextLabel alloc] initWithFrame:CGRectMake(13, 35, 315, 20)];
[origin_ setBackgroundColor:CGColorCreate(space, clear)];
[origin_ setFont:small];
[origin_ setText:origin];
[self addSubview:description_];
[self addSubview:label_];
[self addSubview:origin_];
CFRelease(small);
CFRelease(bold);
} return self;
}
- (void) _setSelected:(float)fraction {
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
float black[] = {
interpolate(0.0, 1.0, fraction),
interpolate(0.0, 1.0, fraction),
interpolate(0.0, 1.0, fraction),
1.0};
float blue[] = {
interpolate(0.2, 1.0, fraction),
interpolate(0.2, 1.0, fraction),
interpolate(1.0, 1.0, fraction),
1.0};
float gray[] = {
interpolate(0.4, 1.0, fraction),
interpolate(0.4, 1.0, fraction),
interpolate(0.4, 1.0, fraction),
1.0};
[description_ setColor:CGColorCreate(space, black)];
[label_ setColor:CGColorCreate(space, blue)];
[origin_ setColor:CGColorCreate(space, gray)];
}
- (void) setSelected:(BOOL)selected {
[self _setSelected:(selected ? 1.0 : 0.0)];
[super setSelected:selected];
}
- (void) setSelected:(BOOL)selected withFade:(BOOL)fade {
if (!fade)
[self _setSelected:(selected ? 1.0 : 0.0)];
[super setSelected:selected withFade:fade];
}
- (void) _setSelectionFadeFraction:(float)fraction {
[self _setSelected:fraction];
[super _setSelectionFadeFraction:fraction];
}
@end
/* }}} */
/* Sources View {{{ */
@interface SourcesView : UIView {
UISectionList *list_;
Database *database_;
id delegate_;
NSMutableArray *sources_;
UIActionSheet *alert_;
}
- (int) numberOfSectionsInSectionList:(UISectionList *)list;
- (NSString *) sectionList:(UISectionList *)list titleForSection:(int)section;
- (int) sectionList:(UISectionList *)list rowForSection:(int)section;
- (int) numberOfRowsInTable:(UITable *)table;
- (float) table:(UITable *)table heightForRow:(int)row;
- (UITableCell *) table:(UITable *)table cellForRow:(int)row column:(UITableColumn *)col;
- (BOOL) table:(UITable *)table showDisclosureForRow:(int)row;
- (void) tableRowSelected:(NSNotification*)notification;
- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button;
- (void) dealloc;
- (id) initWithFrame:(CGRect)frame database:(Database *)database;
- (void) setDelegate:(id)delegate;
- (void) reloadData;
- (NSString *) leftTitle;
- (NSString *) rightTitle;
@end
@implementation SourcesView
- (int) numberOfSectionsInSectionList:(UISectionList *)list {
return 1;
}
- (NSString *) sectionList:(UISectionList *)list titleForSection:(int)section {
return @"sources";
}
- (int) sectionList:(UISectionList *)list rowForSection:(int)section {
return 0;
}
- (int) numberOfRowsInTable:(UITable *)table {
return [sources_ count];
}
- (float) table:(UITable *)table heightForRow:(int)row {
return 64;
}
- (UITableCell *) table:(UITable *)table cellForRow:(int)row column:(UITableColumn *)col {
return [[[SourceCell alloc] initWithSource:[sources_ objectAtIndex:row]] autorelease];
}
- (BOOL) table:(UITable *)table showDisclosureForRow:(int)row {
return NO;
}
- (void) tableRowSelected:(NSNotification*)notification {
UITable *table([list_ table]);
int row([table selectedRow]);
if (row == INT_MAX)
return;
[table selectRow:-1 byExtendingSelection:NO withFade:YES];
}
- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button {
[alert_ dismiss];
[alert_ release];
alert_ = nil;
}
- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button {
switch (button) {
case 0:
alert_ = [[UIActionSheet alloc]
initWithTitle:@"Unimplemented"
buttons:[NSArray arrayWithObjects:@"Okay", nil]
defaultButtonIndex:0
delegate:self
context:self
];
[alert_ setBodyText:@"This feature will be implemented soon. In the mean time, you may add sources by adding .list files to '/etc/apt/sources.list.d'. If you'd like to be in the default list, please contact the author of Packager."];
[alert_ popupAlertAnimated:YES];
break;
case 1:
[delegate_ update];
break;
}
}
- (void) dealloc {
if (sources_ != nil)
[sources_ release];
[list_ release];
[super dealloc];
}
- (id) initWithFrame:(CGRect)frame database:(Database *)database {
if ((self = [super initWithFrame:frame]) != nil) {
database_ = database;
sources_ = nil;
CGSize navsize = [UINavigationBar defaultSize];
CGRect navrect = {{0, 0}, navsize};
CGRect bounds = [self bounds];
navbar_ = [[UINavigationBar alloc] initWithFrame:navrect];
[self addSubview:navbar_];
[navbar_ setBarStyle:1];
[navbar_ setDelegate:self];
UINavigationItem *navitem = [[[UINavigationItem alloc] initWithTitle:@"Sources"] autorelease];
[navbar_ pushNavigationItem:navitem];
list_ = [[UISectionList alloc] initWithFrame:CGRectMake(
0, navsize.height, bounds.size.width, bounds.size.height - navsize.height
)];
[self addSubview:list_];
[list_ setDataSource:self];
[list_ setShouldHideHeaderInShortLists:NO];
UITableColumn *column = [[UITableColumn alloc]
initWithTitle:@"Name"
identifier:@"name"
width:frame.size.width
];
UITable *table = [list_ table];
[table setSeparatorStyle:1];
[table addTableColumn:column];
[table setDelegate:self];
} return self;
}
- (void) setDelegate:(id)delegate {
delegate_ = delegate;
}
- (void) reloadData {
pkgSourceList list;
_assert(list.ReadMainList());
if (sources_ != nil)
[sources_ release];
sources_ = [[NSMutableArray arrayWithCapacity:16] retain];
for (pkgSourceList::const_iterator source = list.begin(); source != list.end(); ++source)
[sources_ addObject:[[[Source alloc] initWithMetaIndex:*source] autorelease]];
[list_ reloadData];
}
- (NSString *) leftTitle {
return @"Refresh All";
}
- (NSString *) rightTitle {
return @"Edit";
}
@end
/* }}} */
/* Settings View {{{ */
@interface SettingsView : ResetView {
}
- (void) dealloc;
- (void) reloadData;
@end
@implementation SettingsView
- (void) dealloc {
[super dealloc];
}
- (id) initWithFrame:(CGRect)frame database:(Database *)database {
if ((self = [super initWithFrame:frame]) != nil) {
database_ = database;
sources_ = nil;
CGSize navsize = [UINavigationBar defaultSize];
CGRect navrect = {{0, 0}, navsize};
CGRect bounds = [self bounds];
navbar_ = [[UINavigationBar alloc] initWithFrame:navrect];
[self addSubview:navbar_];
[navbar_ setBarStyle:1];
[navbar_ setDelegate:self];
UINavigationItem *navitem = [[[UINavigationItem alloc] initWithTitle:@"Settings"] autorelease];
[navbar_ pushNavigationItem:navitem];
} return self;
}
- (void) reloadData {
[self resetView];
}
@end
/* }}} */