ui/viewmanagement/viewmanager/src/glxmenumanager.cpp
branchRCL_3
changeset 59 8e5f6eea9c9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/viewmanagement/viewmanager/src/glxmenumanager.cpp	Tue Aug 31 15:14:51 2010 +0300
@@ -0,0 +1,500 @@
+/*
+* 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: 
+*
+*/
+
+//include
+#include <QDebug>
+#include <hbaction.h>
+#include <hbmenu.h>
+#include <hbmainwindow.h>
+#include <featdiscovery.h>
+#include <publicruntimeids.hrh>
+//user include
+#include "glxviewids.h"
+#include "glxmenumanager.h"
+#include "glxcommandhandlers.hrh"
+#include "glxmodelparm.h"
+#include "glxlocalisationstrings.h"
+#include "glxsettinginterface.h"
+
+
+GlxMenuManager::GlxMenuManager(HbMainWindow* mainWindow)
+    : mModel( 0),
+      mMainWindow( mainWindow ),
+      mContextMenu( 0 )
+{
+    mSettings = GlxSettingInterface::instance();
+}
+
+GlxMenuManager::~GlxMenuManager()
+{
+}
+
+void GlxMenuManager::createMarkingModeMenu(HbMenu* menu)
+{
+    qDebug()<< "GlxMenuManager::CreateMarkingModeMenu" ;  
+    HbAction *action = NULL;
+    
+    action = menu->addAction(GLX_OPTION_MARK_ALL);
+    action->setData(EGlxCmdMarkAll);
+    action->setObjectName( "Menu MarkAll" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    action = menu->addAction(GLX_OPTION_UN_MARK_ALL);
+    action->setDisabled(true);  //Dim UnMarkAll when no images are marked
+    action->setData(EGlxCmdUnMarkAll);
+    action->setObjectName( "Menu UnMarkAll" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));    
+}
+
+void GlxMenuManager::disableAction(HbMenu* menu, bool disable)
+{
+    QList<QAction*> actionList = menu->actions();
+    for ( int i = 0 ; i < actionList.count(); i++) {
+        if(actionList.at(i)->data()==EGlxCmdUnMarkAll) {
+            actionList.at(i)->setDisabled(disable);
+            break;
+        }
+     }
+}
+
+void GlxMenuManager::addMenu(qint32 viewId, HbMenu* menu)
+{
+    int curState = viewSubState();
+    if( curState == FETCHER_ITEM_S || curState == FETCHER_S || curState == FETCHER_ALBUM_S ||  curState == IMAGEVIEWER_S)
+        return;
+    
+    switch(viewId) {
+    case GLX_GRIDVIEW_ID:
+        CreateGridMenu( menu );
+        connect( menu, SIGNAL( aboutToShow() ), this, SLOT( updateGridMenu() ) );
+        break;                            
+
+    case GLX_LISTVIEW_ID: 
+        CreateListMenu ( menu );
+        break;
+        
+    case GLX_FULLSCREENVIEW_ID:
+        CreateFullscreenMenu( menu );
+        connect( menu, SIGNAL( aboutToShow() ), this, SLOT( updateFullscreenMenu() ) );
+        break;
+        
+    case GLX_SLIDESHOWVIEW_ID :
+        createSlideShowMenu( menu );
+        break ;
+                
+    default:
+        break;
+    }  
+}
+
+void GlxMenuManager::removeMenu(qint32 viewId, HbMenu* menu)
+{
+    switch(viewId) {
+    case GLX_GRIDVIEW_ID:
+        disconnect( menu, SIGNAL( aboutToShow() ), this, SLOT( updateGridMenu() ) );
+        break;                            
+        
+    case GLX_FULLSCREENVIEW_ID:
+        disconnect( menu, SIGNAL( aboutToShow() ), this, SLOT( updateFullscreenMenu() ) );
+        break;
+                
+    default:
+        break;
+    }  
+}
+
+void GlxMenuManager::CreateGridMenu(HbMenu* menu)
+{
+    qDebug()<<"GlxMenuManager::CreateGridMenu";
+    HbAction *action = NULL;
+    menu->setObjectName( "GridMenu" );
+    
+    action = menu->addAction(GLX_OPTION_SHARE);
+    action->setData(EGlxCmdSend);
+    action->setObjectName( "GridMenu Send" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+   
+    mSubMenu = menu->addMenu(GLX_OPTION_SLIDESHOW);
+    mSubMenu->setObjectName( "GridMenu SlideShow" );
+	
+    action = mSubMenu->addAction(GLX_OPTION_SS_PLAY); 
+    action->setData(EGlxCmdFirstSlideshow);
+    action->setObjectName( "GridMenu Play" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    action = mSubMenu->addAction(GLX_OPTION_SS_SETTINGS);
+    action->setData(EGlxCmdSlideshowSettings);
+    action->setObjectName( "GridMenu Setting" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected())); 
+    
+    action = menu->addAction(GLX_OPTION_ADD_TO_ALBUM);
+    action->setData(EGlxCmdAddToAlbum);
+    action->setObjectName( "GridMenu AddToAlbum" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    action = menu->addAction(GLX_OPTION_REMOVE_FROM_ALBUM);
+    action->setData(EGlxCmdRemoveFrom);
+    action->setObjectName( "GridMenu RemoveAlbum" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+
+    action = menu->addAction(GLX_OPTION_DELETE);
+    action->setData(EGlxCmdDelete);
+    action->setObjectName( "GridMenu Delete" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    m3DEffectSubMenu = menu->addMenu(GLX_GRID_OPT_EFFECT);
+    m3DEffectSubMenu->setObjectName( "GridMenu 3DEffect" );
+    
+    action = m3DEffectSubMenu->addAction(GLX_GRID_OPT_ON); 
+    action->setCheckable(ETrue);
+    action->setData(EGlxCmd3DEffectOn);
+    action->setObjectName( "GridMenu 3DOn" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    action = m3DEffectSubMenu->addAction(GLX_GRID_OPT_OFF);
+    action->setCheckable(ETrue);
+    action->setData(EGlxCmd3DEffectOff);
+    action->setObjectName( "GridMenu 3DOff" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected())); 
+
+}
+
+void GlxMenuManager::CreateListMenu(HbMenu* menu)
+{
+    qDebug()<<"GlxMenuManager::CreateListMenu";
+    HbAction *action = NULL;
+    menu->setObjectName( "Listmenu" );
+    
+    action = menu->addAction(GLX_OPTION_NEW_ALBUM);
+    action->setData(EGlxCmdAddMedia);
+    action->setObjectName( "ListMenu NewAlbum" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+}
+
+void GlxMenuManager::CreateFullscreenMenu(HbMenu* menu)
+{
+    qDebug()<<"GlxMenuManager::CreateFullscreenMenu";
+    HbAction *action = NULL;
+    menu->setObjectName( "FSMenu" );
+    
+    action = menu->addAction(GLX_OPTION_SHARE);
+    action->setData(EGlxCmdSend);
+    action->setObjectName( "FSMenu Share" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    mSubMenu = menu->addMenu(GLX_OPTION_SLIDESHOW);
+    mSubMenu->setObjectName( "FSMenu SlideShow" );
+    
+    action = mSubMenu->addAction(GLX_OPTION_SS_PLAY);
+    action->setData(EGlxCmdSelectSlideshow);
+    action->setObjectName( "FSMenu Play" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+    
+    action = mSubMenu->addAction(GLX_OPTION_SS_SETTINGS);
+    action->setData(EGlxCmdSlideshowSettings);
+    action->setObjectName( "FSMenu Setting" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+#ifndef __WINSCW__
+	CFeatureDiscovery* featManager = CFeatureDiscovery::NewL();
+    if(featManager->IsFeatureSupportedL(KFeatureIdFfImageEditor))
+        {
+        mUseImgSubMenu = menu->addMenu(GLX_MENU_USE_IMAGE);
+        action = mUseImgSubMenu->addAction(GLX_MENU_SET_WALLPAPER); 
+        action->setData(EGlxCmdSetWallpaper);
+        connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected())); 
+        
+            
+        mRotateSubMenu = menu->addMenu(GLX_MENU_ROTATE);
+		action = mRotateSubMenu->addAction(GLX_MENU_90_CW); 
+		action->setData(EGlxCmdRotateImgCW);
+		connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected())); 
+		action = mRotateSubMenu->addAction(GLX_MENU_90_CCW);
+		action->setData(EGlxCmdRotateImgCCW);
+		connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+		
+		action = menu->addAction(GLX_MENU_CROP);
+		action->setData(EGlxCmdRotateImgCrop);
+		connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));   
+        }
+    delete featManager;
+#endif //__WINSCW__	
+    
+    action = menu->addAction(GLX_OPTION_ADD_TO_ALBUM);
+    action->setData(EGlxCmdAddToAlbum);
+    action->setObjectName( "FSMenu AddToAlbum" );
+    connect(action, SIGNAL(triggered()), this, SLOT(menuItemSelected()));
+	action = menu->addAction( GLX_OPTION_REMOVE_FROM_ALBUM );
+	action->setData( EGlxCmdRemoveFrom );
+	action->setObjectName( "FSMenu RemoveAlbum" );
+	connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+}
+
+void GlxMenuManager::createSlideShowMenu( HbMenu* menu )
+{
+    HbAction *action = NULL;
+    menu->setObjectName( "SSMenu" );
+    
+    action = menu->addAction( GLX_OPTION_SS_SETTINGS );
+    action->setData( EGlxCmdSlideshowSettings );
+    action->setObjectName( "SSMenu Setting" );
+    connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) ); 
+}
+
+void GlxMenuManager::setAllActionVisibility( QList<QAction*> actionList, bool visible )
+{
+    qDebug() << "GlxMenuManager::setAllActionVisibility count " << actionList.count() << " visible" << visible;
+    for ( int i = 0 ; i < actionList.count(); i++) {
+        actionList.at(i)->setVisible(visible);
+    }
+}
+
+int GlxMenuManager::viewSubState()
+{
+    if(mModel){
+        QVariant variant = mModel->data( mModel->index(0,0), GlxSubStateRole );
+        if ( variant.isValid() &&  variant.canConvert<int> () ) {
+            return variant.value<int>() ;
+        }
+    }
+    return -1;
+}
+
+void GlxMenuManager::updateGridMenu()
+{
+    qDebug() << "GlxMenuManager::updateGridMenu";
+
+    HbMenu *menu = qobject_cast<HbMenu*>( sender() );
+    static bool isAllActionDisable = FALSE;
+    int rowCount = mModel->rowCount();    
+    QList<QAction*> actionList = menu->actions();
+    
+    if ( rowCount == 0 && isAllActionDisable == FALSE) {
+        qDebug() << "GlxMenuManager::updateGridMenu set all visible FALSE";
+        setAllActionVisibility( actionList, FALSE );
+        isAllActionDisable = TRUE;
+    }    
+    
+    if ( rowCount && isAllActionDisable == TRUE ) {
+        setAllActionVisibility( actionList, TRUE );
+        isAllActionDisable = FALSE;
+        qDebug() << "GlxMenuManager::updateGridMenu set all visible TRUE" ;
+    }
+    
+    if ( rowCount ) {
+        int state =  viewSubState();
+        
+        switch ( state ) {
+        case ALBUM_ITEM_S :
+            actionList.at(GlxGridViewRemoveFromAlbum)->setVisible( TRUE );
+            break ;
+            
+        default :    
+            actionList.at(GlxGridViewRemoveFromAlbum)->setVisible( FALSE );
+            break ;
+        }       
+        
+        if(mMainWindow->orientation() == Qt::Horizontal)
+            {
+            actionList.at(GlxGridView3DEffect)->setVisible( TRUE );
+            QList<QAction*> subActionList = m3DEffectSubMenu->actions();
+            if(mSettings->mediaWall3DEffect())
+                {
+                subActionList.at(0)->setChecked(ETrue);
+                subActionList.at(1)->setChecked(EFalse);
+                }
+            else
+                {
+                subActionList.at(0)->setChecked(EFalse);
+                subActionList.at(1)->setChecked(ETrue);
+                }
+            }
+        else
+            {
+            actionList.at(GlxGridView3DEffect)->setVisible( FALSE );
+            }
+    }    
+}
+
+void GlxMenuManager::updateFullscreenMenu()
+{
+    HbMenu *menu = qobject_cast<HbMenu*>( sender() );
+    QList<QAction*> actionList = menu->actions();
+    static bool isAllActionDisable = FALSE;
+    int state = viewSubState() ;
+    
+    if ( state == IMAGEVIEWER_S &&  isAllActionDisable == FALSE ) {        
+        setAllActionVisibility( actionList, FALSE );
+        isAllActionDisable = TRUE;
+    }
+  
+    if ( state != IMAGEVIEWER_S &&  isAllActionDisable == TRUE ) {
+        setAllActionVisibility( actionList, TRUE );
+        isAllActionDisable = FALSE;
+    }    
+    
+
+
+#ifndef __WINSCW__
+    if ( state != IMAGEVIEWER_S)
+        {
+        int frameCount = (mModel->data(mModel->index((
+                mModel->data(mModel->index(0, 0),GlxFocusIndexRole)).value<int> (), 0),
+                        GlxFrameCount)).value<int>();
+        bool setVisible = true;
+        if (frameCount > 1) 
+            {
+            //Check for animated image, if found hide editor specific menu
+            setVisible = false;
+            }
+		//If Use Image contains any sub menu item other then related to Editor
+		//then individual sub menu item needs to be hidden rather then
+		//complete "Use Image"menu
+        actionList[GlxFullScreenViewUseImage]->setVisible(setVisible);
+        actionList[GlxFullScreenViewMenuRotate]->setVisible(setVisible);
+        actionList[GlxFullScreenViewCrop]->setVisible(setVisible);
+        }
+#endif    
+	if( state != ALBUM_FULLSCREEN_S ){
+		actionList[GlxFullScreenViewRemoveoAlbum]->setVisible(false);
+	}else{
+		actionList[GlxFullScreenViewRemoveoAlbum]->setVisible(true);
+	}
+}
+
+void GlxMenuManager::menuItemSelected()
+{
+    HbAction *action = qobject_cast<HbAction*>(sender());
+    
+    qint32 commandId = action->data().toInt();
+    emit commandTriggered(commandId);
+}
+
+void GlxMenuManager::ShowItemSpecificMenu(qint32 viewId,QPointF pos)
+{
+    qDebug("GlxMenuManager::showContextMenu " );
+    mContextMenu = new HbMenu();
+    mContextMenu->setObjectName( "ContextMenu" );
+    HbAction *action = NULL;
+    switch ( viewId ) {
+	    case GLX_GRIDVIEW_ID :
+			if ( viewSubState() == FETCHER_ITEM_S || viewSubState() == FETCHER_ALBUM_ITEM_S) {        
+                action = mContextMenu->addAction( GLX_MENU_OPEN );
+                action->setData( EGlxCmdFetcherFullScreenOpen );
+                action->setObjectName( "CM Open1" );
+                connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+				break;
+	        }
+			
+	        action = mContextMenu->addAction( GLX_MENU_OPEN );
+            action->setData( EGlxCmdFullScreenOpen );
+            action->setObjectName( "CM Open" );
+            connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );	        
+	        
+            action = mContextMenu->addAction( GLX_MENU_SHARE );
+	        action->setData( EGlxCmdContextSend );
+	        action->setObjectName( "CM Send" );
+	        connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+	        
+	        action = mContextMenu->addAction( GLX_MENU_SLIDESHOW );
+	        action->setData( EGlxCmdSelectSlideshow );
+	        action->setObjectName( "CM SlideShow" );
+	        connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+
+	        action = mContextMenu->addAction( GLX_MENU_ADD_TO_ALBUM );
+		    action->setData( EGlxCmdContextAddToAlbum );
+		    action->setObjectName( "CM AddToAlbum" );
+		    connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+		    
+	        if ( viewSubState() == ALBUM_ITEM_S ) {        
+                action = mContextMenu->addAction( GLX_OPTION_REMOVE_FROM_ALBUM );
+                action->setData( EGlxCmdContextRemoveFrom );
+                action->setObjectName( "CM RemoveAlbum" );
+                connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+	        }
+	        
+		    action = mContextMenu->addAction( GLX_MENU_DELETE );
+		    action->setData( EGlxCmdContextDelete );
+		    action->setObjectName( "CM Delete" );
+		    connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+			break;
+	    	
+	    case GLX_LISTVIEW_ID : {
+            if ( viewSubState() == FETCHER_ALBUM_S ) {        
+                action = mContextMenu->addAction( GLX_MENU_OPEN );
+                action->setData( EGlxCmdFetcherAlbumGridOpen );
+                action->setObjectName( "CM Open1" );
+                connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+                break;
+            }
+	    
+	        int count = 0;
+            QVariant variant = mModel->data( mModel->index(0,0), GlxListItemCount );    
+	        if ( variant.isValid() &&  variant.canConvert<int> () ) {
+	            count = variant.value<int>();  
+	        }
+	        
+	        action = mContextMenu->addAction( GLX_MENU_OPEN );
+            action->setData( EGlxCmdAlbumGridOpen );
+            action->setObjectName( "CM Album Open" );
+            connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+
+	        if ( count ) {
+                action = mContextMenu->addAction( GLX_MENU_SLIDESHOW );
+                action->setData( EGlxCmdAlbumSlideShow );
+                action->setObjectName( "CM Album SlideShow" );
+                connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+	        }
+	        
+	        variant = mModel->data( mModel->index(0,0), GlxSystemItemRole );    
+            if ( variant.isValid() &&  variant.canConvert<bool> () && ( variant.value<bool>() == false ) ) {           
+                action = mContextMenu->addAction( GLX_MENU_RENAME );
+                action->setData( EGlxCmdContextRename );
+                action->setObjectName( "CM Rename" );
+                connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+                            
+                action = mContextMenu->addAction( GLX_MENU_DELETE );
+                action->setData( EGlxCmdContextAlbumDelete );
+                action->setObjectName( "CM Album Delete" );
+                connect( action, SIGNAL( triggered() ), this, SLOT( menuItemSelected() ) );
+            }
+	    }
+			break;
+			
+		default:
+		    break;	
+		}
+
+    if ( mContextMenu->isEmpty() ) {
+        delete mContextMenu ;
+        mContextMenu = NULL ;
+    }
+    else {
+        connect( mMainWindow, SIGNAL( aboutToChangeOrientation () ), mContextMenu, SLOT( close() ) );
+        connect( mContextMenu, SIGNAL( aboutToClose () ), this, SLOT( closeContextMenu() ) );
+        mContextMenu->setPreferredPos( pos );
+        mContextMenu->show(); 
+    }    
+}
+
+void GlxMenuManager::closeContextMenu()
+{
+    disconnect( mMainWindow, SIGNAL( aboutToChangeOrientation () ), mContextMenu, SLOT( close() ) );
+    disconnect( mContextMenu, SIGNAL( aboutToClose () ), this, SLOT( closeContextMenu() ) ); 
+    mContextMenu->deleteLater();
+    mContextMenu = NULL;
+}
+