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

📄 ringkey.c

📁 PSP YDICT ver0.3 改进的功能 1。在《牛津现代英汉双解词典》中
💻 C
📖 第 1 页 / 共 2 页
字号:
//
//	This program is free software; you can redistribute it and/or
//	modify it under the terms of the GNU General Public License
//
//	Copyright (c) 2005 ZYM <yanming.zhang@gmail.com>
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pspctrl.h>
#include "main.h"
#include "chinesedraw.h"

// we make '_' as ' ' for display
//char kbletters[]="abcdefghijklmnopqrstuvwxyz.-('@_";
char kbletters[]="fghijklmnopqrstuvwxyz.'-_/(abcde";
char kbnumbers[]="87654321!@#$%^&*()_+{}|\\:;][=-09";
//char kbletters2[]="FGHIJKLMNOPQRSTUVWXYZ.'-_@(ABCDE";
char *currkb;
int currkeyindex;

const int KEYCOS[8]={
// cos()*10000, from ...
//	5.625,	16.875,	28.125,	39.375
	9952,	9569,	8819,	7730,
//	50.625,	61.875,	73.125,	84.375
	6344,	4714,	2903,	980};

const int KEYTAN[8]={
// tan()*10000
//	5.625,	16.875,	28.125,	39.375
	985,	3033,	5345,	8207,
//	50.625,	61.875,	73.125,	84.375
        12185,  18709,	32966,	101532};

const int ANALOGTAN[4]={
// tan()*10000
//	11.25,	22.5,	33.75,	45
	1989,	4142,	6682,	10000};

struct key_info {
	unsigned int x;
	unsigned int y;
};

struct key_info	kb[KEYNUMBER];
#define INPUTBAR_SIZE	35
struct inputbar {
	char string[INPUTBAR_SIZE];
	int cursor;
};
struct inputbar	myinput;

int getcurrentkeyindex(unsigned char x, unsigned char y)
{
	unsigned int deltax, deltay;
	int i;
	
	deltax = abs(MAXANALOG_X/2 -x);
	deltay = abs(MAXANALOG_Y/2 -y);
	if ((x<MAXANALOG_X/2) &&(y<MAXANALOG_Y/2)) {
		//kbletter 0..7
		if (deltax>=deltay) {
			//kbletter 0..3
			for (i=0;i<4;i++) {
				if (deltay*10000/deltax <=ANALOGTAN[i])
					return i;
			}
		}
		else {
			// kbletter 4..7
			for (i=0;i<4;i++) {
				if (deltax*10000/deltay<=ANALOGTAN[i])
					return (7-i);
			}
		}
	}
	else if ((x>MAXANALOG_X/2)&&(y<MAXANALOG_Y/2)) {
		// kbletter 8..15
		if (deltax<=deltay) {
			// kbletter 8..11
			for (i=0;i<4;i++) {
				if (deltax*10000/deltay<=ANALOGTAN[i])
					return (8+i);
			}
		}
		else {
			// kbletter 12..15
			for (i=0;i<4;i++) {
				if (deltay*10000/deltax<=ANALOGTAN[i])
					return (15-i);
			}
		}
	}
	else if ((x>MAXANALOG_X/2)&&(y>MAXANALOG_Y/2)) {
		// kbletter 16..23
		if (deltax>=deltay) {
			// kbletter 16.. 19
			for (i=0;i<4;i++){
				if (deltay*10000/deltax<=ANALOGTAN[i])
					return (16+i);
			}
		}
		else {
			// kbletter 20..23
			for (i=0;i<4;i++) {
				if (deltax*10000/deltay<=ANALOGTAN[i])
					return (23-i);
			}
		}
	}
	else if ((x<MAXANALOG_X/2)&&(y>MAXANALOG_Y/2)) {
		// kbletter 24..31
		if (deltax<=deltay) {
			// kbletter 24..27
			for (i=0;i<4;i++) {
				if (deltax*10000/deltay<=ANALOGTAN[i])
					return (24+i);
			}
		}
		else {
			// kbletter 28..31
			for (i=0;i<4;i++) {
				if (deltay*10000/deltax<=ANALOGTAN[i])
					return (31-i);
			}
		}
	}
}

