Skip to content
Snippets Groups Projects
Commit c3fc76ce authored by Kateryna Kostiuk's avatar Kateryna Kostiuk
Browse files

preferences: video settings

Change-Id: I734f690dbe7be689134cf44125df2139e152562a
parent 435a1d59
Branches
No related tags found
No related merge requests found
......@@ -29,6 +29,7 @@ namespace lrc {
@protocol LrcModelsProtocol
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil dataTransferModel:(const lrc::api::DataTransferModel*) dataTransferModel;
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil avModel:(const lrc::api::AVModel*) avModel;
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil accountmodel:(const lrc::api::NewAccountModel*) accountModel;
-(id) initWithWindowNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil accountModel:(const lrc::api::NewAccountModel*)accountModel dataTransferModel:(const lrc::api::DataTransferModel*)dataTransferModel behaviourController:(const lrc::api::BehaviorController*) behaviorController;
-(id) initWithWindowNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil accountModel:(const lrc::api::NewAccountModel*)accountModel dataTransferModel:(const lrc::api::DataTransferModel*)dataTransferModel behaviourController:(const lrc::api::BehaviorController*) behaviorController avModel: (const lrc::api::AVModel*)avModel;
......
......@@ -33,7 +33,7 @@
NSViewController *currentVC;
}
@synthesize dataTransferModel, accountModel, behaviorController;
@synthesize dataTransferModel, accountModel, behaviorController, avModel;
// Identifiers used in PreferencesWindow.xib for tabs
static auto const kGeneralPrefsIdentifier = @"GeneralPrefsIdentifier";
......@@ -55,13 +55,14 @@ static auto const kVideoPrefsIdentifer = @"VideoPrefsIdentifer";
[tb setAllowsUserCustomization:NO];
}
-(id) initWithWindowNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil accountModel:( lrc::api::NewAccountModel*)accountModel dataTransferModel:( lrc::api::DataTransferModel*)dataTransferModel behaviourController:( lrc::api::BehaviorController*) behaviorController
-(id) initWithWindowNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil accountModel:(lrc::api::NewAccountModel*)accountModel dataTransferModel:(lrc::api::DataTransferModel*)dataTransferModel behaviourController:(lrc::api::BehaviorController*) behaviorController avModel: (lrc::api::AVModel*)avModel
{
if (self = [self initWithWindowNibName:nibNameOrNil])
{
self.accountModel = accountModel;
self.dataTransferModel = dataTransferModel;
self.behaviorController = behaviorController;
self.avModel = avModel;
}
return self;
}
......@@ -89,7 +90,7 @@ static auto const kVideoPrefsIdentifer = @"VideoPrefsIdentifer";
{
[[prefsContainer subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
currentVC = [[VideoPrefsVC alloc] initWithNibName:@"VideoPrefs" bundle:nil];
currentVC = [[VideoPrefsVC alloc] initWithNibName:@"VideoPrefs" bundle:nil avModel: self.avModel];
[self resizeWindowWithFrame:currentVC.view.frame];
[prefsContainer addSubview:currentVC.view];
}
......
......@@ -423,7 +423,7 @@ typedef NS_ENUM(NSInteger, ViewState) {
return;
}
preferencesWC = [[PreferencesWC alloc] initWithWindowNibName: @"PreferencesWindow" bundle: nil accountModel:self.accountModel dataTransferModel:self.dataTransferModel behaviourController:self.behaviorController];
preferencesWC = [[PreferencesWC alloc] initWithWindowNibName: @"PreferencesWindow" bundle: nil accountModel:self.accountModel dataTransferModel:self.dataTransferModel behaviourController:self.behaviorController avModel: self.avModel];
[preferencesWC.window makeKeyAndOrderFront:preferencesWC.window];
}
......
......@@ -19,8 +19,9 @@
#import <Cocoa/Cocoa.h>
#import "LrcModelsProtocol.h"
@interface VideoPrefsVC : NSViewController <NSMenuDelegate> {
@interface VideoPrefsVC : NSViewController <LrcModelsProtocol, NSMenuDelegate> {
}
......
/*
* Copyright (C) 2015-2016 Savoir-faire Linux Inc.
* Author: Alexandre Lision <alexandre.lision@savoirfairelinux.com>
* Author: Kateryna Kostiuk <kateryna.kostiuk@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
......@@ -20,15 +21,13 @@
#import <QuartzCore/QuartzCore.h>
#import <QItemSelectionModel>
#import <QAbstractProxyModel>
#import <video/configurationproxy.h>
#import <video/sourcemodel.h>
#import <video/previewmanager.h>
#import <video/renderer.h>
#import <video/device.h>
#import <video/devicemodel.h>
#import "video/channel.h"
#import "video/resolution.h"
#import "video/rate.h"
#import <api/avmodel.h>
@interface VideoPrefsVC ()
......@@ -47,63 +46,54 @@
@synthesize videoDevicesList;
@synthesize sizesList;
@synthesize ratesList;
@synthesize avModel;
QMetaObject::Connection frameUpdated;
QMetaObject::Connection previewStarted;
QMetaObject::Connection previewStopped;
Video::DeviceModel *deviceModel;
-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil avModel:(lrc::api::AVModel*) avModel
{
if (self = [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil])
{
self.avModel = avModel;
}
return self;
}
- (void)loadView
{
[super loadView];
// Make sure models are loaded
Video::ConfigurationProxy::deviceModel().rowCount();
Video::ConfigurationProxy::resolutionModel().rowCount();
Video::ConfigurationProxy::rateModel().rowCount();
// Prepopulate values
QModelIndex qDeviceIdx = Video::ConfigurationProxy::deviceSelectionModel().currentIndex();
[videoDevicesList addItemWithTitle:Video::ConfigurationProxy::deviceModel().data(qDeviceIdx, Qt::DisplayRole).toString().toNSString()];
QModelIndex qSizeIdx = Video::ConfigurationProxy::resolutionSelectionModel().currentIndex();
[sizesList addItemWithTitle:Video::ConfigurationProxy::resolutionModel().data(qSizeIdx, Qt::DisplayRole).toString().toNSString()];
QModelIndex qRate = Video::ConfigurationProxy::rateSelectionModel().currentIndex();
[ratesList addItemWithTitle:Video::ConfigurationProxy::rateModel().data(qDeviceIdx, Qt::DisplayRole).toString().toNSString()];
// connect to model reset (device may have changed) and selection changed signals
QObject::connect(qobject_cast<QAbstractProxyModel*>(&Video::ConfigurationProxy::resolutionModel()),
&QAbstractProxyModel::modelReset,
[=]() {
[sizesList removeAllItems];
});
QObject::connect(&Video::ConfigurationProxy::resolutionSelectionModel(),
&QItemSelectionModel::currentChanged,
[=](const QModelIndex &current, const QModelIndex &previous) {
if (!current.isValid()) {
return;
deviceModel = &Video::DeviceModel::instance();
auto device = deviceModel->activeDevice();
[videoDevicesList removeAllItems];
if (deviceModel->devices().size() > 0) {
for (auto device : deviceModel->devices()) {
[videoDevicesList addItemWithTitle: device->name().toNSString()];
}
[sizesList removeAllItems];
[sizesList addItemWithTitle:Video::ConfigurationProxy::resolutionSelectionModel().currentIndex().data(Qt::DisplayRole).toString().toNSString()];
});
QObject::connect(qobject_cast<QAbstractProxyModel*>(&Video::ConfigurationProxy::rateModel()),
&QAbstractProxyModel::modelReset,
[videoDevicesList selectItemWithTitle: device->name().toNSString()];
[self updateWhenDeviceChanged];
}
QObject::connect(deviceModel,
&Video::DeviceModel::changed,
[=]() {
[videoDevicesList removeAllItems];
[sizesList removeAllItems];
[ratesList removeAllItems];
});
QObject::connect(&Video::ConfigurationProxy::rateSelectionModel(),
&QItemSelectionModel::currentChanged,
[=](const QModelIndex &current, const QModelIndex &previous) {
if (!current.isValid()) {
if (deviceModel->devices().size() <= 0) {
return;
}
[ratesList removeAllItems];
[ratesList addItemWithTitle:Video::ConfigurationProxy::rateSelectionModel().currentIndex().data(Qt::DisplayRole).toString().toNSString()];
for (auto device : deviceModel->devices()) {
[videoDevicesList addItemWithTitle: device->name().toNSString()];
}
auto device = deviceModel->activeDevice();
if(!device) {
deviceModel->setActive(0);
device = deviceModel->activeDevice();
}
[videoDevicesList selectItemWithTitle: device->name().toNSString()];
[self updateWhenDeviceChanged];
});
[previewView setWantsLayer:YES];
......@@ -113,31 +103,78 @@ QMetaObject::Connection previewStopped;
[previewView.layer setFrame:previewView.frame];
[previewView.layer setBounds:previewView.frame];
[self.enableHardwareAccelerationButton setState:Video::ConfigurationProxy::getDecodingAccelerated()];
[self.enableHardwareAccelerationButton setState: self.avModel->getDecodingAccelerated()];
}
-(void) updateWhenDeviceChanged {
auto device = deviceModel->activeDevice();
[sizesList removeAllItems];
[ratesList removeAllItems];
if (device->channelList().size() <= 0) {
return;
}
for (auto resolution : device->channelList()[0]->validResolutions()) {
[sizesList addItemWithTitle: resolution->name().toNSString()];
}
auto activeResolution = device->channelList()[0]->activeResolution();
if(!activeResolution) {
device->channelList()[0]->setActiveResolution(0);
activeResolution = device->channelList()[0]->activeResolution();
}
[sizesList selectItemWithTitle: activeResolution->name().toNSString()];
if(activeResolution->validRates().size() <= 0) {
return;
}
for (auto rate : activeResolution->validRates()) {
[ratesList addItemWithTitle: rate->name().toNSString()];
}
auto activeRate = activeResolution->activeRate();
if(!activeRate) {
activeResolution->setActiveRate(0);
activeRate = activeResolution->activeRate();
}
[ratesList selectItemWithTitle:activeResolution->activeRate()->name().toNSString()];
}
- (IBAction)chooseDevice:(id)sender {
int index = [sender indexOfSelectedItem];
QModelIndex qIdx = Video::ConfigurationProxy::deviceModel().index(index, 0);
Video::ConfigurationProxy::deviceSelectionModel().setCurrentIndex(qIdx, QItemSelectionModel::ClearAndSelect);
if (index == deviceModel->activeIndex()) {
return;
}
deviceModel->setActive(index);
[self updateWhenDeviceChanged];
}
- (IBAction)chooseSize:(id)sender {
int index = [sender indexOfSelectedItem];
QModelIndex qIdx = Video::ConfigurationProxy::resolutionModel().index(index, 0);
Video::ConfigurationProxy::resolutionSelectionModel().setCurrentIndex(qIdx, QItemSelectionModel::ClearAndSelect);
auto device = Video::DeviceModel::instance().activeDevice();
device->channelList()[0]->setActiveResolution(index);
auto activeResolution = device->channelList()[0]->activeResolution();
if(activeResolution->validRates().size() > 0) {
for (auto rate : activeResolution->validRates()) {
[ratesList addItemWithTitle: rate->name().toNSString()];
}
}
[ratesList selectItemWithTitle:activeResolution->activeRate()->name().toNSString()];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
deviceModel->setActive([videoDevicesList indexOfSelectedItem]);
});
}
- (IBAction)chooseRate:(id)sender {
int index = [sender indexOfSelectedItem];
QModelIndex qIdx = Video::ConfigurationProxy::rateModel().index(index, 0);
Video::ConfigurationProxy::rateSelectionModel().setCurrentIndex(qIdx, QItemSelectionModel::ClearAndSelect);
Video::DeviceModel::instance().activeDevice()->channelList()[0]->activeResolution()->setActiveRate(index);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
deviceModel->setActive([videoDevicesList indexOfSelectedItem]);
});
}
- (IBAction)toggleHardwareAcceleration:(NSButton *)sender {
bool enabled = [sender state]==NSOnState;
Video::ConfigurationProxy::setDecodingAccelerated(enabled);
self.avModel->setDecodingAccelerated(enabled);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
deviceModel->setActive([videoDevicesList indexOfSelectedItem]);
});
}
- (void) connectPreviewSignals
......@@ -213,6 +250,7 @@ QMetaObject::Connection previewStopped;
[self connectPreviewSignals];
if (self.shouldHandlePreview) {
Video::PreviewManager::instance().stopPreview();
Video::PreviewManager::instance().startPreview();
}
}
......@@ -231,40 +269,26 @@ QMetaObject::Connection previewStopped;
- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel
{
QModelIndex qIdx;
if(self.videoDevicesList.menu == menu) {
qIdx = Video::ConfigurationProxy::deviceModel().index(index, 0);
[item setTitle:Video::ConfigurationProxy::deviceModel().data(qIdx, Qt::DisplayRole).toString().toNSString()];
if (qIdx == Video::ConfigurationProxy::deviceSelectionModel().currentIndex()) {
auto device = deviceModel->devices()[index];
[item setTitle: device->name().toNSString()];
if (index == deviceModel->activeIndex()) {
[videoDevicesList selectItem:item];
}
} else if(self.sizesList.menu == menu) {
qIdx = Video::ConfigurationProxy::resolutionModel().index(index, 0);
[item setTitle:Video::ConfigurationProxy::resolutionModel().data(qIdx, Qt::DisplayRole).toString().toNSString()];
if (qIdx == Video::ConfigurationProxy::resolutionSelectionModel().currentIndex()) {
auto resolution = deviceModel->activeDevice()->channelList()[0]->validResolutions()[index];
[item setTitle: resolution->name().toNSString()];
if (resolution == deviceModel->activeDevice()->channelList()[0]->activeResolution()) {
[sizesList selectItem:item];
}
} else if(self.ratesList.menu == menu) {
qIdx = Video::ConfigurationProxy::rateModel().index(index, 0);
[item setTitle:Video::ConfigurationProxy::rateModel().data(qIdx, Qt::DisplayRole).toString().toNSString()];
if (qIdx == Video::ConfigurationProxy::rateSelectionModel().currentIndex()) {
auto rate = deviceModel->activeDevice()->channelList()[0]->activeResolution()->validRates()[index];
[item setTitle: rate->name().toNSString()];
if (rate == deviceModel->activeDevice()->channelList()[0]->activeResolution()->activeRate()) {
[ratesList selectItem:item];
}
}
return YES;
}
- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu
{
if(self.videoDevicesList.menu == menu) {
return Video::ConfigurationProxy::deviceModel().rowCount();
} else if(self.sizesList.menu == menu) {
return Video::ConfigurationProxy::resolutionModel().rowCount();
} else if(self.ratesList.menu == menu) {
return Video::ConfigurationProxy::rateModel().rowCount();
}
return 0;
}
@end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment