/* * GPAC - Multimedia Framework C SDK * * Copyright (c) ENST 2006-200X * Authors: Jean Le Feuvre * All rights reserved * * This file is part of GPAC / Symbian GUI player * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ // INCLUDE FILES #include #include #include #include #include #include #include #include #include #include #include "osmo4_AppUi.h" #include "osmo4_AppView.h" #include "playlist.h" #include #include // ============================ MEMBER FUNCTIONS =============================== // ----------------------------------------------------------------------------- // Cosmo4AppUi::ConstructL() // Symbian 2nd phase constructor can leave. // ----------------------------------------------------------------------------- // void COsmo4AppUi::ConstructL() { // Initialise app UI with standard value. BaseConstructL(CAknAppUi::EAknEnableSkin); /*Create display*/ iAppView = COsmo4AppView::NewL( ClientRect() ); AddToStackL(iAppView); /*create playlist*/ iPlaylist = CPlaylist::NewL( ClientRect(), iAppView->GetUser() ); iPlaylist->MakeVisible(EFalse); iAppView->MakeVisible(ETrue); view_mode = 0; m_title = NULL; //StatusPane ()->SwitchLayoutL ( R_AVKON_STATUS_PANE_LAYOUT_SMALL ); nb_keys = 0; CaptureKeys(1); CCommandLineArguments *args = CCommandLineArguments::NewL(); if (args->Count() > 1) { TPtrC url = args->Arg(1); #if defined(_UNICODE) char szURL[1024]; u16 szURLUTF16[1024]; size_t len; len = url.Size(); memcpy(szURLUTF16, url.Ptr(), sizeof(u8)*len); szURLUTF16[len/2] = 0; const u16 *sptr = szURLUTF16; len = gf_utf8_wcstombs(szURL, 512, &sptr); if (len != (size_t) -1) { szURL[len] = 0; iAppView->Connect((const char *)szURL); } #else iAppView->Connect((const char *)url.Ptr()); #endif } delete args; } // ----------------------------------------------------------------------------- // COsmo4AppUi::COsmo4AppUi() // C++ default constructor can NOT contain any code, that might leave. // ----------------------------------------------------------------------------- // COsmo4AppUi::COsmo4AppUi() { // No implementation required } // ----------------------------------------------------------------------------- // COsmo4AppUi::~COsmo4AppUi() // Destructor. // ----------------------------------------------------------------------------- // COsmo4AppUi::~COsmo4AppUi() { CaptureKeys(0); switch (view_mode) { case 0: if (iAppView) RemoveFromStack(iAppView); break; case 1: if (iPlaylist) RemoveFromStack(iPlaylist); break; } if (iAppView) delete iAppView; if (iPlaylist) delete iPlaylist; if (m_title) free(m_title); m_title = NULL; } void COsmo4AppUi::CaptureKey(TInt32 code, TInt32 scancode) { RWindowGroup iWG = CCoeEnv::Static()->RootWin(); if (nb_keys>=MAX_KEY_CAP) return; keys[nb_keys].key_cap = iWG.CaptureKey(code, 0, 0); keys[nb_keys].key_cap_ud = iWG.CaptureKeyUpAndDowns(scancode, 0, 0); nb_keys++; } /* possible meaning for key codes: EStdKeyYes -Call EStdKeyNo -End EStdKeyApplication0 -Apps key EStdKeyDevice0 -Left softkey EStdKeyDevice1 -Right softkey EStdKeyDevice2 -Power EStdKeyDevice3 -Button press EStdKeyDevice4 -Flip - Open EStdKeyDevice5 -Flip - Close EStdKeyDevice6 -Side key EStdKeyDeviceD -Jog Dial forward EStdKeyDeviceE -Jog Dial back */ void COsmo4AppUi::CaptureKeys(int do_capture) { if (do_capture) { CaptureKey(EKeyIncVolume, EStdKeyIncVolume); CaptureKey(EKeyDecVolume, EStdKeyDecVolume); } else { RWindowGroup iWG = CCoeEnv::Static()->RootWin(); for (int i=0; iShutdown(); Exit(); break; /*PLAYLIST commands*/ case EOsmo4PlayListAdd: iPlaylist->PlaylistAct(Osmo4PLAdd); break; case EOsmo4PlayListRem: iPlaylist->PlaylistAct(Osmo4PLRem); break; case EOsmo4PlayListMoveUp: iPlaylist->PlaylistAct(Osmo4PLMoveUp); break; case EOsmo4PlayListMoveDown: iPlaylist->PlaylistAct(Osmo4PLMoveDown); break; case EOsmo4PlayListClear: iPlaylist->PlaylistAct(Osmo4PLClear); break; case EOsmo4PlayListMode: iPlaylist->PlaylistAct(Osmo4PLToggleMode); break; case EOsmo4PlayListAllFiles: iPlaylist->PlaylistAct(Osmo4PLToggleAllFiles); break; /*FILE menu command*/ case EOsmo4PlayListView: TogglePlaylist(); break; case EOsmo4OpenURL: break; case EOsmo4Reload: gf_term_navigate_to(iAppView->m_term, NULL); break; case EOsmo4Fullscreen: break; case EOsmo4ViewMaxSize: { CEikStatusPane* statusPane = StatusPane(); if (statusPane->IsVisible()) statusPane->MakeVisible(EFalse); else statusPane->MakeVisible(ETrue); } break; case EOsmo4AROriginal: gf_term_set_option(iAppView->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_KEEP); break; case EOsmo4ARFillScreen: gf_term_set_option(iAppView->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN); break; case EOsmo4AR4_3: gf_term_set_option(iAppView->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_4_3); break; case EOsmo4AR16_9: gf_term_set_option(iAppView->m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_16_9); break; case EOsmo4NavReset: gf_term_set_option(iAppView->m_term, GF_OPT_NAVIGATION_TYPE, 0); break; case EOsmo4NavNone: gf_term_set_option(iAppView->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_NONE); break; case EOsmo4NavSlide: e = gf_term_set_option(iAppView->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_SLIDE); if (e) { GF_LOG(GF_LOG_ERROR, GF_LOG_CORE, ("Cannot set navigation: %s", gf_error_to_string(e) )); } break; case EOsmo4NavWalk: gf_term_set_option(iAppView->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_WALK); break; case EOsmo4NavFly: gf_term_set_option(iAppView->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_FLY); break; case EOsmo4NavExamine: gf_term_set_option(iAppView->m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_EXAMINE); break; case EOsmo4NavHeadlight: gf_term_set_option(iAppView->m_term, GF_OPT_HEADLIGHT, !gf_term_get_option(iAppView->m_term, GF_OPT_HEADLIGHT) ); break; case EOsmo4CollideNone: gf_term_set_option(iAppView->m_term, GF_OPT_COLLISION, GF_COLLISION_NONE); break; case EOsmo4CollideSimple: gf_term_set_option(iAppView->m_term, GF_OPT_COLLISION, GF_COLLISION_NORMAL); break; case EOsmo4CollideDisp: gf_term_set_option(iAppView->m_term, GF_OPT_COLLISION, GF_COLLISION_DISPLACEMENT); break; case EOsmo4NavGravity: gf_term_set_option(iAppView->m_term, GF_OPT_GRAVITY, !gf_term_get_option(iAppView->m_term, GF_OPT_GRAVITY)); break; case EOsmo4ViewRTI: iAppView->show_rti = !iAppView->show_rti; break; case EOsmo4OptEnableLogs: { const char *opt = gf_cfg_get_key(iAppView->m_user.config, "General", "LogLevel"); if (opt && !stricmp(opt, "debug")) { gf_cfg_set_key(iAppView->m_user.config, "General", "LogLevel", "error"); } else { gf_cfg_set_key(iAppView->m_user.config, "General", "LogLevel", "debug"); } iAppView->SetupLogs(); } break; case EOsmo4OptSwitchRender: { const char *opt = gf_cfg_get_key(iAppView->m_user.config, "Rendering", "RendererName"); if (opt && strstr(opt, "3D")) { gf_cfg_set_key(iAppView->m_user.config, "Rendering", "RendererName", "GPAC 2D Renderer"); } else { gf_cfg_set_key(iAppView->m_user.config, "Rendering", "RendererName", "GPAC 3D Renderer"); } iAppView->ReloadTerminal(); } break; default: if ((aCommand>=EOsmo4OpenRecentFirst) && (aCommand<=EOsmo4OpenRecentLast)) { const char *sOpt = gf_cfg_get_key_name(iAppView->m_user.config, "RecentFiles", aCommand - EOsmo4OpenRecentFirst); if (sOpt) iAppView->Connect(sOpt); } else { iAppView->MessageBox("Unandled command - panic", "Osmo4"); Panic( EOsmo4Ui ); } break; } } // ----------------------------------------------------------------------------- // Called by the framework when the application status pane // size is changed. Passes the new client rectangle to the // AppView // ----------------------------------------------------------------------------- // void COsmo4AppUi::HandleStatusPaneSizeChange() { iAppView->SetRect( ClientRect() ); iPlaylist->SetRect( ClientRect() ); } void COsmo4AppUi::TogglePlaylist() { CEikButtonGroupContainer* cba= CEikButtonGroupContainer::Current(); switch (view_mode) { case 0: RemoveFromStack(iAppView); iAppView->ShowHide(0); AddToStackL(iPlaylist); if (cba) { cba->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_BACK); cba->DrawDeferred(); } view_was_max = StatusPane()->IsVisible() ? 0 : 1; if (view_was_max) StatusPane()->MakeVisible(ETrue); iPlaylist->ShowHide(1); view_mode = 1; break; case 1: RemoveFromStack(iPlaylist); iPlaylist->ShowHide(0); AddToStackL(iAppView); if (cba) { cba->SetCommandSetL(R_AVKON_SOFTKEYS_OPTIONS_EXIT); cba->DrawDeferred(); } iAppView->ShowHide(1); if (view_was_max) StatusPane()->MakeVisible(EFalse); view_was_max = 0; view_mode = 0; break; } } void COsmo4AppUi::PlayURL(const char *url) { if (view_mode) { TogglePlaylist(); } if (url) { char *sep; iAppView->Connect(url); sep = strrchr(url, '\\'); SetTitle(sep ? sep+1 : url); } } void COsmo4AppUi::SetTitleInfo(const char *title) { CEikStatusPane* statusPane = StatusPane(); CAknTitlePane *iTitlePane = (CAknTitlePane*) statusPane->ControlL(TUid::Uid(EEikStatusPaneUidTitle)); if (!title) title = "Osmo4"; HBufC *htitle = HBufC::NewL( strlen(title)+1); htitle->Des().Copy( TPtrC8(( TText8* ) title) ); iTitlePane->SetText(htitle); } void COsmo4AppUi::SetTitle(const char *title, int store_it) { if (store_it) { if (m_title) free(m_title); m_title = NULL; if (title) m_title = strdup(title); } SetTitleInfo(title ? title : m_title); } void COsmo4AppUi::SetInfo(const char *info) { if (info) { char szTitle[200]; sprintf(szTitle, "%s\n%s", info, m_title ? m_title : "Osmo4"); SetTitleInfo(szTitle); } else { SetTitleInfo(m_title); } } #define DECLARE_MENU_ITEM(__text, __com, __check, __res, has_sep) \ item.iText = __text; \ item.iCommandId = __com; \ item.iFlags = has_sep ? EEikMenuItemSeparatorAfter : 0; \ if (__check) item.iFlags |= EEikMenuItemCheckBox | EEikMenuItemSymbolOn; \ item.iCascadeId = __res; \ aMenuPane->AddMenuItemL(item); void COsmo4AppUi::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane) { CEikMenuPaneItem::SData item; if (aResourceId==R_OSMO4_MENU) { aMenuPane->Reset(); if (view_mode==1) { Bool is_file = iPlaylist->SelectionIsFile(); Bool in_pl = (is_file && iPlaylist->IsInPlaylist()) ? 1 : 0; if (iPlaylist->PlaylistMode()) { DECLARE_MENU_ITEM(_L("Up"), EOsmo4PlayListMoveUp, 0, 0, 0); DECLARE_MENU_ITEM(_L("Down"), EOsmo4PlayListMoveDown, 0, 0, 0); DECLARE_MENU_ITEM(_L("Remove"), EOsmo4PlayListRem, 0, 0, 0); DECLARE_MENU_ITEM(_L("Clear"), EOsmo4PlayListClear, 0, 0, 1); } else if (!in_pl) { DECLARE_MENU_ITEM(_L("Add to PlayList"), EOsmo4PlayListAdd, 0, 0, 1); } else if (is_file) { DECLARE_MENU_ITEM(_L("Remove from Playlist"), EOsmo4PlayListRem, 0, 0, 1); } if (! iPlaylist->PlaylistMode()) { DECLARE_MENU_ITEM(iPlaylist->ViewAllFiles() ? _L("View known files") : _L("View all files"), EOsmo4PlayListAllFiles, 0, 0, 1); } else { DECLARE_MENU_ITEM(_L("Sort"), 0, 0, R_OSMO4_SM1, 1); } DECLARE_MENU_ITEM(iPlaylist->PlaylistMode() ? _L("Browse") : _L("Playlist"), EOsmo4PlayListMode, 0, 0, 0); } else { /*open*/ DECLARE_MENU_ITEM(_L("File"), 0, 0, R_OSMO4_SM1, 0); DECLARE_MENU_ITEM(_L("View"), 0, 0, R_OSMO4_SM2, 0); DECLARE_MENU_ITEM(_L("Options"), 0, 0, R_OSMO4_SM3, 0); //DECLARE_MENU_ITEM(_L("Exit"), EEikCmdExit, 0, 0, 0); } smenu_id = 0; return; } else if (aResourceId==R_OSMO4_SM1) { aMenuPane->Reset(); /*sort menu*/ if (view_mode==1) { } /*file menu*/ else { DECLARE_MENU_ITEM(_L("Open local"), EOsmo4PlayListView, 0, 0, 0); DECLARE_MENU_ITEM(_L("Open URL"), EOsmo4OpenURL, 0, 0, 1); if (gf_cfg_get_key_name(iAppView->m_user.config, "RecentFiles", 0) != NULL) { DECLARE_MENU_ITEM(_L("Recent"), 0, 0, R_OSMO4_SSM1, 0); } DECLARE_MENU_ITEM(_L("Reload"), EOsmo4Reload, 0, 0, 0); } smenu_id = 1; return; } /*not used*/ if (view_mode==1) return; /*View menu*/ if (aResourceId==R_OSMO4_SM2) { aMenuPane->Reset(); /*content view menu*/ if (gf_term_get_option(iAppView->m_term, GF_OPT_NAVIGATION_TYPE) != GF_NAVIGATE_TYPE_NONE) { DECLARE_MENU_ITEM(_L("Navigate"), 0, 0, R_OSMO4_SSM1, 1); } DECLARE_MENU_ITEM(_L("Fullscreen"), EOsmo4Fullscreen, 0, 0, 0); /*don't allow content AR modification by user*/ //DECLARE_MENU_ITEM(_L("Aspect Ratio"), 0, 0, R_OSMO4_SSM2, 1); DECLARE_MENU_ITEM(_L("Maximize size"), EOsmo4ViewMaxSize, (StatusPane()->IsVisible() ? 0 : 1), 0, 1); DECLARE_MENU_ITEM(_L("CPU Usage"), EOsmo4ViewRTI, iAppView->show_rti, 0, 0); smenu_id = 2; return; } /*Option menu*/ if (aResourceId==R_OSMO4_SM3) { const char *opt = gf_cfg_get_key(iAppView->m_user.config, "Rendering", "RendererName"); DECLARE_MENU_ITEM(_L("Use OpenGL"), EOsmo4OptSwitchRender, (opt && strstr(opt, "3D")) ? 1 : 0, 0, 0); DECLARE_MENU_ITEM(_L("Enable Logs"), EOsmo4OptEnableLogs, iAppView->do_log, 0, 0); return; } if (aResourceId==R_OSMO4_SSM1) { aMenuPane->Reset(); if (smenu_id == 1) { u32 i = 0; while (1) { const char *opt = gf_cfg_get_key_name(iAppView->m_user.config, "RecentFiles", i); if (!opt) break; const char *sep = strrchr(opt, '\\'); if (!sep) sep = strrchr(opt, '/'); if (!sep) sep = opt; else sep += 1; item.iText.Copy( TPtrC8(( TText8* ) sep) ); item.iCommandId = EOsmo4OpenRecentFirst + i; item.iFlags = 0; item.iCascadeId = 0; aMenuPane->AddMenuItemL(item); i++; if (i>=10) break; } } else if (smenu_id == 2) { DECLARE_MENU_ITEM(_L("Reset"), EOsmo4NavReset, 0, 0, 1); DECLARE_MENU_ITEM(_L("None"), EOsmo4NavNone, 0, 0, 0); DECLARE_MENU_ITEM(_L("Slide"), EOsmo4NavSlide, 0, 0, 0); if (gf_term_get_option(iAppView->m_term, GF_OPT_NAVIGATION_TYPE) == GF_NAVIGATE_TYPE_3D) { DECLARE_MENU_ITEM(_L("Walk"), EOsmo4NavWalk, 0, 0, 0); DECLARE_MENU_ITEM(_L("Fly"), EOsmo4NavFly, 0, 0, 0); DECLARE_MENU_ITEM(_L("Examine"), EOsmo4NavExamine, 0, 0, 1); DECLARE_MENU_ITEM(_L("Headlight"), EOsmo4NavHeadlight, 0, 0, 0); DECLARE_MENU_ITEM(_L("Gravity"), EOsmo4NavGravity, 0, 0, 0); } } return; } if (aResourceId==R_OSMO4_SSM2) { aMenuPane->Reset(); DECLARE_MENU_ITEM(_L("Keep Original"), EOsmo4AROriginal, 0, 0, 0); DECLARE_MENU_ITEM(_L("Fill Screen"), EOsmo4ARFillScreen, 0, 0, 0); DECLARE_MENU_ITEM(_L("Ratio 4/3"), EOsmo4AR4_3, 0, 0, 0); DECLARE_MENU_ITEM(_L("Ratio 16/9"), EOsmo4AR16_9, 0, 0, 0); return; } }