Skip to content

Commit 2b23e84

Browse files
felix-schwarzhosy
authored andcommitted
- UniversalItemListCell: add new Content.iconWidth property to control icon width in the universal cell, with fallback to defaults
- OCShareRole+UniversalItemListCellContentProvider: adapt icon width to size of option icons in ShareViewController
1 parent 9d38a2e commit 2b23e84

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

ownCloudAppShared/Client/Collection Views/Cells/UniversalItemListCell Content Providers/OCShareRole+UniversalItemListCellContentProvider.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ extension OCShareRole: UniversalItemListCellContentProvider {
2525

2626
if let icon = OCSymbol.icon(forSymbolName: symbolName) {
2727
content.icon = .icon(image: icon)
28+
content.iconWidth = UniversalItemListCell.defaultIconSize.width / 2
2829
}
2930

3031
content.title = .text(localizedName)

ownCloudAppShared/Client/Collection Views/Cells/UniversalItemListCell.swift

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
4949

5050
icon = content.icon
5151
iconDisabled = content.iconDisabled
52+
iconWidth = content.iconWidth
5253

5354
details = content.details
5455

@@ -102,6 +103,7 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
102103
var title: Title?
103104
var icon: Icon?
104105
var iconDisabled: Bool = false
106+
var iconWidth: CGFloat?
105107

106108
var details: [SegmentViewItem]?
107109

@@ -127,7 +129,7 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
127129
return view
128130
}()
129131

130-
private let iconSize : CGSize = CGSize(width: 40, height: 40)
132+
static public let defaultIconSize : CGSize = CGSize(width: 40, height: 40)
131133
public let thumbnailSize : CGSize = CGSize(width: 60, height: 60) // when changing size, also update .iconView.fallbackSize
132134
open var iconView: ResourceViewHost = ResourceViewHost(fallbackSize: CGSize(width: 60, height: 60)) // when changing size, also update .thumbnailSize
133135

@@ -306,10 +308,12 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
306308
hasSecondaryDetailView = false
307309
}
308310

311+
let iconWidthConstraint = updateIconWidth(content?.iconWidth, defaultWidth: (iconViewHeight / 0.75)) // 4:3
312+
309313
constraints = [
310314
iconView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: horizontalMargin),
311315
iconView.trailingAnchor.constraint(equalTo: titleLabel.leadingAnchor, constant: -spacing),
312-
iconView.widthAnchor.constraint(equalToConstant: floor(iconViewHeight / 0.75)), // 4:3
316+
iconWidthConstraint,
313317
iconView.heightAnchor.constraint(equalToConstant: iconViewHeight),
314318
iconView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: verticalIconMargin),
315319
iconView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -verticalIconMargin),
@@ -328,7 +332,7 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
328332
let verticalLabelMargin : CGFloat = 10
329333
let verticalIconMargin : CGFloat = 10
330334
let spacing : CGFloat = 15
331-
let iconViewWidth : CGFloat = floor(iconSize.width / 2)
335+
let iconViewWidth : CGFloat = floor(type(of: self).defaultIconSize.width / 2)
332336
let titleDetailSpacing: CGFloat = 15
333337

334338
titleLabel.numberOfLines = 1
@@ -341,10 +345,12 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
341345
hasSecondaryDetailView = false
342346
}
343347

348+
let iconWidthConstraint = updateIconWidth(content?.iconWidth, defaultWidth: iconViewWidth)
349+
344350
constraints = [
345351
iconView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: horizontalMargin),
346352
iconView.trailingAnchor.constraint(equalTo: titleLabel.leadingAnchor, constant: -spacing),
347-
iconView.widthAnchor.constraint(equalToConstant: iconViewWidth),
353+
iconWidthConstraint,
348354
iconView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: verticalIconMargin),
349355
iconView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -verticalIconMargin),
350356

@@ -362,7 +368,7 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
362368
let verticalLabelMargin : CGFloat = 10
363369
let verticalIconMargin : CGFloat = 10
364370
let spacing : CGFloat = 15
365-
let iconViewWidth : CGFloat = iconSize.width
371+
let iconViewWidth : CGFloat = type(of: self).defaultIconSize.width
366372
let verticalLabelMarginFromCenter : CGFloat = 1
367373

368374
titleLabel.numberOfLines = 1
@@ -377,10 +383,12 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
377383

378384
truncationMode = .truncateTail
379385

386+
let iconWidthConstraint = updateIconWidth(content?.iconWidth, defaultWidth: iconViewWidth)
387+
380388
constraints = [
381389
iconView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor, constant: horizontalMargin),
382390
iconView.trailingAnchor.constraint(equalTo: titleLabel.leadingAnchor, constant: -spacing),
383-
iconView.widthAnchor.constraint(equalToConstant: iconViewWidth),
391+
iconWidthConstraint,
384392
iconView.topAnchor.constraint(equalTo: self.contentView.topAnchor, constant: verticalIconMargin),
385393
iconView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor, constant: -verticalIconMargin),
386394

@@ -406,6 +414,28 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
406414
}
407415
}
408416

417+
private var iconWidthConstraint: NSLayoutConstraint?
418+
private var lastIconWidth: CGFloat?
419+
private var defaultIconWidthForCellLayout: CGFloat? // default width for current cell layout
420+
private func updateIconWidth(_ newWidth: CGFloat?, defaultWidth: CGFloat? = nil) -> NSLayoutConstraint {
421+
if let iconWidthConstraint {
422+
iconWidthConstraint.isActive = false
423+
}
424+
425+
if let defaultWidth {
426+
// Store default width for this cell type if one is provided
427+
defaultIconWidthForCellLayout = defaultWidth
428+
}
429+
430+
// Fall back to default icon size if necessary
431+
let effectiveWidth = newWidth ?? defaultIconWidthForCellLayout ?? type(of: self).defaultIconSize.width
432+
433+
let widthConstraint = iconView.widthAnchor.constraint(equalToConstant: effectiveWidth)
434+
iconWidthConstraint = widthConstraint
435+
436+
return widthConstraint
437+
}
438+
409439
// MARK: - Content
410440
var title: NSAttributedString? {
411441
didSet {
@@ -502,6 +532,11 @@ open class UniversalItemListCell: ThemeableCollectionViewListCell {
502532
}
503533
}
504534

535+
if content?.iconWidth != lastIconWidth {
536+
updateIconWidth(content?.iconWidth).isActive = true
537+
lastIconWidth = content?.iconWidth
538+
}
539+
505540
iconView.request = iconRequest
506541
if let iconViewProvider {
507542
iconView.activeViewProvider = iconViewProvider

0 commit comments

Comments
 (0)