⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 textui.cpp

📁 XOSL 多操作系统管理工具 源代码 多系统引导工具
💻 CPP
字号:
/*
 * Extended Operating System Loader (XOSL)
 * Copyright (c) 1999 by Geurt Vos
 *
 * This code is distributed under GNU General Public License (GPL)
 *
 * The full text of the license can be found in the GPL.TXT file,
 * or at http://www.gnu.org
 */

#include <textui.h>
#include <textscr.h>

#include <stdlib.h>
#include <string.h>
#include <key.h>

#define DEC 10
#define HEX 16

const char *Version = "Extended Operating System Loader 1.1.5";
const char *Prog = "XOSL INSTALL UTILITY";
const char *Copyright = "Copyright (c) 1999/2000, Geurt Vos";
const char *StrInfoQuit = "Esc : Quit";
const char *StrInfoSelect = "\x18 \x19 : Select Item";
const char *StrInfoExec = "Enter     : Execute";
const char *StrInfoModify = "PU/PD/-/+ : Modify";
const char *StrOutput = "Output:";


CTextUI::CTextUI(CTextScreen &TextScreenToUse):
	TextScreen(TextScreenToUse),
	Output(41,5,37,12,0x1f00,TextScreenToUse),
	HelpText(1,22,78,1,0x1e00,TextScreenToUse),
	MenuItems(3,5,35,11,TextScreenToUse,HelpText)
{
	DrawText();
	DrawBorders();
	Popup = NULL;
}

CTextUI::~CTextUI()
{
}

void CTextUI::DrawText()
{
	int Offset;

	Offset = 80 - strlen(Version) >> 1;
	TextScreen.PutStr(Offset,0,Version,0x1f00);
	Offset = 80 - strlen(Prog) >> 1;
	TextScreen.PutStr(Offset,1,Prog,0x1f00);
	Offset = 80 - strlen(Copyright) >> 1;
	TextScreen.PutStr(Offset,2,Copyright,0x1f00);
	TextScreen.PutStr(2,18,StrInfoQuit,0x1f00);
	TextScreen.PutStr(2,19,StrInfoSelect,0x1f00);
	TextScreen.PutStr(41,18,StrInfoExec,0x1f00);
	TextScreen.PutStr(41,19,StrInfoModify,0x1f00);
	TextScreen.PutStr(41,4,StrOutput,0x1e00);
}

void CTextUI::DrawBorders()
{
	TextScreen.FillX(1,3,205,0x1f00,78);
	TextScreen.FillX(1,24,205,0x1f00,78);
	TextScreen.FillX(1,17,196,0x1f00,78);
	TextScreen.FillX(1,20,196,0x1f00,78);

	TextScreen.FillY(0,4,186,0x1f00,20);
	TextScreen.FillY(79,4,186,0x1f00,20);
	TextScreen.FillY(39,4,179,0x1f00,13);

	TextScreen.PutChar(0,3,201,0x1f00);
	TextScreen.PutChar(79,3,187,0x1f00);
	TextScreen.PutChar(79,24,188,0x1f00);
	TextScreen.PutChar(0,24,200,0x1f00);
	TextScreen.PutChar(39,3,209,0x1f00);
	TextScreen.PutChar(39,17,193,0x1f00);
	TextScreen.PutChar(0,17,199,0x1f00);
	TextScreen.PutChar(79,17,182,0x1f00);
	TextScreen.PutChar(0,20,199,0x1f00);
	TextScreen.PutChar(79,20,182,0x1f00);

}

void CTextUI::AddMenuItem(int Index, const char *Caption,
	const char *HelpText, int Enabled)
{
	MenuItems.AddItem(Index,Caption,HelpText,Enabled);
}

void CTextUI::AddMenuItem(int Index, const char *Caption, const char *HelpText,
	int Enabled, int OptionCount, const char **OptionList, int IsCombo)
{
	MenuItems.AddItem(Index,Caption,HelpText,Enabled,OptionCount,OptionList,IsCombo);
}

void CTextUI::RefreshMenu()
{
	MenuItems.Refresh();
	TextScreen.PutStr(3,3,MenuTitle,0x1f00);
}

void CTextUI::ClearMenu()
{
	MenuItems.Clear();
}

void CTextUI::SetItemIndex(int ItemIndex)
{
	MenuItems.SetItemIndex(ItemIndex);
}

void CTextUI::HandleKey(int Key)
{
	if (Popup) {
		Popup->Hide();
		delete Popup;
		Popup = NULL;
		return;
	}
	MenuItems.HandleKeyAction(Key);
}


void CTextUI::OutputStr(const char *format, ...)
{
	unsigned short *argl;
	char buf[32];

	for (argl = &((unsigned short *)&format)[2]; *format; ++format)
		switch (*format) {
			case '%':
				switch (*++format) {
					case 'c':
						Output.PutChar(*argl++);
						break;
					case 'd':
						itoa(*argl++,buf,DEC);
						Output.PutStr(buf);
						break;
					case 'x':
						itoa(*argl++,buf,HEX);
						Output.PutStr(buf);
						break;
					case 's':
						Output.PutStr((const char *)*(long *)argl);
						argl += 2;
						break;
					case 'l':
						if (format[1] == 'd') {
							++format;
							itoa(*(unsigned long *)argl++,buf,DEC);
							Output.PutStr(buf);
							break;
						}
						if (format[1] == 'x') {
							++format;
							itoa(*(unsigned long *)argl++,buf,HEX);
							Output.PutStr(buf);
							break;
						}
					default:
						Output.PutChar('%');
						--format;
						break;
				}
				break;
			default:
				Output.PutChar(*format);
				break;
		}
}

int CTextUI::GetOptionIndex(int Index)
{
	return MenuItems.GetOptionIndex(Index);
}

void CTextUI::ConnectEventHandler(CTextList::TListItemExecute Handler, void *_this)
{
	MenuItems.ConnectEventHandler(Handler,_this);
}

void CTextUI::SetMenuTitle(const char *Title)
{
	MenuTitle = Title;
	MenuTitleLength = strlen(MenuTitle);
}

void CTextUI::ShowPopup(int Left, int Top, int Width, int Height, const char *Text)
{
	Popup = new CTextPopup(Left,Top,Width,Height,Text,TextScreen);
	
	Popup->Show();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -