Skip to content
Snippets Groups Projects
Commit 67735239 authored by Kateryna Kostiuk's avatar Kateryna Kostiuk Committed by Andreas Traczyk
Browse files

data transfer: select download folder


Add setting to select folder for incoming images.

Change-Id: I2ee21e0b9195e8ebfcaf11e101160b8058d39792
Reviewed-by: default avatarAndreas Traczyk <andreas.traczyk@savoirfairelinux.com>
parent 50b05f5a
No related branches found
No related tags found
No related merge requests found
......@@ -171,6 +171,7 @@ SET(ringclient_CONTROLLERS
src/MessagesVC.mm
src/PasswordChangeWC.h
src/PasswordChangeWC.mm
src/LrcModelsSProtocol.h
)
SET(ringclient_BACKENDS
......@@ -277,6 +278,7 @@ SET_SOURCE_FILES_PROPERTIES(${myApp_ICON} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources)
SET(ring_ICONS
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_folder.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_action_block.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_attachment.png
${CMAKE_CURRENT_SOURCE_DIR}/data/default_avatar_overlay.png
......
data/dark/ic_folder.png

146 B

ic_folder.png

239 B

......@@ -96,8 +96,8 @@ NSInteger const TAG_TYPE = 400;
QMetaObject::Connection accountChangedConnection, selectedAccountChangedConnection, accountTypeChangedConnection;
- (void)awakeFromNib
{
- (void)loadView {
[super loadView];
treeController = [[QNSTreeController alloc] initWithQModel:&AccountModel::instance()];
[treeController setAvoidsEmptySelection:NO];
[treeController setAlwaysUsesMultipleValuesMarker:YES];
......@@ -111,24 +111,24 @@ QMetaObject::Connection accountChangedConnection, selectedAccountChangedConnecti
QObject::disconnect(selectedAccountChangedConnection);
accountChangedConnection = QObject::connect(&AccountModel::instance(),
&QAbstractItemModel::dataChanged,
[=](const QModelIndex &topLeft, const QModelIndex &bottomRight) {
[accountsListView reloadDataForRowIndexes:
[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(topLeft.row(), bottomRight.row() + 1)]
columnIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, accountsListView.tableColumns.count)]];
});
&QAbstractItemModel::dataChanged,
[=](const QModelIndex &topLeft, const QModelIndex &bottomRight) {
[accountsListView reloadDataForRowIndexes:
[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(topLeft.row(), bottomRight.row() + 1)]
columnIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, accountsListView.tableColumns.count)]];
});
selectedAccountChangedConnection = QObject::connect(AccountModel::instance().selectionModel(),
&QItemSelectionModel::currentChanged,
[=](const QModelIndex &current, const QModelIndex &previous) {
[accountDetailsView setHidden:!current.isValid()];
if(!current.isValid()) {
[accountsListView deselectAll:nil];
return;
}
[treeController setSelectionQModelIndex:current];
});
&QItemSelectionModel::currentChanged,
[=](const QModelIndex &current, const QModelIndex &previous) {
[accountDetailsView setHidden:!current.isValid()];
if(!current.isValid()) {
[accountsListView deselectAll:nil];
return;
}
[treeController setSelectionQModelIndex:current];
});
AccountModel::instance().selectionModel()->clearCurrentIndex();
......@@ -137,14 +137,14 @@ QMetaObject::Connection accountChangedConnection, selectedAccountChangedConnecti
AccountModel::instance().protocolModel()->data(qProtocolIdx, Qt::DisplayRole).toString().toNSString()];
QObject::disconnect(accountTypeChangedConnection);
accountTypeChangedConnection = QObject::connect(AccountModel::instance().protocolModel()->selectionModel(),
&QItemSelectionModel::currentChanged,
[=](const QModelIndex &current, const QModelIndex &previous) {
if (!current.isValid()) {
return;
}
[protocolList removeAllItems];
[protocolList addItemWithTitle:AccountModel::instance().protocolModel()->data(current, Qt::DisplayRole).toString().toNSString()];
});
&QItemSelectionModel::currentChanged,
[=](const QModelIndex &current, const QModelIndex &previous) {
if (!current.isValid()) {
return;
}
[protocolList removeAllItems];
[protocolList addItemWithTitle:AccountModel::instance().protocolModel()->data(current, Qt::DisplayRole).toString().toNSString()];
});
self.generalVC = [[AccGeneralVC alloc] initWithNibName:@"AccGeneral" bundle:nil];
[[self.generalVC view] setFrame:[self.generalTabItem.view frame]];
......
......@@ -31,4 +31,6 @@ namespace Preferences {
NSString * const WindowBehaviour = @"window_behaviour";
/* KVO compliant */
NSString * const Notifications = @"enable_notifications";
/* download folder for incoming images*/
NSString * const DownloadFolder = @"download_folder";
}
......@@ -19,7 +19,8 @@
#import <Cocoa/Cocoa.h>
#import "LrcModelsSProtocol.h"
@interface GeneralPrefsVC : NSViewController
@interface GeneralPrefsVC : NSViewController <LrcModelsSProtocol>
@end
\ No newline at end of file
@end
......@@ -32,6 +32,7 @@
#import <person.h>
#import <globalinstances.h>
#import <media/recordingmodel.h>
#import <api/datatransfermodel.h>
#if ENABLE_SPARKLE
#import <Sparkle/Sparkle.h>
......@@ -53,11 +54,24 @@
__unsafe_unretained IBOutlet NSButton* photoView;
__unsafe_unretained IBOutlet NSTextField* profileNameField;
__unsafe_unretained IBOutlet NSImageView* addProfilePhotoImage;
__unsafe_unretained IBOutlet NSButton *downloadFolder;
}
@end
@implementation GeneralPrefsVC
@synthesize dataTransferModel;
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil model:(lrc::api::DataTransferModel*) dataTransferModel
{
if (self = [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil])
{
self.dataTransferModel = dataTransferModel;
}
return self;
}
- (void)loadView
{
[super loadView];
......@@ -100,6 +114,9 @@
[photoView setBordered:NO];
}
}
if (dataTransferModel) {
downloadFolder.title = [@(dataTransferModel->downloadDirectory.c_str()) lastPathComponent];
}
}
- (void) dealloc
......@@ -123,6 +140,20 @@
[historyTextField setEnabled:[sender state]];
}
- (IBAction)changeDownloadFolder:(id)sender {
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setAllowsMultipleSelection:NO];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:NO];
if ([panel runModal] != NSFileHandlingPanelOKButton) return;
if ([[panel URLs] lastObject] == nil) return;
NSString * path = [[[[panel URLs] lastObject] path] stringByAppendingString:@"/"];
dataTransferModel->downloadDirectory = std::string([path UTF8String]);
downloadFolder.title = [@(dataTransferModel->downloadDirectory.c_str()) lastPathComponent];
[[NSUserDefaults standardUserDefaults] setObject:path forKey:Preferences::DownloadFolder];
}
// KVO handler
-(void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject
change:(NSDictionary *)aChange context:(void *)aContext
......
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
namespace lrc {
namespace api {
class DataTransferModel;
}
}
@protocol LrcModelsSProtocol
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil model:(lrc::api::DataTransferModel*) dataTransferModel;
@property lrc::api::DataTransferModel* dataTransferModel;
@end
......@@ -35,7 +35,6 @@
#import "delegates/ImageManipulationDelegate.h"
#import "utils.h"
#import "views/NSColor+RingTheme.h"
#import "NSString+Extensions.h"
@interface MessagesVC () <NSTableViewDelegate, NSTableViewDataSource> {
......@@ -205,25 +204,6 @@ typedef NS_ENUM(NSInteger, MessageSequencing) {
convModel_->refreshFilter();
}
[self reloadConversationForMessage:interactionId shouldUpdateHeight:YES];
//accept incoming transfer
if (interaction.type == lrc::api::interaction::Type::INCOMING_DATA_TRANSFER &&
(interaction.status == lrc::api::interaction::Status::TRANSFER_AWAITING_HOST ||
interaction.status == lrc::api::interaction::Status::TRANSFER_CREATED)) {
lrc::api::datatransfer::Info info = {};
convModel_->getTransferInfo(interactionId, info);
double convertData = static_cast<double>(info.totalSize);
NSString* pathUrl = @(info.displayName.c_str());
NSString* fileExtension = pathUrl.pathExtension;
CFStringRef utiType = UTTypeCreatePreferredIdentifierForTag(
kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL);
bool isImage = UTTypeConformsTo(utiType, kUTTypeImage);
if( convertData <= 10485760 && isImage) {
[self acceptFile:interactionId];
}
}
});
// Signals tracking changes in conversation list, we need them as cached conversation can be invalid
......@@ -336,13 +316,7 @@ typedef NS_ENUM(NSInteger, MessageSequencing) {
[result invalidateImageConstraints];
NSString* name = @(interaction.body.c_str());
if (name.length > 0) {
if (([name rangeOfString:@"/"].location != NSNotFound)) {
NSArray *listItems = [name componentsSeparatedByString:@"/"];
NSString* name1 = listItems.lastObject;
fileName = name1;
} else {
fileName = name;
}
fileName = [name lastPathComponent];
}
result.transferedFileName.stringValue = fileName;
if (status == lrc::api::interaction::Status::TRANSFER_FINISHED) {
......@@ -756,19 +730,6 @@ typedef NS_ENUM(NSInteger, MessageSequencing) {
return aMutableParagraphStyle;
}
- (void)acceptFile:(uint64_t)interactionID {
NSURL *downloadsURL = [[NSFileManager defaultManager]
URLForDirectory:NSDownloadsDirectory
inDomain:NSUserDomainMask appropriateForURL:nil
create:YES error:nil];
auto& inter = [self getCurrentConversation]->interactions.find(interactionID)->second;
if (convModel_ && !convUid_.empty()) {
NSURL *bUrl = [downloadsURL URLByAppendingPathComponent:@(inter.body.c_str())];
const char* fullPath = [bUrl fileSystemRepresentation];
convModel_->acceptTransfer(convUid_, interactionID, fullPath);
}
}
#pragma mark - Actions
- (void)acceptIncomingFile:(id)sender {
......
......@@ -17,8 +17,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#import <Cocoa/Cocoa.h>
#import "LrcModelsSProtocol.h"
@interface PreferencesWC : NSWindowController <NSWindowDelegate>
@interface PreferencesWC : NSWindowController <NSWindowDelegate, LrcModelsSProtocol>
- (void)displayGeneral:(NSToolbarItem *)sender;
- (void)displayAudio:(NSToolbarItem *)sender;
......
......@@ -25,6 +25,7 @@
#import <codecmodel.h>
#import <profilemodel.h>
#import <profile.h>
#import <api/datatransfermodel.h>
//Ring
#import "AccountsVC.h"
......@@ -36,9 +37,10 @@
__unsafe_unretained IBOutlet NSView *prefsContainer;
NSViewController *currentVC;
}
@synthesize dataTransferModel;
// Identifiers used in PreferencesWindow.xib for tabs
static auto const kProfilePrefsIdentifier = @"AccountsPrefsIdentifier";
static auto const kGeneralPrefsIdentifier = @"GeneralPrefsIdentifier";
......@@ -53,6 +55,15 @@ static auto const kVideoPrefsIdentifer = @"VideoPrefsIdentifer";
[self displayGeneral:nil];
}
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil model:(lrc::api::DataTransferModel*) dataTransferModel
{
if (self = [self initWithWindowNibName:nibNameOrNil])
{
self.dataTransferModel = dataTransferModel;
}
return self;
}
- (void)windowWillClose:(NSNotification *)notification
{
AccountModel::instance().save();
......@@ -63,7 +74,7 @@ static auto const kVideoPrefsIdentifer = @"VideoPrefsIdentifer";
{
[[prefsContainer subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
currentVC = [[GeneralPrefsVC alloc] initWithNibName:@"GeneralPrefs" bundle:nil];
currentVC = [[GeneralPrefsVC alloc] initWithNibName:@"GeneralPrefs" bundle:nil model: self.dataTransferModel];
[self resizeWindowWithFrame:currentVC.view.frame];
[prefsContainer addSubview:currentVC.view];
......@@ -90,7 +101,7 @@ static auto const kVideoPrefsIdentifer = @"VideoPrefsIdentifer";
- (IBAction)displayAccounts:(NSToolbarItem *)sender
{
[[prefsContainer subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
makeObjectsPerformSelector:@selector(removeFromSuperview)];
currentVC = [[AccountsVC alloc] initWithNibName:@"Accounts" bundle:nil];
[self resizeWindowWithFrame:currentVC.view.frame];
[prefsContainer addSubview:currentVC.view];
......
......@@ -39,6 +39,7 @@
#import <api/conversation.h>
#import <api/contactmodel.h>
#import <api/contact.h>
#import <api/datatransfermodel.h>
// Ring
#import "AppDelegate.h"
......@@ -123,6 +124,16 @@ NSString* const kChangeAccountToolBarItemIdentifier = @"ChangeAccountToolBarIte
NSToolbar *toolbar = self.window.toolbar;
toolbar.delegate = self;
[toolbar insertItemWithItemIdentifier:kChangeAccountToolBarItemIdentifier atIndex:1];
// set download folder (default - 'Downloads')
NSString* path = [[NSUserDefaults standardUserDefaults] stringForKey:Preferences::DownloadFolder];
if (!path || path.length == 0) {
NSURL *downloadsURL = [[NSFileManager defaultManager]
URLForDirectory:NSDownloadsDirectory
inDomain:NSUserDomainMask appropriateForURL:nil
create:YES error:nil];
path = [[downloadsURL path] stringByAppendingString:@"/"];
}
lrc_->getDataTransferModel().downloadDirectory = std::string([path UTF8String]);
}
- (void) connect
......@@ -310,7 +321,7 @@ NSString* const kChangeAccountToolBarItemIdentifier = @"ChangeAccountToolBarIte
- (IBAction)openPreferences:(id)sender
{
preferencesWC = [[PreferencesWC alloc] initWithWindowNibName:@"PreferencesWindow"];
preferencesWC = [[PreferencesWC alloc] initWithNibName:@"PreferencesWindow" bundle: nil model:&(lrc_->getDataTransferModel())];
[preferencesWC.window makeKeyAndOrderFront:preferencesWC.window];
}
......
......@@ -119,7 +119,7 @@ NSInteger const REQUEST_SEG = 1;
selectorIsPresent = true;
smartView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleNone;
}
- (void)placeCall:(id)sender
......@@ -506,11 +506,7 @@ NSInteger const REQUEST_SEG = 1;
lastInteractionSnippetFixedString = [lastInteractionSnippetFixedString stringByReplacingOccurrencesOfString:@"📞" withString:@""];
if (conversation.interactions[lastUid].type == lrc::api::interaction::Type::OUTGOING_DATA_TRANSFER
|| conversation.interactions[lastUid].type == lrc::api::interaction::Type::INCOMING_DATA_TRANSFER) {
if (([lastInteractionSnippetFixedString rangeOfString:@"/"].location != NSNotFound)) {
NSArray *listItems = [lastInteractionSnippetFixedString componentsSeparatedByString:@"/"];
NSString* name = listItems.lastObject;
lastInteractionSnippetFixedString = name;
}
lastInteractionSnippetFixedString = [lastInteractionSnippetFixedString lastPathComponent];
}
[interactionSnippet setStringValue:lastInteractionSnippetFixedString];
......
......@@ -9,6 +9,7 @@
<connections>
<outlet property="addProfilePhotoImage" destination="3l7-TU-AMG" id="oQC-jN-JV0"/>
<outlet property="checkIntervalPopUp" destination="RYP-3d-PCa" id="JNO-GR-CV8"/>
<outlet property="downloadFolder" destination="7bY-JW-z0U" id="ylD-Yb-I2N"/>
<outlet property="historyChangedLabel" destination="Gyi-ID-Z3v" id="aoO-Fh-UCQ"/>
<outlet property="historyStepper" destination="QmA-ZI-ZL5" id="dDV-1G-rZs"/>
<outlet property="historySwitch" destination="DgD-2y-4g5" id="GYk-pz-jGT"/>
......@@ -24,11 +25,11 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="c22-O7-iKe">
<rect key="frame" x="0.0" y="0.0" width="502" height="421"/>
<rect key="frame" x="0.0" y="0.0" width="502" height="445"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField toolTip="Profile" horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MV1-AC-qE7">
<rect key="frame" x="30" y="384" width="79" height="17"/>
<rect key="frame" x="30" y="408" width="79" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="75" id="Nj8-qG-TRL"/>
</constraints>
......@@ -39,7 +40,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mjw-8U-dzO">
<rect key="frame" x="211" y="306" width="197" height="21"/>
<rect key="frame" x="211" y="330" width="197" height="21"/>
<constraints>
<constraint firstAttribute="width" constant="197" id="pDD-Xk-k4K"/>
</constraints>
......@@ -53,7 +54,7 @@
</connections>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Oth-up-2k2">
<rect key="frame" x="56" y="232" width="423" height="18"/>
<rect key="frame" x="56" y="256" width="423" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="419" id="upW-bh-eQg"/>
</constraints>
......@@ -66,7 +67,7 @@
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="j3T-5j-Fom">
<rect key="frame" x="30" y="256" width="449" height="17"/>
<rect key="frame" x="30" y="280" width="449" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Behaviours" id="Rzy-Gh-3wQ">
<font key="font" metaFont="systemBold"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
......@@ -74,7 +75,7 @@
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="1Nr-L4-fcd">
<rect key="frame" x="56" y="178" width="423" height="18"/>
<rect key="frame" x="56" y="202" width="423" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="419" id="8Mk-zb-NLA"/>
</constraints>
......@@ -86,6 +87,27 @@
<action selector="toggleLaunchAtStartup:" target="-2" id="Rky-YK-2yk"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7bY-JW-z0U">
<rect key="frame" x="171" y="158" width="82" height="32"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="150" id="d7f-Id-S7d"/>
</constraints>
<buttonCell key="cell" type="push" bezelStyle="rounded" image="ic_folder" imagePosition="left" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="DVe-a5-SU0">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="changeDownloadFolder:" target="-2" id="7UI-HT-B4J"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IHD-1X-sid">
<rect key="frame" x="56" y="167" width="103" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Download folder" id="6Ye-pe-9WV">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="DgD-2y-4g5">
<rect key="frame" x="56" y="125" width="140" height="18"/>
<constraints>
......@@ -203,7 +225,7 @@
</constraints>
</customView>
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Gyi-ID-Z3v">
<rect key="frame" x="306" y="126" width="171" height="14"/>
<rect key="frame" x="306" y="150" width="171" height="14"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="(Applied on application restart)" id="OTl-vx-S43">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
......@@ -211,14 +233,14 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fC0-ce-Yiz">
<rect key="frame" x="18" y="147" width="399" height="17"/>
<rect key="frame" x="18" y="147" width="399" height="0.0"/>
<constraints>
<constraint firstAttribute="width" constant="395" id="6HO-p7-tAk"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="48" id="JrN-bM-7Wz"/>
</constraints>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Is4-pD-LOT">
<rect key="frame" x="56" y="205" width="423" height="18"/>
<rect key="frame" x="56" y="229" width="423" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="419" id="iUi-lt-J9M"/>
</constraints>
......@@ -231,7 +253,7 @@
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="L6I-bx-LnN">
<rect key="frame" x="132" y="281" width="71" height="70"/>
<rect key="frame" x="132" y="305" width="71" height="70"/>
<constraints>
<constraint firstAttribute="height" constant="70" id="RFb-D4-827"/>
<constraint firstAttribute="width" constant="71" id="gAI-0Z-pME"/>
......@@ -245,7 +267,7 @@
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="c9L-Qb-bNK">
<rect key="frame" x="42" y="359" width="482" height="17"/>
<rect key="frame" x="42" y="383" width="482" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="This is shared with your contacts " id="vbU-2S-O58">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
......@@ -253,7 +275,7 @@
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="3l7-TU-AMG">
<rect key="frame" x="153" y="302" width="30" height="30"/>
<rect key="frame" x="153" y="325" width="30" height="30"/>
<constraints>
<constraint firstAttribute="height" constant="30" id="3dM-RS-1SR"/>
<constraint firstAttribute="width" constant="30" id="San-2A-6Wv"/>
......@@ -277,12 +299,15 @@
<constraint firstItem="nah-Jm-ZYB" firstAttribute="leading" secondItem="QmA-ZI-ZL5" secondAttribute="trailing" constant="8" id="JJi-0O-nUi"/>
<constraint firstItem="tHZ-7Q-5iP" firstAttribute="top" secondItem="QmA-ZI-ZL5" secondAttribute="top" id="Jrk-f0-97K"/>
<constraint firstItem="j3T-5j-Fom" firstAttribute="top" secondItem="L6I-bx-LnN" secondAttribute="bottom" constant="8" symbolic="YES" id="OMM-Ry-Zsx"/>
<constraint firstItem="7bY-JW-z0U" firstAttribute="leading" secondItem="IHD-1X-sid" secondAttribute="trailing" constant="20" id="Ptz-be-9mW"/>
<constraint firstItem="L6I-bx-LnN" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="132" id="QTU-A1-JdM"/>
<constraint firstItem="Mjw-8U-dzO" firstAttribute="top" secondItem="c9L-Qb-bNK" secondAttribute="bottom" constant="32" id="TGb-qG-xFk"/>
<constraint firstItem="Gyi-ID-Z3v" firstAttribute="centerY" secondItem="nah-Jm-ZYB" secondAttribute="centerY" id="VGH-9C-eD1"/>
<constraint firstItem="IHD-1X-sid" firstAttribute="top" secondItem="1Nr-L4-fcd" secondAttribute="bottom" constant="20" id="X4c-Ad-8yh"/>
<constraint firstItem="Oth-up-2k2" firstAttribute="top" secondItem="j3T-5j-Fom" secondAttribute="bottom" constant="8" symbolic="YES" id="XMy-vs-rqU"/>
<constraint firstItem="QmA-ZI-ZL5" firstAttribute="leading" secondItem="tHZ-7Q-5iP" secondAttribute="trailing" constant="8" id="YPs-UE-IFi"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Gyi-ID-Z3v" secondAttribute="trailing" constant="20" id="Z4C-x5-1Op"/>
<constraint firstItem="7bY-JW-z0U" firstAttribute="centerY" secondItem="IHD-1X-sid" secondAttribute="centerY" id="aI1-uX-lQY"/>
<constraint firstItem="DgD-2y-4g5" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="58" id="aPM-dp-Eym"/>
<constraint firstAttribute="bottom" secondItem="yVO-jk-ay3" secondAttribute="bottom" constant="20" id="bAA-rc-QhB"/>
<constraint firstItem="3l7-TU-AMG" firstAttribute="centerX" secondItem="L6I-bx-LnN" secondAttribute="centerX" id="bNA-y1-w4O"/>
......@@ -291,14 +316,15 @@
<constraint firstItem="MV1-AC-qE7" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="20" symbolic="YES" id="eb5-W0-5Yr"/>
<constraint firstItem="c9L-Qb-bNK" firstAttribute="top" secondItem="MV1-AC-qE7" secondAttribute="bottom" constant="8" symbolic="YES" id="f2T-ft-Osc"/>
<constraint firstItem="DgD-2y-4g5" firstAttribute="leading" secondItem="U84-le-Iy4" secondAttribute="leading" id="ggy-GJ-WMj"/>
<constraint firstItem="DgD-2y-4g5" firstAttribute="leading" secondItem="IHD-1X-sid" secondAttribute="leading" id="hIj-5P-1iF"/>
<constraint firstItem="Mjw-8U-dzO" firstAttribute="leading" secondItem="L6I-bx-LnN" secondAttribute="trailing" constant="8" symbolic="YES" id="jVt-Fl-fMN"/>
<constraint firstItem="Is4-pD-LOT" firstAttribute="top" secondItem="Oth-up-2k2" secondAttribute="bottom" constant="13" id="lHy-u9-IB0"/>
<constraint firstItem="L6I-bx-LnN" firstAttribute="centerY" secondItem="Mjw-8U-dzO" secondAttribute="centerY" id="q2I-i3-D74"/>
<constraint firstItem="L6I-bx-LnN" firstAttribute="top" secondItem="c9L-Qb-bNK" secondAttribute="bottom" constant="8" symbolic="YES" id="qJk-WJ-ebJ"/>
<constraint firstItem="yVO-jk-ay3" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="20" id="qa3-OH-fvn"/>
<constraint firstItem="U84-le-Iy4" firstAttribute="top" secondItem="DgD-2y-4g5" secondAttribute="bottom" constant="15" id="szl-Nh-CbR"/>
<constraint firstItem="fC0-ce-Yiz" firstAttribute="top" secondItem="1Nr-L4-fcd" secondAttribute="bottom" constant="16" id="tQx-o6-feR"/>
<constraint firstItem="MV1-AC-qE7" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="32" id="vN1-5P-m9g"/>
<constraint firstItem="fC0-ce-Yiz" firstAttribute="top" secondItem="IHD-1X-sid" secondAttribute="bottom" constant="20" id="vNW-gf-432"/>
<constraint firstItem="yVO-jk-ay3" firstAttribute="top" secondItem="U84-le-Iy4" secondAttribute="bottom" constant="13" id="wfT-QL-241"/>
<constraint firstAttribute="trailing" secondItem="yVO-jk-ay3" secondAttribute="trailing" constant="20" id="wig-B4-OtV"/>
<constraint firstItem="tHZ-7Q-5iP" firstAttribute="top" secondItem="fC0-ce-Yiz" secondAttribute="bottom" constant="2" id="wo5-OT-LTj"/>
......@@ -309,6 +335,7 @@
<customObject id="VEJ-ic-3Ub" customClass="SUUpdater"/>
</objects>
<resources>
<image name="ic_folder" width="36" height="36"/>
<image name="ic_picture" width="72" height="72"/>
</resources>
</document>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment