Added last updated date in plugin repository browser

This commit is contained in:
Michael Starke
2018-12-11 16:14:06 +01:00
parent 9f8617372f
commit 032cd39416
4 changed files with 25 additions and 10 deletions

View File

@@ -31,6 +31,7 @@ FOUNDATION_EXTERN NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNot
@interface MPPluginRepository : NSObject @interface MPPluginRepository : NSObject
@property (class, strong, readonly) MPPluginRepository *defaultRepository; @property (class, strong, readonly) MPPluginRepository *defaultRepository;
@property (readonly, copy) NSDate *updatedAt;
@property (readonly) BOOL isInitialized; @property (readonly) BOOL isInitialized;
/* /*
this property is set asynchronously, to make sure, you receive valid data, this property is set asynchronously, to make sure, you receive valid data,

View File

@@ -38,6 +38,10 @@ NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.
@synthesize availablePlugins = _availablePlugins; @synthesize availablePlugins = _availablePlugins;
+ (NSSet<NSString *> *)keyPathsForValuesAffectingUpdatedAt {
return [NSSet setWithObject:NSStringFromSelector(@selector(lastDataFetchTime))];
}
+ (instancetype)defaultRepository { + (instancetype)defaultRepository {
static MPPluginRepository *instance; static MPPluginRepository *instance;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
@@ -71,6 +75,10 @@ NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.
return _availablePlugins; return _availablePlugins;
} }
- (NSDate *)updatedAt {
return [NSDate dateWithTimeIntervalSinceReferenceDate:self.lastDataFetchTime];
}
- (void)setAvailablePlugins:(NSArray<MPPluginRepositoryItem *> *)availablePlugins { - (void)setAvailablePlugins:(NSArray<MPPluginRepositoryItem *> *)availablePlugins {
@synchronized (self) { @synchronized (self) {
_availablePlugins = [availablePlugins copy]; _availablePlugins = [availablePlugins copy];

View File

@@ -24,6 +24,7 @@ typedef NS_ENUM(NSUInteger, MPPluginTableColumn) {
@property (copy) NSArray<MPPluginRepositoryItem *>* repositoryItems; @property (copy) NSArray<MPPluginRepositoryItem *>* repositoryItems;
@property (strong) IBOutlet NSTableView *itemTable; @property (strong) IBOutlet NSTableView *itemTable;
@property (strong) IBOutlet NSTextField *updatedAtTextField;
@end @end
@@ -35,6 +36,7 @@ typedef NS_ENUM(NSUInteger, MPPluginTableColumn) {
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
[self.updatedAtTextField bind:NSValueBinding toObject:MPPluginRepository.defaultRepository withKeyPath:NSStringFromSelector(@selector(updatedAt)) options:nil];
[self _refreshRepository]; [self _refreshRepository];
} }

View File

@@ -9,6 +9,7 @@
<customObject id="-2" userLabel="File's Owner" customClass="MPPluginRepositoryBrowserViewController"> <customObject id="-2" userLabel="File's Owner" customClass="MPPluginRepositoryBrowserViewController">
<connections> <connections>
<outlet property="itemTable" destination="gDR-Fx-c0h" id="yYx-qm-i7K"/> <outlet property="itemTable" destination="gDR-Fx-c0h" id="yYx-qm-i7K"/>
<outlet property="updatedAtTextField" destination="d2Q-7O-ilP" id="uiZ-VA-MQv"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/> <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections> </connections>
</customObject> </customObject>
@@ -19,13 +20,13 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<scrollView autohidesScrollers="YES" horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V1g-KK-vjw"> <scrollView autohidesScrollers="YES" horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="V1g-KK-vjw">
<rect key="frame" x="20" y="141" width="598" height="352"/> <rect key="frame" x="20" y="74" width="598" height="419"/>
<clipView key="contentView" id="Sqy-VI-iH4"> <clipView key="contentView" id="Sqy-VI-iH4">
<rect key="frame" x="1" y="0.0" width="596" height="351"/> <rect key="frame" x="1" y="0.0" width="596" height="418"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="sequential" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="24" rowSizeStyle="systemDefault" headerView="uVe-04-Now" viewBased="YES" id="gDR-Fx-c0h"> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="sequential" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="24" rowSizeStyle="systemDefault" headerView="uVe-04-Now" viewBased="YES" id="gDR-Fx-c0h">
<rect key="frame" x="0.0" y="0.0" width="599" height="328"/> <rect key="frame" x="0.0" y="0.0" width="599" height="395"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/> <size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -142,7 +143,7 @@
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="gYM-eK-y5v"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="gYM-eK-y5v"/>
</constraints> </constraints>
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="ajb-Vb-WhY"> <scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="ajb-Vb-WhY">
<rect key="frame" x="1" y="335" width="596" height="16"/> <rect key="frame" x="1" y="402" width="596" height="16"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="3eJ-oK-GNt"> <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="3eJ-oK-GNt">
@@ -174,10 +175,10 @@
<action selector="closeBrowser:" target="-2" id="FVU-rJ-Pxm"/> <action selector="closeBrowser:" target="-2" id="FVU-rJ-Pxm"/>
</connections> </connections>
</button> </button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="d2Q-7O-ilP"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d2Q-7O-ilP">
<rect key="frame" x="20" y="116" width="111" height="17"/> <rect key="frame" x="18" y="49" width="72" height="17"/>
<autoresizingMask key="autoresizingMask"/> <textFieldCell key="cell" lineBreakMode="clipping" title="Updated at" id="DhR-ED-6gV">
<textFieldCell key="cell" lineBreakMode="clipping" title="last.time.checked" id="DhR-ED-6gV"> <dateFormatter key="formatter" dateStyle="short" timeStyle="medium" doesRelativeDateFormatting="YES" id="0Ll-SA-lFN"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -185,18 +186,21 @@
</textField> </textField>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="Pkh-la-7FU" firstAttribute="top" secondItem="V1g-KK-vjw" secondAttribute="bottom" constant="100" id="30X-fR-rks"/> <constraint firstItem="d2Q-7O-ilP" firstAttribute="top" secondItem="V1g-KK-vjw" secondAttribute="bottom" constant="8" symbolic="YES" id="0Pm-R2-Jb4"/>
<constraint firstItem="Pkh-la-7FU" firstAttribute="top" secondItem="d2Q-7O-ilP" secondAttribute="bottom" constant="8" symbolic="YES" id="30X-fR-rks"/>
<constraint firstItem="V1g-KK-vjw" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="3jQ-NX-W3e"/> <constraint firstItem="V1g-KK-vjw" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="3jQ-NX-W3e"/>
<constraint firstAttribute="bottom" secondItem="Pkh-la-7FU" secondAttribute="bottom" constant="20" symbolic="YES" id="AwW-xp-Lps"/> <constraint firstAttribute="bottom" secondItem="Pkh-la-7FU" secondAttribute="bottom" constant="20" symbolic="YES" id="AwW-xp-Lps"/>
<constraint firstAttribute="trailing" secondItem="V1g-KK-vjw" secondAttribute="trailing" constant="20" symbolic="YES" id="DVA-MO-e4e"/> <constraint firstAttribute="trailing" secondItem="V1g-KK-vjw" secondAttribute="trailing" constant="20" symbolic="YES" id="DVA-MO-e4e"/>
<constraint firstItem="bGv-Zc-Vrk" firstAttribute="centerY" secondItem="Pkh-la-7FU" secondAttribute="centerY" id="J68-4H-1yJ"/> <constraint firstItem="bGv-Zc-Vrk" firstAttribute="centerY" secondItem="Pkh-la-7FU" secondAttribute="centerY" id="J68-4H-1yJ"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="d2Q-7O-ilP" secondAttribute="trailing" constant="20" symbolic="YES" id="LAb-xb-eeR"/>
<constraint firstItem="V1g-KK-vjw" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="SQs-j2-6HH"/> <constraint firstItem="V1g-KK-vjw" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="SQs-j2-6HH"/>
<constraint firstAttribute="bottom" secondItem="bGv-Zc-Vrk" secondAttribute="bottom" constant="20" symbolic="YES" id="hyU-hm-uRL"/> <constraint firstAttribute="bottom" secondItem="bGv-Zc-Vrk" secondAttribute="bottom" constant="20" symbolic="YES" id="hyU-hm-uRL"/>
<constraint firstAttribute="trailing" secondItem="Pkh-la-7FU" secondAttribute="trailing" constant="20" symbolic="YES" id="iTm-72-HFD"/> <constraint firstAttribute="trailing" secondItem="Pkh-la-7FU" secondAttribute="trailing" constant="20" symbolic="YES" id="iTm-72-HFD"/>
<constraint firstItem="Pkh-la-7FU" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="bGv-Zc-Vrk" secondAttribute="trailing" constant="12" symbolic="YES" id="lUQ-jf-KWR"/> <constraint firstItem="Pkh-la-7FU" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="bGv-Zc-Vrk" secondAttribute="trailing" constant="12" symbolic="YES" id="lUQ-jf-KWR"/>
<constraint firstItem="d2Q-7O-ilP" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="s9m-Ls-EeX"/>
<constraint firstItem="bGv-Zc-Vrk" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="tk3-kF-k22"/> <constraint firstItem="bGv-Zc-Vrk" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="tk3-kF-k22"/>
</constraints> </constraints>
<point key="canvasLocation" x="-41" y="87"/> <point key="canvasLocation" x="263" y="32"/>
</customView> </customView>
</objects> </objects>
</document> </document>