Skip to content

Commit e31552b

Browse files
committed
Addeded presentation and basic management UI for bookmarks #beagleim-450
1 parent dfbe646 commit e31552b

29 files changed

+2271
-2267
lines changed

BeagleIM.xcodeproj/project.pbxproj

Lines changed: 20 additions & 20 deletions
Large diffs are not rendered by default.

BeagleIM/AppDelegate.swift

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -277,13 +277,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele
277277
switch action {
278278
case .join:
279279
DispatchQueue.main.async {
280-
guard let windowController = self.mainWindowController?.storyboard?.instantiateController(withIdentifier: "OpenGroupchatController") as? NSWindowController else {
280+
guard let windowController = NSStoryboard(name: "MIX", bundle: nil).instantiateController(withIdentifier: "JoinChannelWindowController") as? NSWindowController else {
281281
return;
282282
}
283-
(windowController.contentViewController as? OpenGroupchatController)?.componentJidField.stringValue = uri.jid.domain;
284-
(windowController.contentViewController as? OpenGroupchatController)?.componentJid = BareJID(uri.jid.domain);
285-
(windowController.contentViewController as? OpenGroupchatController)?.searchField.stringValue = uri.jid.localPart ?? "";
286-
(windowController.contentViewController as? OpenGroupchatController)?.password = uri.dict?["password"];
283+
(windowController.contentViewController as? JoinChannelViewController)?.componentDomainField.stringValue = uri.jid.domain;
284+
(windowController.contentViewController as? JoinChannelViewController)?.channelNameField.stringValue = uri.jid.localPart ?? "";
285+
(windowController.contentViewController as? JoinChannelViewController)?.password = uri.dict?["password"];
287286
self.mainWindowController?.window?.beginSheet(windowController.window!, completionHandler: nil);
288287
}
289288
case .message:
@@ -507,17 +506,17 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele
507506
break;
508507
}
509508
let storyboard = NSStoryboard(name: "Main", bundle: nil);
510-
guard let windowController = storyboard.instantiateController(withIdentifier: "OpenGroupchatController") as? NSWindowController else {
509+
guard let windowController = storyboard.instantiateController(withIdentifier: "JoinChannelWindowController") as? NSWindowController else {
511510
break;
512511
}
513-
guard let openRoomController = windowController.contentViewController as? OpenGroupchatController else {
512+
guard let openRoomController = windowController.contentViewController as? JoinChannelViewController else {
514513
break;
515514
}
516515
let roomJid = BareJID(roomJidStr);
517-
openRoomController.searchField.stringValue = roomJidStr;
518-
openRoomController.componentJids = [BareJID(roomJid.domain)];
516+
openRoomController.channelNameField.stringValue = roomJid.domain;
517+
openRoomController.channelNameField.stringValue = roomJid.localPart ?? "";
519518
openRoomController.account = BareJID(accountStr);
520-
openRoomController.nicknameField.stringValue = nickname;
519+
openRoomController.nickname = nickname;
521520
guard let window = self.mainWindowController?.window else {
522521
break;
523522
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//
2-
// OpenChannelViewController.swift
2+
// BaseJoinChannelViewController.swift
33
//
44
// BeagleIM
5-
// Copyright (C) 2020 "Tigase, Inc." <[email protected]>
5+
// Copyright (C) 2022 "Tigase, Inc." <[email protected]>
66
//
77
// This program is free software: you can redistribute it and/or modify
88
// it under the terms of the GNU General Public License as published by
@@ -19,71 +19,29 @@
1919
// If not, see https://www.gnu.org/licenses/.
2020
//
2121

22+
import Foundation
2223
import AppKit
2324
import TigaseSwift
2425

25-
class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabViewDelegate {
26+
class BaseJoinChannelViewController: NSViewController {
2627

27-
private var tabView: NSTabView? {
28-
didSet {
29-
// (tabView?.selectedTabViewItem?.view as? OpenChannelViewControllerTabView)?.delegate = self;
30-
showDisclosure(false);
31-
if let tabView = self.tabView {
32-
for viewItem in tabView.tabViewItems {
33-
if let view = viewItem.view as? OpenChannelViewControllerTabView {
34-
view.delegate = self;
35-
}
36-
}
37-
}
38-
}
39-
}
4028
@IBOutlet var accountButton: NSPopUpButton!;
4129
@IBOutlet var componentDomainField: NSTextField!;
4230
@IBOutlet var progressIndication: NSProgressIndicator!;
43-
44-
private var accountHeightConstraint: NSLayoutConstraint!;
45-
46-
var account: BareJID? {
47-
didSet {
48-
if let tabView = self.tabView {
49-
for viewItem in tabView.tabViewItems {
50-
if let view = viewItem.view as? OpenChannelViewControllerTabView {
51-
view.account = self.account;
52-
}
53-
}
54-
}
55-
}
56-
}
57-
5831
@IBOutlet var submitButton: NSButton!;
5932

60-
private var components: [Component] = [] {
61-
didSet {
62-
if let tabView = self.tabView {
63-
for viewItem in tabView.tabViewItems {
64-
if let view = viewItem.view as? OpenChannelViewControllerTabView {
65-
view.components = self.components;
66-
}
67-
}
68-
}
69-
}
70-
}
33+
private var accountHeightConstraint: NSLayoutConstraint!;
34+
35+
var account: BareJID?;
36+
var components: [Component] = [];
7137

7238
override func viewDidLoad() {
7339
super.viewDidLoad();
7440
accountHeightConstraint = accountButton.heightAnchor.constraint(equalToConstant: 0);
7541
}
7642

7743
override func viewWillAppear() {
78-
self.submitButton.title = tabView?.selectedTabViewItem?.label ?? "";
7944
self.accountButton.addItem(withTitle: "");
80-
if let tabView = self.tabView {
81-
for viewItem in tabView.tabViewItems {
82-
if let view = viewItem.view as? OpenChannelViewControllerTabView {
83-
view.delegate = self;
84-
}
85-
}
86-
}
8745
AccountManager.getAccounts().filter { account -> Bool in
8846
return XmppService.instance.getClient(for: account) != nil
8947
}.forEach { (account) in
@@ -100,19 +58,11 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
10058
self.accountButton.title = self.accountButton.itemTitle(at: 1);
10159
self.account = BareJID(self.accountButton.itemTitle(at: 1));
10260
}
61+
showDisclosure(AccountManager.getAccounts().count != 1);
10362
findComponents();
104-
self.updateSubmitState();
63+
updateSubmitState();
10564
}
10665

107-
// func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
108-
// submitButton.title = tabViewItem?.label ?? "";
109-
//// (tabViewItem?.view as? OpenChannelViewControllerTabView)?.delegate = self;
110-
// (tabViewItem?.view as? OpenChannelViewControllerTabView)?.account = self.account;
111-
// (tabViewItem?.view as? OpenChannelViewControllerTabView)?.components = self.components;
112-
// (tabViewItem?.view as? OpenChannelViewControllerTabView)?.disclosureChanged(state: !accountHeightConstraint.isActive);
113-
// self.updateSubmitState();
114-
// }
115-
11666
@IBAction func accountSelectionChanged(_ sender: NSPopUpButton) {
11767
guard let title = sender.selectedItem?.title else {
11868
return;
@@ -140,39 +90,18 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
14090
@IBAction func disclosureChangedState(_ sender: NSButton) {
14191
showDisclosure(sender.state == .on);
14292
}
143-
93+
14494
func showDisclosure(_ state: Bool) {
14595
accountButton.isHidden = !state;
14696
accountHeightConstraint.isActive = !state;
147-
if let tabView = self.tabView {
148-
for viewItem in tabView.tabViewItems {
149-
if let view = viewItem.view as? OpenChannelViewControllerTabView {
150-
view.disclosureChanged(state: state);
151-
}
152-
}
153-
}
15497
}
15598

15699
@IBAction func cancelClicked(_ sender: NSButton) {
157-
guard let view = self.tabView?.selectedTabViewItem?.view as? OpenChannelViewControllerTabView else {
158-
close();
159-
return;
160-
}
161-
view.cancelClicked(completionHandler: {
162-
self.close()
163-
})
100+
close();
164101
}
165102

166103
@IBAction func submitClicked(_ sender: NSButton) {
167-
guard let view = self.tabView?.selectedTabViewItem?.view as? OpenChannelViewControllerTabView else {
168-
close();
169-
return;
170-
}
171-
view.submitClicked(completionHandler: { result in
172-
if result {
173-
self.close()
174-
}
175-
})
104+
close();
176105
}
177106

178107
func operationStarted() {
@@ -184,25 +113,25 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
184113
}
185114

186115
func updateSubmitState() {
187-
submitButton.isEnabled = (self.tabView?.selectedTabViewItem?.view as? OpenChannelViewControllerTabView)?.canSubmit() ?? false;
116+
submitButton.isEnabled = canSubmit();
188117
}
189118

190-
private func close() {
191-
self.view.window?.sheetParent?.endSheet(self.view.window!);
119+
func canSubmit() -> Bool {
120+
return account != nil && !components.isEmpty;
192121
}
193122

194-
func askForNickname(completionHandler: @escaping (String) -> Void) {
195-
OpenChannelViewController.askForNickname(for: self.account!, window: self.view.window!, completionHandler: completionHandler);
123+
func close() {
124+
self.view.window?.sheetParent?.endSheet(self.view.window!);
196125
}
197126

198-
static func askForNickname(for account: BareJID, window: NSWindow, completionHandler: @escaping (String)->Void) {
127+
static func askForNickname(for account: BareJID, suggestedNickname: String? = nil, window: NSWindow, completionHandler: @escaping (String)->Void) {
199128
let alert = NSAlert();
200129
alert.alertStyle = .informational;
201130
alert.icon = NSImage(named: NSImage.userName);
202131
alert.messageText = NSLocalizedString("Nickname", comment: "alert window title");
203132
alert.informativeText = NSLocalizedString("Enter a nickname which you want to use in this channel.", comment: "alert window message");
204133
let nicknameField = NSTextField(frame: NSRect(x: 0, y: 0, width: 200, height: 7 + NSFont.systemFontSize));
205-
nicknameField.stringValue = AccountManager.getAccount(for: account)?.nickname ?? ""
134+
nicknameField.stringValue = suggestedNickname ?? AccountManager.getAccount(for: account)?.nickname ?? ""
206135
alert.accessoryView = nicknameField;
207136
alert.addButton(withTitle: NSLocalizedString("Submit", comment: "Button"));
208137
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: "Button"));
@@ -219,7 +148,7 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
219148
}
220149
})
221150
}
222-
151+
223152
func findComponents(for account: BareJID, at domain: String) {
224153
let domainJid = JID(domain);
225154
guard let discoModule = XmppService.instance.getClient(for: account)?.module(.disco) else {
@@ -271,13 +200,6 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
271200
})
272201
}
273202

274-
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
275-
if let tabViewController = segue.destinationController as? OpenChannelViewTabViewController {
276-
tabViewController.delegate = self;
277-
self.tabView = tabViewController.tabView;
278-
}
279-
}
280-
281203
private func retrieveComponent(from jid: JID, name: String?, discoModule: DiscoveryModule, completionHandler: @escaping (Result<Component,XMPPError>)->Void) {
282204
discoModule.getInfo(for: jid, completionHandler: { result in
283205
switch result {
@@ -293,7 +215,7 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
293215
})
294216

295217
}
296-
218+
297219
enum ComponentType {
298220
case muc
299221
case mix
@@ -329,45 +251,4 @@ class OpenChannelViewController: NSViewController, OpenChannelViewControllerTabV
329251
}
330252
}
331253

332-
protocol OpenChannelViewControllerTabView: AnyObject {
333-
334-
var account: BareJID? { get set }
335-
var components: [OpenChannelViewController.Component] { get set }
336-
var delegate: OpenChannelViewControllerTabViewDelegate? { get set }
337-
338-
func canSubmit() -> Bool;
339-
340-
func disclosureChanged(state: Bool);
341-
342-
func cancelClicked(completionHandler: (()->Void)?);
343-
func submitClicked(completionHandler: ((Bool)->Void)?);
344-
345-
func viewWillAppear();
346-
func viewDidDisappear();
347-
}
348-
349-
protocol OpenChannelViewControllerTabViewDelegate: AnyObject {
350-
351-
func askForNickname(completionHandler: @escaping (String)->Void)
352-
func operationStarted();
353-
func operationFinished();
354-
355-
func updateSubmitState();
356-
}
357254

358-
class OpenChannelViewTabViewController: NSTabViewController {
359-
360-
weak var delegate: OpenChannelViewController?;
361-
362-
override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
363-
super.tabView(tabView, didSelect: tabViewItem);
364-
let newTabLabel = tabViewItem?.label ?? "";
365-
for view in tabView.tabViewItems {
366-
if !(view.label == newTabLabel) {
367-
(view.view as? OpenChannelViewControllerTabView)?.viewDidDisappear();
368-
}
369-
}
370-
(tabViewItem?.view as? OpenChannelViewControllerTabView)?.viewWillAppear();
371-
}
372-
373-
}

0 commit comments

Comments
 (0)