radioapp/radioapplication/src/testwindow_win32.cpp
branchRCL_3
changeset 19 cce62ebc198e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radioapp/radioapplication/src/testwindow_win32.cpp	Tue Aug 31 15:15:02 2010 +0300
@@ -0,0 +1,353 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+
+// System includes
+#include <QPushButton>
+#include <QGridLayout>
+#include <QVBoxLayout>
+#include <HbMainWindow>
+#include <QTimer>
+#include <QMessageBox>
+#include <QComboBox>
+#include <QLocalSocket>
+#include <QDir>
+#include <QStringListModel>
+#include <QSettings>
+#include <HbInstance>
+#include <QLabel>
+
+// User includes
+#include "testwindow_win32.h"
+#include "radioapplication.h"
+#include "radiologger.h"
+#include "radio_global.h"
+#include "radioenginewrapper_win32_p.h"
+
+const int WINDOW_WIDTH = 360;
+const int WINDOW_HEIGHT = 640;
+const int TOOLBAR_HEIGHT = 120;
+const int WINDOW_EXTRA_WIDTH = 5;
+
+const QString KBtnDisconnectHeadset = "Disconnect Headset";
+const QString KBtnConnectHeadset = "Connect Headset";
+
+const QString KBtnGoOffline = "Go Offline";
+const QString KBtnGoOnline = "Go Online";
+
+struct Song
+{
+    const char* mArtist;
+    const char* mTitle;
+};
+
+const Song KRecognizedSongs[] = {
+    { "Red Hot Chili Peppers", "Under The Bridge" },
+    { "Queens Of The Stone Age", "No One Knows" },
+    { "The Presidents of the United States of America", "Dune Buggy" },
+    { "System of a Down", "Aerials" },
+    { "The White Stripes", "Seven Nation Army" },
+    { "Alice In Chains", "When The Sun Rose Again" },
+    { "Bullet For My Valentine", "Tears Don't Fall" }
+};
+const int KSongsCount = sizeof( KRecognizedSongs ) / sizeof( KRecognizedSongs[0] );
+
+/*!
+ *
+ */
+Win32Window::Win32Window() :
+    QWidget( 0 ),
+    mOrientationButton( new QPushButton( "Change Orientation", this ) ),
+    mVolUpButton( new QPushButton( "Volume Up", this ) ),
+    mVolDownButton( new QPushButton( "Volume Down", this ) ),
+    mAddSongButton( new QPushButton( "Add Song", this ) ),
+    mClearSongButton( new QPushButton( "Clear Song", this ) ),
+    mHeadsetButton( new QPushButton( KBtnDisconnectHeadset, this ) ),
+    mHeadsetConnected( true ),
+    mOfflineButton( new QPushButton( KBtnGoOffline, this ) ),
+    mThemeBox( new QComboBox( this ) ),
+    mToolbarLayout( 0 ),
+    mVolume( 5 ),
+    mRadioWindow( 0 ),
+    mOrientation( Qt::Vertical ),
+    mSongIndex( 0 )
+{
+    mThemeBox->setEditable( false );
+    initThemes();    
+
+    Radio::connect( mOrientationButton, SIGNAL(clicked()), this, SLOT(changeOrientation()) );
+    Radio::connect( mVolUpButton, SIGNAL(clicked()), this, SLOT(volumeUp()) );
+    Radio::connect( mVolDownButton, SIGNAL(clicked()), this, SLOT(volumeDown()) );
+    Radio::connect( mHeadsetButton, SIGNAL(clicked()), this, SLOT(toggleHeadsetStatus()) );
+    Radio::connect( mAddSongButton, SIGNAL(clicked()), this, SLOT(addSong()) );
+    Radio::connect( mClearSongButton, SIGNAL(clicked()), this, SLOT(clearSong()) );
+    Radio::connect( mOfflineButton, SIGNAL(clicked()), this, SLOT(toggleOffline()) );
+    Radio::connect( mThemeBox, SIGNAL(activated(QString)), this, SLOT(changeTheme(QString)) );
+
+    QTimer::singleShot( 0, this, SLOT(updateWindowSize()) );
+}
+
+/*!
+ *
+ */
+Win32Window::~Win32Window()
+{
+}
+
+/*!
+ *
+ */
+void Win32Window::addHbWindow( HbMainWindow* radioWindow )
+{
+    mRadioWindow = radioWindow;
+    mOrientation = mRadioWindow->orientation();
+    updateWindowSize();
+
+    QVBoxLayout* layout = new QVBoxLayout( this );
+    layout->setMargin( 5 );
+    layout->setSpacing( 5 );
+
+    mToolbarLayout = new QGridLayout( this );
+    mToolbarLayout->setHorizontalSpacing( 5 );
+    mToolbarLayout->setVerticalSpacing( 5 );
+
+    mToolbarLayout->addWidget( mOrientationButton, 0, 0 );
+    mToolbarLayout->addWidget( mVolUpButton, 0, 1 );
+    mToolbarLayout->addWidget( mVolDownButton, 1, 1 );
+    mToolbarLayout->addWidget( mHeadsetButton, 1, 0 );
+    mToolbarLayout->addWidget( mAddSongButton, 2, 0 );
+    mToolbarLayout->addWidget( mClearSongButton, 2, 1 );
+    mToolbarLayout->addWidget( mOfflineButton, 3, 0 );
+
+    QGridLayout* themeLayout = new QGridLayout( this );
+    themeLayout->addWidget( new QLabel( "Theme:", this ), 0, 0 );
+    themeLayout->addWidget( mThemeBox, 0, 1 );
+    themeLayout->setColumnStretch( 1, 2 );
+
+    mToolbarLayout->addLayout( themeLayout, 3, 1 );
+    mToolbarLayout->setColumnStretch( 0, 1 );
+    mToolbarLayout->setColumnStretch( 1, 1 );
+
+    layout->addItem( mToolbarLayout );
+    layout->addWidget( radioWindow );
+
+    setLayout( layout );
+}
+
+/*!
+ *
+ */
+void Win32Window::init()
+{
+    RadioEngineWrapperPrivate* wrapper = RadioEngineWrapperPrivate::instance();
+    if ( wrapper ) {
+        QString error = wrapper->dataParsingError();
+        if ( !error.isEmpty() ) {
+            QMessageBox msg( QMessageBox::Warning, "Unable to parse radio settings", error, QMessageBox::Ok );
+            msg.exec();
+        }
+
+        if ( wrapper->isOffline() ) {
+            mOfflineButton->setText( KBtnGoOnline );
+        }
+    }
+    updateWindowSize();
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::changeOrientation()
+{
+    if ( mOrientation == Qt::Horizontal ) {
+        mOrientation = Qt::Vertical;
+    } else {
+        mOrientation = Qt::Horizontal;
+    }
+
+    mRadioWindow->setOrientation( mOrientation );
+    updateWindowSize();
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::volumeUp()
+{
+    if ( ++mVolume > MAXIMUM_VOLUME_LEVEL ) {
+        mVolume = MAXIMUM_VOLUME_LEVEL;
+    }
+    RadioEngineWrapperPrivate::instance()->setVolume( mVolume );
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::volumeDown()
+{
+    if ( --mVolume < 0 ) {
+        mVolume = 0;
+    }
+    RadioEngineWrapperPrivate::instance()->setVolume( mVolume );
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::toggleHeadsetStatus()
+{
+    mHeadsetConnected = !mHeadsetConnected;
+    if ( mHeadsetConnected ) {
+        mHeadsetButton->setText( KBtnDisconnectHeadset );
+    } else {
+        mHeadsetButton->setText( KBtnConnectHeadset );
+    }
+    RadioEngineWrapperPrivate::instance()->setHeadsetStatus( mHeadsetConnected );
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::updateWindowSize()
+{
+    if ( mOrientation == Qt::Horizontal ) {
+        resize( WINDOW_HEIGHT + WINDOW_EXTRA_WIDTH, WINDOW_WIDTH + TOOLBAR_HEIGHT );
+    } else {
+        resize( WINDOW_WIDTH + WINDOW_EXTRA_WIDTH, WINDOW_HEIGHT + TOOLBAR_HEIGHT );
+    }
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::addSong()
+{
+    Song song = KRecognizedSongs[mSongIndex++];
+    mSongIndex %= KSongsCount;
+
+    RadioEngineWrapperPrivate::instance()->addSong( song.mArtist, song.mTitle );
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::clearSong()
+{
+    RadioEngineWrapperPrivate::instance()->clearSong();
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::toggleOffline()
+{
+    bool offline = !RadioEngineWrapperPrivate::instance()->isOffline();
+    RadioEngineWrapperPrivate::instance()->setOffline( offline );
+    if ( offline ) {
+        mOfflineButton->setText( KBtnGoOnline );
+    } else {
+        mOfflineButton->setText( KBtnGoOffline );
+    }
+}
+
+/*!
+ * Private slot
+ */
+void Win32Window::changeTheme( const QString& theme )
+{
+    LOG_FORMAT( "Changing to theme %s", GETSTRING( theme ) );
+    QLocalSocket socket;
+    socket.connectToServer( "hbthemeserver" );
+    if ( socket.waitForConnected( 3000 ) ) {
+        QByteArray outputByteArray;
+        QDataStream outputDataStream( &outputByteArray, QIODevice::WriteOnly );
+        outputDataStream << 4; // EThemeSelection from HbThemeServerRequest in hbthemecommon_p.h
+        outputDataStream << theme;
+        socket.write( outputByteArray );
+        socket.flush();
+    }
+}
+
+/*!
+ *
+ */
+void Win32Window::initThemes()
+{
+    QStringList themeList;
+    foreach ( const QString& themeRootPath, themeRootPaths() ) {
+        QDir dir( themeRootPath ) ;
+        QStringList list = dir.entryList( QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name );
+
+        if ( list.contains( "themes", Qt::CaseSensitive ) ) {
+            QDir root = themeRootPath;
+            dir.setPath( root.path() + "/themes/icons/" );
+            QStringList iconthemeslist = dir.entryList( QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name );
+            foreach ( QString themefolder, iconthemeslist ) {
+                QDir iconThemePath( root.path() + "/themes/icons/" + themefolder );
+                if ( iconThemePath.exists( "index.theme" ) ) {
+                    QSettings iniSetting( iconThemePath.path() + "/index.theme", QSettings::IniFormat );
+                    iniSetting.beginGroup( "Icon Theme" );
+                    QString hidden = iniSetting.value( "Hidden" ).toString();
+                    QString name = iniSetting.value( "Name" ).toString();
+                    iniSetting.endGroup();
+                    if ( (hidden == "true") || ( hidden == "" ) || ( name != themefolder ) ) {
+                        iconthemeslist.removeOne( themefolder );
+                    }
+                }
+                else {
+                     iconthemeslist.removeOne( themefolder );
+                }
+
+            }
+
+            themeList.append( iconthemeslist );
+        }
+    }
+
+    if ( themeList.count() == 0 ) {
+        themeList.insert( 0, "hbdefault" ); //adding one default entry
+        mThemeBox->setEnabled( false );
+    }
+
+    mThemeBox->setModel( new QStringListModel( themeList, mThemeBox ) );
+
+    for ( int i = 0; i < themeList.count(); ++i ) {
+        QString theme = themeList.at( i );
+        if ( theme == HbInstance::instance()->theme()->name() ) {
+            mThemeBox->setCurrentIndex( i );
+        }
+    }
+}
+
+/*!
+ *
+ */
+QStringList Win32Window::themeRootPaths()
+{
+    QStringList rootDirs;
+    QString envDir = qgetenv( "HB_THEMES_DIR" );
+    if ( !envDir.isEmpty() ) {
+        rootDirs << envDir;
+    }
+
+    QString resourcesDir = HB_RESOURCES_DIR;
+    if ( resourcesDir.isEmpty() ) {
+        resourcesDir = "/hb_dev/src/hbcore/resources";
+    }
+    rootDirs << resourcesDir;
+
+    return rootDirs;
+}