void buildkeyxy(void)
{
	int i;
	int deltax1, deltay1, deltax2,deltay2;
	//build letter array
	for (i=0;i<8; i++) {
		deltax1 = (KBRADIUS * KEYCOS[i]+5000) / 10000;
		deltay1 = (deltax1 * KEYTAN[i]+5000) / 10000;
		deltax2 = (KBRADIUS * KEYCOS[7-i]+5000) / 10000;
		deltay2 = (deltax2 * KEYTAN[7-i]+5000)/ 10000;
		kb[i].x = KBCENTRE_X - deltax1;
		kb[i].y = KBCENTRE_Y - deltay1;
		kb[i+8].x = KBCENTRE_X +deltax2;
		kb[i+8].y = KBCENTRE_Y - deltay2;
		kb[i+16].x = KBCENTRE_X + deltax1;
		kb[i+16].y = KBCENTRE_Y + deltay1;
		kb[i+24].x= KBCENTRE_X -deltax2;
		kb[i+24].y= KBCENTRE_Y+deltay2;
	}
}

int getindex(char *inputstr)
{
	int i, mid, first, last;

	first = 0;
	last = wordcount-1;
	while(1) {
		mid=(first+last)/2;
	
		i = strcasecmp(inputstr, *(wordarray+mid));
		if (i==0) {
			break;
		}
		else if (i>0) {
			first=mid;
		}
		else {
			last=mid;
		}
		if ((last-first)<=1){
			//DBG_PRINT("first %s last %s", *(wordarray+first), *(wordarray+last));
			break;
		}
	}
	//DBG_PRINT(" %s/ %s/ %s", *(wordarray+first),*(wordarray+mid),*(wordarray+last));
	if ((mid>0) && (strcasecmp(inputstr, *(wordarray+mid-1))==0))
		return (mid-1);
	if (strcasecmp(inputstr, *(wordarray+mid))>0)
		return last;
	return mid;
}

void disp_ringkey_page(void);

