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

📄 sugarmemolearn.c

📁 最好用的背单词软件, palm 平台, 如果能移植到别的平台
💻 C
📖 第 1 页 / 共 3 页
字号:
		p += strLength;
		(*top) += FntLineHeight();
	}
}

void RemoveBlankHead(char** p){
	while ((**p) == 9 			//Horizontal Tabulation
			|| (**p) == 10		//Line Feed
			|| (**p) == 13		//Carrige Return
			|| (**p) == 32)		//Space
		(*p)++;
}

void UpdateScrollers(){
	
	UInt16 upIndex, downIndex;
	Boolean Scrollup = false;
	Boolean Scrolldown = false;
	FormType* frmP = FrmGetActiveForm();
	RectangleType bounds = GetCanvasBounds();
	
	if (CurrentTop < bounds.topLeft.y || CurrentTop > 160)
		Scrollup = true;

	if (CurrentTop + CurrentHeight > bounds.topLeft.y + bounds.extent.y)
		Scrolldown = true;
	
	upIndex = FrmGetObjectIndex(frmP, LearnScrollUpRepeating);
	downIndex = FrmGetObjectIndex(frmP, LearnScrollDownRepeating);
	
	FrmUpdateScrollers(frmP, upIndex, downIndex, Scrollup, Scrolldown);
}

void ScrollCanvas(Boolean up){

	SugarAppInfoType* app;
	WordRecordType record;
	MemHandle recordH;
	UInt16 height = 0;
	FontID font;
	
	app = GetAppInfoPtr(CurrentDB);
	GetWordRecord(CurrentDB, CurrentRecord, &record, &recordH);
	
	font = FntSetFont(app->learnFieldFont[CurrentAnswerField]);
	DrawFieldHeight(record.field[CurrentAnswerField], &height, app->learnFieldAlignment[CurrentAnswerField], false);
	
	MemPtrUnlock(app);
	MemHandleUnlock(recordH);
	
	if (up){
		if (CurrentAnswerTop + AnswerPane.extent.y - FntLineHeight() > AnswerPane.extent.y)
			CurrentAnswerTop += AnswerPane.extent.y - FntLineHeight();
		else
			CurrentAnswerTop = 0; 
	}
	else{
		if (CurrentAnswerTop + height - AnswerPane.extent.y > AnswerPane.extent.y - FntLineHeight())
			CurrentAnswerTop -= AnswerPane.extent.y - FntLineHeight();
		else
			CurrentAnswerTop = AnswerPane.extent.y - height;
	}

	DrawAnswerPane();	
}

