Skip to content
This repository was archived by the owner on May 7, 2025. It is now read-only.

Commit 6618a12

Browse files
committed
Merge pull request #33 from readium/feature/paginationAPI_prevNext
ObjectiveC pagination API to match shared-Javascript lib, fixes previous/next buttons (RTL page progression direction)
2 parents 34f19e8 + 713f7f2 commit 6618a12

File tree

4 files changed

+49
-35
lines changed

4 files changed

+49
-35
lines changed

Classes/EPubViewController.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,14 @@
4343
{
4444
@private UIAlertView *m_alertAddBookmark;
4545
@private RDContainer *m_container;
46-
@private int m_currentOpenPageCount;
47-
@private int m_currentPageCount;
48-
@private int m_currentPageIndex;
49-
@private BOOL m_currentPageProgressionIsLTR;
50-
@private int m_currentSpineItemIndex;
46+
47+
@private BOOL m_currentPageCanGoLeft;
48+
@private BOOL m_currentPageCanGoRight;
49+
@private BOOL m_currentPageProgressionIsLTR;
50+
@private BOOL m_currentPageIsFixedLayout;
51+
@private int m_currentPageSpineItemCount;
52+
@private NSArray* m_currentPageOpenPagesArray;
53+
5154
@private NSString *m_initialCFI;
5255
@private BOOL m_moIsPlaying;
5356
@private RDNavigationElement *m_navElement;

Classes/EPubViewController.m

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -378,20 +378,42 @@ - (void)updateToolbar {
378378
label.font = [UIFont systemFontOfSize:16];
379379
label.textColor = [UIColor blackColor];
380380

381-
if (m_currentPageCount == 0) {
381+
BOOL canGoNext = m_currentPageProgressionIsLTR ? m_currentPageCanGoRight : m_currentPageCanGoLeft;
382+
BOOL canGoPrevious = m_currentPageProgressionIsLTR ? m_currentPageCanGoLeft : m_currentPageCanGoRight;
383+
384+
itemNext.enabled = canGoNext;
385+
itemPrev.enabled = canGoPrevious;
386+
387+
if (m_currentPageOpenPagesArray == nil || [m_currentPageOpenPagesArray count] <= 0) {
382388
label.text = @"";
383-
itemNext.enabled = NO;
384-
itemPrev.enabled = NO;
385389
}
386390
else {
387-
label.text = LocStr(@"PAGE_X_OF_Y", m_currentPageIndex + 1, m_currentPageCount);
388391

389-
itemNext.enabled = !(
390-
(m_currentSpineItemIndex + 1 == m_package.spineItems.count) &&
391-
(m_currentPageIndex + m_currentOpenPageCount + 1 > m_currentPageCount)
392-
);
392+
NSMutableArray *pageNumbers = [NSMutableArray array];
393+
394+
for (NSDictionary *pageDict in m_currentPageOpenPagesArray) {
395+
396+
NSNumber *spineItemIndex = [pageDict valueForKey:@"spineItemIndex"];
397+
NSNumber *spineItemPageIndex = [pageDict valueForKey:@"spineItemPageIndex"];
398+
399+
int pageIndex = m_currentPageIsFixedLayout ? spineItemIndex.intValue : spineItemPageIndex.intValue;
400+
401+
[pageNumbers addObject: [NSNumber numberWithInt:pageIndex + 1]];
402+
}
403+
404+
NSString* currentPages = [NSString stringWithFormat:@"%@", [pageNumbers componentsJoinedByString:@"-"]];
405+
406+
int pageCount = 0;
407+
if ([m_currentPageOpenPagesArray count] > 0)
408+
{
409+
NSDictionary *firstOpenPageDict = [m_currentPageOpenPagesArray objectAtIndex:0];
410+
NSNumber *number = [firstOpenPageDict valueForKey:@"spineItemPageCount"];
393411

394-
itemPrev.enabled = !(m_currentSpineItemIndex == 0 && m_currentPageIndex == 0);
412+
pageCount = m_currentPageIsFixedLayout ? m_currentPageSpineItemCount: number.intValue;
413+
}
414+
NSString* totalPages = [NSString stringWithFormat:@"%d", pageCount];
415+
416+
label.text = LocStr(@"PAGE_X_OF_Y", [currentPages UTF8String], [totalPages UTF8String], m_currentPageIsFixedLayout?[@"FXL" UTF8String]:[@"reflow" UTF8String]);
395417
}
396418

397419
[label sizeToFit];
@@ -557,31 +579,16 @@ - (void)viewWillDisappear:(BOOL)animated {
557579
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
558580
options:0 error:&error];
559581

560-
NSString *direction = [dict objectForKey:@"pageProgressionDirection"];
582+
m_currentPageCanGoLeft = ([[dict valueForKey:@"canGoLeft_"] isEqual:[NSNumber numberWithBool:YES]] ? YES : NO);
583+
m_currentPageCanGoRight = ([[dict valueForKey:@"canGoRight_"] isEqual:[NSNumber numberWithBool:YES]] ? YES : NO);
561584

562-
if ([direction isKindOfClass:[NSString class]]) {
563-
m_currentPageProgressionIsLTR = ![direction isEqualToString:@"rtl"];
564-
}
565-
else {
566-
m_currentPageProgressionIsLTR = YES;
567-
}
585+
m_currentPageProgressionIsLTR = ([[dict valueForKey:@"isRightToLeft"] isEqual:[NSNumber numberWithBool:YES]] ? NO : YES);
568586

569-
m_currentOpenPageCount = 0;
587+
m_currentPageIsFixedLayout = ([[dict valueForKey:@"isFixedLayout"] isEqual:[NSNumber numberWithBool:YES]] ? YES : NO);
570588

571-
for (NSDictionary *pageDict in [dict objectForKey:@"openPages"]) {
572-
m_currentOpenPageCount++;
589+
m_currentPageSpineItemCount = [((NSNumber*)[dict valueForKey:@"spineItemCount"]) intValue];
573590

574-
if (m_currentOpenPageCount == 1) {
575-
NSNumber *number = [pageDict objectForKey:@"spineItemPageCount"];
576-
m_currentPageCount = number.intValue;
577-
578-
number = [pageDict objectForKey:@"spineItemPageIndex"];
579-
m_currentPageIndex = number.intValue;
580-
581-
number = [pageDict objectForKey:@"spineItemIndex"];
582-
m_currentSpineItemIndex = number.intValue;
583-
}
584-
}
591+
m_currentPageOpenPagesArray = (NSArray*)[dict objectForKey:@"openPages"];
585592

586593
m_webView.hidden = NO;
587594
[self updateToolbar];
10 Bytes
Binary file not shown.

Resources/host_app_feedback.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ ReadiumSDK.HostAppFeedback = function() {
4141
}, this);
4242

4343
this.onPaginationChanged = function(pageChangeData) {
44+
45+
pageChangeData.paginationInfo.canGoLeft_ = pageChangeData.paginationInfo.canGoLeft();
46+
pageChangeData.paginationInfo.canGoRight_ = pageChangeData.paginationInfo.canGoRight();
47+
4448
window.location.href = "epubobjc:pageDidChange?q=" +
4549
encodeURIComponent(JSON.stringify(pageChangeData.paginationInfo));
4650
};

0 commit comments

Comments
 (0)