const string PRESET_AVATAR_TAB = "PRESET_AVATAR_TAB"; const string MY_AVATAR_TAB = "MY_AVATAR_TAB"; component AvatarViewModel { AvatarModel m_Model; AvatarView m_View; bool m_IsOpenedMyAvatar; string m_CurrentTabIndex; int m_SelectedMyAvatarItemIndex; int m_SelectedPresetAvatarItemIndex; int m_PresetAvatarID; bool m_IsPortrait; public AvatarViewModel() { m_Model = system.Layer_GetComponentByName("mainmenu_mypage_avatar_base"); m_View = new AvatarView(); m_IsOpenedMyAvatar = false; m_CurrentTabIndex = ""; m_SelectedMyAvatarItemIndex = -1; m_SelectedPresetAvatarItemIndex = -1; m_PresetAvatarID = hel_skyway_get_avatar(); m_IsPortrait = hsCanvasIsPortrait(); hsAddEventListener("login-state-change", OnLoginStateChange); } public void OnWindowActivate(bool IsActivate) { if(IsActivate) { if(m_IsOpenedMyAvatar) { // マイアバタータブを再描画する ClickMyAvatarTab(""); } } } public void OnResize(int width, int height) { //bool PrevState = m_IsPortrait; m_IsPortrait = hsCanvasIsPortrait(); // マイアバターリストを開いている途中に縦横が切り替わったのでリストを再描画する // 縦横で表示数が違う都合上、再描画しないと表示がおかしくなるため //if(PrevState != m_IsPortrait) //{ if(m_IsOpenedMyAvatar) { // マイアバタータブを再描画する ClickMyAvatarTab(""); }else{ // アバタータブを再描画する ClickPresetAvatarTab(""); } //} } // ログイン状態が変化したときのイベントリスナー。 // (HeliScriptのコールバック関数ではない) void OnLoginStateChange(string jsonParam) { bool loginValid = hel_net_is_logged_in(); if(!loginValid) { // ログイン から ゲストに変わった時にマイアバターを使用していたらプリセットアバターの0番目に変更する if(!hel_net_get_my_avatar().IsNull()) { ResetAvatar(); } } } // プリセットアバターの0番目へ変更する public void ResetAvatar() { m_SelectedMyAvatarItemIndex = -1; m_PresetAvatarID = 0; m_SelectedPresetAvatarItemIndex = -1; m_Model.SelectPresetAvatar(m_PresetAvatarID); hel_setText(ETextParamType_ReplaceMyAvatar, m_PresetAvatarID.ToString()); } public void UpdateViewDataByAvatars(list AvatarList, int PagerIndex) { if(!m_IsOpenedMyAvatar) { return; } if(!AvatarList.IsEmpty()) { m_View.drawConfigAvatarTileList(AvatarList, PagerIndex); m_View.showMyAvatarSelectmark(m_Model.GetCurrentMyAvatarIndex()); //_SetSelectMarkToCurrentMyAvatar(AvatarList); } else { m_View.drawMyAvatarUploadButton(); } } /* void _SetSelectMarkToCurrentMyAvatar(list AvatarList){ int Index = -1; JsVal avatarInfo = hel_net_get_my_avatar(); if(!avatarInfo.IsNull()) { string uuid = avatarInfo.GetProperty("uuid").GetStr(); for(int i = 0; i < AvatarList.Count; i++) { if(AvatarList[i].GetUUID() == uuid) { Index = i; break; } } } } */ public void UpdateViewDataByPresetAvatars(list AvatarList, int PagerIndex) { if(m_IsOpenedMyAvatar) { return; } if(!AvatarList.IsEmpty()) { m_View.drawConfigPresetAvatarTileList(AvatarList, PagerIndex); if( m_PresetAvatarID / m_Model.GetMaxPageElemCount() == m_Model.GetPresetPagerIndex()){ m_View.showPresetAvatarSelectmark(m_PresetAvatarID % m_Model.GetMaxPageElemCount()); }else{ m_View.showPresetAvatarSelectmark(-1); } } } public void SetCurrentAvatarItemIndexOnLoaded(int Index) { if(Index != -1) { m_PresetAvatarID = -1; } } public void ClickMyAvatarTab(string param) { m_IsOpenedMyAvatar = true; m_View.resetAvatarButton(); m_View.showPresetAvatarSelectmark(-1); m_Model.FetchMyAvatarDataList(0); m_SelectedMyAvatarItemIndex = m_Model.GetCurrentMyAvatarIndex(); m_CurrentTabIndex = MY_AVATAR_TAB; } public void ClickPresetAvatarTab(string param) { m_IsOpenedMyAvatar = false; m_View.resetAvatarButton(); m_SelectedPresetAvatarItemIndex = m_PresetAvatarID; if(m_PresetAvatarID / m_Model.GetMaxPageElemCount() == m_Model.GetPresetPagerIndex()){ m_View.showPresetAvatarSelectmark(m_PresetAvatarID); }else{ m_View.showPresetAvatarSelectmark(-1); } m_View.closeConfigMyAvatar(); m_Model.FetchPresetAvatarDataList(0); m_CurrentTabIndex = PRESET_AVATAR_TAB; } public void ClickPageBack() { m_SelectedMyAvatarItemIndex = -1; m_Model.UpdatePager(-1, m_CurrentTabIndex); if(m_CurrentTabIndex == PRESET_AVATAR_TAB){ m_SelectedPresetAvatarItemIndex = -1; if(m_PresetAvatarID / m_Model.GetMaxPageElemCount() == m_Model.GetPresetPagerIndex()){ m_View.showPresetAvatarSelectmark(m_PresetAvatarID % m_Model.GetMaxPageElemCount()); m_SelectedPresetAvatarItemIndex = m_PresetAvatarID % m_Model.GetMaxPageElemCount(); }else{ m_View.showPresetAvatarSelectmark(-1); } } } public void ClickPageNext() { m_SelectedMyAvatarItemIndex = -1; m_Model.UpdatePager(1, m_CurrentTabIndex); if(m_CurrentTabIndex == PRESET_AVATAR_TAB){ m_SelectedPresetAvatarItemIndex = -1; if(m_PresetAvatarID / m_Model.GetMaxPageElemCount() == m_Model.GetPresetPagerIndex()){ m_View.showPresetAvatarSelectmark(m_PresetAvatarID % m_Model.GetMaxPageElemCount()); m_SelectedPresetAvatarItemIndex = m_PresetAvatarID % m_Model.GetMaxPageElemCount(); }else{ m_View.showPresetAvatarSelectmark(-1); } } } public void Close(string param) { m_View.closeAvatarBase(); m_View.closeConfigMyAvatar(); m_View.showPresetAvatarSelectmark(-1); m_CurrentTabIndex = MY_AVATAR_TAB; m_Model.Release(); m_IsOpenedMyAvatar = false; } public void ShowLoginButtonOnMyAvatar() { m_View.drawLoginButtonOnMyAvatar(); } public void ClickLogin(string param) { heliport.v3.api.auths.login(); // WebXRモード中は裏で別タブが開かれるのでユーザー通知を行う if(hsSystemIsVRMode()) { string Ja = "リンクを新しいタブで開きました。\nHomeボタン、またはWebXR終了で確認できます。"; string En = "Link opened in a new tab.\nCheck using Home button or exit WebXR."; string Message = hsIsLangJA() ? Ja : En; hsSendToastNotice(0,Message,5.0,"",""); } } public void ClickSignup(string param) { //heliport.v3.api.profiles.openMyVketUrl("/mypage/profile"); string LoginURL = "https://account.vket.com/auth/login?"; hsWebOpen(LoginURL); } public void ClickAvatarUpload(string param) { //heliport.v3.api.profiles.openMyVketUrl("/mypage/assets/avatar"); string CurrentUrl = GetCurrentUrl(); bool IsTest = (CurrentUrl.IndexOf("test") != -1 || CurrentUrl.IndexOf("localhost") != -1 || CurrentUrl.IndexOf("hikky.dev") != -1); string Domain = (IsTest)? "cloud.hikky.dev" : "cloud.vket.com"; string MyVketURL = "https://%s/my-page/avatars/uploaded" % Domain; hsWebOpen(MyVketURL); } public void ConfirmAvatarSelect(string param) { int ID = hel_skyway_get_avatar(); if(m_CurrentTabIndex == PRESET_AVATAR_TAB) { if(m_SelectedPresetAvatarItemIndex != -1 && m_PresetAvatarID != m_SelectedPresetAvatarItemIndex + m_Model.GetMaxPageElemCount() * m_Model.GetPresetPagerIndex()){ m_PresetAvatarID = m_SelectedPresetAvatarItemIndex + m_Model.GetMaxPageElemCount() * m_Model.GetPresetPagerIndex(); // プリセットアバター用のネームプレートアイコンを表示する m_View.DrawPresetNameplateIcon(m_SelectedPresetAvatarItemIndex); m_Model.SelectPresetAvatar(m_SelectedPresetAvatarItemIndex); } } else if(m_CurrentTabIndex == MY_AVATAR_TAB) { if(m_SelectedMyAvatarItemIndex >= 0 && m_SelectedMyAvatarItemIndex < m_Model.GetMyAvatarCount()) { m_PresetAvatarID = -1; m_Model.SelectMyAvatar(m_SelectedMyAvatarItemIndex); } } Close(""); } public void DrawProfileNameplateIcon() { // マイアバター用のネームプレートアイコンを表示する LayerBundle layer = hsLayerGet("config_profile"); if(layer !== null) { layer.CallComponentMethod("ProfileMenuViewModel", "DrawProfileNameplateIcon", ""); } } public void SelectMyAvatarFromUUID(string UUID) { m_Model.SelectMyAvatarFromUUID(UUID); } void _ClickGridListItem(int Index) { if(m_CurrentTabIndex == MY_AVATAR_TAB){ m_SelectedMyAvatarItemIndex = Index; m_SelectedPresetAvatarItemIndex = -1; m_View.showMyAvatarSelectmark(m_SelectedMyAvatarItemIndex); }else{ m_SelectedPresetAvatarItemIndex = Index; m_SelectedMyAvatarItemIndex = -1; m_View.showPresetAvatarSelectmark(m_SelectedPresetAvatarItemIndex); } } public void ClickGridListRow(string param) { int Index = param.ToInt(); _ClickGridListItem(Index); } private string GetCurrentUrl() { JsVal val = heliport.v3.api.routers.getCurrentUrl(); ReturnType result = hsLoadReturnType(val); if(!result.IsValid()) return ""; return result.data.GetStr(); } }