void ydict_ringkey(int laststate)
{
	unsigned char x, y;
	unsigned int button;
	struct ydictctrl yctrl;

	buildkeyxy();

	memset(&myinput, 0, sizeof(struct inputbar));
	updatelist(0);
	curword = -1;
	currkb = &kbletters;

	while (1) {
		if ((curword !=-1)&&(curpage == 0)) {
			build_dictraw(&wordlist[curword]);
			curwordrows= (strlen(*(wordarray+wordlist[curword].index))+C_LEN)/C_LEN;
			dictpages = (curwordrows+dictrows+R_LEN)/R_LEN;
		}
		disp_ringkey_page();
		
		getcontrol(&yctrl);
		x = yctrl.x;
		y = yctrl.y;
		button = yctrl.buttons;
		if ((abs(MAXANALOG_X/2 -x)+abs(MAXANALOG_Y/2 -y)) >ANALOG_IGNORE) {
			// maybe should use (dx*dx + dy*dy) >ignore*ignore
			currkeyindex= getcurrentkeyindex(x, y);
			if (curword !=-1){
				memset(&myinput, 0, sizeof(struct inputbar));
				updatelist(0);
				curword =-1;
			}
		}
		else {
			// no analog input
			currkeyindex= -1;
		}
		switch (button) {
		case PSP_CTRL_SELECT:
			// 
			gstate = STATE_SWITCHMODE;
			return;
		case PSP_CTRL_START:
			memset(&myinput, 0, sizeof(struct inputbar));
			updatelist(0);
			curword = -1;
			break;
		case PSP_CTRL_CIRCLE:
			// input the currkey
			if ((myinput.cursor<INPUTBAR_SIZE )&&(currkeyindex!=-1)) {
				if ((currkb==&kbletters) && (*(currkb+currkeyindex)=='_'))
					myinput.string[myinput.cursor] = ' ';
				else
					myinput.string[myinput.cursor] = *(currkb+currkeyindex);
				myinput.cursor++;
				updatelist(getindex(myinput.string));
				curword =-1;
			}
			break;
		case PSP_CTRL_SQUARE:
			// erase last key
			if (myinput.cursor>0) {
				myinput.cursor--;
				myinput.string[myinput.cursor]=0;
				updatelist(getindex(myinput.string));
				curword =-1;
			}
			break;
		case PSP_CTRL_UP:
			// previous word
			if (curword == -1) {
				curword = WORDLIST_SIZE -1;
			}
			else if (curword == 0){
				int i;

				if (wordlist[curword].index >0) {
					i = wordlist[curword].index -1;
					updatelist(i);
					//updateidxword(i, &currange.mid);
					//update currange first
					//if (currange.first.index >= currange.mid.index)
					//	updateidxword(currange.mid.index, &currange.first);
				}
			}
			else {
				curword +=(WORDLIST_SIZE -1);
				curword %= WORDLIST_SIZE;
			}
			curpage = 0;
			break;
		case PSP_CTRL_DOWN:
			// next word
			if (curword == -1)
				curword = 0;
			else if (curword == (WORDLIST_SIZE-1)) {
				int i;

				if (wordlist[curword].index <(wordcount-1)) {
					i = wordlist[curword].index +1;
					updatelist(i-WORDLIST_SIZE+1);
					//updateidxword(i, &currange.mid);
					//update currange last
					//if (currange.last.index <= currange.mid.index)
					//	updateidxword(currange.mid.index, &currange.last);
				}
			}
			else {
				curword++;
				curword %= WORDLIST_SIZE;
			}
			curpage = 0;
			break;
		case PSP_CTRL_LEFT:
			//previous list
			if (wordlist[0].index <WORDLIST_SIZE)
				updatelist(0);
			else
				updatelist(wordlist[0].index - WORDLIST_SIZE);
			// left/right key do not change curword
			// but if curword has value, set curpage as 0 to update the dictraw info
			if (curword != -1){
				curword = 0;
				curpage = 0;
			}
			break;
		case PSP_CTRL_RIGHT:
			//next list
			if ((wordlist[0].index + WORDLIST_SIZE) > (wordcount - WORDLIST_SIZE))
				updatelist(wordcount - WORDLIST_SIZE);
			else
				updatelist(wordlist[0].index + WORDLIST_SIZE);
			// left/right key do not change curword
			// but if curword has value, set curpage as 0 to update the dictraw info
			if (curword != -1) {
				curword = 0;
				curpage = 0;
			}
			break;
		case PSP_CTRL_TRIANGLE:
			// change keyboard, or previous page in view mode
			{
				if (curword !=-1) {
					if (curpage>0)
						curpage--;
				}
				else {
					// change ring keyboard
					if (currkb == &kbletters)
						currkb = &kbnumbers;
					else
						currkb = &kbletters;
				}
			}
			break;
		case PSP_CTRL_CROSS:
			// view word dict, or next page in dict mode, or mark this word
			if (curword == -1) {
				curword = 0;
				curpage = 0;
			}
			else {
				if ((curpage+1)<dictpages)
					curpage++;
				else {
					if (tagfilep!=NULL) {
						int idx;
						unsigned char tag, c;
						idx = wordlist[curword].index;
						tag = *(tagfilep+idx);
						c = ((tag&0x03) +1) %3;
						*(tagfilep +idx) = (tag&0xF0) + c;
						tagchanged = 1;
					}
				}
			}
			break;
		case PSP_CTRL_LTRIGGER:
			if (tagfilep!=NULL)
			{
				int idx, i;
				unsigned char tag;
				// view the previous marked word
				if (curword ==-1)
					idx=wordlist[0].index;
				else

⌨️ 快捷键说明

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