ui: change person default icon
This commit introduces adjustements in lists layout.
In SmartList
- use custom Ring default user icon
In PersonsList
- use custom Ring default user icon
- make categories selectable
- remove background color of categories
In HistoryList
- add photo/default Ring user icon to history entries
Tuleap: #151
Change-Id: I99bba6ef95b31f9f6ac33d14f434c0a0bd53c654
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0693423..745eb8b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -190,6 +190,7 @@
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_action_transfer.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_action_add_participant.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_action_merge_calls.png
+${CMAKE_CURRENT_SOURCE_DIR}/data/default_user_icon.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ancrage.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/audio.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_person_add.png
diff --git a/data/default_user_icon.png b/data/default_user_icon.png
new file mode 100644
index 0000000..e99ee04
--- /dev/null
+++ b/data/default_user_icon.png
Binary files differ
diff --git a/src/HistoryVC.mm b/src/HistoryVC.mm
index 3b17422..76d685c 100644
--- a/src/HistoryVC.mm
+++ b/src/HistoryVC.mm
@@ -20,6 +20,8 @@
//Qt
#import <QSortFilterProxyModel>
+#import <QtMacExtras/qmacfunctions.h>
+#import <QPixmap>
//LRC
#import <categorizedhistorymodel.h>
@@ -27,10 +29,12 @@
#import <call.h>
#import <person.h>
#import <contactmethod.h>
+#import <globalinstances.h>
#import "QNSTreeController.h"
#import "PersonLinkerVC.h"
#import "views/HoverTableRowView.h"
+#import "delegates/ImageManipulationDelegate.h"
@interface HistoryVC() <NSPopoverDelegate, KeyboardShortcutDelegate, ContactLinkedDelegate> {
@@ -45,9 +49,10 @@
@implementation HistoryVC
// Tags for Views
-NSInteger const IMAGE_TAG = 100;
+NSInteger const DIRECTION_TAG = 100;
NSInteger const DISPLAYNAME_TAG = 200;
NSInteger const DETAILS_TAG = 300;
+NSInteger const PHOTO_TAG = 400;
- (void)awakeFromNib
{
@@ -150,24 +155,30 @@
} else {
result = [outlineView makeViewWithIdentifier:@"HistoryCell" owner:outlineView];
- NSImageView* photoView = [result viewWithTag:IMAGE_TAG];
+ NSImageView* directionView = [result viewWithTag:DIRECTION_TAG];
if (qvariant_cast<Call::Direction>(qIdx.data((int)Call::Role::Direction)) == Call::Direction::INCOMING) {
if (qvariant_cast<Boolean>(qIdx.data((int) Call::Role::Missed))) {
- [photoView setImage:[self image:[NSImage imageNamed:@"ic_call_missed"] withTintedWithColor:[NSColor redColor]]];
+ [directionView setImage:[self image:[NSImage imageNamed:@"ic_call_missed"] withTintedWithColor:[NSColor redColor]]];
} else {
- [photoView setImage:[self image:[NSImage imageNamed:@"ic_call_received"]
+ [directionView setImage:[self image:[NSImage imageNamed:@"ic_call_received"]
withTintedWithColor:[NSColor colorWithCalibratedRed:116/255.0 green:179/255.0 blue:93/255.0 alpha:1.0]]];
}
} else {
if (qvariant_cast<Boolean>(qIdx.data((int) Call::Role::Missed))) {
- [photoView setImage:[self image:[NSImage imageNamed:@"ic_call_missed"] withTintedWithColor:[NSColor redColor]]];
+ [directionView setImage:[self image:[NSImage imageNamed:@"ic_call_missed"] withTintedWithColor:[NSColor redColor]]];
} else {
- [photoView setImage:[self image:[NSImage imageNamed:@"ic_call_made"]
+ [directionView setImage:[self image:[NSImage imageNamed:@"ic_call_made"]
withTintedWithColor:[NSColor colorWithCalibratedRed:116/255.0 green:179/255.0 blue:93/255.0 alpha:1.0]]];
}
}
+ auto call = qvariant_cast<Call*>(qIdx.data((int)Call::Role::Object));
+
+ NSImageView* photoView = [result viewWithTag:PHOTO_TAG];
+ QVariant photo = GlobalInstances::pixmapManipulator().callPhoto(call, QSize(50,50));
+ [photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
+
NSTextField* details = [result viewWithTag:DETAILS_TAG];
[details setStringValue:qIdx.data((int)Call::Role::FormattedDate).toString().toNSString()];
}
diff --git a/src/PersonsVC.mm b/src/PersonsVC.mm
index aebe00b..730b43d 100644
--- a/src/PersonsVC.mm
+++ b/src/PersonsVC.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004-2015 Savoir-Faire Linux Inc.
+ * Copyright (C) 2015 Savoir-faire Linux Inc.
* Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -99,8 +99,16 @@
- (IBAction)callContact:(id)sender
{
if([[treeController selectedNodes] count] > 0) {
- QModelIndex qIdx = [treeController toQIdx:[treeController selectedNodes][0]];
+ auto item = [treeController selectedNodes][0];
+ QModelIndex qIdx = [treeController toQIdx:item];
ContactMethod* m = nil;
+ if (!qIdx.parent().isValid()) {
+ if ([personsView isItemExpanded:item]) {
+ [[personsView animator] collapseItem:item];
+ } else
+ [[personsView animator] expandItem:item];
+ return;
+ }
if(((NSTreeNode*)[treeController selectedNodes][0]).indexPath.length == 2) {
// Person
QVariant var = qIdx.data((int)Person::Role::Object);
@@ -138,11 +146,7 @@
if(!qIdx.isValid())
return NO;
- if(!qIdx.parent().isValid()) {
- return NO;
- } else {
- return YES;
- }
+ return YES;
}
// -------------------------------------------------------------------------------
@@ -167,7 +171,6 @@
result = [outlineView makeViewWithIdentifier:@"LetterCell" owner:outlineView];
[result setWantsLayer:YES];
[result setLayer:[CALayer layer]];
- [result.layer setBackgroundColor:[NSColor selectedControlColor].CGColor];
} else if(((NSTreeNode*)item).indexPath.length == 2) {
result = [outlineView makeViewWithIdentifier:@"PersonCell" owner:outlineView];
NSImageView* photoView = [result viewWithTag:IMAGE_TAG];
diff --git a/src/SmartViewVC.mm b/src/SmartViewVC.mm
index b08feb7..539c949 100644
--- a/src/SmartViewVC.mm
+++ b/src/SmartViewVC.mm
@@ -250,7 +250,7 @@
[displayName setStringValue:qIdx.data(Qt::DisplayRole).toString().toNSString()];
NSImageView* photoView = [result viewWithTag:IMAGE_TAG];
Person* p = qvariant_cast<Person*>(qIdx.data((int)Person::Role::Object));
- QVariant photo = GlobalInstances::pixmapManipulator().contactPhoto(p, QSize(40,40));
+ QVariant photo = GlobalInstances::pixmapManipulator().contactPhoto(p, QSize(50,50));
[photoView setImage:QtMac::toNSImage(qvariant_cast<QPixmap>(photo))];
return result;
}
diff --git a/src/delegates/ImageManipulationDelegate.mm b/src/delegates/ImageManipulationDelegate.mm
index 4a73edb..491a242 100644
--- a/src/delegates/ImageManipulationDelegate.mm
+++ b/src/delegates/ImageManipulationDelegate.mm
@@ -125,52 +125,23 @@
}
QPixmap ImageManipulationDelegate::drawDefaultUserPixmap(const QSize& size, bool displayPresence, bool isPresent) {
-
- const int radius = size.height() / 2;
- QPixmap pxm(size);
- pxm.fill(Qt::transparent);
- QPainter painter(&pxm);
-
- painter.setCompositionMode(QPainter::CompositionMode_Clear);
- painter.fillRect(0,0,size.width(),size.height(),QBrush(Qt::white));
- painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
-
// create the image somehow, load from file, draw into it...
- auto sourceImgRef = CGImageSourceCreateWithData((CFDataRef)[[NSImage imageNamed:@"NSUser"] TIFFRepresentation], NULL);
+ auto sourceImgRef = CGImageSourceCreateWithData((CFDataRef)[[NSImage imageNamed:@"default_user_icon"] TIFFRepresentation], NULL);
auto imgRef = CGImageSourceCreateImageAtIndex(sourceImgRef, 0, NULL);
auto finalpxm = QtMac::fromCGImageRef(resizeCGImage(imgRef, size));
-
- QRect pxRect = finalpxm.rect();
- QBitmap mask(pxRect.size());
- QPainter customPainter(&mask);
- customPainter.setRenderHint (QPainter::Antialiasing, true );
- customPainter.fillRect (pxRect , Qt::white );
- customPainter.setBackground (Qt::black );
- customPainter.setBrush (Qt::black );
- customPainter.drawRoundedRect(pxRect,radius,radius);
- finalpxm.setMask(mask);
- painter.setRenderHint (QPainter::Antialiasing, true );
- painter.drawPixmap(0,0,finalpxm);
- painter.setBrush(Qt::NoBrush);
- painter.setPen(Qt::black);
- painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
- painter.drawRoundedRect(0,0,pxm.height(),pxm.height(),radius,radius);
-
CFRelease(sourceImgRef);
CFRelease(imgRef);
- return pxm;
+ return finalpxm;
}
CGImageRef ImageManipulationDelegate::resizeCGImage(CGImageRef image, const QSize& size) {
// create context, keeping original image properties
- CGColorSpaceRef colorspace = CGImageGetColorSpace(image);
-
CGContextRef context = CGBitmapContextCreate(NULL, size.width(), size.height(),
CGImageGetBitsPerComponent(image),
- size.width() * CGImageGetBitsPerComponent(image),
- colorspace,
- CGImageGetAlphaInfo(image));
+ CGImageGetBytesPerRow(image),
+ CGImageGetColorSpace(image),
+ kCGImageAlphaPremultipliedLast);
if(context == NULL)
return nil;
diff --git a/ui/Base.lproj/CurrentCall.xib b/ui/Base.lproj/CurrentCall.xib
index fbae36f..fd29ac5 100644
--- a/ui/Base.lproj/CurrentCall.xib
+++ b/ui/Base.lproj/CurrentCall.xib
@@ -123,8 +123,12 @@
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Eoi-B8-iL6" userLabel="Controls">
<rect key="frame" x="20" y="20" width="452" height="67"/>
<subviews>
- <button toolTip="Mute Audio" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tQl-cT-0Lb" userLabel="Mute Audio" customClass="IconButton">
+ <button toolTip="Mute Audio" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tQl-cT-0Lb" userLabel="Mute Audio" customClass="IconButton">
<rect key="frame" x="158" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="40" id="VhT-NE-Ler"/>
+ <constraint firstAttribute="height" constant="40" id="WFp-nl-egQ"/>
+ </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_mute_audio" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="7wg-Q4-mbD">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -144,8 +148,12 @@
<action selector="muteAudio:" target="-2" id="DBk-mG-FLj"/>
</connections>
</button>
- <button toolTip="Record" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oRa-pS-HN2" customClass="IconButton">
+ <button toolTip="Record" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="oRa-pS-HN2" customClass="IconButton">
<rect key="frame" x="249" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="40" id="5Yb-Ir-aNP"/>
+ <constraint firstAttribute="height" constant="40" id="f6U-Sc-LhF"/>
+ </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_record" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="rhz-4Z-avV">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="10" name=".HelveticaNeueDeskInterface-Regular"/>
@@ -165,8 +173,12 @@
<action selector="toggleRecording:" target="-2" id="gAc-ZJ-9PN"/>
</connections>
</button>
- <button toolTip="Toggle chat" wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fmp-x4-Pef" userLabel="Chat" customClass="IconButton">
+ <button toolTip="Toggle chat" wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fmp-x4-Pef" userLabel="Chat" customClass="IconButton">
<rect key="frame" x="392" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="40" id="48U-1h-yAx"/>
+ <constraint firstAttribute="height" constant="40" id="EDO-9c-ndD"/>
+ </constraints>
<backgroundFilters>
<ciFilter name="CIColorMonochrome">
<configuration>
@@ -195,8 +207,12 @@
<action selector="toggleChat:" target="-2" id="7HN-HS-oqT"/>
</connections>
</button>
- <button toolTip="Hold" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="anb-Y8-JQi" userLabel="Hold" customClass="IconButton">
+ <button toolTip="Hold" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="anb-Y8-JQi" userLabel="Hold" customClass="IconButton">
<rect key="frame" x="113" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="40" id="QlH-xq-7uO"/>
+ <constraint firstAttribute="height" constant="40" id="Xzt-L0-evm"/>
+ </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_hold" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="7w5-d1-mNe">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -216,8 +232,12 @@
<action selector="toggleHold:" target="-2" id="O18-nN-hHE"/>
</connections>
</button>
- <button toolTip="Transfer" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ChW-kg-Sja" customClass="IconButton">
+ <button toolTip="Transfer" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ChW-kg-Sja" customClass="IconButton">
<rect key="frame" x="294" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="40" id="9zo-pq-mgF"/>
+ <constraint firstAttribute="width" constant="40" id="EVF-UM-brL"/>
+ </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_transfer" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="FOs-Wt-c2R">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="10" name=".HelveticaNeueDeskInterface-Regular"/>
@@ -237,8 +257,12 @@
<action selector="toggleTransferView:" target="-2" id="Gxt-lS-qZs"/>
</connections>
</button>
- <button toolTip="Add participant" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kIZ-mf-moM" customClass="IconButton">
+ <button toolTip="Add participant" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="kIZ-mf-moM" customClass="IconButton">
<rect key="frame" x="342" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="40" id="7qu-cd-B7J"/>
+ <constraint firstAttribute="width" constant="40" id="U4p-eV-iCZ"/>
+ </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_add_participant" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="BOx-wf-CM5">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="10" name=".HelveticaNeueDeskInterface-Regular"/>
@@ -302,8 +326,12 @@
<action selector="accept:" target="-2" id="maS-G8-eY7"/>
</connections>
</button>
- <button toolTip="Mute Video" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LVS-yZ-98V" userLabel="Mute Video" customClass="IconButton">
+ <button toolTip="Mute Video" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LVS-yZ-98V" userLabel="Mute Video" customClass="IconButton">
<rect key="frame" x="204" y="13" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="40" id="Qiq-Nb-gHN"/>
+ <constraint firstAttribute="width" constant="40" id="k3u-dD-eLF"/>
+ </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_mute_video" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="sSe-V6-C7i">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
diff --git a/ui/Base.lproj/RingWindow.xib b/ui/Base.lproj/RingWindow.xib
index b255607..e38394c 100644
--- a/ui/Base.lproj/RingWindow.xib
+++ b/ui/Base.lproj/RingWindow.xib
@@ -238,30 +238,52 @@
<rect key="frame" x="1" y="1" width="321" height="48"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
- <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" tag="200" translatesAutoresizingMaskIntoConstraints="NO" id="L24-xb-PrL">
- <rect key="frame" x="39" y="22" width="276.5" height="23"/>
- <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Name" id="amz-mN-l2I">
- <font key="font" size="16" name="HelveticaNeue-Light"/>
- <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
- <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
- </textFieldCell>
- </textField>
- <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="yXU-aM-QzI">
- <rect key="frame" x="8" y="12" width="25" height="25"/>
- <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="UbN-dY-FV8"/>
- </imageView>
- <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" tag="300" translatesAutoresizingMaskIntoConstraints="NO" id="eGS-mC-h5A">
- <rect key="frame" x="39" y="3" width="276.5" height="20"/>
- <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="date" id="UKP-Et-CT0">
+ <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" ambiguous="YES" misplaced="YES" tag="300" translatesAutoresizingMaskIntoConstraints="NO" id="eGS-mC-h5A">
+ <rect key="frame" x="62" y="3" width="258" height="20"/>
+ <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" placeholderString="date" id="UKP-Et-CT0">
<font key="font" size="13" name="HelveticaNeue-Light"/>
<color key="textColor" name="windowFrameColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
+ <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" tag="400" translatesAutoresizingMaskIntoConstraints="NO" id="m5q-Hl-1dF">
+ <rect key="frame" x="11" y="4" width="40" height="40"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="40" id="LP5-6G-eRx"/>
+ <constraint firstAttribute="height" constant="40" id="eBN-SG-DI4"/>
+ </constraints>
+ <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="0fm-ha-CAn"/>
+ </imageView>
+ <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" ambiguous="YES" misplaced="YES" tag="200" translatesAutoresizingMaskIntoConstraints="NO" id="CF6-GV-88E">
+ <rect key="frame" x="62" y="21" width="55" height="23"/>
+ <constraints>
+ <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="51" id="LAB-T6-3cs"/>
+ </constraints>
+ <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" placeholderString="Name" id="bgk-oz-u7n">
+ <font key="font" size="16" name="HelveticaNeue"/>
+ <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
+ <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
+ </textFieldCell>
+ </textField>
+ <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="yXU-aM-QzI">
+ <rect key="frame" x="123" y="19" width="25" height="25"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="25" id="VAR-He-2Qx"/>
+ <constraint firstAttribute="width" constant="25" id="WB7-n5-GSl"/>
+ </constraints>
+ <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="UbN-dY-FV8"/>
+ </imageView>
</subviews>
- <connections>
- <outlet property="textField" destination="L24-xb-PrL" id="D2J-mS-dmr"/>
- </connections>
+ <constraints>
+ <constraint firstItem="m5q-Hl-1dF" firstAttribute="top" secondItem="agj-oV-Bb0" secondAttribute="top" constant="4" id="675-MG-hXD"/>
+ <constraint firstItem="yXU-aM-QzI" firstAttribute="leading" secondItem="CF6-GV-88E" secondAttribute="trailing" constant="8" id="89i-c8-g0e"/>
+ <constraint firstItem="eGS-mC-h5A" firstAttribute="leading" secondItem="m5q-Hl-1dF" secondAttribute="trailing" constant="13" id="EzO-1R-2ok"/>
+ <constraint firstAttribute="trailing" secondItem="eGS-mC-h5A" secondAttribute="trailing" constant="3" id="Teg-0X-pen"/>
+ <constraint firstAttribute="bottom" secondItem="m5q-Hl-1dF" secondAttribute="bottom" constant="4" id="Y8D-aX-zWm"/>
+ <constraint firstItem="m5q-Hl-1dF" firstAttribute="leading" secondItem="agj-oV-Bb0" secondAttribute="leading" constant="11" id="gnA-17-OeG"/>
+ <constraint firstItem="m5q-Hl-1dF" firstAttribute="centerY" secondItem="agj-oV-Bb0" secondAttribute="centerY" id="l0f-3e-5mi"/>
+ <constraint firstItem="CF6-GV-88E" firstAttribute="leading" secondItem="m5q-Hl-1dF" secondAttribute="trailing" constant="13" id="rrA-IB-RYq"/>
+ </constraints>
</tableCellView>
<tableCellView identifier="CategoryCell" id="p9h-Zd-GtR">
<rect key="frame" x="1" y="51" width="321" height="32"/>