mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Adding unread icon to story detail. Fixing inconsistencies in unreads.
This commit is contained in:
parent
b28b081d33
commit
439ece29fb
7 changed files with 65 additions and 11 deletions
|
@ -967,10 +967,12 @@
|
|||
}
|
||||
|
||||
- (void)loadStory:(FeedDetailTableCell *)cell atRow:(NSInteger)row {
|
||||
cell.isRead = YES;
|
||||
[cell setNeedsLayout];
|
||||
NSInteger storyIndex = [appDelegate indexFromLocation:row];
|
||||
appDelegate.activeStory = [[appDelegate activeFeedStories] objectAtIndex:storyIndex];
|
||||
if ([appDelegate isStoryUnread:appDelegate.activeStory]) {
|
||||
[self markStoryAsRead:appDelegate.activeStory];
|
||||
}
|
||||
[self redrawUnreadStory];
|
||||
[appDelegate loadStoryDetailView];
|
||||
}
|
||||
|
||||
|
@ -978,7 +980,7 @@
|
|||
NSInteger rowIndex = [appDelegate locationOfActiveStory];
|
||||
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];
|
||||
FeedDetailTableCell *cell = (FeedDetailTableCell*) [self.storyTitlesTable cellForRowAtIndexPath:indexPath];
|
||||
cell.isRead = [[appDelegate.activeStory objectForKey:@"read_status"] boolValue];
|
||||
cell.isRead = ![appDelegate isStoryUnread:appDelegate.activeStory];
|
||||
cell.isShared = [[appDelegate.activeStory objectForKey:@"shared"] boolValue];
|
||||
cell.isStarred = [[appDelegate.activeStory objectForKey:@"starred"] boolValue];
|
||||
[cell setNeedsDisplay];
|
||||
|
|
|
@ -1075,9 +1075,9 @@
|
|||
BOOL recentlyRead = [[self.recentlyReadStories
|
||||
objectForKey:[story objectForKey:@"story_hash"]] boolValue];
|
||||
|
||||
// NSLog(@"isUnread: %d/%d/%d (%@ / %@)", readStatusUnread, storyHashUnread,
|
||||
// recentlyRead, [[story objectForKey:@"story_title"] substringToIndex:10],
|
||||
// [story objectForKey:@"story_hash"]);
|
||||
NSLog(@"isUnread: (%d || %d) && %d (%@ / %@)", readStatusUnread, storyHashUnread,
|
||||
!recentlyRead, [[story objectForKey:@"story_title"] substringToIndex:10],
|
||||
[story objectForKey:@"story_hash"]);
|
||||
|
||||
return (readStatusUnread || storyHashUnread) && !recentlyRead;
|
||||
}
|
||||
|
@ -1662,6 +1662,7 @@
|
|||
[self.recentlyReadStories setObject:[NSNumber numberWithBool:YES]
|
||||
forKey:[story objectForKey:@"story_hash"]];
|
||||
[self.recentlyReadStoryLocations addObject:[NSNumber numberWithInteger:location]];
|
||||
[self.unreadStoryHashes removeObjectForKey:[story objectForKey:@"story_hash"]];
|
||||
|
||||
}
|
||||
|
||||
|
@ -2407,6 +2408,7 @@
|
|||
[db executeUpdate:@"drop table if exists `cached_images`"];
|
||||
[db executeUpdate:@"drop table if exists `users`"];
|
||||
// [db executeUpdate:@"drop table if exists `queued_read_hashes`"]; // Nope, don't clear this.
|
||||
// [db executeUpdate:@"drop table if exists `queued_saved_hashes`"]; // Nope, don't clear this.
|
||||
NSLog(@"Dropped db: %@", [db lastErrorMessage]);
|
||||
sqlite3_exec(db.sqliteHandle, [[NSString stringWithFormat:@"PRAGMA user_version = %d", CURRENT_DB_VERSION] UTF8String], NULL, NULL, NULL);
|
||||
}
|
||||
|
@ -2462,6 +2464,14 @@
|
|||
")"];
|
||||
[db executeUpdate:createReadTable];
|
||||
|
||||
NSString *createSavedTable = [NSString stringWithFormat:@"create table if not exists queued_saved_hashes "
|
||||
"("
|
||||
" story_feed_id varchar(20),"
|
||||
" story_hash varchar(24),"
|
||||
" UNIQUE(story_hash) ON CONFLICT IGNORE"
|
||||
")"];
|
||||
[db executeUpdate:createSavedTable];
|
||||
|
||||
NSString *createImagesTable = [NSString stringWithFormat:@"create table if not exists cached_images "
|
||||
"("
|
||||
" story_feed_id varchar(20),"
|
||||
|
|
|
@ -338,6 +338,13 @@
|
|||
[self.activeStory objectForKey:@"starred_date"]];
|
||||
}
|
||||
|
||||
NSString *storyUnread = @"";
|
||||
if ([appDelegate isStoryUnread:self.activeStory]) {
|
||||
NSInteger score = [NewsBlurAppDelegate computeStoryScore:[self.activeStory objectForKey:@"intelligence"]];
|
||||
storyUnread = [NSString stringWithFormat:@"<div class=\"NB-story-unread NB-%@\"></div>",
|
||||
score > 0 ? @"positive" : score < 0 ? @"negative" : @"neutral"];
|
||||
}
|
||||
|
||||
NSString *storyTitle = [self.activeStory objectForKey:@"story_title"];
|
||||
NSMutableDictionary *titleClassifiers = [[appDelegate.activeClassifiers objectForKey:feedId]
|
||||
objectForKey:@"titles"];
|
||||
|
@ -354,12 +361,16 @@
|
|||
|
||||
NSString *storyHeader = [NSString stringWithFormat:@
|
||||
"<div class=\"NB-header\"><div class=\"NB-header-inner\">"
|
||||
"<div class=\"NB-story-title\">%@</div>"
|
||||
"<div class=\"NB-story-title\">"
|
||||
" %@"
|
||||
" %@"
|
||||
"</div>"
|
||||
"<div class=\"NB-story-date\">%@</div>"
|
||||
"%@"
|
||||
"%@"
|
||||
"%@"
|
||||
"</div></div>",
|
||||
storyUnread,
|
||||
storyTitle,
|
||||
[self.activeStory objectForKey:@"long_parsed_date"],
|
||||
storyAuthor,
|
||||
|
|
|
@ -777,6 +777,8 @@
|
|||
if ([appDelegate isStoryUnread:appDelegate.activeStory]) {
|
||||
|
||||
[appDelegate markActiveStoryRead];
|
||||
[self.currentPage refreshHeader];
|
||||
[appDelegate.feedDetailViewController redrawUnreadStory];
|
||||
|
||||
NSString *urlString = [NSString stringWithFormat:@"%@/reader/mark_story_hashes_as_read",
|
||||
NEWSBLUR_URL];
|
||||
|
@ -924,7 +926,7 @@
|
|||
[appDelegate markActiveStoryUnread];
|
||||
[appDelegate.feedDetailViewController redrawUnreadStory];
|
||||
[self setNextPreviousButtons];
|
||||
|
||||
[self refreshHeaders];
|
||||
[self.currentPage flashCheckmarkHud:@"unread"];
|
||||
}
|
||||
|
||||
|
@ -941,9 +943,10 @@
|
|||
[appDelegate markActiveStoryUnread];
|
||||
[appDelegate.feedDetailViewController redrawUnreadStory];
|
||||
[self setNextPreviousButtons];
|
||||
|
||||
[self.currentPage flashCheckmarkHud:@"unread"];
|
||||
}
|
||||
|
||||
[self refreshHeaders];
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -775,7 +775,7 @@
|
|||
FF67D3B1168924C40057A7DA /* TrainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TrainerViewController.m; sourceTree = "<group>"; };
|
||||
FF67D3B6168977690057A7DA /* TrainerViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TrainerViewController.xib; sourceTree = "<group>"; };
|
||||
FF67D3BA168A70630057A7DA /* trainer.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = trainer.css; path = ../static/trainer.css; sourceTree = "<group>"; };
|
||||
FF67D3BD168A708D0057A7DA /* storyDetailView.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = storyDetailView.css; path = ../static/storyDetailView.css; sourceTree = "<group>"; };
|
||||
FF67D3BD168A708D0057A7DA /* storyDetailView.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = storyDetailView.css; path = ../static/storyDetailView.css; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.css; };
|
||||
FF67D3BE168A708D0057A7DA /* storyDetailView.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = storyDetailView.js; path = ../static/storyDetailView.js; sourceTree = "<group>"; };
|
||||
FF67D3BF168A708D0057A7DA /* zepto.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = zepto.js; path = ../static/zepto.js; sourceTree = "<group>"; };
|
||||
FF67D3C4168A71870057A7DA /* trainer.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = trainer.js; path = ../static/trainer.js; sourceTree = "<group>"; };
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#import <SystemConfiguration/SystemConfiguration.h>
|
||||
#import <MobileCoreServices/MobileCoreServices.h>
|
||||
|
||||
//#define DEBUG 1
|
||||
#define DEBUG 1
|
||||
|
||||
#ifdef DEBUG
|
||||
#define BACKGROUND_REFRESH_SECONDS -5
|
||||
|
|
|
@ -204,6 +204,34 @@ body.NB-iphone {
|
|||
color: #B85044;
|
||||
text-shadow: 0 1px 0 #F6E9E9;
|
||||
}
|
||||
.NB-story-unread {
|
||||
float: left;
|
||||
margin: 6px 6px 0 0;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background: transparent url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACVElEQVQ4EXVTPW8TQRCd/XCM7QgF2QSnsYQbRGKgpA+QitY/IBUSrgAjQWW5oojocCTSRKJ1SRMpgCIhIVrERwlSmthnsBXLd7bPtzvM7HFgkDlrvbuz782+N7srEBHmv/395+tCQY2imwCiHK/hVwHwBg20trfvfJnHiyRBu91eGgU/dohYI4CaB82NDSVqLWfzD6vVashxl4DJQ//7S5pvcbB4YQ2KxTXIZDI8hfF4DJ3OCXS6J25OtMOzufxtTiI5cjrq7ViLW+l0GiqVq1AqlUBrDWEYusZjjvEaY6y1t5jDXLG392wDJX6gsapsXCHAGTA2YhAk9oQQIKUEJTVMpxP49PkjAEKECq9pC+YuWlCr51dBKQWTyRiM+U8CpZ2yQr4AXs/TIoKaNoibVBhYWTlH5AlE0YwUGECLtEl8QgLoJwUpUJQg5bBdrwuWTkqT1DIn4I/lRf/sHq+Q1182jDEuibMIUNZI+vkqTMOpk86AxHtCTnpOwsSIMNxT2pAVfCOll4LAd4ViciI9ISY9W2GitVPX0/xYgsHX7HcwGJAC45o1BFrQknXGuhpZeyStwV2L1gyHQ1fEeAfeZXHjQjOWOcxVBweHvXfv3xZI+nVeTKVSrmDOCtuZa3yx+v2+U0m2WvfvPXqh2d/oNKxnl/Xl2Wx20/M8yGazkMvl3JlzApbu+z4EQRCXA+GVP5rVefL7MTWbzaVMTtL1FPwSFz4mOm6DAnYnI1NvNBp/HlOcNv5/8rS5LlDW6Chu0H29SH1IxT8mX0cobOvxg8Zfz/knWROSyKoTDHAAAAAASUVORK5CYII=") no-repeat center center;
|
||||
background-size: 8px;
|
||||
}
|
||||
.NB-extra-small .NB-story-unread {
|
||||
margin-top: 4px;
|
||||
}
|
||||
.NB-small .NB-story-unread {
|
||||
margin-top: 5px;
|
||||
}
|
||||
.NB-large .NB-story-unread {
|
||||
margin-top: 7px;
|
||||
}
|
||||
.NB-extra-large .NB-story-unread {
|
||||
margin-top: 8px;
|
||||
}
|
||||
.NB-story-unread.NB-positive {
|
||||
background: transparent url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAJCSURBVDiNfZO9a1NhFMZ/733vvWnTSoZULBkqltBiHRxKsYOLUdvFpc6COAkGEUv9KwJ1kAacRGexg6MaijgInVw6FcWAWqu1ps3n/TjHIR9NVPrAgXd4z/M85zkcw1+4v56bMYY8Sg7DJADKRwwlVdYeLpW2+v+b7mN5PedjKKiSB+zfxB3ExrCG8mB1qRT0CJbXc77CS5QFgIlTWSZSM4z4KQBqQYVyZYvy9+22quEVcG11qRQ4ACJaUGVheDTBfHaRqfQsvk0QxA2CuIFvE0ylZ5nPLjI8mkCUqyJaADD3nl86B3wA7Fw2R9I7QSwRsUaoSkfRwRoX67jUw0M2t0sAEcp51xjuqGLHT2ZwHY9acEAsIaIxinaCMjjGYh0Pz/qMj2XY+fnVNQ55V2LNAaSTGRrhIWEc9NT7CbouIvFJj2T4tvsFhZyrwqRx2hE3wipRn7pqh8CYnotIAlzrt7crTLqKghhaUZ0wDo6sd5qPFt4miSTElZBOPIELfFLR6WrrN45jB6wPQI9GaUV1VBQMZRfhjcL0fmOX1FD6/839RjBUmnsoYJQNR0SLKhpX91o0o1p7hcdUM6pR3WuhorGIFu3mi88/5q6fHgMuBK0QO9QOTZF/KpQmB79qbfuwVrzx9pkLUNsPVpIp72wUxFf2d6okRl2GRjys8VAU0YhmLaRVjbqTvK5XwpXeLQDcfDTvJ1NeAY4/JqBYr4QrT+++DwYIurj95OKMY01elcvAGZQAKBuHDYl17fGtdwPn/AezNkQDSAjjKwAAAABJRU5ErkJggg==") no-repeat center center;
|
||||
background-size: 8px;
|
||||
}
|
||||
.NB-story-unread.NB-negative {
|
||||
background: transparent url("data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACT0lEQVQ4EX1TTWsUQRB9NTPZXfcjxKhkFTxkL4FNIKDk6CVqBPXsj3Cv+iv2vPkRXkUvfhDILaAQiAEvihE0IR9gJjvZnZ3u8tXsxiQabCjorqr36nVVt6gqzq7th9ebYRC0BLoISGMY0y8Kee+879Rf/9w8my8nBJtP5grXugdthbYIDM8mne7VCaSzW5l83nyxkZo/JzDwlaO9l6yyZM7SzSlaHWGlZEe4bg+979u0nfxMdW/2q1cfG0lgnol4r515LKFUxPhCE+XpGwgY0W6Sm+3NZzHLYe59wxhWvj2oz4q6daiEk7dnEBUiaDoAsowMo/6IAFEEKYwhSzMcfPhMqGbqw/lInXvqoWG5PolAPdyvGCAB/YAfEQS8eci2kCCgguLUZSTb+5GIa0XO+UVlgeJ4BT7uQnt96IDVnT+vIAwgY1TBmOXGP/asgYtR5n0DlBhQsjNwLp/VqQYnE2YBCBsxcBA2wFQ4U6faiPKNKFzSA/opb2bSCf5n0UdVYsoI5psw1jRyql9ZaSblqCI61QInlf8m8VRAcEYVeWFgK/Be39nh8DCBZ0AdnxLPFxpjlmO5hvHer8jaQnWWDV5nsXCqVsYYm/W/NeAVduLEUhwHNR8srMWfyLRsjLtHx+izUd4qXWAWs5xR9WXDDp/ynBTicvkVWe8ZdZXzrtEie4JsSEbymNM5sgkN19takjxqbmh6+plIcli61PaCFjEXfyaBY2x5onf8zMDG9YdgxIzVW8WmSMgfqXc5/mm+5hSCLaauqLrOnY/9c9/5N8X6eiwIgjoOAAAAAElFTkSuQmCC") no-repeat center center;
|
||||
background-size: 8px;
|
||||
}
|
||||
.NB-story-date {
|
||||
display: inline;
|
||||
color: #818776;
|
||||
|
|
Loading…
Add table
Reference in a new issue