Commit 252a94ab authored by Andreas Traczyk's avatar Andreas Traczyk Committed by Kateryna Kostiuk

UI/UX: refactor smartlist

Change-Id: Ibfd5154757908ebd85f4b0060da00a7c608a0e56
Reviewed-by: Kateryna Kostiuk's avatarKateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
parent 9d8b7923
...@@ -227,7 +227,9 @@ SET(ringclient_OTHERS ...@@ -227,7 +227,9 @@ SET(ringclient_OTHERS
src/delegates/ImageManipulationDelegate.h src/delegates/ImageManipulationDelegate.h
src/AccountSelectionManager.h src/AccountSelectionManager.h
src/AccountSelectionManager.mm src/AccountSelectionManager.mm
src/utils.h) src/utils.h
src/NSString+Extensions.h
src/NSString+Extensions.mm)
SET(ringclient_XIBS SET(ringclient_XIBS
...@@ -275,6 +277,7 @@ SET_SOURCE_FILES_PROPERTIES(${myApp_ICON} PROPERTIES ...@@ -275,6 +277,7 @@ SET_SOURCE_FILES_PROPERTIES(${myApp_ICON} PROPERTIES
MACOSX_PACKAGE_LOCATION Resources) MACOSX_PACKAGE_LOCATION Resources)
SET(ring_ICONS SET(ring_ICONS
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_action_block.png
${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_attachment.png ${CMAKE_CURRENT_SOURCE_DIR}/data/dark/ic_attachment.png
${CMAKE_CURRENT_SOURCE_DIR}/data/default_avatar_overlay.png ${CMAKE_CURRENT_SOURCE_DIR}/data/default_avatar_overlay.png
${CMAKE_CURRENT_SOURCE_DIR}/data/symbol_name.png ${CMAKE_CURRENT_SOURCE_DIR}/data/symbol_name.png
......
...@@ -88,6 +88,18 @@ ...@@ -88,6 +88,18 @@
return self; return self;
} }
-(void) clearData {
cachedConv_ = nil;
convUid_ = "";
convModel_ = nil;
[messagesViewVC clearData];
QObject::disconnect(modelSortedConnection_);
QObject::disconnect(filterChangedConnection_);
QObject::disconnect(newConversationConnection_);
QObject::disconnect(conversationRemovedConnection_);
}
-(const lrc::api::conversation::Info*) getCurrentConversation -(const lrc::api::conversation::Info*) getCurrentConversation
{ {
if (convModel_ == nil || convUid_.empty()) if (convModel_ == nil || convUid_.empty())
...@@ -282,6 +294,8 @@ ...@@ -282,6 +294,8 @@
return; return;
} }
[self clearData];
if (!animate) { if (!animate) {
[self.view setHidden:YES]; [self.view setHidden:YES];
return; return;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
@interface MessagesVC : NSViewController @interface MessagesVC : NSViewController
-(void)setConversationUid:(const std::string)convUid model:(lrc::api::ConversationModel*)model; -(void)setConversationUid:(const std::string)convUid model:(lrc::api::ConversationModel*)model;
-(void)clearData;
@property (retain, nonatomic) id <MessagesVCDelegate> delegate; @property (retain, nonatomic) id <MessagesVCDelegate> delegate;
......
/* /*
* Copyright (C) 2015-2018 Savoir-faire Linux Inc. * Copyright (C) 2015-2018 Savoir-faire Linux Inc.
* Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com> * Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
...@@ -89,6 +90,16 @@ typedef NS_ENUM(NSInteger, MessageSequencing) { ...@@ -89,6 +90,16 @@ typedef NS_ENUM(NSInteger, MessageSequencing) {
[conversationView registerNib:cellNib forIdentifier:@"RightOngoingFileView"]; [conversationView registerNib:cellNib forIdentifier:@"RightOngoingFileView"];
[conversationView registerNib:cellNib forIdentifier:@"RightFinishedFileView"]; [conversationView registerNib:cellNib forIdentifier:@"RightFinishedFileView"];
} }
-(void) clearData {
cachedConv_ = nil;
convUid_ = "";
convModel_ = nil;
QObject::disconnect(modelSortedSignal_);
QObject::disconnect(filterChangedSignal_);
QObject::disconnect(interactionStatusUpdatedSignal_);
QObject::disconnect(newInteractionSignal_);
}
-(const lrc::api::conversation::Info*) getCurrentConversation -(const lrc::api::conversation::Info*) getCurrentConversation
{ {
...@@ -390,8 +401,6 @@ typedef NS_ENUM(NSInteger, MessageSequencing) { ...@@ -390,8 +401,6 @@ typedef NS_ENUM(NSInteger, MessageSequencing) {
} else { } else {
result = [tableView makeViewWithIdentifier:@"LeftMessageView" owner:self]; result = [tableView makeViewWithIdentifier:@"LeftMessageView" owner:self];
} }
if (interaction.status == lrc::api::interaction::Status::UNREAD)
convModel_->setInteractionRead(convUid_, it->first);
break; break;
case lrc::api::interaction::Type::INCOMING_DATA_TRANSFER: case lrc::api::interaction::Type::INCOMING_DATA_TRANSFER:
case lrc::api::interaction::Type::OUTGOING_DATA_TRANSFER: case lrc::api::interaction::Type::OUTGOING_DATA_TRANSFER:
......
/*
* Copyright (C) 2018 Savoir-faire Linux Inc.
* Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
*
* 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.
*/
#import <Foundation/Foundation.h>
@interface NSString (Extensions)
- (NSString *) removeAllNewLinesAtTheEnd;
- (NSString *) removeEmptyLinesAtBorders;
@end
/*
* Copyright (C) 2018 Savoir-faire Linux Inc.
* Author: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
*
* 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.
*/
#import "NSString+Extensions.h"
@implementation NSString (Extensions)
- (NSString *) removeAllNewLinesAtTheEnd {
NSString *result = self;
while ([result endedByEmptyLine]) {
result = [result removeLastWhiteSpaceAndNewLineCharacter];
}
return result;
}
- (NSString *) removeAllNewLinesAtBegining {
NSString *result = self;
while ([result startByEmptyLine]) {
result = [result removeFirstWhiteSpaceAndNewLineCharacter];
}
return result;
}
- (NSString *) removeEmptyLinesAtBorders {
NSString *result = self;
result = [result removeAllNewLinesAtBegining];
result = [result removeAllNewLinesAtTheEnd];
return result;
}
-(bool)endedByEmptyLine {
if ([self length] < 1) {
return false;
}
unichar last = [self characterAtIndex:[self length] - 1];
return [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:last];
}
- (bool)startByEmptyLine {
if ([self length] < 1) {
return false;
}
unichar first = [self characterAtIndex:0];
return [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember:first];
}
- (NSString *) removeLastWhiteSpaceAndNewLineCharacter {
if ([self endedByEmptyLine]) {
return [self substringToIndex:[self length]-1];
}
return self;
}
- (NSString *) removeFirstWhiteSpaceAndNewLineCharacter {
if ([self startByEmptyLine]) {
return [self substringFromIndex:1];
}
return self;
}
@end
This diff is collapsed.
...@@ -277,13 +277,23 @@ namespace Interfaces { ...@@ -277,13 +277,23 @@ namespace Interfaces {
return pxm; return pxm;
} else { } else {
char color = contact.profileInfo.uri.at(0); char color = contact.profileInfo.uri.at(0);
contact.profileInfo.alias.erase(std::remove(contact.profileInfo.alias.begin(), contact.profileInfo.alias.end(), '\n'), contact.profileInfo.alias.end());
contact.profileInfo.alias.erase(std::remove(contact.profileInfo.alias.begin(), contact.profileInfo.alias.end(), ' '), contact.profileInfo.alias.end());
contact.profileInfo.alias.erase(std::remove(contact.profileInfo.alias.begin(), contact.profileInfo.alias.end(), '\r'), contact.profileInfo.alias.end());
if (!contact.profileInfo.alias.empty()) { if (!contact.profileInfo.alias.empty()) {
return drawDefaultUserPixmap(size, color, std::toupper(contact.profileInfo.alias.at(0))); return drawDefaultUserPixmap(size, color, std::toupper(contact.profileInfo.alias.at(0)));
} else if((contact.profileInfo.type == lrc::api::profile::Type::RING || } else if((contact.profileInfo.type == lrc::api::profile::Type::RING ||
contact.profileInfo.type == lrc::api::profile::Type::PENDING) && contact.profileInfo.type == lrc::api::profile::Type::PENDING) &&
!contact.registeredName.empty()) { !contact.registeredName.empty()) {
return drawDefaultUserPixmap(size, color, std::toupper(contact.registeredName.at(0))); contact.registeredName.erase(std::remove(contact.registeredName.begin(), contact.registeredName.end(), '\n'), contact.registeredName.end());
contact.registeredName.erase(std::remove(contact.registeredName.begin(), contact.registeredName.end(), ' '), contact.registeredName.end());
contact.registeredName.erase(std::remove(contact.registeredName.begin(), contact.registeredName.end(), '\r'), contact.registeredName.end());
if(!contact.registeredName.empty()) {
return drawDefaultUserPixmap(size, color, std::toupper(contact.registeredName.at(0)));
} else {
return drawDefaultUserPixmapUriOnly(size, color);
}
} else { } else {
return drawDefaultUserPixmapUriOnly(size, color); return drawDefaultUserPixmapUriOnly(size, color);
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
*/ */
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "NSString+Extensions.h"
#import <api/conversation.h> #import <api/conversation.h>
#import <api/conversationmodel.h> #import <api/conversationmodel.h>
#import <api/account.h> #import <api/account.h>
...@@ -28,19 +29,39 @@ ...@@ -28,19 +29,39 @@
static inline NSString* bestIDForConversation(const lrc::api::conversation::Info& conv, const lrc::api::ConversationModel& model) static inline NSString* bestIDForConversation(const lrc::api::conversation::Info& conv, const lrc::api::ConversationModel& model)
{ {
auto contact = model.owner.contactModel->getContact(conv.participants[0]); auto contact = model.owner.contactModel->getContact(conv.participants[0]);
if (!contact.registeredName.empty()) if (!contact.registeredName.empty()) {
return @(contact.registeredName.c_str()); contact.registeredName.erase(std::remove(contact.registeredName.begin(), contact.registeredName.end(), '\n'), contact.registeredName.end());
contact.registeredName.erase(std::remove(contact.registeredName.begin(), contact.registeredName.end(), '\r'), contact.registeredName.end());
return [@(contact.registeredName.c_str()) removeEmptyLinesAtBorders];
}
else else
return @(contact.profileInfo.uri.c_str()); return [@(contact.profileInfo.uri.c_str()) removeEmptyLinesAtBorders];
} }
static inline NSString* bestNameForConversation(const lrc::api::conversation::Info& conv, const lrc::api::ConversationModel& model) static inline NSString* bestNameForConversation(const lrc::api::conversation::Info& conv, const lrc::api::ConversationModel& model)
{ {
auto contact = model.owner.contactModel->getContact(conv.participants[0]); auto contact = model.owner.contactModel->getContact(conv.participants[0]);
if (!contact.profileInfo.alias.empty()) if (contact.profileInfo.alias.empty()) {
return @(contact.profileInfo.alias.c_str()); return bestIDForConversation(conv, model);
else }
auto alias = contact.profileInfo.alias;
alias.erase(std::remove(alias.begin(), alias.end(), '\n'), alias.end());
alias.erase(std::remove(alias.begin(), alias.end(), '\r'), alias.end());
if(alias.length() == 0) {
return bestIDForConversation(conv, model); return bestIDForConversation(conv, model);
}
return @(alias.c_str());
}
static inline lrc::api::profile::Type profileType(const lrc::api::conversation::Info& conv, const lrc::api::ConversationModel& model)
{
@try {
auto contact = model.owner.contactModel->getContact(conv.participants[0]);
return contact.profileInfo.type;
}
@catch (NSException *exception) {
lrc::api::profile::Type::INVALID;
}
} }
/** /**
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
/* /*
* Padding * Padding
* default value : 5.0 * default value : 8.0
*/ */
@property CGFloat imageInsets; @property CGFloat imageInsets;
......
...@@ -103,12 +103,9 @@ ...@@ -103,12 +103,9 @@
//// Group //// Group
{ {
//// Oval Drawing //// Oval Drawing
NSBezierPath* ovalPath = [NSBezierPath bezierPathWithRoundedRect: NSBezierPath* ovalPath = [NSBezierPath bezierPathWithRoundedRect:dirtyRect
NSMakeRect(NSMinX(group) + floor(NSWidth(group) * 0.00000 + 0.5), xRadius:[self.cornerRadius floatValue]
NSMinY(group) + floor(NSHeight(group) * 0.00000 + 0.5), yRadius:[self.cornerRadius floatValue]];
floor(NSWidth(group) * 1.00000 + 0.5) - floor(NSWidth(group) * 0.00000 + 0.5),
floor(NSHeight(group) * 1.00000 + 0.5) - floor(NSHeight(group) * 0.00000 + 0.5))
xRadius:[self.cornerRadius floatValue] yRadius:[self.cornerRadius floatValue]];
[backgroundColor setFill]; [backgroundColor setFill];
[ovalPath fill]; [ovalPath fill];
......
...@@ -32,6 +32,11 @@ ...@@ -32,6 +32,11 @@
*/ */
@property (nonatomic, strong) NSColor* borderColor; @property (nonatomic, strong) NSColor* borderColor;
/*
* default value : [NSNumber numberWithDouble:1.0];
*/
@property (nonatomic, strong) NSNumber* borderThickness;
/* /*
* default value : (self.frame) / 2; * default value : (self.frame) / 2;
*/ */
......
...@@ -34,6 +34,10 @@ ...@@ -34,6 +34,10 @@
self.borderColor = [self.bgColor darkenColorByValue:0.1]; self.borderColor = [self.bgColor darkenColorByValue:0.1];
} }
if(!self.borderThickness) {
self.borderThickness = [NSNumber numberWithDouble:1.0];
}
self.backgroundColor = [NSColor controlColor]; self.backgroundColor = [NSColor controlColor];
} }
...@@ -42,6 +46,7 @@ ...@@ -42,6 +46,7 @@
NSColor* backgroundColor = self.bgColor; NSColor* backgroundColor = self.bgColor;
NSColor* borderColor = self.borderColor; NSColor* borderColor = self.borderColor;
CGFloat borderThickness = [self.borderThickness floatValue];
NSRect group = NSMakeRect(NSMinX(dirtyRect) + floor(NSWidth(dirtyRect) * 0.03333) + 0.5, NSRect group = NSMakeRect(NSMinX(dirtyRect) + floor(NSWidth(dirtyRect) * 0.03333) + 0.5,
NSMinY(dirtyRect) + floor(NSHeight(dirtyRect) * 0.03333) + 0.5, NSMinY(dirtyRect) + floor(NSHeight(dirtyRect) * 0.03333) + 0.5,
...@@ -57,7 +62,7 @@ ...@@ -57,7 +62,7 @@
[backgroundColor setFill]; [backgroundColor setFill];
[ovalPath fill]; [ovalPath fill];
[borderColor setStroke]; [borderColor setStroke];
[ovalPath setLineWidth: 1.0]; [ovalPath setLineWidth: borderThickness];
[ovalPath stroke]; [ovalPath stroke];
NSDictionary *att = nil; NSDictionary *att = nil;
......
...@@ -329,11 +329,11 @@ ...@@ -329,11 +329,11 @@
</constraints> </constraints>
</box> </box>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="35p-WS-DUv" userLabel="ContactInteractionLabel"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" tag="100" translatesAutoresizingMaskIntoConstraints="NO" id="35p-WS-DUv" userLabel="ContactInteractionLabel">
<rect key="frame" x="330" y="11" width="37" height="17"/> <rect key="frame" x="347" y="11" width="4" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="17" id="azh-RJ-oYw"/> <constraint firstAttribute="height" constant="17" id="azh-RJ-oYw"/>
</constraints> </constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="jRF-Jm-tK5"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="jRF-Jm-tK5">
<font key="font" metaFont="systemLight" size="13"/> <font key="font" metaFont="systemLight" size="13"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
...@@ -379,13 +379,13 @@ ...@@ -379,13 +379,13 @@
</constraints> </constraints>
</customView> </customView>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="Sn1-dJ-QCw"> <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="Sn1-dJ-QCw">
<rect key="frame" x="0.0" y="765" width="798" height="5"/> <rect key="frame" x="0.0" y="770" width="798" height="5"/>
</box> </box>
<button toolTip="Record" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ooq-vs-Xt1" customClass="HoverButton"> <button toolTip="Record" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ooq-vs-Xt1" customClass="HoverButton">
<rect key="frame" x="10" y="778" width="40" height="40"/> <rect key="frame" x="10" y="783" width="35" height="35"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="40" id="69o-49-0QB"/> <constraint firstAttribute="height" constant="35" id="69o-49-0QB"/>
<constraint firstAttribute="width" constant="40" id="ImE-zq-KIj"/> <constraint firstAttribute="width" constant="35" id="ImE-zq-KIj"/>
</constraints> </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_arrow_back" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="DP0-lw-oRl"> <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_arrow_back" imagePosition="overlaps" alignment="center" transparent="YES" imageScaling="proportionallyDown" id="DP0-lw-oRl">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
...@@ -396,7 +396,10 @@ ...@@ -396,7 +396,10 @@
<color key="value" red="0.76470588235294112" green="0.76470588235294112" blue="0.76470588235294112" alpha="1" colorSpace="calibratedRGB"/> <color key="value" red="0.76470588235294112" green="0.76470588235294112" blue="0.76470588235294112" alpha="1" colorSpace="calibratedRGB"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="color" keyPath="imageColor"> <userDefinedRuntimeAttribute type="color" keyPath="imageColor">
<color key="value" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="value" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="calibratedRGB"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="imageInsets">
<integer key="value" value="4"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
<connections> <connections>
...@@ -407,7 +410,7 @@ ...@@ -407,7 +410,7 @@
<rect key="frame" x="49" y="0.0" width="700" height="60"/> <rect key="frame" x="49" y="0.0" width="700" height="60"/>
<subviews> <subviews>
<textField verticalCompressionResistancePriority="1000" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bsk-Gj-qQ2"> <textField verticalCompressionResistancePriority="1000" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bsk-Gj-qQ2">
<rect key="frame" x="58" y="22" width="592" height="17"/> <rect key="frame" x="53" y="22" width="602" height="17"/>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" placeholderString="Send a message" id="Ilz-7v-2fr"> <textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" placeholderString="Send a message" id="Ilz-7v-2fr">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
...@@ -426,10 +429,10 @@ ...@@ -426,10 +429,10 @@
</connections> </connections>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UJf-cF-RAo" customClass="HoverButton"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UJf-cF-RAo" customClass="HoverButton">
<rect key="frame" x="650" y="10" width="40" height="40"/> <rect key="frame" x="655" y="13" width="35" height="35"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="40" id="TmF-ip-m4C"/> <constraint firstAttribute="width" constant="35" id="TmF-ip-m4C"/>
<constraint firstAttribute="height" constant="40" id="rbQ-lE-sAq"/> <constraint firstAttribute="height" constant="35" id="rbQ-lE-sAq"/>
</constraints> </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_send" imagePosition="overlaps" alignment="center" enabled="NO" transparent="YES" imageScaling="proportionallyDown" inset="2" id="s6a-eK-t3T"> <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_send" imagePosition="overlaps" alignment="center" enabled="NO" transparent="YES" imageScaling="proportionallyDown" inset="2" id="s6a-eK-t3T">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
...@@ -445,6 +448,9 @@ ...@@ -445,6 +448,9 @@
<userDefinedRuntimeAttribute type="color" keyPath="buttonDisableColor"> <userDefinedRuntimeAttribute type="color" keyPath="buttonDisableColor">
<color key="value" red="0.78955939797794117" green="0.75686274509803919" blue="0.82745098039215681" alpha="1" colorSpace="calibratedRGB"/> <color key="value" red="0.78955939797794117" green="0.75686274509803919" blue="0.82745098039215681" alpha="1" colorSpace="calibratedRGB"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="imageInsets">
<integer key="value" value="4"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="sendMessage:" target="-2" id="5Cf-jA-eJM"/> <action selector="sendMessage:" target="-2" id="5Cf-jA-eJM"/>
...@@ -452,10 +458,10 @@ ...@@ -452,10 +458,10 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gwx-eT-PcN" customClass="HoverButton"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gwx-eT-PcN" customClass="HoverButton">
<rect key="frame" x="10" y="10" width="40" height="40"/> <rect key="frame" x="10" y="13" width="35" height="35"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="40" id="C2W-wV-YvF"/> <constraint firstAttribute="height" constant="35" id="C2W-wV-YvF"/>
<constraint firstAttribute="width" constant="40" id="zZF-4P-pW9"/> <constraint firstAttribute="width" constant="35" id="zZF-4P-pW9"/>
</constraints> </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_file_upload" imagePosition="overlaps" alignment="center" enabled="NO" transparent="YES" imageScaling="proportionallyDown" inset="2" id="gfQ-c5-YPu"> <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_file_upload" imagePosition="overlaps" alignment="center" enabled="NO" transparent="YES" imageScaling="proportionallyDown" inset="2" id="gfQ-c5-YPu">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
...@@ -468,6 +474,9 @@ ...@@ -468,6 +474,9 @@
<userDefinedRuntimeAttribute type="color" keyPath="hoverColor"> <userDefinedRuntimeAttribute type="color" keyPath="hoverColor">
<color key="value" red="0.23137254901960785" green="0.75686274509803919" blue="0.82745098039215681" alpha="0.23000000000000001" colorSpace="calibratedRGB"/> <color key="value" red="0.23137254901960785" green="0.75686274509803919" blue="0.82745098039215681" alpha="0.23000000000000001" colorSpace="calibratedRGB"/>
</userDefinedRuntimeAttribute> </userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="imageInsets">
<integer key="value" value="4"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
<connections> <connections>
<action selector="sendFile:" target="-2" id="Lex-2X-KCU"/> <action selector="sendFile:" target="-2" id="Lex-2X-KCU"/>
...@@ -486,18 +495,18 @@ ...@@ -486,18 +495,18 @@
</constraints> </constraints>
</customView> </customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ucx-6g-eJw"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ucx-6g-eJw">
<rect key="frame" x="58" y="773" width="40" height="50"/> <rect key="frame" x="53" y="778" width="4" height="45"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" placeholderString="Title" id="HnC-1N-RmR"> <textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" id="HnC-1N-RmR">
<font key="font" metaFont="system" size="18"/> <font key="font" metaFont="system" size="18"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" tag="400" translatesAutoresizingMaskIntoConstraints="NO" id="cFH-d7-Erh" userLabel="Call Button" customClass="HoverButton"> <button verticalHuggingPriority="750" tag="400" translatesAutoresizingMaskIntoConstraints="NO" id="cFH-d7-Erh" userLabel="Call Button" customClass="HoverButton">
<rect key="frame" x="748" y="778" width="40" height="40"/> <rect key="frame" x="753" y="783" width="35" height="35"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="40" id="4jd-jn-RY1"/> <constraint firstAttribute="width" constant="35" id="4jd-jn-RY1"/>
<constraint firstAttribute="height" constant="40" id="DMa-Lq-2Tk"/> <constraint firstAttribute="height" constant="35" id="DMa-Lq-2Tk"/>
</constraints> </constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_video" imagePosition="overlaps" alignment="center" allowsMixedState="YES" transparent="YES" imageScaling="proportionallyDown" inset="2" id="XOS-rh-WfH"> <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="ic_action_video" imagePosition="overlaps" alignment="center" allowsMixedState="YES" transparent="YES" imageScaling="proportionallyDown" inset="2" id="XOS-rh-WfH">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
...@@ -510,24 +519,27 @@ ...@@ -510,24 +519,27 @@
<userDefinedRuntimeAttribute type="color" keyPath="hoverColor"> <userDefinedRuntimeAttribute type="color" keyPath="hoverColor">