Skip to content

Commit

Permalink
FEAT: Implement network printers to printer list
Browse files Browse the repository at this point in the history
  • Loading branch information
josefdolezal committed May 10, 2017
1 parent 18af83e commit 8d7ac19
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 7 deletions.
4 changes: 4 additions & 0 deletions OctoPhone/Generated/Localizable.Generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ enum L10n {
case milimetersPerMinute
/// mm
case milimetersSign
/// Network printers could not be loaded.
case networkPrintersCouldNotBeLoaded
/// No connection is selected.
case noConnectionSelected
/// No, I do not
Expand Down Expand Up @@ -521,6 +523,8 @@ extension L10n: CustomStringConvertible {
return L10n.tr(key: "Milimeters per minute")
case .milimetersSign:
return L10n.tr(key: "Milimeters sign")
case .networkPrintersCouldNotBeLoaded:
return L10n.tr(key: "Network printers could not be loaded")
case .noConnectionSelected:
return L10n.tr(key: "No connection selected")
case .noIDoNot:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,11 @@ class PrinterListViewController: BaseCollectionViewController {
forCellWithReuseIdentifier: PrinterListCollectionViewCell.identifier
)

collectionView.reactive.reloadData <~ viewModel.outputs.storedPrintersChanged
collectionView.reactive.reloadData <~ viewModel.outputs.printersChanged
}
}

/// UI callback for add button tap event
func addPrinterButtonTapped() {
viewModel.inputs.addPrinterButtonTapped()
}
Expand Down Expand Up @@ -90,6 +91,7 @@ extension PrinterListViewController {
}
}

// MARK: - UICollectionViewDelegateFlowLayout
extension PrinterListViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
Expand Down
33 changes: 27 additions & 6 deletions OctoPhone/View Related/Printer List/PrinterListViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,18 @@ protocol PrinterListViewModelInputs {

/// Call when user tapped button for printer addition
func addPrinterButtonTapped()

}

/// Defines all outputs API for view controller
protocol PrinterListViewModelOutputs {
/// Total count of stored printers
var storedPrintersCount: Int { get }

/// Stored printers list changed indicator
var storedPrintersChanged: SignalProducer<(), NoError> { get }
/// Total count of printers available on network
var networkPrintersCount: Int { get }

/// Called when stored printers or network printers changed
var printersChanged: SignalProducer<(), NoError> { get }

/// Stream of errors which should be presented to the user
var displayError: SignalProducer<DisplayableError, NoError> { get }
Expand Down Expand Up @@ -62,7 +64,9 @@ PrinterListViewModelOutputs {

var storedPrintersCount: Int { return storedPrintersProperty.value?.count ?? 0 }

let storedPrintersChanged: SignalProducer<(), NoError>
var networkPrintersCount: Int { return networkPrintersProperty.value.count }

let printersChanged: SignalProducer<(), NoError>

let displayError: SignalProducer<DisplayableError, NoError>

Expand All @@ -71,6 +75,9 @@ PrinterListViewModelOutputs {
/// Collection of stored printers
private let storedPrintersProperty = MutableProperty<Results<Printer>?>(nil)

/// The actual collection of network printers
private let networkPrintersProperty = MutableProperty<[BonjourService]>([])

/// Holds last occured error
private let displayErrorProperty = MutableProperty<DisplayableError?>(nil)

Expand All @@ -83,19 +90,33 @@ PrinterListViewModelOutputs {
init(delegate: PrinterListViewControllerDelegate, contextManager: ContextManagerType) {
self.delegate = delegate
self.contextManager = contextManager
self.storedPrintersChanged = storedPrintersProperty.producer.ignoreValues()
self.displayError = displayErrorProperty.producer.skipNil()

self.printersChanged = SignalProducer.merge([
networkPrintersProperty.producer.skip(first: 1).ignoreValues(),
storedPrintersProperty.producer.skipNil().ignoreValues()
])

contextManager.createObservableContext()
.fetch(collectionOf: Printer.self)
.startWithResult { [weak self] result in

switch result {
case let .success(printers): self?.storedPrintersProperty.value = printers
case .failure: self?.displayErrorProperty.value = (tr(.anErrorOccured),
tr(.storedPrintersCouldNotBeLoaded))
}
}

Bonjour.searchForServices(ofType: .internetPrinter)
.observeResult { [weak self] result in
switch result {
case let .success(printers):
self?.networkPrintersProperty.value = printers
case .failure:
self?.displayErrorProperty.value = (tr(.anErrorOccured),
tr(.networkPrintersCouldNotBeLoaded))
}
}
}

// MARK: Output functions
Expand Down
1 change: 1 addition & 0 deletions en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
// *
"Printer list" = "Printer list";
"Stored printers could not be loaded" = "Stored printers could not be loaded.";
"Network printers could not be loaded" = "Network printers could not be loaded.";


// *
Expand Down

0 comments on commit 8d7ac19

Please sign in to comment.