Files
Zockerhoehle/Zockerhoehle/ViewController/ConsoleLibraryViewController.swift
Dr. Julian-Steffen Müller 696525ef6a Changed contextual menus
2019-07-12 15:47:12 +02:00

213 lines
8.1 KiB
Swift

//
// ConsoleViewController.swift
// Zockerhoehle
//
// Created by Julian-Steffen Müller on 12.09.18.
// Copyright © 2018 Julian-Steffen Müller. All rights reserved.
//
import UIKit
import CoreData
import Combine
class ConsoleLibraryViewController: UIViewController {
@IBOutlet weak var consoleItemTable: UITableView!
@IBOutlet weak var category: UISegmentedControl!
@IBOutlet weak var toggleWishList: UIBarButtonItem!
var subsriber : Subscribers.Sink<NSSet, Never>?
var videoGamesInLibrary : [Bool : [Game]] = [:]
var accessoriesinLibrary : [Bool : [Accessory]] = [:]
var showWishlist : Bool = false
var console : Console? {
didSet {
self.title = console?.name ?? "N/A"
//Remove subscription to old console object
subsriber?.cancel()
subsriber = console?.publisher(for: \.games, options: .new).sink(receiveValue: {_ in
self.refreshConsoleLibrary()
})
refreshConsoleLibrary()
}
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "detail" {
guard let indexpath = self.consoleItemTable.indexPathForSelectedRow else {
print("ConsoleLibraryViewController::prepare::detail IndexPath for selectedRow could not be retreived")
return
}
if let dest = segue.destination as? GameDetailController {
dest.game = self.videoGamesInLibrary[self.showWishlist]?[indexpath.row]
}else if let dest = segue.destination as? AccessoryDetailController {
dest.accessory = self.accessoriesinLibrary[self.showWishlist]?[indexpath.row]
}
}else if (segue.identifier == "consoleEntryAdd") {
guard let addPopup = segue.destination as? AddEntryPopUpViewController else {
print("ConsoleLibraryViewController::prepare::consoleEntryAdd Destination is no AddEntryPopUpViewController")
return
}
addPopup.console = self.console
addPopup.isWishlist = self.showWishlist
addPopup.isVideogame = self.category.selectedSegmentIndex == 0
}
}
@IBAction func categoryChanged(_ sender: Any) {
self.consoleItemTable.reloadData()
}
override func viewWillAppear(_ animated: Bool) {
if self.showWishlist {
self.toggleWishList.tintColor = UIColor.red
}else{
self.toggleWishList.tintColor = UIColor.black
}
self.toggleWishList.tintColor = UIColor.black
}
func refreshConsoleLibrary() {
let videogames = self.console?.games.map({$0 as! Game}) ?? []
self.videoGamesInLibrary[true] = videogames.filter({$0.inWishlist})
self.videoGamesInLibrary[false] = videogames.filter({!$0.inWishlist})
let accessories = self.console?.accessories.map({$0 as! Accessory}) ?? []
self.accessoriesinLibrary[true] = accessories.filter({$0.inWishlist})
self.accessoriesinLibrary[false] = accessories.filter({!$0.inWishlist})
consoleItemTable?.reloadData()
}
@IBAction func toggleWishlist(_ sender: Any) {
self.showWishlist = !self.showWishlist
if self.showWishlist {
self.toggleWishList.tintColor = UIColor.red
}else{
self.toggleWishList.tintColor = UIColor.black
}
consoleItemTable.reloadData()
}
}
extension ConsoleLibraryViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if self.category.selectedSegmentIndex == 0 {
return self.videoGamesInLibrary[self.showWishlist]?.count ?? 0
}else{
return self.accessoriesinLibrary[self.showWishlist]?.count ?? 0
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if self.category.selectedSegmentIndex == 0 {
let gameCell = tableView.dequeueReusableCell(withIdentifier: "gameCell") as! GameCell
gameCell.game = self.videoGamesInLibrary[self.showWishlist]?[indexPath.row]
return gameCell
}else{
let accessoryCell = tableView.dequeueReusableCell(withIdentifier: "accessoryCell") as! AccessoryCell
accessoryCell.accessory = self.accessoriesinLibrary[self.showWishlist]?[indexPath.row]
return accessoryCell
}
}
}
// Swipe Action - Delete / move console items from / into the library
extension ConsoleLibraryViewController: UITableViewDelegate {
// Move console item to library
func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let bought = UIContextualAction(style: .destructive, title: "") { (action, view, actionDone) in
actionDone(true)
if self.category.selectedSegmentIndex == 0 {
let game = self.videoGamesInLibrary[self.showWishlist]?[indexPath.row]
game?.inWishlist = false
}else{
let accessory = self.accessoriesinLibrary[self.showWishlist]?[indexPath.row]
accessory?.inWishlist = false
}
self.refreshConsoleLibrary()
}
bought.image = #imageLiteral(resourceName: "cave")
bought.backgroundColor = #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)
var actions : [UIContextualAction] = []
if (self.showWishlist) {
actions.append(bought)
}
let swipeConf = UISwipeActionsConfiguration(actions: actions)
swipeConf.performsFirstActionWithFullSwipe = false
return swipeConf
}
// Delete console item from library
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let delete = UIContextualAction(style: .destructive, title: "Delete") { (action, view, actionDone) in
var nso : NSManagedObject? = .none
var name : String?
if self.category.selectedSegmentIndex == 0 {
nso = self.videoGamesInLibrary[self.showWishlist]?[indexPath.row]
name = self.videoGamesInLibrary[self.showWishlist]?[indexPath.row].name
}else{
nso = self.accessoriesinLibrary[self.showWishlist]?[indexPath.row]
name = self.accessoriesinLibrary[self.showWishlist]?[indexPath.row].name
}
let deleteWarning = UIAlertController( title: "Aus Zockerhöhle entfernen",
message: "Willst du '\(name ?? "N/A")' wirklich aus der Zockerhöhle tragen?",
preferredStyle: .alert)
deleteWarning.addAction(UIAlertAction(title: "Ja", style: .destructive, handler: { (action) in
actionDone(true)
if nso != nil {
CDManager.shared.viewContext.delete(nso!)
}
}))
deleteWarning.addAction(UIAlertAction(title: "Nein", style: .cancel, handler: { (action) in
actionDone(false)
}))
self.present(deleteWarning, animated: true, completion: nil)
}
delete.image = #imageLiteral(resourceName: "delete")
delete.backgroundColor = #colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1)
let swipeConf = UISwipeActionsConfiguration(actions: [delete])
swipeConf.performsFirstActionWithFullSwipe = false
return swipeConf
}
}