📄 osdfm.c
字号:
//scroll down. Bitmap copy.
GDI_BITMAP_COPY((OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_H+OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_WIDTH+4), //left //for 4-bit mode (original "+1")
(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_V-OSDFM_SELECT_FRAME_DISTANCE_V), //top
(OSDFM_DISPLAY_RIGHT_SCROLL_BAR_H-1), //right
(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_V+(OSDFM_MAX_ITEM_IN_FILE_WINDOW-2)*OSDFM_DISPLAY_ITEM_HEIGHT + OSDFM_FILE_WINDOW_FONT_HEIGHT + OSDFM_SELECT_FRAME_DISTANCE_V), //bottom
(OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_H+OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_WIDTH+4), //X //for 4-bit mode (original "+1")
(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_V+OSDFM_DISPLAY_ITEM_HEIGHT-OSDFM_SELECT_FRAME_DISTANCE_V), //Y
0, //source
0); //destination
//Then clear the last dir in this page and re-draw it.
_OSDFM_ClearItemRegionInFileWindow(OSDFM_RIGHT_FILE_WINDOW, 0);
_OSDFM_UpdateRightScrollBar();
}
//Re-set the background's color.
__GDIParm.u.RectParm.bColor = OSDFM_PALETTE_ENTRY_HIGHLIGHT_BACKGROUND;
}
//CoCo1.10, fix the problem about critical "FM_MAX_FILE_NO_ONCE_TIME" issue.
_OSDFM_PrepagePage();
if (__FMSelectCursor.wIndex < __pFMDirTree[__bFMActiveDir].bNoOfSubDir) //the cursor is at the folder.
{
_OSDFM_CopyDirString((BYTE)(__pFMDirTree[__bFMActiveDir].b1stSubDirID+(BYTE)__FMSelectCursor.wIndex), POS_FILE_LIST);
_bOSDFMIconType = OSDFM_ICON_TYPE_FOLDER;
}
else //the cursor is at the file.
{
if (__btProgram)
{
if (LINEAR_ProgramEntryOperation(LINEAR_QUERY_INDEX, 0, __bFMActiveDir, (WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir+1)) != 0xFF)
{
//assign the file's index to _wFileIndex before calling _OSDFM_DrawSelectedFrame.
//Thus _OSDFM_DrawSelectedFrame() can draw the selected frame according to the width of the file's name.
_wFileIndex = (WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir);
//draw the selected frame
_OSDFM_DrawSelectedFrame(UPDATE_FRAME_DRAW, (BYTE)((__FMSelectCursor.wIndex - __wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW));
}
}
//CoCo1.01, for moving highlight when playing
if ((__FMActiveCursor.wIndex == __FMSelectCursor.wIndex) && (__bFMActiveDir == __bFMPlayingDir)) //The active playing file is equal to the cursor's position
{
GDI_SetTextColor(TEXT_FG_COLOR, OSDFM_PALETTE_ENTRY_ACTIVE_PLAYING_FILE);
}
_OSDFM_CopyFileString((WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir), OSDFM_FILE_WINDOW_LETTER_INDEX);
//Call this function to get correct _wTransformFileIndex
_OSDFM_TransformFileIndex((WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir));
_OSDFM_GetIconType(__pFMFileRecord[_wTransformFileIndex].FileName.bExtID);
}
//Reset the __GDIParm.u.RectParm.bColor after draw the selected frame
if (bUpdate == UPDATE_HIGHLIGHT_DRAW)
{
__GDIParm.u.RectParm.bColor = OSDFM_PALETTE_ENTRY_HIGHLIGHT_BACKGROUND;
}
else if (bUpdate == UPDATE_HIGHLIGHT_CLEAR)
{
__GDIParm.u.RectParm.bColor = OSDFM_PALETTE_ENTRY_GENERAL_BACKGROUND;
}
#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
#ifdef SUPPORT_UNICODE
//CoCo2.36, support UNICODE string
_bOSDFMTemp3 = GDI_GetUnicodeStringMaxWidth(_wOSDFMMaxStringSpace);
#else
_bOSDFMTemp3 = GDI_GetStringWidth();
#endif
SET_RECT(__GDIParm.u.Frame.rect,
(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_H-OSDFM_HIGHLIGHT_DISTANCE_H),
(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT-OSDFM_HIGHLIGHT_DISTANCE_V),
(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H+_bOSDFMTemp3+OSDFM_HIGHLIGHT_DISTANCE_H),
(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT+OSDFM_FILE_WINDOW_FONT_HEIGHT+OSDFM_HIGHLIGHT_DISTANCE_V));
#else
//Set the rectange of highlight
SET_RECT(__GDIParm.u.RectParm.rect,
(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_H-OSDFM_HIGHLIGHT_DISTANCE_H),
(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT-OSDFM_HIGHLIGHT_DISTANCE_V),
(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_H-OSDFM_HIGHLIGHT_DISTANCE_H+OSDFM_FILE_HIGHLIGHT_WIDTH),
(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT+OSDFM_FILE_WINDOW_FONT_HEIGHT+OSDFM_HIGHLIGHT_DISTANCE_V));
#endif
//Draw the highlight in the file window.
GDI_FillRect((PPARM_RECT)&__GDIParm);
#ifdef SUPPORT_UNICODE //CoCo2.36, support UNICODE string
GDI_DRAW_UNICODE_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT), _wOSDFMMaxStringSpace);
#else
GDI_DRAW_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
#endif
//draw the file icon
if (bUpdate == UPDATE_HIGHLIGHT_DRAW)
_OSDFM_DrawRightFileWindowIcon((BYTE)((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW), TRUE);
else
_OSDFM_DrawRightFileWindowIcon((BYTE)((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW), FALSE);
if (__FMSelectCursor.wIndex >= __pFMDirTree[__bFMActiveDir].bNoOfSubDir) //the cursor is at the file.
{
//draw serial number
_OSDFM_NormalFileWindowStringPalette();
if ((__FMActiveCursor.wIndex == __FMSelectCursor.wIndex) && (__bFMActiveDir == __bFMPlayingDir)) //The active playing file is equal to the cursor's position
{
GDI_SetTextColor(TEXT_FG_COLOR, OSDFM_PALETTE_ENTRY_ACTIVE_PLAYING_FILE);
}
OSD_OutputNum((WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir+1), OSDFM_FILE_WINDOW_NUM_INDEX);
GDI_DRAW_STRING((OSDFM_DISPLAY_SERIAL_NUM_START_H-GDI_GetStringWidth()), (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
}
break;
#ifdef SUPPORT_FM_BUTTONS
case POS_BUTTON_LIST:
if (bUpdate == UPDATE_HIGHLIGHT_DRAW)
OSDFM_DrawButton((BYTE)__FMSelectCursor.wIndex, TRUE);
else if (bUpdate == UPDATE_HIGHLIGHT_CLEAR)
OSDFM_DrawButton((BYTE)__FMSelectCursor.wIndex, FALSE);
break;
#endif //SUPPORT_FM_BUTTONS
default:
break;
}
}
//CoCo1.01, for moving cursor when playing
//***************************************************************************
// Function : _OSDFM_UpdateActivePlayingFile
// Abstract : This function will update the color of the file.
// Arguments : bUpdate: UPDATE_ACTIVE_PLAYING_FILE_DRAW
// : UPDATE_ACTIVE_PLAYING_FILE_CLEAR
// Return : none.
// Side Effect : none.
// Notes :
//***************************************************************************
void _OSDFM_UpdateActivePlayingFile(BYTE bUpdate)
{
//The active playing cursor is not in the current page.
if ((__FMActiveCursor.wIndex > (__wStartDrawItem+OSDFM_MAX_ITEM_IN_FILE_WINDOW-1)) || (__FMActiveCursor.wIndex < __wStartDrawItem))
{
return;
}
if (__bFMActiveDir != __bFMPlayingDir) //The active playing file is not equal to the cursor's position
return;
if (bUpdate == UPDATE_ACTIVE_PLAYING_FILE_CLEAR)
{
_OSDFMFlashCount = (OSDFM_FLASH_ACTIVE_FILE_COUNT << 1) - 1;
_OSDFM_FlashPlayingFile(TRUE);
}
_OSDFM_NormalFileWindowStringPalette();
if (bUpdate == UPDATE_ACTIVE_PLAYING_FILE_DRAW)
{
if ((__FMActiveCursor.wIndex == __FMSelectCursor.wIndex) && (__FMSelectCursor.bPosition == POS_FILE_LIST))
{
GDI_SetTextColor(TEXT_BG_COLOR, OSDFM_PALETTE_ENTRY_HIGHLIGHT_BACKGROUND);
}
GDI_SetTextColor(TEXT_FG_COLOR, OSDFM_PALETTE_ENTRY_ACTIVE_PLAYING_FILE);
}
_OSDFM_CopyFileString((WORD)(__FMActiveCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir), OSDFM_FILE_WINDOW_LETTER_INDEX);
#ifdef SUPPORT_UNICODE //CoCo.236, support UNICODE string.
GDI_DRAW_UNICODE_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMActiveCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT), _wOSDFMMaxStringSpace);
#else
GDI_DRAW_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMActiveCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
#endif
//Recover to general background to prevent see a highlight background in the serial number.
GDI_SetTextColor(TEXT_BG_COLOR, OSDFM_PALETTE_ENTRY_GENERAL_BACKGROUND);
//CoCo1.10, change the color of serial number also.
OSD_OutputNum((WORD)(__FMActiveCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir+1), OSDFM_FILE_WINDOW_NUM_INDEX);
GDI_DRAW_STRING((OSDFM_DISPLAY_SERIAL_NUM_START_H-GDI_GetStringWidth()), (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMActiveCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
}
//***************************************************************************
// Function : _OSDFM_CopyDirString
// Abstract : Copy the name of the directory to the GDI's array.
// Arguments : bID: The ID of the directory.
// Return : none.
// Side Effect : none.
// Notes :
//***************************************************************************
void _OSDFM_CopyDirString(BYTE bID, BYTE bPos)
{
_bOSDFMTemp = 0;
#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
if (bPos == POS_FILE_LIST)
{
__wTemp = OSDFM_DISPLAY_RIGHT_SCROLL_BAR_H - OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H - OSDFM_SERIALNUM_FILENAME_DISTANCE;
}
else //in the left file window
{
//CoCo1.10, Entend the number of characters for file string automatically.
//Calculate the max width for file string.
OSD_OutputNum((WORD)(bID+1), OSDFM_FILE_WINDOW_NUM_INDEX);
__wTemp = OSDFM_DISPLAY_LEFT_SCROLL_BAR_H - OSDFM_DISPLAY_ITEM_LEFT_WINDOW_START_H - OSDFM_SERIALNUM_FILENAME_DISTANCE - GDI_GetStringWidth();
//__wTemp = OSDFM_DISPLAY_LEFT_SCROLL_BAR_H - OSDFM_DISPLAY_ITEM_LEFT_WINDOW_START_H - OSDFM_SERIALNUM_FILENAME_DISTANCE;
}
#endif
#ifdef SUPPORT_UNICODE //CoCo2.36, support UNICDE string.
_wOSDFMMaxStringSpace = __wTemp;
while (_bOSDFMTemp < FM_MAX_DIRNAME_LENGTH)
{
if (__bJolietTitle) //UNICODE
{
if ((__pFMDirNameList[bID].cName[_bOSDFMTemp] == '\0') && (__pFMDirNameList[bID].cName[_bOSDFMTemp+1] == '\0'))
break;
__wGDIString[_bOSDFMTemp/2+1] = MAKEWORD(__pFMDirNameList[bID].cName[_bOSDFMTemp+1], __pFMDirNameList[bID].cName[_bOSDFMTemp]);
_bOSDFMTemp += 2;
}
else //ASCII
{
if (__pFMDirNameList[bID].cName[_bOSDFMTemp] == '\0')
break;
__wGDIString[_bOSDFMTemp+1] = __pFMDirNameList[bID].cName[_bOSDFMTemp];
_bOSDFMTemp++;
}
}
if (__bJolietTitle)
__wGDIString[0] = (_bOSDFMTemp >> 1);
else
__wGDIString[0] = _bOSDFMTemp;
#else
while (__pFMDirNameList[bID].cName[_bOSDFMTemp] != '\0')
{
__wGDIString[_bOSDFMTemp+1] = OSD_TransformChar(__pFMDirNameList[bID].cName[_bOSDFMTemp], OSDFM_FILE_WINDOW_LETTER_INDEX);
#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
if (__wTemp >= ((__wGDIString[_bOSDFMTemp+1] & 0xF000) >> 10))
{
__wTemp -= ((__wGDIString[_bOSDFMTemp+1] & 0xF000) >> 10);
_bOSDFMTemp++;
}
else
{
//Dont't increase _bOSDFMTemp because this charachter should not be added to the array.
break;
}
#else
_bOSDFMTemp++;
#endif
if (_bOSDFMTemp > OSDFM_MAX_DIRNAME_LENGTH)
{
_bOSDFMTemp = OSDFM_MAX_DIRNAME_LENGTH;
break;
}
}
__wGDIString[0] = _bOSDFMTemp;
#endif //SUPPORT_UNICODE
}
//***************************************************************************
// Function : _OSDFM_CopyFileString
// Abstract : This function will copy the name of the file to GDI's array.
// Arguments : wFileIndex: The index of the file.
// Return : none.
// Side Effect : none.
// Notes :
//***************************************************************************
void _OSDFM_CopyFileString(WORD wFileIndex, BYTE bLetterIndex)
{
_bOSDFMTemp = 0;
//Call this function to get correct _wTransformFileIndex
_OSDFM_TransformFileIndex(wFileIndex);
#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
//CoCo1.07, Entend the number of characters for file string automatically.
//Calculate the max width
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -