📄 sugarmemolearn.c
字号:
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 + -