account: merge audio and video panel

AccVideoVC + AccAudioVC = AccMediaVC

Tuleap: #406
Change-Id: I757d66322975b9362e42cb313a6f50986591bef6
diff --git a/src/AccAudioVC.mm b/src/AccAudioVC.mm
deleted file mode 100644
index 6e841e9..0000000
--- a/src/AccAudioVC.mm
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-#import "AccAudioVC.h"
-
-///Qt
-#import <QSortFilterProxyModel>
-#import <qitemselectionmodel.h>
-
-///LRC
-#import <audio/codecmodel.h>
-#import <accountmodel.h>
-#import <ringtonemodel.h>
-#import <ringtone.h>
-
-@interface AccAudioVC ()
-
-@property QNSTreeController* treeController;
-@property (assign) IBOutlet NSOutlineView* codecsView;
-@property (unsafe_unretained) IBOutlet NSPopUpButton* ringtonePopUpButton;
-@property (unsafe_unretained) IBOutlet NSButton* enableRingtone;
-@property (unsafe_unretained) IBOutlet NSButton* playRingtone;
-
-@end
-
-@implementation AccAudioVC
-@synthesize treeController;
-@synthesize codecsView;
-@synthesize ringtonePopUpButton, enableRingtone, playRingtone;
-
-NSInteger const TAG_CHECK       =   100;
-NSInteger const TAG_NAME        =   200;
-NSInteger const TAG_FREQUENCY   =   300;
-
-- (void) loadView
-{
-    [super loadView];
-    NSLog(@"INIT Audio VC");
-    QObject::connect(AccountModel::instance().selectionModel(),
-                     &QItemSelectionModel::currentChanged,
-                     [=](const QModelIndex &current, const QModelIndex &previous) {
-                         if(!current.isValid())
-                             return;
-                         [self loadAccount];
-                     });
-
-    QObject::connect(&RingtoneModel::instance(),
-                     &QAbstractItemModel::dataChanged,
-                     [=](const QModelIndex &current, const QModelIndex &previous) {
-                         if(!current.isValid())
-                             return;
-
-                         NSString* label;
-                         if (!RingtoneModel::instance().isPlaying()) {
-                             label = NSLocalizedString(@"Play", @"Button label");
-                         } else {
-                             label = NSLocalizedString(@"Pause", @"Button label");
-                         }
-                         [playRingtone setTitle:label];
-                     });
-}
-
-- (void)loadAccount
-{
-    auto account = AccountModel::instance().selectedAccount();
-    treeController = [[QNSTreeController alloc] initWithQModel:account->codecModel()->audioCodecs()];
-
-    [treeController setAvoidsEmptySelection:NO];
-    [treeController setChildrenKeyPath:@"children"];
-
-    [codecsView bind:@"content" toObject:treeController withKeyPath:@"arrangedObjects" options:nil];
-    [codecsView bind:@"sortDescriptors" toObject:treeController withKeyPath:@"sortDescriptors" options:nil];
-    [codecsView bind:@"selectionIndexPaths" toObject:treeController withKeyPath:@"selectionIndexPaths" options:nil];
-
-    QModelIndex qIdx = RingtoneModel::instance().selectionModel(account)->currentIndex();
-    [ringtonePopUpButton removeAllItems];
-    [ringtonePopUpButton addItemWithTitle:RingtoneModel::instance().data(qIdx, Qt::DisplayRole).toString().toNSString()];
-
-    [enableRingtone setState:account->isRingtoneEnabled()];
-    [ringtonePopUpButton setEnabled:account->isRingtoneEnabled()];
-}
-
-- (IBAction)startStopRingtone:(id)sender {
-    auto qIdx = RingtoneModel::instance().selectionModel(AccountModel::instance().selectedAccount())->currentIndex();
-    RingtoneModel::instance().play(qIdx);
-}
-
-- (IBAction)toggleRingtoneEnabled:(id)sender {
-    AccountModel::instance().selectedAccount()->setRingtoneEnabled([sender state]);
-    [ringtonePopUpButton setEnabled:[sender state]];
-}
-
-- (IBAction)chooseRingtone:(id)sender {
-    int index = [sender indexOfSelectedItem];
-    QModelIndex qIdx = RingtoneModel::instance().index(index, 0);
-    RingtoneModel::instance().selectionModel(AccountModel::instance().selectedAccount())->setCurrentIndex(qIdx, QItemSelectionModel::ClearAndSelect);
-}
-
-- (IBAction)moveUp:(id)sender {
-    if([[treeController selectedNodes] count] > 0) {
-        QModelIndex qIdx = [treeController toQIdx:[treeController selectedNodes][0]];
-        if(!qIdx.isValid())
-            return;
-
-        QMimeData* mime = AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->mimeData(QModelIndexList() << qIdx);
-        AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->dropMimeData(mime, Qt::MoveAction, qIdx.row() - 1, 0, QModelIndex());
-    }
-}
-
-- (IBAction)moveDown:(id)sender {
-    if([[treeController selectedNodes] count] > 0) {
-        QModelIndex qIdx = [treeController toQIdx:[treeController selectedNodes][0]];
-        if(!qIdx.isValid())
-            return;
-
-        QMimeData* mime = AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->mimeData(QModelIndexList() << qIdx);
-        AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->dropMimeData(mime, Qt::MoveAction, qIdx.row() + 1, 0, QModelIndex());
-    }
-}
-
-- (IBAction)toggleCodec:(NSButton*)sender {
-    NSInteger row = [codecsView rowForView:sender];
-    QModelIndex qIdx = AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->index(row, 0, QModelIndex());
-    AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->setData(qIdx, sender.state == NSOnState ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole);
-}
-
-#pragma mark - NSOutlineViewDelegate methods
-
-- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item;
-{
-    return YES;
-}
-
-- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
-{
-    NSTableView* result = [outlineView makeViewWithIdentifier:@"CodecView" owner:self];
-
-    QModelIndex qIdx = [treeController toQIdx:((NSTreeNode*)item)];
-    if(!qIdx.isValid())
-        return result;
-    NSTextField* name = [result viewWithTag:TAG_NAME];
-    NSTextField* frequency = [result viewWithTag:TAG_FREQUENCY];
-    NSButton* check = [result viewWithTag:TAG_CHECK];
-
-    [name setStringValue:AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->data(qIdx, CodecModel::Role::NAME).toString().toNSString()];
-    [frequency setStringValue:[NSString stringWithFormat:@"%@ Hz", AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->data(qIdx, CodecModel::Role::SAMPLERATE).toString().toNSString()]];
-    [check setState:AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->data(qIdx, Qt::CheckStateRole).value<BOOL>()?NSOnState:NSOffState];
-    return result;
-}
-
-#pragma mark - NSMenuDelegate methods
-
-- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
-{
-    QModelIndex qIdx;
-    qIdx = RingtoneModel::instance().index(index, 0);
-    [item setTitle:RingtoneModel::instance().data(qIdx, Qt::DisplayRole).toString().toNSString()];
-
-    if (qIdx == RingtoneModel::instance().selectionModel(AccountModel::instance().selectedAccount())->currentIndex()) {
-        [ringtonePopUpButton selectItem:item];
-    }
-    return YES;
-}
-
-- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
-{
-    return RingtoneModel::instance().rowCount();
-}
-
-@end
diff --git a/src/AccAudioVC.h b/src/AccMediaVC.h
similarity index 93%
rename from src/AccAudioVC.h
rename to src/AccMediaVC.h
index d871ded..9082adf 100644
--- a/src/AccAudioVC.h
+++ b/src/AccMediaVC.h
@@ -23,6 +23,6 @@
 
 #import "QNSTreeController.h"
 