void LoadControls(){

	FormType * frmP = FrmGetActiveForm();
	
	if (GetBitMacro(controlFlag.allBits, nextControl)!= 0) ShowObject(LearnNextButton);
	else	HideObject(LearnNextButton);
	
	//show answer button
	if (GetBitMacro(controlFlag.allBits, showControl)!= 0) ShowObject(LearnShowButton);
	else	HideObject(LearnShowButton);
	
	//right push
	if (GetBitMacro(controlFlag.allBits, rightControl)!= 0) ShowObject(LearnRightPushButton);
	else	HideObject(LearnRightPushButton);

	//wrong push
	if (GetBitMacro(controlFlag.allBits, wrongControl)!= 0) ShowObject(LearnWrongPushButton);
	else 	HideObject(LearnWrongPushButton);

	//bingo push
	if (GetBitMacro(controlFlag.allBits, bingoControl)!= 0) ShowObject(LearnBingoPushButton);
	else	HideObject(LearnBingoPushButton);

	//pass push
	if (GetBitMacro(controlFlag.allBits, passControl)!= 0)
		FrmShowObject(frmP, FrmGetObjectIndex(frmP, LearnPassPushButton));
	else
		FrmHideObject(frmP, FrmGetObjectIndex(frmP, LearnPassPushButton));
	
	//fail push
	if (GetBitMacro(controlFlag.allBits, failControl)!= 0)
		FrmShowObject(frmP, FrmGetObjectIndex(frmP, LearnFailPushButton));
	else
		FrmHideObject(frmP, FrmGetObjectIndex(frmP, LearnFailPushButton));
	
	if (PushSelection == noSelectedControl){
	
		if (controlFlag.allBits == ShowRightWrong){
			SwitchButtonOff(LearnRightPushButton);		
			SwitchButtonOff(LearnWrongPushButton);
		}
	
		if (controlFlag.allBits == ShowBingoPassFail){
			SwitchButtonOff(LearnBingoPushButton);
			SwitchButtonOff(LearnPassPushButton);
			SwitchButtonOff(LearnFailPushButton);
		}
	}
	
	
	if (PushSelection == rightControl) 
		FrmSetControlGroupSelection(frmP, RightWrongGroup, LearnRightPushButton);
	
	if (PushSelection == wrongControl)
		FrmSetControlGroupSelection(frmP, RightWrongGroup, LearnWrongPushButton);
		
	if (PushSelection == bingoControl)
		FrmSetControlGroupSelection(frmP, BingoPassFailGroup, LearnBingoPushButton);
	
	if (PushSelection == passControl)
		FrmSetControlGroupSelection(frmP, BingoPassFailGroup, LearnPassPushButton);
		
	if (PushSelection == failControl)
		FrmSetControlGroupSelection(frmP, BingoPassFailGroup, LearnFailPushButton);

}

Boolean LoadWord(){
	
	HeaderItem item;
	LearningStatus status;
	Err error;
	
	while(true) {
		if (0 == GetHeaderItemNumber(CurrentDB, HeaderRecordIndex)){
			Finish();
			return false;
		}
		
		GetHeaderItem(CurrentDB, HeaderRecordIndex, &item, 0); //fetch first item
		error = DmFindRecordByID(CurrentDB, item, &CurrentRecord);
		if (error) ErrAlert(error);
		if (error == errNone) break; 
		RemoveHeaderItem(CurrentDB, HeaderRecordIndex, 0);
	}
	
	if (HeaderRecordIndex == LearningRecordIndex){
		status = GetLearningStatus(CurrentDB, CurrentRecord);
				
		switch(status){
			case FirstLook:
				ShowAnswerPane = true;
				controlFlag.allBits = ShowNext;
				fieldFlag.allBits = GetAnswerPageFields();
				break;
			
			case TranslationRecollection:
			case WordRecollection:
			case TranslationTest:
			case WordTest:
				ShowAnswerPane = false;
				controlFlag.allBits = ShowShowAnswer;
				fieldFlag.allBits = GetQuestionPageFields();
				break;
		}				
	}
	else if (HeaderRecordIndex == TestingRecordIndex){
		ShowAnswerPane = false;
		controlFlag.allBits = ShowShowAnswer;
		fieldFlag.allBits = GetQuestionPageFields();
	}
	
	CurrentTop = GetCanvasBounds().topLeft.y;
	
	return true;
}

UInt16 GetQuestionPageFields(){
	WordFieldFlags flag;
	SugarAppInfoType* app;
	app = GetAppInfoPtr(CurrentDB);
	flag = app->questionPageFields;
	MemPtrUnlock(app);
	return flag.allBits;	
}

UInt16 GetAnswerPageFields(){
	WordFieldFlags flag;
	SugarAppInfoType* app;
	app = GetAppInfoPtr(CurrentDB);
	flag = app->answerPageFields;
	MemPtrUnlock(app);
	return flag.allBits;	
}


void DoControlShowButton(){

	ShowAnswerPane = true;
	if (HeaderRecordIndex == LearningRecordIndex){
		

		if (GetLearningStatus(CurrentDB, CurrentRecord) == TranslationTest){
			controlFlag.allBits = ShowRightWrong;
		}
	
		else{
			
			controlFlag.allBits = ShowNext;
		}
		
	}
	
	if (HeaderRecordIndex == TestingRecordIndex){
		controlFlag.allBits = ShowBingoPassFail;
	}
	
	fieldFlag.allBits = GetAnswerPageFields();

	CurrentTop = GetCanvasBounds().topLeft.y;
	PushSelection = noSelectedControl;
	LoadControls();
	DrawCanvas();
}

