@@ -77,6 +77,7 @@ pub struct EditorOptions {
7777 pub lookup_strategy : LookupStrategy ,
7878 pub conversion_engine : ConversionEngineKind ,
7979 pub enable_fullwidth_toggle_key : bool ,
80+ pub sort_candidates_by_frequency : bool ,
8081}
8182
8283impl Default for EditorOptions {
@@ -97,6 +98,7 @@ impl Default for EditorOptions {
9798 // FIXME may be out of sync with the engine used
9899 conversion_engine : ConversionEngineKind :: ChewingEngine ,
99100 enable_fullwidth_toggle_key : true ,
101+ sort_candidates_by_frequency : false ,
100102 }
101103 }
102104}
@@ -1558,7 +1560,7 @@ mod tests {
15581560 use crate :: {
15591561 conversion:: ChewingEngine ,
15601562 dictionary:: { Layered , TrieBuf } ,
1561- editor:: { EditorKeyBehavior , SymbolSelector , abbrev:: AbbrevTable , estimate} ,
1563+ editor:: { EditorKeyBehavior , EditorOptions , SymbolSelector , abbrev:: AbbrevTable , estimate} ,
15621564 input:: {
15631565 KeyboardEvent , keycode,
15641566 keymap:: { QWERTY_MAP , map_ascii} ,
@@ -1641,6 +1643,102 @@ mod tests {
16411643 assert_eq ! ( "冊" , editor. display( ) ) ;
16421644 }
16431645
1646+ #[ test]
1647+ fn editing_mode_input_bopomofo_select ( ) {
1648+ let dict = TrieBuf :: from ( [ (
1649+ vec ! [ crate :: syl![ Bopomofo :: C , Bopomofo :: E , Bopomofo :: TONE4 ] ] ,
1650+ vec ! [ ( "冊" , 100 ) , ( "測" , 200 ) ] ,
1651+ ) ] ) ;
1652+ let dict = Layered :: new ( vec ! [ Box :: new( dict) ] , Box :: new ( TrieBuf :: new_in_memory ( ) ) ) ;
1653+ let conversion_engine = Box :: new ( ChewingEngine :: new ( ) ) ;
1654+ let estimate = LaxUserFreqEstimate :: new ( 0 ) ;
1655+ let abbrev = AbbrevTable :: new ( ) ;
1656+ let sym_sel = SymbolSelector :: default ( ) ;
1657+ let mut editor = Editor :: new ( conversion_engine, dict, estimate, abbrev, sym_sel) ;
1658+
1659+ editor. set_editor_options ( EditorOptions {
1660+ sort_candidates_by_frequency : false ,
1661+ ..Default :: default ( )
1662+ } ) ;
1663+
1664+ editor. process_keyevent (
1665+ KeyboardEvent :: builder ( )
1666+ . code ( keycode:: KEY_H )
1667+ . ksym ( keysym:: SYM_LOWER_H )
1668+ . build ( ) ,
1669+ ) ;
1670+ editor. process_keyevent (
1671+ KeyboardEvent :: builder ( )
1672+ . code ( keycode:: KEY_K )
1673+ . ksym ( keysym:: SYM_LOWER_H )
1674+ . build ( ) ,
1675+ ) ;
1676+ editor. process_keyevent (
1677+ KeyboardEvent :: builder ( )
1678+ . code ( keycode:: KEY_4 )
1679+ . ksym ( keysym:: SYM_4 )
1680+ . build ( ) ,
1681+ ) ;
1682+ editor. process_keyevent (
1683+ KeyboardEvent :: builder ( )
1684+ . code ( keycode:: KEY_DOWN )
1685+ . ksym ( keysym:: SYM_DOWN )
1686+ . build ( ) ,
1687+ ) ;
1688+ let candidates = editor
1689+ . all_candidates ( )
1690+ . expect ( "should be in selection mode" ) ;
1691+ assert_eq ! ( vec![ "冊" , "測" ] , candidates) ;
1692+ }
1693+
1694+ #[ test]
1695+ fn editing_mode_input_bopomofo_select_sorted ( ) {
1696+ let dict = TrieBuf :: from ( [ (
1697+ vec ! [ crate :: syl![ Bopomofo :: C , Bopomofo :: E , Bopomofo :: TONE4 ] ] ,
1698+ vec ! [ ( "冊" , 100 ) , ( "測" , 200 ) ] ,
1699+ ) ] ) ;
1700+ let dict = Layered :: new ( vec ! [ Box :: new( dict) ] , Box :: new ( TrieBuf :: new_in_memory ( ) ) ) ;
1701+ let conversion_engine = Box :: new ( ChewingEngine :: new ( ) ) ;
1702+ let estimate = LaxUserFreqEstimate :: new ( 0 ) ;
1703+ let abbrev = AbbrevTable :: new ( ) ;
1704+ let sym_sel = SymbolSelector :: default ( ) ;
1705+ let mut editor = Editor :: new ( conversion_engine, dict, estimate, abbrev, sym_sel) ;
1706+
1707+ editor. set_editor_options ( EditorOptions {
1708+ sort_candidates_by_frequency : true ,
1709+ ..Default :: default ( )
1710+ } ) ;
1711+
1712+ editor. process_keyevent (
1713+ KeyboardEvent :: builder ( )
1714+ . code ( keycode:: KEY_H )
1715+ . ksym ( keysym:: SYM_LOWER_H )
1716+ . build ( ) ,
1717+ ) ;
1718+ editor. process_keyevent (
1719+ KeyboardEvent :: builder ( )
1720+ . code ( keycode:: KEY_K )
1721+ . ksym ( keysym:: SYM_LOWER_H )
1722+ . build ( ) ,
1723+ ) ;
1724+ editor. process_keyevent (
1725+ KeyboardEvent :: builder ( )
1726+ . code ( keycode:: KEY_4 )
1727+ . ksym ( keysym:: SYM_4 )
1728+ . build ( ) ,
1729+ ) ;
1730+ editor. process_keyevent (
1731+ KeyboardEvent :: builder ( )
1732+ . code ( keycode:: KEY_DOWN )
1733+ . ksym ( keysym:: SYM_DOWN )
1734+ . build ( ) ,
1735+ ) ;
1736+ let candidates = editor
1737+ . all_candidates ( )
1738+ . expect ( "should be in selection mode" ) ;
1739+ assert_eq ! ( vec![ "測" , "冊" ] , candidates) ;
1740+ }
1741+
16441742 #[ test]
16451743 fn editing_mode_input_chinese_to_english_mode ( ) {
16461744 let dict = TrieBuf :: from ( [ (
0 commit comments