// 加载歌词 gboolean _LoadLyric(SongInfo info) { const gchar * pszTitle = info.szTitle; const gchar * pszArtist = info.szArtist; LyricDebug("LoadLyric(%s, %s)", pszTitle, pszArtist); #define LRC_PATH_NUM 12 gchar szLrcFile[LRC_PATH_NUM][MAX_PATH]; if (strlen((char *) pszTitle) <= 0) return FALSE; int nCount = 0; sprintf(szLrcFile[nCount++], "%s/%s/%s.lrc", theApp.m_configs.szLyricPath, pszArtist, pszTitle); sprintf(szLrcFile[nCount++], "%s/%s - %s.lrc", theApp.m_configs.szLyricPath, pszArtist, pszTitle); sprintf(szLrcFile[nCount++], "%s/%s.lrc", theApp.m_configs.szLyricPath, pszTitle); sprintf(szLrcFile[nCount++], "%s/%s/%s.lrc", info.szSongFolder, pszArtist, pszTitle); sprintf(szLrcFile[nCount++], "%s/%s - %s.lrc", info.szSongFolder, pszArtist, pszTitle); sprintf(szLrcFile[nCount++], "%s/%s.lrc", info.szSongFolder, pszTitle); gchar szTmp[MAX_PATH] = {0}; sprintf(szLrcFile[nCount++], "%s/%s.lrc", info.szSongFolder, GetNameFromFileName(info.szFileName, szTmp, MAX_PATH)); sprintf(szLrcFile[nCount++], "%s/%s.lrc", theApp.m_configs.szLyricPath, GetNameFromFileName(info.szFileName, szTmp, MAX_PATH)); szLrcFile[LRC_PATH_NUM - 1][0] = 0; // 检查该歌曲的歌词是否存在 int i = 0; for (i = 0; i < nCount; i++) { if (g_file_test(szLrcFile[i], G_FILE_TEST_IS_REGULAR)) { break; } } theApp.m_CurrSongInfo = info; if (i < nCount) { strcpy(theApp.m_CurrSongInfo.szLyricFileName, szLrcFile[i]); return theApp.m_LyricWnd.ParseLyric(theApp.m_CurrSongInfo.szLyricFileName); } else { theApp.m_CurrSongInfo = info; return SearchLyric(info, theApp.m_configs.bSmartDownLoad, theApp.m_configs.nSearchAppIndex, TRUE); } }
/** * Function name CDeleteObject::DeleteFile * Description Asks the user if he really wants to delete the file. if so the file is deleted * @param CString strFileName * @return file deleted? * @exception file exeption catchen internally * @see GetNameFromFileName, */ BOOL CDeleteObject::DeleteFile(CString strFileName) { CString strAddInfo = m_sAdditionalInfo; CString strFilePathName; strFilePathName = (CString)m_ProjectPath + _T("\\") + strFileName; CFileStatus tFileStatus; if(!CFile::GetStatus(strFilePathName, tFileStatus)) { if(!m_bSilent) { CString strMessage; strMessage.Format(IDS_FILE_ALREADY_REMOVED, strFilePathName); ::AfxMessageBox(strMessage, MB_OK | MB_ICONWARNING); } return TRUE; } CString errorMsg; CString errorTitle; m_sName = GetNameFromFileName(strFileName); if(!m_bSilent) { errorMsg.Format(IDS_REALLY_DELETE_FILE1, m_sName, strFilePathName); int Res = ::AfxMessageBox(errorMsg, MB_YESNO|MB_ICONWARNING); if(Res != IDYES) { return FALSE; } } if(!::DeleteFile(strFilePathName)) { if(!m_bSilent) { errorMsg.Format(IDS_ERROR_DELETE_FILE, strFilePathName); ::AfxMessageBox(errorMsg, MB_OK); } return FALSE; } else { // file has been removed, now trigger close editor, if open ASSERT(m_pAddonHandler); if(m_pAddonHandler) { CComBSTR sFilePathName(strFilePathName); m_pAddonHandler->Fire_OnFileRemoved(sFilePathName); } } return TRUE; }
gboolean Lyric_GetSongInfo(SongInfo * pInfo) { gchar *pszTitle= NULL, *pszArtist= NULL, *lpszTmp= NULL; Playlist *pl= NULL; int iPlPos = 0; if (!audacious_drct_get_playing()) return FALSE; gint iPlLen= audacious_drct_pl_get_length(); if (iPlLen <= 0) { return FALSE; } iPlPos = audacious_drct_pl_get_pos(); if (iPlPos < 0) { return FALSE; } Tuple *out = NULL; gint iLen = 0; pl = aud_playlist_get_active(); out = aud_playlist_get_tuple(pl, iPlPos); if (!out) { return FALSE; } iLen = aud_tuple_get_int(out, FIELD_LENGTH, NULL); if (iLen < 1) { LyricLog("The song's tuple is empty!\n"); return FALSE; } // 获取文件完整路径名 lpszTmp = aud_playlist_get_filename(pl, iPlPos); if (!lpszTmp)return FALSE; gchar * lpszFileName = g_filename_from_uri(lpszTmp, NULL, NULL); g_free(lpszTmp); // 获取文件名 lpszTmp = g_path_get_basename(lpszFileName); strncpy(pInfo->szFileName, lpszTmp, MAX_PATH); g_free(lpszTmp); // 获取目录名 lpszTmp = g_path_get_dirname(lpszFileName); strncpy(pInfo->szSongFolder, lpszTmp, MAX_PATH); g_free(lpszTmp); g_free(lpszFileName); lpszFileName = NULL; // 获取歌曲标题 pszTitle = (gchar *) aud_tuple_get_string(out, FIELD_TITLE, NULL); if (pszTitle) { strncpy(pInfo->szTitle, pszTitle, TITLE_LENGTH); pInfo->szTitle[TITLE_LENGTH] = 0; pszTitle = NULL; } else { int iLenght = strlen((const char *) pInfo->szFileName); int iDotPos = iLenght, iNameBegin = 0, iCurr = iLenght; while (iCurr> 0) { if (pInfo->szFileName[iCurr] == '.' && iDotPos == iLenght) { iDotPos = iCurr; iCurr--; continue; } if (pInfo->szFileName[iCurr] == '.') { iNameBegin = iCurr + 2; if (iNameBegin != iDotPos) break; } iCurr--; } int iTitleLen = iDotPos - iNameBegin; LyricDebug ("iDotPos:%d, iNameBegin:%d, iTitleLen:%d, iLenght:%d", iDotPos, iNameBegin, iTitleLen, strlen((const char *) pInfo->szFileName)); if (iTitleLen <= 0) return FALSE; strncpy(pInfo->szTitle, pInfo->szFileName + iNameBegin, iTitleLen); pInfo->szTitle[iTitleLen] = '\0'; } // 获取歌曲作者 pszArtist = (gchar *) aud_tuple_get_string(out, FIELD_ARTIST, NULL); if (pszArtist) { strncpy(pInfo->szArtist, pszArtist, ARTIST_LENGTH); pInfo->szArtist[ARTIST_LENGTH] = '\0'; //free(pszArtist); pszArtist = NULL; } else { pInfo->szArtist[0] = 0; } // 由于Audacious提供的信息可能不正确,所以我们需要根据对歌曲标题和作者进行修复 if(g_strstr_len(pInfo->szTitle, strlen(pInfo->szTitle), "????")) { gchar szTmp[MAX_PATH] = {0}; gchar* lpszName = GetNameFromFileName(pInfo->szFileName, szTmp, MAX_PATH); // 如果存在乱码,那么就拿文件名当歌曲的标题 strncpy(pInfo->szTitle, lpszName, MAX_PATH); } if(g_strstr_len(pInfo->szArtist, strlen(pInfo->szArtist), "????")) { // 如果存在乱码,那么清空。 // 因为作者不是必须的关键字 memset(pInfo->szArtist, 0, sizeof(pInfo->szArtist)); } gchar szName[MAX_PATH] = {0}; if (theApp.m_configs.bSaveLyricToSongFolder) { if (theApp.m_configs.bSaveLyricAsFileName) { snprintf(pInfo->szLyricFileName, MAX_PATH, "%s/%s.lrc", pInfo->szSongFolder, GetNameFromFileName(pInfo->szFileName, szName, MAX_PATH)); } else { snprintf(pInfo->szLyricFileName, MAX_PATH, "%s/%s - %s.lrc", pInfo->szSongFolder, pInfo->szArtist, pInfo->szTitle); } } else { if (theApp.m_configs.bSaveLyricAsFileName) { snprintf(pInfo->szLyricFileName, MAX_PATH, "%s/%s.lrc", theApp.m_configs.szLyricPath, GetNameFromFileName(pInfo->szFileName, szName, MAX_PATH)); } else { snprintf(pInfo->szLyricFileName, MAX_PATH, "%s/%s/%s.lrc", theApp.m_configs.szLyricPath, pInfo->szArtist, pInfo->szTitle); } } LyricDebug("szSongFolder: %s", pInfo->szSongFolder); LyricDebug("szFileName: %s", pInfo->szFileName); LyricDebug("szTitle: %s", pInfo->szTitle); LyricDebug("szArtist: %s", pInfo->szArtist); LyricDebug("szLyricFileName: %s\n\n", pInfo->szLyricFileName); return TRUE; }
UI_GameSettingsMenu::UI_GameSettingsMenu() : UI_Menu() { miSettingsStartButton = new MI_Button(&rm->spr_selectfield, 70, 45, "Start", 500, 0); miSettingsStartButton->SetCode(MENU_CODE_START_GAME); miModeField = new MI_ImageSelectField(&rm->spr_selectfield, &rm->menu_mode_small, 70, 85, "Mode", 500, 120, 16, 16); for (short iGameMode = 0; iGameMode < GAMEMODE_LAST; iGameMode++) { miModeField->Add(gamemodes[iGameMode]->GetModeName(), iGameMode, "", false, false); } miModeField->SetData(¤tgamemode, NULL, NULL); miModeField->SetKey(0); miModeField->SetItemChangedCode(MENU_CODE_MODE_CHANGED); for (short iGameMode = 0; iGameMode < GAMEMODE_LAST; iGameMode++) { miGoalField[iGameMode] = new MI_SelectField(&rm->spr_selectfield, 70, 125, gamemodes[iGameMode]->GetGoalName(), 352, 120); //miGoalField[iGameMode]->SetKey(gamemodes[iGameMode]->goal); miGoalField[iGameMode]->Show(iGameMode == 0); for (short iGameModeOption = 0; iGameModeOption < GAMEMODE_NUM_OPTIONS; iGameModeOption++) { SModeOption * option = &gamemodes[iGameMode]->GetOptions()[iGameModeOption]; miGoalField[iGameMode]->Add(option->szName, option->iValue, "", false, false); } miGoalField[iGameMode]->SetData(&gamemodes[iGameMode]->goal, NULL, NULL); miGoalField[iGameMode]->SetKey(gamemodes[iGameMode]->goal); } miModeSettingsButton = new MI_Button(&rm->spr_selectfield, 430, 125, "Settings", 140, 0); miModeSettingsButton->SetCode(MENU_CODE_TO_MODE_SETTINGS_MENU); miMapField = new MI_MapField(&rm->spr_selectfield, 70, 165, "Map", 400, 120, true); miMapFiltersButton = new MI_Button(&rm->spr_selectfield, 430, 205, "Filters", 140, 0); miMapFiltersButton->SetCode(MENU_CODE_TO_MAP_FILTERS); miMapFiltersOnImage = new MI_Image(&rm->menu_map_filter, 530, 213, 0, 48, 16, 16, 1, 1, 0); miMapFiltersOnImage->Show(false); miMapThumbnailsButton = new MI_Button(&rm->spr_selectfield, 430, 245, "Thumbs", 140, 0); miMapThumbnailsButton->SetCode(MENU_CODE_TO_MAP_BROWSER_THUMBNAILS); miMapFilterScroll = new MI_MapFilterScroll(&rm->menu_plain_field, 120, 72, 400, 9); miMapFilterScroll->SetAutoModify(true); miMapFilterScroll->Show(false); //Add auto map filters for (short iFilter = 0; iFilter < NUM_AUTO_FILTERS; iFilter++) { miMapFilterScroll->Add(g_szAutoFilterNames[iFilter], g_iAutoFilterIcons[iFilter]); } //Add user defined filters char szTemp[256]; for (short iFilter = 0; iFilter < filterslist->GetCount(); iFilter++) { GetNameFromFileName(szTemp, filterslist->GetIndex(iFilter), true); miMapFilterScroll->Add(szTemp, game_values.piFilterIcons[NUM_AUTO_FILTERS + iFilter]); } miGameSettingsLeftHeaderBar = new MI_Image(&rm->menu_plain_field, 0, 0, 0, 0, 320, 32, 1, 1, 0); miGameSettingsMenuRightHeaderBar = new MI_Image(&rm->menu_plain_field, 320, 0, 192, 0, 320, 32, 1, 1, 0); miGameSettingsMenuHeaderText = new MI_Text("Single Game Menu", 320, 5, 0, 2, 1); //Exit tournament dialog box miGameSettingsExitDialogImage = new MI_Image(&rm->spr_dialog, 224, 176, 0, 0, 192, 128, 1, 1, 0); miGameSettingsExitDialogExitText = new MI_Text("Exit", 320, 195, 0, 2, 1); miGameSettingsExitDialogTournamentText = new MI_Text("Tournament", 320, 220, 0, 2, 1); miGameSettingsExitDialogYesButton = new MI_Button(&rm->spr_selectfield, 235, 250, "Yes", 80, 1); miGameSettingsExitDialogNoButton = new MI_Button(&rm->spr_selectfield, 325, 250, "No", 80, 1); miGameSettingsExitDialogYesButton->SetCode(MENU_CODE_EXIT_TOURNAMENT_YES); miGameSettingsExitDialogNoButton->SetCode(MENU_CODE_EXIT_TOURNAMENT_NO); miGameSettingsExitDialogImage->Show(false); miGameSettingsExitDialogTournamentText->Show(false); miGameSettingsExitDialogExitText->Show(false); miGameSettingsExitDialogYesButton->Show(false); miGameSettingsExitDialogNoButton->Show(false); AddControl(miSettingsStartButton, miMapThumbnailsButton, miModeField, NULL, NULL); AddControl(miModeField, miSettingsStartButton, miGoalField[0], NULL, NULL); AddControl(miGoalField[0], miModeField, miGoalField[1], NULL, miModeSettingsButton); for (short iGoalField = 1; iGoalField < GAMEMODE_LAST - 1; iGoalField++) AddControl(miGoalField[iGoalField], miGoalField[iGoalField - 1], miGoalField[iGoalField + 1], miGoalField[iGoalField - 1], miModeSettingsButton); AddControl(miGoalField[GAMEMODE_LAST - 1], miGoalField[GAMEMODE_LAST - 2], miMapField, miGoalField[GAMEMODE_LAST - 2], miModeSettingsButton); AddControl(miModeSettingsButton, miModeField, miMapField, miGoalField[GAMEMODE_LAST - 1], NULL); AddControl(miMapField, miGoalField[GAMEMODE_LAST - 1], miMapFiltersButton, NULL, NULL); AddControl(miMapFiltersButton, miMapField, miMapThumbnailsButton, NULL, NULL); AddControl(miMapThumbnailsButton, miMapFiltersButton, miSettingsStartButton, NULL, NULL); AddControl(miMapFilterScroll, NULL, NULL, NULL, NULL); AddNonControl(miGameSettingsLeftHeaderBar); AddNonControl(miGameSettingsMenuRightHeaderBar); AddNonControl(miGameSettingsMenuHeaderText); AddNonControl(miGameSettingsExitDialogImage); AddNonControl(miGameSettingsExitDialogExitText); AddNonControl(miGameSettingsExitDialogTournamentText); AddNonControl(miMapFiltersOnImage); AddControl(miGameSettingsExitDialogYesButton, NULL, NULL, NULL, miGameSettingsExitDialogNoButton); AddControl(miGameSettingsExitDialogNoButton, NULL, NULL, miGameSettingsExitDialogYesButton, NULL); SetHeadControl(miSettingsStartButton); SetCancelCode(MENU_CODE_BACK_TEAM_SELECT_MENU); };