void DoControlNext(){
/*
	HeaderQueue queue;
	LearningStatus learningStatus;
	TestingStatus testingStatus;
	MemorizingStatus memoStatus;
	DateType zeroDate = {0, 0, 0};
	DateType today;
	Int32 interval;
	FormType* frmP;
	ControlType* ctl;
	
	ClearAnswerTab();
	
	DateSecondsToDate(TimGetSeconds(), &today);
	
	if (HeaderRecordIndex == LearningRecordIndex){
		queue = GetQueue(CurrentDB, CurrentRecord);
		learningStatus = GetLearningStatus(CurrentDB, CurrentRecord);
		memoStatus = GetMemorizingStatus(CurrentDB, CurrentRecord);
		
		switch(learningStatus){
			case FirstLook:
				SetLearningStatus(CurrentDB, CurrentRecord, TranslationRecollection);
				MoveHeaderItem(CurrentDB, HeaderRecordIndex, 6);
				break;		
			
			case TranslationRecollection:
				SetLearningStatus(CurrentDB, CurrentRecord, WordRecollection);
				MoveHeaderItem(CurrentDB, HeaderRecordIndex, 13);
				break;
			
			case WordRecollection:
				SetLearningStatus(CurrentDB, CurrentRecord, TranslationTest);
				MoveHeaderItem(CurrentDB, HeaderRecordIndex, 55);
				break;
				
			case TranslationTest:

				if (PushSelection == rightControl){ //right button pushed
					SetQueue(CurrentDB, CurrentRecord, TestingQueue);
					
					//clear learning/testing status
					SetLearningStatus(CurrentDB, CurrentRecord, FirstLook);     //i.e. clear ltstatus
					
					//set memo status
					memoStatus.difficulty = Difficulty(memoStatus.eFactor);
					memoStatus.step = 1;
					memoStatus.currentTest = zeroDate;
					memoStatus.nextTest = today;
					
					interval = 8 - (Int32)((memoStatus.eFactor - 1.3) * 3 / 1.2);
					
					DateAdjust(&memoStatus.nextTest, interval);

					//set first learn;
					if (ZeroDate(memoStatus.firstLearn))
						memoStatus.firstLearn = today;
										
					//set memo status
					SetMemorizingStatus(CurrentDB, CurrentRecord, memoStatus);	
				}
				else if (PushSelection == wrongControl){
					MoveHeaderItem(CurrentDB, HeaderRecordIndex, 55);
				}
				
				//!!! Clear Selection
				frmP = FrmGetActiveForm();
				ctl = FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, LearnWrongPushButton));
				CtlSetValue(ctl, 0);
				ctl = FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, LearnRightPushButton));
				CtlSetValue(ctl, 0);

				PushSelection = noSelectedControl;
				break;
		
		}//end switching learning status
	
	} //end if learning
	
	else if (HeaderRecordIndex == TestingRecordIndex){
		
		queue = GetQueue(CurrentDB, CurrentRecord); 
		testingStatus = GetTestingStatus(CurrentDB, CurrentRecord);
		memoStatus = GetMemorizingStatus(CurrentDB, CurrentRecord);
		
		
		if (queue == TestingQueue){
			switch (PushSelection){
				
				case bingoControl:
					
					if (memoStatus.step == 1){
						//bingo times accumulate
						testingStatus.bingoed = 1;	
						testingStatus.passed = 0;
						testingStatus.failed = 0;
						
						
						memoStatus.totalRecall += 1;
						memoStatus.step = 2;
						memoStatus.lastTest = today;
						memoStatus.currentTest = zeroDate;
						memoStatus.nextTest = today;
						interval = (Int32)((memoStatus.eFactor - 1.3) * 8 / 1.2) + 13;
						DateAdjust(& memoStatus.nextTest, interval); 
						break;
					}
					
					//if successive bingo, adjust eFactor
					if (testingStatus.bingoed > 2){			
						testingStatus.bingoed = 0;
						testingStatus.passed = 0;
						testingStatus.failed = 0;
						
						memoStatus.eFactor += 0.1;
						memoStatus.difficulty = Difficulty(memoStatus.eFactor);
						
						interval = (DateToDays(memoStatus.nextTest) - DateToDays(memoStatus.lastTest)) * (memoStatus.eFactor - 0.1);
						memoStatus.totalRecall += 1;
						memoStatus.step += 1;
						memoStatus.lastTest = today;
						memoStatus.currentTest = zeroDate;
						memoStatus.nextTest = today;
						DateAdjust(& memoStatus.nextTest, interval);
						break;	
					}
					// do not adjust efactor					
					
					testingStatus.bingoed += 1;
					testingStatus.passed = 0;
					testingStatus.failed = 0;

					interval = (DateToDays(memoStatus.nextTest) - DateToDays(memoStatus.lastTest)) * (memoStatus.eFactor - 0.1);
					memoStatus.totalRecall += 1;
					memoStatus.step += 1;
					memoStatus.lastTest = today;
					memoStatus.currentTest = zeroDate;
					memoStatus.nextTest = today;
					DateAdjust(& memoStatus.nextTest, interval);
					
					break;
									
				case passControl:
					//queue = PassedQueue;
					testingStatus.bingoed = 0;
					testingStatus.passed = 1;
					testingStatus.failed = 0;
					memoStatus.currentTest = today;
					
					break;
					
				case failControl:
					//queue = FailedQueue;
					testingStatus.bingoed = 0;
					testingStatus.passed = 0;
					testingStatus.failed = 1;

					break;						
			
			}
		
		}
		
		else if (queue == TestingQueue){
			switch (PushSelection){
				case bingoControl:
					if (memoStatus.step == 1){
						queue = TestingQueue;
						//bingo times accumulate
						testingStatus.bingoed = 0;	
						testingStatus.passed = 0;
						testingStatus.failed = 0;
						
						memoStatus.eFactor -= 0.14;
						if (memoStatus.eFactor < 1.3) memoStatus.eFactor = 1.3;
						
						memoStatus.difficulty = Difficulty(memoStatus.eFactor);
						memoStatus.totalRecall += 1;
						memoStatus.step = 2;
						memoStatus.lastTest = today;
						memoStatus.currentTest = zeroDate;
						memoStatus.nextTest = today;
						
						interval = (Int32)((memoStatus.eFactor - 1.3) * 8 / 1.2) + 13;
						DateAdjust(& memoStatus.nextTest, interval); 
						break;
					}
					
					
					
					queue = TestingQueue;
					
					testingStatus.bingoed = 0;
					testingStatus.passed = 0;
					testingStatus.failed = 0;
					
					memoStatus.eFactor -= 0.14;
					if (memoStatus.eFactor < 1.3) memoStatus.eFactor = 1.3;
					
					memoStatus.difficulty = Difficulty(memoStatus.eFactor);
					memoStatus.totalRecall += 1;
					memoStatus.step += 1;
					
					interval = (DateToDays(memoStatus.nextTest) - DateToDays(memoStatus.lastTest)) * (memoStatus.eFactor - 0.1);
					memoStatus.lastTest = today;
					memoStatus.currentTest = zeroDate;
					memoStatus.nextTest = today;
					DateAdjust(&memoStatus.nextTest, interval);

					break;
					
				case passControl:
					testingStatus.passed +=1;
					break;
			
				case failControl:
					//queue = FailedQueue;
					testingStatus.bingoed = 0;

⌨️ 快捷键说明

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