-@interface AccAudioVC : NSViewController <NSOutlineViewDelegate>
+@interface AccMediaVC : NSViewController <NSOutlineViewDelegate>
 
 @end
\ No newline at end of file
diff --git a/src/AccMediaVC.mm b/src/AccMediaVC.mm
new file mode 100644
index 0000000..22e4013
--- /dev/null
+++ b/src/AccMediaVC.mm
@@ -0,0 +1,268 @@
+/*
+ *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
+ *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ */
+#import "AccMediaVC.h"
+
+///Qt
+#import <QSortFilterProxyModel>
+#import <qitemselectionmodel.h>
+
+///LRC
+#import <audio/codecmodel.h>
+#import <accountmodel.h>
+#import <ringtonemodel.h>
+#import <ringtone.h>
+
+@interface AccMediaVC ()
+
+@property QNSTreeController* audioTreeController;
+@property QNSTreeController* videoTreeController;
+@property (unsafe_unretained) IBOutlet NSPopUpButton* ringtonePopUpButton;
+@property (unsafe_unretained) IBOutlet NSButton* enableRingtone;
+@property (unsafe_unretained) IBOutlet NSButton* playRingtone;
+@property (unsafe_unretained) IBOutlet NSButton *toggleVideoButton;
+@property (unsafe_unretained) IBOutlet NSOutlineView* audioCodecView;
+@property (unsafe_unretained) IBOutlet NSOutlineView* videoCodecView;
+@property (unsafe_unretained) IBOutlet NSView* videoPanelContainer;
+
+@end
+
+@implementation AccMediaVC
+@synthesize audioTreeController, videoTreeController;
+@synthesize audioCodecView, videoCodecView;
+@synthesize videoPanelContainer;
+@synthesize ringtonePopUpButton, enableRingtone, playRingtone, toggleVideoButton;
+
+NSInteger const TAG_CHECK       =   100;
+NSInteger const TAG_NAME        =   200;
+NSInteger const TAG_DETAILS     =   300;
+
+NSString*  const ID_AUDIO       =   @"audioview";
+NSString*  const ID_VIDEO       =   @"videoview";
+
+- (void) loadView
+{
+    [super loadView];
+    NSLog(@"INIT Media VC");
+    QObject::connect(AccountModel::instance().selectionModel(),
+                     &QItemSelectionModel::currentChanged,
+                     [=](const QModelIndex &current, const QModelIndex &previous) {
+                         if(!current.isValid())
+                             return;
+                         [self loadAccount];
+                     });
+
+    QObject::connect(&RingtoneModel::instance(),
+                     &QAbstractItemModel::dataChanged,
+                     [=](const QModelIndex &current, const QModelIndex &previous) {
+                         if(!current.isValid())
+                             return;
+
+                         NSString* label;
+                         if (!RingtoneModel::instance().isPlaying()) {
+                             label = NSLocalizedString(@"Play", @"Button label");
+                         } else {
+                             label = NSLocalizedString(@"Pause", @"Button label");
+                         }
+                         [playRingtone setTitle:label];
+                     });
+}
+
+- (void)loadAccount
+{
+    // AUDIO
+    [self loadAudioPrefs];
+
+    // VIDEO
+    [self loadVideoPrefs];
+
+}
+
+#pragma Audio Preferences method
+
+- (void) loadAudioPrefs
+{
+    auto account = AccountModel::instance().selectedAccount();
+    audioTreeController = [[QNSTreeController alloc] initWithQModel:account->codecModel()->audioCodecs()];
+    [audioTreeController setAvoidsEmptySelection:NO];
+    [audioTreeController setChildrenKeyPath:@"children"];
+    [audioCodecView bind:@"content" toObject:audioTreeController withKeyPath:@"arrangedObjects" options:nil];
+    [audioCodecView bind:@"sortDescriptors" toObject:audioTreeController withKeyPath:@"sortDescriptors" options:nil];
+    [audioCodecView bind:@"selectionIndexPaths" toObject:audioTreeController withKeyPath:@"selectionIndexPaths" options:nil];
+    [audioCodecView setIdentifier:ID_AUDIO];
+
+    QModelIndex qIdx = RingtoneModel::instance().selectionModel(account)->currentIndex();
+    [ringtonePopUpButton removeAllItems];
+    [ringtonePopUpButton addItemWithTitle:RingtoneModel::instance().data(qIdx, Qt::DisplayRole).toString().toNSString()];
+
+    [enableRingtone setState:account->isRingtoneEnabled()];
+    [ringtonePopUpButton setEnabled:account->isRingtoneEnabled()];
+}
+
+- (IBAction)startStopRingtone:(id)sender {
+    auto qIdx = RingtoneModel::instance().selectionModel(AccountModel::instance().selectedAccount())->currentIndex();
+    RingtoneModel::instance().play(qIdx);
+}
+
+- (IBAction)toggleRingtoneEnabled:(id)sender {
+    AccountModel::instance().selectedAccount()->setRingtoneEnabled([sender state]);
+    [ringtonePopUpButton setEnabled:[sender state]];
+}
+
+- (IBAction)chooseRingtone:(id)sender {
+    int index = [sender indexOfSelectedItem];
+    QModelIndex qIdx = RingtoneModel::instance().index(index, 0);
+    RingtoneModel::instance().selectionModel(AccountModel::instance().selectedAccount())->setCurrentIndex(qIdx, QItemSelectionModel::ClearAndSelect);
+}
+
+- (IBAction)moveAudioCodecUp:(id)sender {
+    if([[audioTreeController selectedNodes] count] > 0) {
+        QModelIndex qIdx = [audioTreeController toQIdx:[audioTreeController selectedNodes][0]];
+        if(!qIdx.isValid())
+            return;
+
+        QMimeData* mime = AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->mimeData(QModelIndexList() << qIdx);
+        AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->dropMimeData(mime, Qt::MoveAction, qIdx.row() - 1, 0, QModelIndex());
+    }
+}
+
+- (IBAction)moveAudioCodecDown:(id)sender {
+    if([[audioTreeController selectedNodes] count] > 0) {
+        QModelIndex qIdx = [audioTreeController toQIdx:[audioTreeController selectedNodes][0]];
+        if(!qIdx.isValid())
+            return;
+
+        QMimeData* mime = AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->mimeData(QModelIndexList() << qIdx);
+        AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->dropMimeData(mime, Qt::MoveAction, qIdx.row() + 1, 0, QModelIndex());
+    }
+}
+
+- (IBAction)toggleAudioCodec:(NSButton*)sender {
+    NSInteger row = [audioCodecView rowForView:sender];
+    QModelIndex qIdx = AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->index(row, 0, QModelIndex());
+    AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->setData(qIdx, sender.state == NSOnState ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole);
+}
+
+#pragma Video Preferences method
+
+-(void) loadVideoPrefs
+{
+    auto account = AccountModel::instance().selectedAccount();
+    videoTreeController = [[QNSTreeController alloc] initWithQModel:account->codecModel()->videoCodecs()];
+    [videoTreeController setAvoidsEmptySelection:NO];
+    [videoTreeController setChildrenKeyPath:@"children"];
+
+    [videoCodecView setIdentifier:ID_VIDEO];
+    [videoCodecView bind:@"content" toObject:videoTreeController withKeyPath:@"arrangedObjects" options:nil];
+    [videoCodecView bind:@"sortDescriptors" toObject:videoTreeController withKeyPath:@"sortDescriptors" options:nil];
+    [videoCodecView bind:@"selectionIndexPaths" toObject:videoTreeController withKeyPath:@"selectionIndexPaths" options:nil];
+    [videoPanelContainer setHidden:!account->isVideoEnabled()];
+    [toggleVideoButton setState:account->isVideoEnabled()?NSOnState:NSOffState];
+
+}
+
+- (IBAction)toggleVideoEnabled:(id)sender {
+    AccountModel::instance().selectedAccount()->setVideoEnabled([sender state] == NSOnState);
+    [videoPanelContainer setHidden:!AccountModel::instance().selectedAccount()->isVideoEnabled()];
+}
+
+- (IBAction)toggleVideoCodec:(NSButton*)sender {
+    NSInteger row = [videoCodecView rowForView:sender];
+    QModelIndex qIdx = AccountModel::instance().selectedAccount()->codecModel()->videoCodecs()->index(row, 0, QModelIndex());
+    AccountModel::instance().selectedAccount()->codecModel()->videoCodecs()->setData(qIdx, sender.state == NSOnState ? Qt::Checked : Qt::Unchecked, Qt::CheckStateRole);
+}
+
+- (IBAction)moveVideoCodecUp:(id)sender {
+
+    if([[videoTreeController selectedNodes] count] > 0) {
+        QModelIndex qIdx = [videoTreeController toQIdx:[videoTreeController selectedNodes][0]];
+        if(!qIdx.isValid())
+            return;
+
+        QMimeData* mime = AccountModel::instance().selectedAccount()->codecModel()->mimeData(QModelIndexList() << qIdx);
+        AccountModel::instance().selectedAccount()->codecModel()->dropMimeData(mime, Qt::MoveAction, qIdx.row() - 1, 0, QModelIndex());
+    }
+}
+
+- (IBAction)moveVideoCodecDown:(id)sender {
+    if([[videoTreeController selectedNodes] count] > 0) {
+        QModelIndex qIdx = [videoTreeController toQIdx:[videoTreeController selectedNodes][0]];
+        if(!qIdx.isValid())
+            return;
+
+        QMimeData* mime = AccountModel::instance().selectedAccount()->codecModel()->mimeData(QModelIndexList() << qIdx);
+        AccountModel::instance().selectedAccount()->codecModel()->dropMimeData(mime, Qt::MoveAction, qIdx.row() + 1, 0, QModelIndex());
+    }
+}
+
+
+#pragma mark - NSOutlineViewDelegate methods
+
+- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item;
+{
+    return YES;
+}
+
+- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
+{
+    NSTableView* result = [outlineView makeViewWithIdentifier:@"CodecView" owner:self];
+
+    QModelIndex qIdx;
+    if ([outlineView.identifier isEqualToString:ID_AUDIO])
+        qIdx = [audioTreeController toQIdx:((NSTreeNode*)item)];
+    else
+        qIdx = [videoTreeController toQIdx:((NSTreeNode*)item)];
+
+    if(!qIdx.isValid())
+        return result;
+    NSTextField* name = [result viewWithTag:TAG_NAME];
+    NSTextField* details = [result viewWithTag:TAG_DETAILS];
+    NSButton* check = [result viewWithTag:TAG_CHECK];
+
+    if ([outlineView.identifier isEqualToString:ID_AUDIO]) {
+        [name setStringValue:AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->data(qIdx, CodecModel::Role::NAME).toString().toNSString()];
+        [details setStringValue:[NSString stringWithFormat:@"%@ Hz", AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->data(qIdx, CodecModel::Role::SAMPLERATE).toString().toNSString()]];
+        [check setState:AccountModel::instance().selectedAccount()->codecModel()->audioCodecs()->data(qIdx, Qt::CheckStateRole).value<BOOL>()?NSOnState:NSOffState];
+    } else {
+        [name setStringValue:AccountModel::instance().selectedAccount()->codecModel()->videoCodecs()->data(qIdx, CodecModel::Role::NAME).toString().toNSString()];
+        [check setState:AccountModel::instance().selectedAccount()->codecModel()->videoCodecs()->data(qIdx, Qt::CheckStateRole).value<BOOL>()?NSOnState:NSOffState];
+    }
+
+    return result;
+}
+
+#pragma mark - NSMenuDelegate methods
+
+- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
+{
+    QModelIndex qIdx;
+    qIdx = RingtoneModel::instance().index(index, 0);
+    [item setTitle:RingtoneModel::instance().data(qIdx, Qt::DisplayRole).toString().toNSString()];
+
+    if (qIdx == RingtoneModel::instance().selectionModel(AccountModel::instance().selectedAccount())->currentIndex()) {
+        [ringtonePopUpButton selectItem:item];
+    }
+    return YES;
+}
+
+- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
+{
+    return RingtoneModel::instance().rowCount();
+}
+
+@end
diff --git a/src/AccVideoVC.h b/src/AccVideoVC.h
deleted file mode 100644
index 1cc0cb1..0000000
--- a/src/AccVideoVC.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-
-#import <Cocoa/Cocoa.h>
-
-#import <account.h>
-
-@interface AccVideoVC : NSViewController <NSOutlineViewDelegate>
-
-@end
\ No newline at end of file
diff --git a/src/AccVideoVC.mm b/src/AccVideoVC.mm
deleted file mode 100644
index 3ff97a9..0000000
--- a/src/AccVideoVC.mm
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
- *  Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
- */
-#define COLUMNID_STATE   @"VideoStateColumn"
-#define COLUMNID_CODECS   @"VideoCodecsColumn"
-#define COLUMNID_FREQ     @"VideoFrequencyColumn"
-#define COLUMNID_BITRATE  @"VideoBitrateColumn"
-
-#import "AccVideoVC.h"
-
-#include <QtCore/QSortFilterProxyModel>
-#import <audio/codecmodel.h>
-#import <accountmodel.h>
-#import <qitemselectionmodel.h>
-
-#import "QNSTreeController.h"
-
-@interface AccVideoVC ()
-
-@property QNSTreeController *treeController;
-@property (assign) IBOutlet NSOutlineView *codecsView;
-@property (assign) IBOutlet NSView *videoPanelContainer;
-@property (assign) IBOutlet NSButton *toggleVideoButton;
-
-@end
-
-@implementation AccVideoVC
-@synthesize treeController;
-@synthesize codecsView;
-@synthesize videoPanelContainer;
-@synthesize toggleVideoButton;
-
-- (void)awakeFromNib
-{
-    NSLog(@"INIT Video VC");
-    QObject::connect(AccountModel::instance().selectionModel(),
-                     &QItemSelectionModel::currentChanged,
-                     [=](const QModelIndex &current, const QModelIndex &previous) {
-                         if(!current.isValid())
-                             return;
-                         [self loadAccount];
-                     });
-}
-
-- (Account*) currentAccount
-{
-    auto accIdx = AccountModel::instance().selectionModel()->currentIndex();
-    return AccountModel::instance().getAccountByModelIndex(accIdx);
-}
-
-- (void)loadAccount
-{
-    auto account = [self currentAccount];
-
-    treeController = [[QNSTreeController alloc] initWithQModel:account->codecModel()->videoCodecs()];
-    [treeController setAvoidsEmptySelection:NO];
-    [treeController setChildrenKeyPath:@"children"];
-
-    [codecsView bind:@"content" toObject:treeController withKeyPath:@"arrangedObjects" options:nil];
-    [codecsView bind:@"sortDescriptors" toObject:treeController withKeyPath:@"sortDescriptors" options:nil];
-    [codecsView bind:@"selectionIndexPaths" toObject:treeController withKeyPath:@"selectionIndexPaths" options:nil];
-    [videoPanelContainer setHidden:!account->isVideoEnabled()];
-    [toggleVideoButton setState:account->isVideoEnabled()?NSOnState:NSOffState];
-}
-
-- (IBAction)toggleVideoEnabled:(id)sender {
-    [self currentAccount]->setVideoEnabled([sender state] == NSOnState);
-    [videoPanelContainer setHidden:![self currentAccount]->isVideoEnabled()];
-}
-
-- (IBAction)toggleCodec:(NSOutlineView*)sender {
-    NSInteger row = [sender clickedRow];
-    NSTableColumn *col = [sender tableColumnWithIdentifier:COLUMNID_STATE];
-    NSButtonCell *cell = [col dataCellForRow:row];
-    [self currentAccount]->codecModel()->videoCodecs()->setData([self currentAccount]->codecModel()->videoCodecs()->index(row, 0, QModelIndex()),
-        cell.state == NSOnState ? Qt::Unchecked : Qt::Checked, Qt::CheckStateRole);
-}
-
-- (IBAction)moveUp:(id)sender {
-
-    if([[treeController selectedNodes] count] > 0) {
-        QModelIndex qIdx = [treeController toQIdx:[treeController selectedNodes][0]];
-        if(!qIdx.isValid())
-            return;
-
-        QMimeData* mime = [self currentAccount]->codecModel()->mimeData(QModelIndexList() << qIdx);
-        [self currentAccount]->codecModel()->dropMimeData(mime, Qt::MoveAction, qIdx.row() - 1, 0, QModelIndex());
-    }
-}
-
-- (IBAction)moveDown:(id)sender {
-    if([[treeController selectedNodes] count] > 0) {
-        QModelIndex qIdx = [treeController toQIdx:[treeController selectedNodes][0]];
-        if(!qIdx.isValid())
-            return;
-
-        QMimeData* mime = [self currentAccount]->codecModel()->mimeData(QModelIndexList() << qIdx);
-        [self currentAccount]->codecModel()->dropMimeData(mime, Qt::MoveAction, qIdx.row() + 1, 0, QModelIndex());
-    }
-}
-
-#pragma mark - NSOutlineViewDelegate methods
-
-// -------------------------------------------------------------------------------
-//	shouldSelectItem:item
-// -------------------------------------------------------------------------------
-- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item;
-{
-    return YES;
-}
-
-// -------------------------------------------------------------------------------
-//	dataCellForTableColumn:tableColumn:item
-// -------------------------------------------------------------------------------
-- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item
-{
-    NSCell *returnCell = [tableColumn dataCell];
-
-    if(item == nil)
-        return returnCell;
-    return returnCell;
-}
-
-// -------------------------------------------------------------------------------
-//	textShouldEndEditing:fieldEditor
-// -------------------------------------------------------------------------------
-- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor
-{
-    if ([[fieldEditor string] length] == 0)
-    {
-        // don't allow empty node names
-        return NO;
-    }
-    else
-    {
-        return YES;
-    }
-}
-
-// -------------------------------------------------------------------------------
-//	shouldEditTableColumn:tableColumn:item
-//
-//	Decide to allow the edit of the given outline view "item".
-// -------------------------------------------------------------------------------
-- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item
-{
-    return NO;
-}
-
-// -------------------------------------------------------------------------------
-//	outlineView:willDisplayCell:forTableColumn:item
-// -------------------------------------------------------------------------------
-- (void)outlineView:(NSOutlineView *)olv willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
-{
-    QModelIndex qIdx = [treeController toQIdx:((NSTreeNode*)item)];
-    if(!qIdx.isValid())
-        return;
-
-    if([[tableColumn identifier] isEqualToString:COLUMNID_STATE]) {
-        [cell setState:[self currentAccount]->codecModel()->videoCodecs()->data(qIdx, Qt::CheckStateRole).value<BOOL>()?NSOnState:NSOffState];
-    } else if ([[tableColumn identifier] isEqualToString:COLUMNID_CODECS])
-    {
-        cell.title = [self currentAccount]->codecModel()->videoCodecs()->data(qIdx, CodecModel::Role::NAME).toString().toNSString();
-        [cell setState:[self currentAccount]->codecModel()->videoCodecs()->data(qIdx, Qt::CheckStateRole).value<BOOL>()?NSOnState:NSOffState];
-    } else if ([[tableColumn identifier] isEqualToString:COLUMNID_FREQ])
-    {
-        cell.title = [self currentAccount]->codecModel()->videoCodecs()->data(qIdx, CodecModel::Role::SAMPLERATE).toString().toNSString();
-    } else if ([[tableColumn identifier] isEqualToString:COLUMNID_BITRATE])
-    {
-        cell.title = [self currentAccount]->codecModel()->videoCodecs()->data(qIdx, CodecModel::Role::BITRATE).toString().toNSString();
-    }
-}
-
-// -------------------------------------------------------------------------------
-//	outlineViewSelectionDidChange:notification
-// -------------------------------------------------------------------------------
-- (void)outlineViewSelectionDidChange:(NSNotification *)notification
-{
-    // ask the tree controller for the current selection
-}
-
-@end
diff --git a/src/AccountsVC.mm b/src/AccountsVC.mm
index 84b4ca6..2c142e8 100644
--- a/src/AccountsVC.mm
+++ b/src/AccountsVC.mm
@@ -32,8 +32,7 @@
 
 #import "QNSTreeController.h"
 #import "AccGeneralVC.h"
