diff --git a/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt b/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt index 8b3ea1bab4..b1cdbe5803 100644 --- a/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt +++ b/Meta/Lagom/Contrib/MacPDF/CMakeLists.txt @@ -17,6 +17,7 @@ add_executable(MacPDF MACOSX_BUNDLE main.mm AppDelegate.mm MacPDFDocument.mm + MacPDFOutlineViewDataSource.mm MacPDFView.mm MacPDFWindowController.mm ) diff --git a/Meta/Lagom/Contrib/MacPDF/MacPDFOutlineViewDataSource.h b/Meta/Lagom/Contrib/MacPDF/MacPDFOutlineViewDataSource.h new file mode 100644 index 0000000000..a91b4cedb2 --- /dev/null +++ b/Meta/Lagom/Contrib/MacPDF/MacPDFOutlineViewDataSource.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include "CocoaWrapper.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +// Objective-C wrapper of PDF::OutlineItem, to launder it through the NSOutlineViewDataSource protocol. +@interface OutlineItemWrapper : NSObject + +- (Optional)page; + +@end + +@interface MacPDFOutlineViewDataSource : NSObject + +- (instancetype)initWithOutline:(RefPtr)outline; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Meta/Lagom/Contrib/MacPDF/MacPDFOutlineViewDataSource.mm b/Meta/Lagom/Contrib/MacPDF/MacPDFOutlineViewDataSource.mm new file mode 100644 index 0000000000..6dcf6b6e0f --- /dev/null +++ b/Meta/Lagom/Contrib/MacPDF/MacPDFOutlineViewDataSource.mm @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2023, Nico Weber + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#import "MacPDFOutlineViewDataSource.h" + +@interface OutlineItemWrapper () +{ + RefPtr _item; +} +@end + +@implementation OutlineItemWrapper +- (instancetype)initWithItem:(NonnullRefPtr)item +{ + if (self = [super init]; !self) + return nil; + _item = move(item); + return self; +} + +- (Optional)page +{ + return _item->dest.page.map([](u32 page_index) { return page_index + 1; }); +} + +- (OutlineItemWrapper*)child:(NSInteger)index +{ + return [[OutlineItemWrapper alloc] initWithItem:_item->children[index]]; +} + +- (NSInteger)numberOfChildren +{ + return _item->children.size(); +} + +- (NSString*)objectValue +{ + return [NSString stringWithFormat:@"%s", _item->title.characters()]; // FIXME: encoding? +} +@end + +@interface MacPDFOutlineViewDataSource () +{ + RefPtr _outline; +} +@end + +@implementation MacPDFOutlineViewDataSource + +- (instancetype)initWithOutline:(RefPtr)outline +{ + if (self = [super init]; !self) + return nil; + _outline = move(outline); + return self; +} + +#pragma mark - NSOutlineViewDataSource + +- (id)outlineView:(NSOutlineView*)outlineView child:(NSInteger)index ofItem:(nullable id)item +{ + if (item) + return [(OutlineItemWrapper*)item child:index]; + + return [[OutlineItemWrapper alloc] initWithItem:_outline->children[index]]; +} + +- (BOOL)outlineView:(NSOutlineView*)outlineView isItemExpandable:(id)item +{ + return [self outlineView:outlineView numberOfChildrenOfItem:item] > 0; +} + +- (NSInteger)outlineView:(NSOutlineView*)outlineView numberOfChildrenOfItem:(nullable id)item +{ + if (item) + return [(OutlineItemWrapper*)item numberOfChildren]; + + return _outline ? _outline->children.size() : 0; +} + +- (id)outlineView:(NSOutlineView*)outlineView objectValueForTableColumn:(nullable NSTableColumn*)tableColumn byItem:(nullable id)item +{ + return [(OutlineItemWrapper*)item objectValue]; +} + +@end