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 ¤t, const QModelIndex &previous) {
- if(!current.isValid())
- return;
- [self loadAccount];
- });
-
- QObject::connect(&RingtoneModel::instance(),
- &QAbstractItemModel::dataChanged,
- [=](const QModelIndex ¤t, 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 ¤t, const QModelIndex &previous) {
+ if(!current.isValid())
+ return;
+ [self loadAccount];
+ });
+
+ QObject::connect(&RingtoneModel::instance(),
+ &QAbstractItemModel::dataChanged,
+ [=](const QModelIndex ¤t, 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 ¤t, 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];
}