-#import "AccAudioVC.h"
-#import "AccVideoVC.h"
+#import "AccMediaVC.h"
 #import "AccAdvancedVC.h"
 #import "AccSecurityVC.h"
 #import "AccRingVC.h"
@@ -57,8 +56,7 @@
 
 @property (assign) IBOutlet NSTabView *configPanels;
 @property (retain) IBOutlet NSTabViewItem *generalTabItem;
-@property (retain) IBOutlet NSTabViewItem *audioTabItem;
-@property (retain) IBOutlet NSTabViewItem *videoTabItem;
+@property (retain) IBOutlet NSTabViewItem *mediaTabItem;
 @property (retain) IBOutlet NSTabViewItem *advancedTabItem;
 @property (retain) IBOutlet NSTabViewItem *securityTabItem;
 @property (retain) IBOutlet NSTabViewItem *ringTabItem;
@@ -70,8 +68,7 @@
 
 @property AccRingVC* ringVC;
 @property AccGeneralVC* generalVC;
-@property AccAudioVC* audioVC;
-@property AccVideoVC* videoVC;
+@property AccMediaVC* audioVC;
 @property AccAdvancedVC* advancedVC;
 @property AccSecurityVC* securityVC;
 
@@ -81,8 +78,7 @@
 @synthesize protocolList;
 @synthesize configPanels;
 @synthesize generalTabItem;
