diff --git a/CMakeLists.txt b/CMakeLists.txt index 06934235a49085da1bfebc0c039a8dfeb6a78dc0..745eb8b2ab7229846aa06c52f90405110b92111d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,6 +190,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_call_made.png ${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 0000000000000000000000000000000000000000..e99ee04782463832b656b934e544377c9c11b8aa Binary files /dev/null and b/data/default_user_icon.png differ diff --git a/src/HistoryVC.mm b/src/HistoryVC.mm index 3b17422be8edc55c7a7600f0bb40f0151327fc18..76d685cef121d325fbb9e923eec4fd76c85e8de9 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 @@ NSInteger const DETAILS_TAG = 300; } 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 aebe00bc5de20cac24b168463b3c3c4e7871ca41..730b43da712ba78f6afce610019b47a30e64908e 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 @@ NSInteger const CALL_BUTTON_TAG = 400; - (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 @@ NSInteger const CALL_BUTTON_TAG = 400; if(!qIdx.isValid()) return NO; - if(!qIdx.parent().isValid()) { - return NO; - } else { - return YES; - } + return YES; } // ------------------------------------------------------------------------------- @@ -167,7 +171,6 @@ NSInteger const CALL_BUTTON_TAG = 400; 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 b08feb7af99fde976d4e1160329ae901311cbf63..539c949a6cabb4804486882eafdae8223b72eb87 100644 --- a/src/SmartViewVC.mm +++ b/src/SmartViewVC.mm @@ -250,7 +250,7 @@ NSInteger const TXT_BUTTON_TAG = 500; [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 4a73edb7638967d102c5a14a7a6db840d59536fc..491a2429ce36581c482987886ac4b3efb2b0b79a 100644 --- a/src/delegates/ImageManipulationDelegate.mm +++ b/src/delegates/ImageManipulationDelegate.mm @@ -125,52 +125,23 @@ namespace Interfaces { } 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 fbae36f915a956cda5a55d6b1412da78695ed4e6..fd29ac53282b92e0c44aede3ea938431f05280df 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 b255607fbd2222a49260c7126d615f1393a189da..e38394c112f6b717eb3ae9980dfc9b55a2022de5 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"/> + <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" 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 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 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"> - <font key="font" size="13" name="HelveticaNeue-Light"/> - <color key="textColor" name="windowFrameColor" catalog="System" colorSpace="catalog"/> + <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"/>