From d5229f3489aeb5eb2d1cb77721fec2e593ba984d Mon Sep 17 00:00:00 2001
From: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
Date: Mon, 16 Nov 2015 11:17:41 -0500
Subject: [PATCH] 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
---
 CMakeLists.txt                             |   1 +
 data/default_user_icon.png                 | Bin 0 -> 4752 bytes
 src/HistoryVC.mm                           |  23 ++++++---
 src/PersonsVC.mm                           |  19 +++++---
 src/SmartViewVC.mm                         |   2 +-
 src/delegates/ImageManipulationDelegate.mm |  39 ++-------------
 ui/Base.lproj/CurrentCall.xib              |  42 +++++++++++++---
 ui/Base.lproj/RingWindow.xib               |  54 +++++++++++++++------
 8 files changed, 108 insertions(+), 72 deletions(-)
 create mode 100644 data/default_user_icon.png

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 06934235..745eb8b2 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
GIT binary patch
literal 4752
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
RGcYhPc)I$ztaD0e0szJ@J`?}|

literal 0
HcmV?d00001

diff --git a/src/HistoryVC.mm b/src/HistoryVC.mm
index 3b17422b..76d685ce 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 aebe00bc..730b43da 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 b08feb7a..539c949a 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 4a73edb7..491a2429 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 fbae36f9..fd29ac53 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 b255607f..e38394c1 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"/>
-- 
GitLab