-@synthesize audioTabItem;
-@synthesize videoTabItem;
+@synthesize mediaTabItem;
 @synthesize advancedTabItem;
 @synthesize securityTabItem;
 @synthesize ringTabItem;
@@ -122,15 +118,10 @@
     [[self.generalVC view] setBounds:[self.generalTabItem.view bounds]];
     [self.generalTabItem setView:self.generalVC.view];
 
-    self.audioVC = [[AccAudioVC alloc] initWithNibName:@"AccAudio" bundle:nil];
-    [[self.audioVC view] setFrame:[self.audioTabItem.view frame]];
-    [[self.audioVC view] setBounds:[self.audioTabItem.view bounds]];
-    [self.audioTabItem setView:self.audioVC.view];
-
-    self.videoVC = [[AccVideoVC alloc] initWithNibName:@"AccVideo" bundle:nil];
-    [[self.videoVC view] setFrame:[self.videoTabItem.view frame]];
-    [[self.videoVC view] setBounds:[self.videoTabItem.view bounds]];
-    [self.videoTabItem setView:self.videoVC.view];
+    self.audioVC = [[AccMediaVC alloc] initWithNibName:@"AccMedia" bundle:nil];
+    [[self.audioVC view] setFrame:[self.mediaTabItem.view frame]];
+    [[self.audioVC view] setBounds:[self.mediaTabItem.view bounds]];
+    [self.mediaTabItem setView:self.audioVC.view];
 
     self.advancedVC = [[AccAdvancedVC alloc] initWithNibName:@"AccAdvanced" bundle:nil];
     [[self.advancedVC view] setFrame:[self.advancedTabItem.view frame]];
