📄 pickboardcfg.cpp
字号:
break; } // else fall through default: StringConfig::doMenu(i); } shift = 0; lit0 = -1;}QString DictFilterConfig::text(int r, int i){ QStringList l = r ? sets_a : input.isEmpty() ? othermodes : matches; return i < (int)l.count() ? (input.isEmpty() ? l[i] : capitalize(l[i])) : QString::null;}bool DictFilterConfig::spreadRow(int r){ return r ? TRUE : input.isEmpty() ? TRUE : FALSE;}QStringList DictFilterConfig::capitalize(const QStringList& l){ switch ( shift ) { case 1: { QStringList r; QStringList::ConstIterator it = l.begin(); r.append((*it).upper()); for (++it; it != l.end(); ++it) r.append(*it); return r; } case 2: { QStringList r; for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) r.append((*it).upper()); return r; } } return l;}QString DictFilterConfig::capitalize(const QString& s){ switch ( shift ) { case 1: { QString u = s; u[0] = u[0].upper(); return u; break; } case 2: return s.upper(); break; } return s;}void DictFilterConfig::pick(bool press, int row, int item){ if ( row == 0 ) { if ( press ) { if ( input.isEmpty() ) { lit0 = item; if ( othermodes[item] == PickboardPicks::tr("Space") ) { updateItem(row,item); generateText(" "); } else if ( othermodes[item] == PickboardPicks::tr("Back") ) { updateItem(row,item); generateKey(Qt::Key_Backspace); } else if ( othermodes[item] == PickboardPicks::tr("Enter") ) { updateItem(row,item); generateKey(Qt::Key_Return); } else if ( othermodes[item] == PickboardPicks::tr("Shift") ) { updateItem(row,item); shift = (shift+1)%3; } } } else { if ( !input.isEmpty() ) { input.clear(); if ( item>=0 ) { generateText(capitalize(matches[item])); } shift = 0; matches.clear(); updateRows(0,0); } else if ( item < 3 ) { lit0 = -1; changeMode(item+1); // I'm mode 0! #### updateRows(0,1); } if ( lit0 >= 0 ) { if ( !shift || othermodes[lit0] != PickboardPicks::tr("Shift") ) { updateItem(0,lit0); lit0 = -1; } } } } else { lit0 = -1; if ( press && item >= 0 ) { lit1 = item; add(sets[item]); updateItem(1,item); updateRows(0,0); } else { updateItem(1,lit1); lit1 = -1; } }}bool DictFilterConfig::scanMatch(const QString& set, const QChar& l) const{ return set == "?" || set == "*" || set.contains(l);}//static int visit=0;//static int lvisit=0;void DictFilterConfig::scan(const QDawg::Node* n, int ipos, const QString& str, int length, bool extend){ if ( n ) { do {//visit++; bool pastend = ipos >= (int)input.count(); if ( pastend && extend || !pastend && scanMatch(input[ipos],n->letter().lower()) ) { if ( length>1 ) { if ( !pastend && input[ipos] == "*" ) { scan(n->jump(),ipos+1,str+n->letter(),length-1,FALSE); scan(n->jump(),ipos,str+n->letter(),length,FALSE); } else { scan(n->jump(),ipos+1,str+n->letter(),length-1,extend); } } else { if ( n->isWord() ) { matches.append(str+n->letter()); } } } n = n->next(); } while (n); }}void DictFilterConfig::scanLengths(const QDawg::Node* n, int ipos, int& length_bitarray){ if ( n ) { do {//lvisit++; bool pastend = ipos >= (int)input.count(); if ( pastend || scanMatch(input[ipos],n->letter().lower()) ) { scanLengths(n->jump(),ipos+1,length_bitarray); if ( n->isWord() ) length_bitarray |= (1<<(ipos+1)); } n = n->next(); } while (n); }}void DictFilterConfig::add(const QString& set){ QFontMetrics fm = parent->fontMetrics(); input.append(set.lower()); matches.clear();//visit=0;//lvisit=0; int length_bitarray = 0; if ( input.count() > 4 ) { scanLengths(Global::addedDawg().root(),0,length_bitarray); scanLengths(Global::fixedDawg().root(),0,length_bitarray); } else { length_bitarray = 0xffffffff; } for (int len=input.count(); len<22 /* 32 */; ++len) { if ( length_bitarray & (1<<len) ) { scan(Global::addedDawg().root(),0,"",len,TRUE); scan(Global::fixedDawg().root(),0,"",len,TRUE); int x = 2; for (QStringList::Iterator it=matches.begin(); it!=matches.end(); ++it) { x += fm.width(*it)+intermatchmargin; if ( x >= parent->width() ) {//qDebug("%d+%d visits",lvisit,visit); return; // RETURN - No point finding more } } } if ( len == 1 && input.count() == 1 ) { // Allow all single-characters to show as "matches" for ( int i=0; i<(int)set.length(); i++ ) { QChar ch = set[i].lower(); matches.append(ch); } } }//qDebug("%d+%d visits",lvisit,visit);}bool DictFilterConfig::highlight(int r,int c) const{ return r == 0 ? c == lit0 : c == lit1;}void DictFilterConfig::addSet(const QString& appearance, const QString& set){ sets_a.append(appearance); sets.append(set);}void DictFilterConfig::addMode(const QString& s){ othermodes.append(s);}void DictFilterConfig::fillMenu(QPopupMenu& menu){ menu.insertItem(tr("Add..."),300); StringConfig::fillMenu(menu);}QValueList<QPixmap> KeycodeConfig::row(int i){ return i ? keypm2 : keypm1;}void KeycodeConfig::pickInRow(int r, int xpos, bool press){ QValueList<QPixmap> pl = row(r); QValueList<QPixmap>::Iterator it; int item=0; int x=xmarg; for (it=pl.begin(); it!=pl.end(); ++it) { int x2 = x + (*it).width(); if ( (*it).height() > 1 ) x2 += xw; if ( xpos >= x && xpos < x2 ) { pick(press, r, item); return; } x = x2; item++; }}void KeycodeConfig::pick(bool press, int row, int item){ if ( !press ) { if ( item >= 0 ) { int k = row == 0 ? keys1[item] : keys2[item]; if ( k ) generateKey(k); } changeMode(0); updateRows(0,1); }}void KeycodeConfig::draw(QPainter* p){ int y=3; QValueList<QPixmap>::Iterator it; for (int r=0; r<nrows; r++) { QValueList<QPixmap> pl = row(r); int x = xmarg; for (it=pl.begin(); it!=pl.end(); ++it) { if ( (*it).height() == 1 ) { // just a gap x += (*it).width(); } else { p->drawPixmap(x,y,*it); x += (*it).width()+xw; } } y += parent->height()/nrows; }}void KeycodeConfig::addKey(int r, const QPixmap& pm, int code){ if ( r == 0 ) { keypm1.append(pm); keys1.append(code); } else { keypm2.append(pm); keys2.append(code); }}void KeycodeConfig::addGap(int r, int w){ QBitmap pm(w,1); // ick. addKey(r,pm,0);}QString CharConfig::text(int r, int i){ QStringList l = r ? chars2 : chars1; return i < (int)l.count() ? l[i] : QString::null;}bool CharConfig::spreadRow(int){ return TRUE;}void CharConfig::pick(bool press, int row, int item){ if ( !press ) { if ( item >= 0 ) { generateText(row == 0 ? chars1[item] : chars2[item]); } changeMode(0); updateRows(0,1); }}void CharConfig::addChar(int r, const QString& s){ if ( r ) chars2.append(s); else chars1.append(s);}QString CharStringConfig::text(int r, int i){ QStringList l = r ? chars : QStringList(input); return i < (int)l.count() ? l[i] : QString::null;}bool CharStringConfig::spreadRow(int i){ return i ? TRUE : FALSE;}void CharStringConfig::pick(bool press, int row, int item){ if ( row == 0 ) { if ( !press ) { if ( item>=0 ) { generateText(input); } input = ""; changeMode(0); updateRows(0,1); } } else { if ( press && item >= 0 ) { input.append(chars[item]); updateRows(0,0); } }}void CharStringConfig::addChar(const QString& s){ chars.append(s);}void CharStringConfig::doMenu(int i){ if ( i == 100 ) { input = ""; updateRows(0,0); } StringConfig::doMenu(i);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -