preferences: bind audio preferences to lrc

Refs #66840

Change-Id: I9176b20cc39642953e3a32a25e35a0b73d1ce8e2
diff --git a/AudioPrefsVC.mm b/AudioPrefsVC.mm
index 0a95c52..16700a6 100644
--- a/AudioPrefsVC.mm
+++ b/AudioPrefsVC.mm
@@ -29,11 +29,182 @@
  */
 #import "AudioPrefsVC.h"
 
+#import <audio/settings.h>
+#import <QUrl>
+#import <audio/inputdevicemodel.h>
+#import <audio/outputdevicemodel.h>
+#import <qitemselectionmodel.h>
+
 @interface AudioPrefsVC ()
 
+@property (assign) IBOutlet NSPathControl *recordingsPathControl;
+@property (assign) IBOutlet NSPopUpButton *outputDeviceList;
+@property (assign) IBOutlet NSPopUpButton *inputDeviceList;
+@property (assign) IBOutlet NSButton *alwaysRecordingButton;
+@property (assign) IBOutlet NSButton *muteDTMFButton;
+
 @end
 
 @implementation AudioPrefsVC
+@synthesize recordingsPathControl;
+@synthesize outputDeviceList;
+@synthesize inputDeviceList;
+@synthesize alwaysRecordingButton;
+@synthesize muteDTMFButton;
 