@@ -196,10 +187,9 @@
     }
 
     [configPanels insertTabViewItem:generalTabItem atIndex:0];
-    [configPanels insertTabViewItem:audioTabItem atIndex:1];
-    [configPanels insertTabViewItem:videoTabItem atIndex:2];
-    [configPanels insertTabViewItem:advancedTabItem atIndex:3];
-    [configPanels insertTabViewItem:securityTabItem atIndex:4];
+    [configPanels insertTabViewItem:mediaTabItem atIndex:1];
+    [configPanels insertTabViewItem:advancedTabItem atIndex:2];
+    [configPanels insertTabViewItem:securityTabItem atIndex:3];
 }
 
 - (void) setupIAXPanels
@@ -210,8 +200,7 @@
     }
 
     [configPanels insertTabViewItem:generalTabItem atIndex:0];
-    [configPanels insertTabViewItem:audioTabItem atIndex:1];
-    [configPanels insertTabViewItem:videoTabItem atIndex:2];
+    [configPanels insertTabViewItem:mediaTabItem atIndex:1];
 }
 
 - (void) setupRINGPanels
@@ -222,9 +211,8 @@
     }
 
     [configPanels insertTabViewItem:ringTabItem atIndex:0];
-    [configPanels insertTabViewItem:audioTabItem atIndex:1];
-    [configPanels insertTabViewItem:videoTabItem atIndex:2];
-    [configPanels insertTabViewItem:advancedTabItem atIndex:3];
+    [configPanels insertTabViewItem:mediaTabItem atIndex:1];
+    [configPanels insertTabViewItem:advancedTabItem atIndex:2];
 
 }