diff -r 6369bfd1b60d -r 08b5eae9f9ff dlnasrv_exampleapp/src/exampleappui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dlnasrv_exampleapp/src/exampleappui.cpp Wed Nov 03 11:45:09 2010 +0200 @@ -0,0 +1,612 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "exampleappui.h" +#include "exampleappengine.h" +#include "trace.h" + +/*! + \class ExampleAppUi + \brief Implements the application UI for Dlnasrv example application. +*/ + +/*! + ExampleAppUi constructor. + */ +ExampleAppUi::ExampleAppUi(): + mEngine(0), + mSelectedRenderer(0), + mSelectedFileLabel(0), + mPlaybackStatus(0), + mRenderingDevices(0), + mPauseButton(0), + mStopButton(0), + mRewButton(0), + mFfButton(0), + mSelectFileButton(0), + mSearchDevicesButton(0), + mSelectedFile("") +{ + FUNC_LOG +} + +/*! + ExampleAppUi destructor. +*/ +ExampleAppUi::~ExampleAppUi() +{ + FUNC_LOG + + delete mEngine; +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::construct() +{ + FUNC_LOG + + createEngine(); + createUi(); +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::createUi() +{ + FUNC_LOG + + // create main view + QWidget *view = new QWidget; + setCentralWidget(view); + + // create main view layout + QVBoxLayout *mainLayout = new QVBoxLayout; + view->setLayout(mainLayout); + + // create accesspoint selection + QLayout *layout = createApSelectionUi(); + mainLayout->addLayout(layout); + mainLayout->addSpacing(40); + + // create renderer selection + layout = createRendererSelectionUi(); + mainLayout->addLayout(layout); + mainLayout->addSpacing(40); + + // create file selection + layout = createFileSelectionUi(); + mainLayout->addLayout(layout); + mainLayout->addSpacing(40); + + // create playback ui + layout = createPlaybackUi(); + mainLayout->addLayout(layout); + mainLayout->addSpacing(40); +} + +/*! + description + + /a + /return + */ +QLayout *ExampleAppUi::createApSelectionUi() +{ + FUNC_LOG + + QVBoxLayout *layout = new QVBoxLayout; + QHBoxLayout *topLayout = new QHBoxLayout; + QLabel *titleLabel = new QLabel(tr("Access point:")); + QLabel *statusLabel = new QLabel(tr("Not connected")); + + // connect signals + connect(mEngine, SIGNAL(iapUpdated(const QString &)), statusLabel, SLOT(setText(const QString &))); + + // add widgets to top layout + topLayout->addWidget(titleLabel); + topLayout->addWidget(statusLabel); + + // add sub layouts to main layout + layout->addLayout(topLayout); + + // update iap + QString iapName = mEngine->getIapName(); + if (iapName.length()) + { + statusLabel->setText(iapName); + } + + return layout; +} + +/*! + description + + /a + /return + */ +QLayout *ExampleAppUi::createRendererSelectionUi() +{ + FUNC_LOG + + QVBoxLayout *layout = new QVBoxLayout; + QHBoxLayout *topLayout = new QHBoxLayout; + QVBoxLayout *bottomLayout = new QVBoxLayout; + QLabel *titleLabel = new QLabel(tr("Rendering device:")); + QLabel *statusLabel = new QLabel(tr("Not connected")); + QPushButton *searchButton = new QPushButton(tr("Search for new devices")); + QComboBox *selectionComboBox = new QComboBox; + + // connect signals + connect(searchButton, SIGNAL(clicked()), mEngine, SLOT(searchRenderingDevices())); + connect(selectionComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectRenderingDevice(int))); + connect(mEngine, SIGNAL(iapUpdated(int)), this, SLOT(enableRenderingDeviceSelection(int))); + + // add widgets to top layout + topLayout->addWidget(titleLabel); + topLayout->addWidget(statusLabel); + + // add widgets to bottom layout + bottomLayout->addWidget(searchButton); + bottomLayout->addWidget(selectionComboBox); + + // add sub layouts to main layout + layout->addLayout(topLayout); + layout->addLayout(bottomLayout); + + // store rendering devices + mRenderingDevices = selectionComboBox; + mSelectedRenderer = statusLabel; + mSearchDevicesButton = searchButton; + + // disable search button if iap has not been defined + if (!mEngine->getIap()) + { + disableRenderingDeviceSelection(); + } + + return layout; +} + +/*! + description + + /a + /return + */ +QLayout *ExampleAppUi::createFileSelectionUi() +{ + FUNC_LOG + + QVBoxLayout *layout = new QVBoxLayout; + QHBoxLayout *topLayout = new QHBoxLayout; + QVBoxLayout *bottomLayout = new QVBoxLayout; + QLabel *titleLabel = new QLabel(tr("Selected file:")); + QLabel *statusLabel = new QLabel(tr("None")); + QPushButton *selectButton = new QPushButton(tr("Select media file")); + + // connect signals + connect(selectButton, SIGNAL(clicked()), this, SLOT(selectFile())); + + // add widgets to top layout + topLayout->addWidget(titleLabel); + topLayout->addWidget(statusLabel); + + // add widgets to bottom layout + bottomLayout->addWidget(selectButton); + + // add sub layouts to main layout + layout->addLayout(topLayout); + layout->addLayout(bottomLayout); + + // store status label and select file button + mSelectedFileLabel = statusLabel; + mSelectFileButton = selectButton; + + // disable select file button by default + disableFileSelection(); + + return layout; +} + +/*! + description + + /a + /return + */ +QLayout *ExampleAppUi::createPlaybackUi() +{ + FUNC_LOG + + QVBoxLayout *layout = new QVBoxLayout; + QHBoxLayout *topLayout = new QHBoxLayout; + QHBoxLayout *bottomLayout = new QHBoxLayout; + QLabel *titleLabel = new QLabel(tr("Playback status:")); + QLabel *statusLabel = new QLabel(tr("Stopped")); + QPushButton *rewButton = new QPushButton(tr("Rew")); + QPushButton *playButton = new QPushButton(tr("Play")); + QPushButton *pauseButton = new QPushButton(tr("Pause")); + QPushButton *stopButton = new QPushButton(tr("Stop")); + QPushButton *ffButton = new QPushButton(tr("Ff")); + + // connect signals + connect(rewButton, SIGNAL(clicked()), mEngine, SLOT(rew())); + connect(playButton, SIGNAL(clicked()), mEngine, SLOT(play())); + connect(pauseButton, SIGNAL(clicked()), mEngine, SLOT(pause())); + connect(stopButton, SIGNAL(clicked()), mEngine, SLOT(stop())); + connect(ffButton, SIGNAL(clicked()), mEngine, SLOT(ff())); + + // add widgets to top layout + topLayout->addWidget(titleLabel); + topLayout->addWidget(statusLabel); + + // add widgets to bottom layout + bottomLayout->addWidget(rewButton); + bottomLayout->addWidget(playButton); + bottomLayout->addWidget(pauseButton); + bottomLayout->addWidget(stopButton); + bottomLayout->addWidget(ffButton); + + // add sub layouts to main layout + layout->addLayout(topLayout); + layout->addLayout(bottomLayout); + + // store status label + mPlaybackStatus = statusLabel; + mPlayButton = playButton; + mPauseButton = pauseButton; + mStopButton = stopButton; + mRewButton = rewButton; + mFfButton = ffButton; + + // disable all buttons by default + disablePlayback(); + + return layout; +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::createEngine() +{ + FUNC_LOG + + mEngine = new ExampleAppEngine; + mEngine->construct(); + + // connect signals + connect(mEngine, SIGNAL(stateChanged(int)), this, SLOT(updateState(int))); + connect(mEngine, SIGNAL(renderingDeviceSearchStarted()), this, SLOT(deviceSearchStarted())); + connect(mEngine, SIGNAL(renderingDeviceFound(const QString &, const QString &)), this, SLOT(addRenderingDevice(const QString &, const QString &))); + connect(mEngine, SIGNAL(renderingDeviceDisappeared(const QString &, const QString &)), this, SLOT(removeRenderingDevice(const QString &, const QString &))); + connect(mEngine, SIGNAL(initComplete(int)), this, SLOT(enablePlayback(int))); +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::updateState(int newState) +{ + FUNC_LOG + + switch (newState) + { + case ExampleAppEngine::PlaybackStateBuffering: + { + mPlaybackStatus->setText(tr("Buffering")); + break; + } + case ExampleAppEngine::PlaybackStatePlaying: + { + mPlaybackStatus->setText(tr("Playing")); + break; + } + case ExampleAppEngine::PlaybackStatePaused: + { + mPlaybackStatus->setText(tr("Paused")); + break; + } + case ExampleAppEngine::PlaybackStateStopped: + // fall through + default: + { + mPlaybackStatus->setText(tr("Stopped")); + break; + } + } + + // update playback controls + enablePlayback(); +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::selectFile() +{ + FUNC_LOG + + mSelectedFile = QFileDialog::getOpenFileName(this, + tr("Open file"), + tr("e:\\"), + tr("Media Files (*.mp3 *.jpg *.mp4)")); + if (mSelectedFile.length()) + { + // convert all '/' to '\' since symbian does not understand '/' + // characters in the file path + mSelectedFile.replace("/", "\\"); + + // update text to ui + QFileInfo fileInfo(mSelectedFile); + // use only 20 characters to fit text on screen + // since otherwise qt will panic with bad alloc + mSelectedFileLabel->setText(fileInfo.fileName().left(20)); + + // resolve and init file for rendering + int err = mEngine->initFile(mSelectedFile); + if (err != 0) + { + ERROR_1(err, "Failed to init file %s", mSelectedFile.utf16()); + + mSelectedFile = ""; + + mSelectedFileLabel->setText(tr("Could not init")); + + disablePlayback(); + } + } + else + { + mSelectedFileLabel->setText(tr("Not selected")); + + disablePlayback(); + } +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::deviceSearchStarted() +{ + FUNC_LOG + + if (!mRenderingDevices->count()) + { + mSelectedRenderer->setText(tr("Searching")); + } +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::addRenderingDevice(const QString &name, const QString &uuid) +{ + FUNC_LOG + + mRenderingDevices->addItem(name, QVariant(uuid)); +} + +/*! + description + + /a + /return + */ +void ExampleAppUi::removeRenderingDevice(const QString &/*name*/, const QString &uuid) +{ + FUNC_LOG + + int count(mRenderingDevices->count()); + for (int i = 0; i < count; i++) + { + QVariant userData(mRenderingDevices->itemData(i)); + if (userData.toString() == uuid) + { + mRenderingDevices->removeItem(i); + break; + } + } +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::selectRenderingDevice(int index) +{ + FUNC_LOG + + // use only 16 characters to fit on screen otherwise qt will panic with bad alloc + mSelectedRenderer->setText(mRenderingDevices->itemText(index).left(16)); + + QVariant userData(mRenderingDevices->itemData(index)); + mEngine->prepareRenderingDevice(userData.toString()); + + enablePlayback(); + enableFileSelection(); +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::enablePlayback(int result) +{ + FUNC_LOG + + if (result == 0 && + mSelectedFile.length()) + { + switch (mEngine->getPlaybackState()) + { + case ExampleAppEngine::PlaybackStateBuffering: + { + // disable all controls when buffering + disablePlayback(); + break; + } + case ExampleAppEngine::PlaybackStatePlaying: + { + mRewButton->setEnabled(mEngine->isSeekSupported()); + mPlayButton->setDisabled(true); + mPauseButton->setEnabled(mEngine->isPauseSupported()); + mStopButton->setEnabled(true); + mRewButton->setEnabled(mEngine->isSeekSupported()); + break; + } + case ExampleAppEngine::PlaybackStatePaused: + { + mRewButton->setEnabled(mEngine->isSeekSupported()); + mPlayButton->setEnabled(true); + mPauseButton->setDisabled(true); + mStopButton->setEnabled(true); + mRewButton->setEnabled(mEngine->isSeekSupported()); + break; + } + case ExampleAppEngine::PlaybackStateStopped: + { + mRewButton->setDisabled(true); + mPlayButton->setEnabled(true); + mPauseButton->setDisabled(true); + mStopButton->setDisabled(true); + mRewButton->setDisabled(true); + break; + } + default: + { + // invalid state, disable all buttons + disablePlayback(); + break; + } + } + } +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::disablePlayback() +{ + FUNC_LOG + + mPlayButton->setDisabled(true); + mPauseButton->setDisabled(true); + mStopButton->setDisabled(true); + mRewButton->setDisabled(true); + mFfButton->setDisabled(true); +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::enableFileSelection() +{ + FUNC_LOG + + mSelectFileButton->setEnabled(true); +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::disableFileSelection() +{ + FUNC_LOG + + mSelectFileButton->setDisabled(true); +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::enableRenderingDeviceSelection(int iap) +{ + FUNC_LOG + + if (iap) + { + mSearchDevicesButton->setEnabled(true); + mRenderingDevices->setEnabled(true); + } +} + +/*! + description + + /a + /return +*/ +void ExampleAppUi::disableRenderingDeviceSelection() +{ + FUNC_LOG + + mSearchDevicesButton->setDisabled(true); + mRenderingDevices->setDisabled(true); +} + +// End of file