Skip to content

Commit

Permalink
Cleanup and show reactions in a nested menu (#2055)
Browse files Browse the repository at this point in the history
Consequence for now is that we don't have a seperate "select more"-submenu anymore, as: "we only support 1 submenu layer for now"
  • Loading branch information
zeitschlag committed Feb 7, 2024
1 parent 092f744 commit 6e842d0
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 42 deletions.
28 changes: 13 additions & 15 deletions deltachat-ios/Chat/ChatViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -195,20 +195,17 @@ class ChatViewController: UITableViewController, UITableViewDropDelegate {
}

private func contextMenu(for indexPath: IndexPath) -> ContextMenuProvider {
let config = ContextMenuProvider()
if #available(iOS 13.0, *) {
if dcChat.canSend {
let mainMenu = ContextMenuProvider.ContextMenuItem(submenuitems: [replyItem, replyPrivatelyItem, forwardItem, infoItem, copyItem, deleteItem])
config.setMenu([reactionsMenu(indexPath: indexPath), mainMenu, selectMoreItem])
return ContextMenuProvider(menu: [reactionsMenu(indexPath: indexPath), replyItem, replyPrivatelyItem, forwardItem, infoItem, copyItem, deleteItem, selectMoreItem])
} else {
config.setMenu([replyPrivatelyItem, forwardItem, infoItem, copyItem, deleteItem])
return ContextMenuProvider(menu: [replyPrivatelyItem, forwardItem, infoItem, copyItem, deleteItem])
}
} else if dcChat.canSend { // skips some options on iOS <13 because of limited horizontal space (reply is still available by swiping)
config.setMenu([forwardItem, infoItem, copyItem, deleteItem, selectMoreItem])
return ContextMenuProvider(menu: [forwardItem, infoItem, copyItem, deleteItem, selectMoreItem])
} else {
config.setMenu([forwardItem, infoItem, copyItem, deleteItem])
return ContextMenuProvider(menu: [forwardItem, infoItem, copyItem, deleteItem])
}
return config
}

private lazy var copyItem: ContextMenuProvider.ContextMenuItem = {
Expand Down Expand Up @@ -1963,17 +1960,18 @@ extension ChatViewController {
identifier: NSString(string: "\(messageId)"),
previewProvider: nil,
actionProvider: { [weak self] _ in
guard let self else {
return nil
}
guard let self else { return nil }

let menuProvider = self.contextMenu(for: indexPath)

if self.dcContext.getMessage(id: messageId).isInfo {
return self.contextMenu(for: indexPath).actionProvider(indexPath: indexPath,
filters: [ { $0.action != self.replyItem.action && $0.action != self.replyPrivatelyItem.action } ])
return menuProvider.actionProvider(indexPath: indexPath,
filters: [ { $0.action != self.replyItem.action && $0.action != self.replyPrivatelyItem.action } ])
} else if self.isGroupChat && !self.dcContext.getMessage(id: messageId).isFromCurrentSender {
return self.contextMenu(for: indexPath).actionProvider(indexPath: indexPath)
return menuProvider.actionProvider(indexPath: indexPath)
} else {
return self.contextMenu(for: indexPath).actionProvider(indexPath: indexPath,
filters: [ { $0.action != self.replyPrivatelyItem.action } ])
return menuProvider.actionProvider(indexPath: indexPath,
filters: [ { $0.action != self.replyPrivatelyItem.action } ])
}
}
)
Expand Down
27 changes: 6 additions & 21 deletions deltachat-ios/Controller/ContextMenuProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,12 @@ import UIKit

class ContextMenuProvider {

var menu: [ContextMenuItem] = []
let menu: [ContextMenuItem]

init(menu: [ContextMenuItem] = []) {
self.menu = menu
}

func setMenu(_ menu: [ContextMenuItem]) {
self.menu = menu
}

// iOS 12- action menu
var menuItems: [UIMenuItem] {
return menu
Expand All @@ -20,9 +16,7 @@ class ContextMenuProvider {
}

private func filter(_ filters: [(ContextMenuItem) throws -> Bool]?, in items: [ContextMenuItem]) -> [ContextMenuItem] {
guard let filters = filters else {
return items
}
guard let filters else { return items }

var items = items
for filter in filters {
Expand Down Expand Up @@ -61,8 +55,8 @@ extension ContextMenuProvider {
image: UIImage? = nil,
identifier: UIMenu.Identifier? = nil,
indexPath: IndexPath,
filters: [(ContextMenuItem) throws -> Bool]? = []) -> UIMenu {

filters: [(ContextMenuItem) throws -> Bool]? = []) -> UIMenu? {
var children: [UIMenuElement] = []
let menuItems = filter(filters, in: menu)
for item in menuItems {
Expand All @@ -73,7 +67,7 @@ extension ContextMenuProvider {
for submenuItem in subMenus {
submenuChildren.append(generateUIAction(item: submenuItem, indexPath: indexPath))
}
let submenu = UIMenu(title: "", options: .displayInline, children: submenuChildren)
let submenu = UIMenu(title: item.title ?? "", options: [], children: submenuChildren)
children.append(submenu)
} else {
children.append(generateUIAction(item: item, indexPath: indexPath))
Expand Down Expand Up @@ -114,22 +108,13 @@ extension ContextMenuProvider {
var onPerform: ((IndexPath) -> Void)?
var children: [ContextMenuItem]?

init(title: String?, imageName: String?, isDestructive: Bool = false, action: Selector? = nil, children: [ContextMenuItem]? = nil, onPerform: ((IndexPath) -> Void)?) {
init(title: String? = nil, imageName: String? = nil, isDestructive: Bool = false, action: Selector? = nil, children: [ContextMenuItem]? = nil, onPerform: ((IndexPath) -> Void)? = nil) {
self.title = title
self.imageName = imageName
self.isDestructive = isDestructive
self.action = action
self.onPerform = onPerform
self.children = children
}

init(submenuitems: [ContextMenuItem]) {
title = nil
imageName = nil
isDestructive = nil
action = nil
onPerform = nil
children = submenuitems
}
}
}
4 changes: 1 addition & 3 deletions deltachat-ios/Controller/FilesViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,7 @@ class FilesViewController: UIViewController {
}
)

let menu = ContextMenuProvider()
menu.setMenu([showInChatItem, shareItem, deleteItem])
return menu
return ContextMenuProvider(menu: [showInChatItem, shareItem, deleteItem])
}()

init(context: DcContext, chatId: Int, type1: Int32, type2: Int32, type3: Int32, title: String? = nil) {
Expand Down
4 changes: 1 addition & 3 deletions deltachat-ios/Controller/GalleryViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,7 @@ class GalleryViewController: UIViewController {
}
)

let config = ContextMenuProvider()
config.setMenu([showInChatItem, deleteItem])
return config
return ContextMenuProvider(menu: [showInChatItem, deleteItem])
}()

init(context: DcContext, chatId: Int) {
Expand Down

0 comments on commit 6e842d0

Please sign in to comment.