+- (void)loadView
+{
+    [super loadView];
+
+    QModelIndex qInputIdx = Audio::Settings::instance()->inputDeviceModel()->selectionModel()->currentIndex();
+    QModelIndex qOutputIdx = Audio::Settings::instance()->outputDeviceModel()->selectionModel()->currentIndex();
+    
+    [self.outputDeviceList addItemWithTitle:
+            Audio::Settings::instance()->outputDeviceModel()->data(qOutputIdx, Qt::DisplayRole).toString().toNSString()];
+
+    [self.inputDeviceList addItemWithTitle:
+            Audio::Settings::instance()->inputDeviceModel()->data(qInputIdx, Qt::DisplayRole).toString().toNSString()];
+    [self.alwaysRecordingButton setState:
+            Audio::Settings::instance()->isAlwaysRecording()?NSOnState:NSOffState];
+
+    [self.muteDTMFButton setState:
+            Audio::Settings::instance()->areDTMFMuted()?NSOnState:NSOffState];
+
+    if([[Audio::Settings::instance()->recordPath().toNSURL() absoluteString] isEqualToString:@""]) {
+        NSArray * pathComponentArray = [self pathComponentArray];
+        [recordingsPathControl setPathComponentCells:pathComponentArray];
+    }
+}
+
+- (IBAction)toggleMuteDTMF:(NSButton *)sender
+{
+    Audio::Settings::instance()->setDTMFMuted([sender state] == NSOnState);
+}
+
+- (IBAction)toggleAlwaysRecording:(NSButton *)sender
+{
+    Audio::Settings::instance()->setAlwaysRecording([sender state] == NSOnState);
+}
+
+- (IBAction)pathControlSingleClick:(id)sender {
+    // Select that chosen component of the path.
+    [self.recordingsPathControl setURL:[[self.recordingsPathControl clickedPathComponentCell] URL]];
+    Audio::Settings::instance()->setRecordPath(QUrl::fromNSURL(self.recordingsPathControl.URL));
+}
+
+- (IBAction)chooseOutput:(id)sender {
+    int index = [sender indexOfSelectedItem];
+    QModelIndex qIdx = Audio::Settings::instance()->outputDeviceModel()->index(index, 0);
+    Audio::Settings::instance()->outputDeviceModel()->selectionModel()->setCurrentIndex(
+                                                    qIdx, QItemSelectionModel::ClearAndSelect);
+}
+
+- (IBAction)chooseInput:(id)sender {
+    int index = [sender indexOfSelectedItem];
+    QModelIndex qIdx = Audio::Settings::instance()->inputDeviceModel()->index(index, 0);
+    Audio::Settings::instance()->inputDeviceModel()->selectionModel()->setCurrentIndex(
+                                                    qIdx, QItemSelectionModel::ClearAndSelect);
+}
+
+#pragma mark - NSPathControl delegate methods
+
+/*
+ Assemble a set of custom cells to display into an array to pass to the path control.
+ */
+- (NSArray *)pathComponentArray
+{
+    NSMutableArray *pathComponentArray = [[NSMutableArray alloc] init];
+
+    NSFileManager *fileManager = [[NSFileManager alloc] init];
+
+    NSURL* desktopURL = [fileManager URLForDirectory:NSDesktopDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
+    NSURL* documentsURL = [fileManager URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
+    NSURL* userURL = [fileManager URLForDirectory:NSUserDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
+
+    NSPathComponentCell *componentCell;
+
+    // Use utility method to obtain a NSPathComponentCell based on icon, title and URL.
+    componentCell = [self componentCellForType:kGenericFolderIcon withTitle:@"Desktop" URL:desktopURL];
+    [pathComponentArray addObject:componentCell];
+
+    componentCell = [self componentCellForType:kGenericFolderIcon withTitle:@"Documents" URL:documentsURL];
+    [pathComponentArray addObject:componentCell];
+
+    componentCell = [self componentCellForType:kUserFolderIcon withTitle:NSUserName() URL:userURL];
+    [pathComponentArray addObject:componentCell];
+
+    return pathComponentArray;
+}
+
+/*
+ This method is used by pathComponentArray to create a NSPathComponent cell based on icon, title and URL information. 
+ Each path component needs an icon, URL and title.
+ */
+- (NSPathComponentCell *)componentCellForType:(OSType)withIconType withTitle:(NSString *)title URL:(NSURL *)url
+{
+    NSPathComponentCell *componentCell = [[NSPathComponentCell alloc] init];
+
+    NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(withIconType)];
+    [componentCell setImage:iconImage];
+    [componentCell setURL:url];
+    [componentCell setTitle:title];
+
+    return componentCell;
+}
+
+/*
+ Delegate method of NSPathControl to determine how the NSOpenPanel will look/behave.
+ */
+- (void)pathControl:(NSPathControl *)pathControl willDisplayOpenPanel:(NSOpenPanel *)openPanel
+{
+    NSLog(@"willDisplayOpenPanel");
+    [openPanel setAllowsMultipleSelection:NO];
+    [openPanel setCanChooseDirectories:YES];
+    [openPanel setCanChooseFiles:NO];
+    [openPanel setResolvesAliases:YES];
+    [openPanel setTitle:NSLocalizedString(@"Choose a file", @"Open panel title")];
+    [openPanel setPrompt:NSLocalizedString(@"Choose", @"Open panel prompt for 'Choose a directory'")];
+    [openPanel setDelegate:self];
+}
+
+- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu
+{
+
+}
+
+#pragma mark - NSOpenSavePanelDelegate delegate methods
+
+- (BOOL)panel:(id)sender validateURL:(NSURL *)url error:(NSError **)outError
+{
+    [recordingsPathControl setURL:url];
+    return YES;
+}
+
+#pragma mark - NSMenuDelegate methods
+
+- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
+{
+    QModelIndex qIdx;
+
+    if([menu.title isEqualToString:@"inputlist"])
+    {
+        qIdx = Audio::Settings::instance()->inputDeviceModel()->index(index);
+        [item setTitle:Audio::Settings::instance()->inputDeviceModel()->data(qIdx, Qt::DisplayRole).toString().toNSString()];
+    } else
+    {
+        qIdx = Audio::Settings::instance()->outputDeviceModel()->index(index);
+        [item setTitle:Audio::Settings::instance()->outputDeviceModel()->data(qIdx, Qt::DisplayRole).toString().toNSString()];
+    }
+
+    return YES;
+}
+
+- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
+{
+    if([menu.title isEqualToString:@"inputlist"])
+        return Audio::Settings::instance()->inputDeviceModel()->rowCount();
+    else
+        return Audio::Settings::instance()->outputDeviceModel()->rowCount();
+}
 
 @end