Allow images to be pasted from Safari rather than their URL.

Use correct type.
This commit is contained in:
Doug 2021-10-18 11:52:31 +01:00
parent 1126e5f9a6
commit 98be850786
3 changed files with 40 additions and 2 deletions

View file

@ -16,8 +16,14 @@
import GrowingTextView import GrowingTextView
@objc protocol RoomInputToolbarTextViewDelegate: AnyObject {
func textView(_ textView: RoomInputToolbarTextView, didReceivePasteForMediaFromSender sender: Any?)
}
class RoomInputToolbarTextView: GrowingTextView { class RoomInputToolbarTextView: GrowingTextView {
@objc weak var toolbarDelegate: RoomInputToolbarTextViewDelegate?
override var keyCommands: [UIKeyCommand]? { override var keyCommands: [UIKeyCommand]? {
return [UIKeyCommand(input: "\r", modifierFlags: [], action: #selector(keyCommandSelector(_:)))] return [UIKeyCommand(input: "\r", modifierFlags: [], action: #selector(keyCommandSelector(_:)))]
} }
@ -28,5 +34,19 @@ class RoomInputToolbarTextView: GrowingTextView {
} }
delegate.onTouchUp(inside: delegate.rightInputToolbarButton) delegate.onTouchUp(inside: delegate.rightInputToolbarButton)
} }
/// Overrides paste to handle images pasted from Safari, passing them up to the input toolbar.
/// This is required as the pasteboard contains both the image and the image's URL, with the
/// default implementation choosing to paste the URL and completely ignore the image data.
override func paste(_ sender: Any?) {
let pasteboard = MXKPasteboardManager.shared.pasteboard
let types = pasteboard.types.map { UTI(rawValue: $0) }
if types.contains(where: { $0.conforms(to: .image) }) {
toolbarDelegate?.textView(self, didReceivePasteForMediaFromSender: sender)
} else {
super.paste(sender)
}
}
} }

View file

@ -38,7 +38,7 @@ const NSTimeInterval kActionMenuContentAlphaAnimationDuration = .2;
const NSTimeInterval kActionMenuComposerHeightAnimationDuration = .3; const NSTimeInterval kActionMenuComposerHeightAnimationDuration = .3;
const CGFloat kComposerContainerTrailingPadding = 12; const CGFloat kComposerContainerTrailingPadding = 12;
@interface RoomInputToolbarView() <GrowingTextViewDelegate> @interface RoomInputToolbarView() <GrowingTextViewDelegate, RoomInputToolbarTextViewDelegate>
{ {
// The intermediate action sheet // The intermediate action sheet
UIAlertController *actionSheet; UIAlertController *actionSheet;
@ -83,6 +83,8 @@ const CGFloat kComposerContainerTrailingPadding = 12;
self.isEncryptionEnabled = _isEncryptionEnabled; self.isEncryptionEnabled = _isEncryptionEnabled;
[self updateUIWithTextMessage:nil animated:NO]; [self updateUIWithTextMessage:nil animated:NO];
self.textView.toolbarDelegate = self;
} }
- (void)setVoiceMessageToolbarView:(UIView *)voiceMessageToolbarView - (void)setVoiceMessageToolbarView:(UIView *)voiceMessageToolbarView
@ -382,6 +384,16 @@ const CGFloat kComposerContainerTrailingPadding = 12;
[super onTouchUpInside:button]; [super onTouchUpInside:button];
} }
- (BOOL)becomeFirstResponder
{
return [self.textView becomeFirstResponder];
}
- (void)dismissKeyboard
{
[self.textView resignFirstResponder];
}
- (void)destroy - (void)destroy
{ {
if (actionSheet) if (actionSheet)
@ -455,6 +467,11 @@ const CGFloat kComposerContainerTrailingPadding = 12;
[super paste:sender]; [super paste:sender];
} }
- (void)textView:(GrowingTextView *)textView didReceivePasteForMediaFromSender:(id)sender
{
[self paste:sender];
}
#pragma mark - Private #pragma mark - Private
- (void)updateUIWithTextMessage:(NSString *)textMessage animated:(BOOL)animated - (void)updateUIWithTextMessage:(NSString *)textMessage animated:(BOOL)animated

1
changelog.d/2076.bugfix Normal file
View file

@ -0,0 +1 @@
Message Composer: Pasting images from Safari now pastes the image and not its URL.