diff --git a/linux/blitztext/gtksettings.py b/linux/blitztext/gtksettings.py index 7296a97..87559ea 100644 --- a/linux/blitztext/gtksettings.py +++ b/linux/blitztext/gtksettings.py @@ -34,20 +34,89 @@ RESP_SAVE = 1 RESP_SAVE_RESTART = 2 GREEN, RED, GREY = "#34c759", "#ff3b30", "#b8b8be" -_PICKER_EMOJIS = ( - # Lightning / common defaults - "โšก", "๐ŸŽค", "๐Ÿ“", "โœ‰๏ธ", "๐Ÿ“‹", "๐Ÿ’ฌ", "๐Ÿ“ข", "๐Ÿ””", "๐Ÿ’ก", "๐Ÿ”", - # Status / actions - "โœ…", "โŒ", "๐Ÿ”„", "โ–ถ๏ธ", "โบ๏ธ", "๐Ÿš€", "โญ", "โœจ", "๐ŸŽฏ", "๐Ÿ†", - # Tech / tools - "๐Ÿ’ป", "โŒจ๏ธ", "๐Ÿ”ง", "โš™๏ธ", "๐Ÿ› ๏ธ", "๐Ÿ’พ", "๐Ÿ“ฑ", "๐ŸŒ", "๐Ÿ“Š", "๐Ÿ“ˆ", - # People / reactions - "๐Ÿ˜€", "๐Ÿ˜Š", "๐Ÿ‘", "๐Ÿค–", "๐Ÿ™Œ", "๐Ÿ‘‹", "๐ŸŽ“", "๐ŸŽต", "๐Ÿ“–", "๐Ÿ”", - # Writing / documents - "๐Ÿ“ง", "๐Ÿ—จ๏ธ", "๐Ÿ“จ", "๐Ÿ—’๏ธ", "โœ๏ธ", "๐Ÿ–Š๏ธ", "๐Ÿ“‘", "๐Ÿ–‹๏ธ", "๐Ÿ“ƒ", "๐Ÿ“„", - # Misc useful - "๐ŸŒŸ", "๐Ÿ’ซ", "๐Ÿ”", "๐Ÿ”€", "โธ๏ธ", "โน๏ธ", "๐Ÿ ", "๐Ÿ’ฐ", "๐ŸŽถ", "๐ŸŒˆ", -) +# (cat_emoji, label, [emojis]) โ€” standard Unicode categories, WhatsApp-style +_EMOJI_CATEGORIES: list[tuple[str, str, list[str]]] = [ + ("๐Ÿ˜€", "Smileys", [ + "๐Ÿ˜€","๐Ÿ˜ƒ","๐Ÿ˜„","๐Ÿ˜","๐Ÿ˜†","๐Ÿ˜…","๐Ÿคฃ","๐Ÿ˜‚","๐Ÿ™‚","๐Ÿ™ƒ","๐Ÿ˜‰","๐Ÿ˜Š","๐Ÿ˜‡", + "๐Ÿฅฐ","๐Ÿ˜","๐Ÿคฉ","๐Ÿ˜˜","๐Ÿ˜—","๐Ÿ˜š","๐Ÿ˜™","๐Ÿฅฒ","๐Ÿ˜‹","๐Ÿ˜›","๐Ÿ˜œ","๐Ÿคช","๐Ÿ˜", + "๐Ÿค‘","๐Ÿค—","๐Ÿคญ","๐Ÿคซ","๐Ÿค”","๐Ÿค","๐Ÿคจ","๐Ÿ˜","๐Ÿ˜‘","๐Ÿ˜ถ","๐Ÿ˜","๐Ÿ˜’","๐Ÿ™„", + "๐Ÿ˜ฌ","๐Ÿคฅ","๐Ÿ˜Œ","๐Ÿ˜”","๐Ÿ˜ช","๐Ÿคค","๐Ÿ˜ด","๐Ÿ˜ท","๐Ÿค’","๐Ÿค•","๐Ÿคข","๐Ÿคฎ","๐Ÿคง", + "๐Ÿฅต","๐Ÿฅถ","๐Ÿฅด","๐Ÿ˜ต","๐Ÿคฏ","๐Ÿค ","๐Ÿฅณ","๐Ÿฅธ","๐Ÿ˜Ž","๐Ÿค“","๐Ÿง","๐Ÿ˜•","๐Ÿ˜Ÿ", + "๐Ÿ™","๐Ÿ˜ฎ","๐Ÿ˜ฏ","๐Ÿ˜ฒ","๐Ÿ˜ณ","๐Ÿฅบ","๐Ÿ˜ฆ","๐Ÿ˜ง","๐Ÿ˜จ","๐Ÿ˜ฐ","๐Ÿ˜ฅ","๐Ÿ˜ข","๐Ÿ˜ญ", + "๐Ÿ˜ฑ","๐Ÿ˜–","๐Ÿ˜ฃ","๐Ÿ˜ž","๐Ÿ˜“","๐Ÿ˜ฉ","๐Ÿ˜ซ","๐Ÿฅฑ","๐Ÿ˜ค","๐Ÿ˜ก","๐Ÿ˜ ","๐Ÿคฌ","๐Ÿ˜ˆ", + "๐Ÿ‘ฟ","๐Ÿ’€","โ˜ ๏ธ","๐Ÿ’ฉ","๐Ÿคก","๐Ÿ‘น","๐Ÿ‘บ","๐Ÿ‘ป","๐Ÿ‘ฝ","๐Ÿ‘พ","๐Ÿค–", + ]), + ("๐Ÿ‘‹", "People", [ + "๐Ÿ‘‹","๐Ÿคš","๐Ÿ–๏ธ","โœ‹","๐Ÿ––","๐Ÿ‘Œ","๐ŸคŒ","๐Ÿค","โœŒ๏ธ","๐Ÿคž","๐ŸคŸ","๐Ÿค˜","๐Ÿค™", + "๐Ÿ‘ˆ","๐Ÿ‘‰","๐Ÿ‘†","๐Ÿ–•","๐Ÿ‘‡","โ˜๏ธ","๐Ÿ‘","๐Ÿ‘Ž","โœŠ","๐Ÿ‘Š","๐Ÿค›","๐Ÿคœ","๐Ÿ‘", + "๐Ÿ™Œ","๐Ÿ‘","๐Ÿคฒ","๐Ÿค","๐Ÿ™","โœ๏ธ","๐Ÿ’…","๐Ÿ’ช","๐Ÿฆพ","๐Ÿ‘‚","๐Ÿ‘ƒ","๐Ÿ‘€","๐Ÿ‘…", + "๐Ÿ‘„","๐Ÿ’‹","๐Ÿ‘ถ","๐Ÿง’","๐Ÿ‘ฆ","๐Ÿ‘ง","๐Ÿง‘","๐Ÿ‘ฑ","๐Ÿ‘จ","๐Ÿง”","๐Ÿ‘ฉ","๐Ÿง“","๐Ÿ‘ด", + "๐Ÿ‘ต","๐Ÿ™","๐Ÿ™Ž","๐Ÿ™…","๐Ÿ™†","๐Ÿ’","๐Ÿ™‹","๐Ÿง","๐Ÿ™‡","๐Ÿคฆ","๐Ÿคท","๐Ÿ’†","๐Ÿ’‡", + "๐Ÿšถ","๐Ÿƒ","๐Ÿ’ƒ","๐Ÿ•บ","๐Ÿง–","๐Ÿง—","๐Ÿคธ","โ›น๏ธ","๐Ÿ‹๏ธ","๐Ÿคผ","๐Ÿง˜","๐Ÿ›€","๐Ÿ›Œ", + "๐Ÿ‘ฎ","๐Ÿ•ต๏ธ","๐Ÿ’‚","๐Ÿฅท","๐Ÿ‘ท","๐Ÿซ…","๐Ÿคด","๐Ÿ‘ธ","๐Ÿง™","๐Ÿง","๐Ÿง›","๐ŸงŸ","๐Ÿงž", + "๐Ÿงœ","๐Ÿงš","๐Ÿ‘ผ","๐Ÿคถ","๐ŸŽ…","๐Ÿฆธ","๐Ÿฆน","๐Ÿง‘โ€๐Ÿณ","๐Ÿง‘โ€๐ŸŽ“","๐Ÿง‘โ€๐Ÿซ","๐Ÿง‘โ€โš•๏ธ","๐Ÿง‘โ€๐Ÿ’ผ","๐Ÿง‘โ€๐Ÿ”ง","๐Ÿง‘โ€๐Ÿ’ป", + ]), + ("๐Ÿถ", "Animals", [ + "๐Ÿถ","๐Ÿฑ","๐Ÿญ","๐Ÿน","๐Ÿฐ","๐ŸฆŠ","๐Ÿป","๐Ÿผ","๐Ÿจ","๐Ÿฏ","๐Ÿฆ","๐Ÿฎ","๐Ÿท", + "๐Ÿธ","๐Ÿต","๐Ÿ™ˆ","๐Ÿ™‰","๐Ÿ™Š","๐Ÿ’","๐Ÿ”","๐Ÿง","๐Ÿฆ","๐Ÿค","๐Ÿฆ†","๐Ÿฆ…","๐Ÿฆ‰", + "๐Ÿฆ‡","๐Ÿบ","๐Ÿ—","๐Ÿด","๐Ÿฆ„","๐Ÿ","๐Ÿ›","๐Ÿฆ‹","๐ŸŒ","๐Ÿž","๐Ÿœ","๐ŸฆŸ","๐Ÿฆ—", + "๐Ÿ•ท๏ธ","๐Ÿฆ‚","๐Ÿข","๐Ÿ","๐ŸฆŽ","๐Ÿ™","๐Ÿฆ‘","๐Ÿฆ","๐Ÿฆ€","๐Ÿก","๐Ÿ ","๐ŸŸ","๐Ÿฌ", + "๐Ÿณ","๐Ÿ‹","๐Ÿฆˆ","๐ŸŠ","๐Ÿ…","๐Ÿ†","๐Ÿฆ“","๐Ÿฆ","๐Ÿ˜","๐Ÿฆ","๐Ÿช","๐Ÿฆ’","๐Ÿฆ˜", + "๐Ÿƒ","๐Ÿ„","๐ŸŽ","๐Ÿ–","๐Ÿ","๐Ÿ‘","๐Ÿฆ™","๐Ÿ","๐ŸฆŒ","๐Ÿ•","๐Ÿฉ","๐Ÿฆฎ","๐Ÿˆ", + "๐Ÿ“","๐Ÿฆƒ","๐Ÿฆš","๐Ÿฆœ","๐Ÿฆข","๐Ÿฆฉ","๐Ÿ•Š๏ธ","๐Ÿ‡","๐Ÿฆ","๐Ÿฆจ","๐Ÿฆก","๐Ÿฆฆ","๐Ÿฆฅ", + "๐Ÿ","๐Ÿ€","๐Ÿฟ๏ธ","๐Ÿฆ”","๐Ÿ‰","๐Ÿฒ","๐ŸŒต","๐ŸŒฒ","๐ŸŒณ","๐ŸŒด","๐ŸŒฟ","โ˜˜๏ธ","๐Ÿ€", + "๐ŸŽ‹","๐ŸŽ","๐Ÿƒ","๐Ÿ‚","๐Ÿ","๐ŸŒพ","๐ŸŒบ","๐ŸŒธ","๐ŸŒผ","๐ŸŒป","๐ŸŒน","๐Ÿฅ€","๐ŸŒท", + ]), + ("๐ŸŽ", "Food", [ + "๐Ÿ","๐ŸŽ","๐Ÿ","๐ŸŠ","๐Ÿ‹","๐ŸŒ","๐Ÿ‰","๐Ÿ‡","๐Ÿ“","๐Ÿซ","๐Ÿ’","๐Ÿ‘","๐Ÿฅญ", + "๐Ÿ","๐Ÿฅฅ","๐Ÿฅ","๐Ÿ…","๐Ÿ†","๐Ÿฅ‘","๐Ÿฅฆ","๐Ÿฅฌ","๐Ÿฅ’","๐ŸŒถ๏ธ","๐Ÿง„","๐Ÿง…","๐Ÿฅ”", + "๐ŸŒฝ","๐Ÿฅ•","๐Ÿž","๐Ÿฅ","๐Ÿฅ–","๐Ÿฅจ","๐Ÿง€","๐Ÿฅš","๐Ÿณ","๐Ÿงˆ","๐Ÿฅž","๐Ÿฅ“","๐Ÿฅฉ", + "๐Ÿ—","๐Ÿ–","๐ŸŒญ","๐Ÿ”","๐ŸŸ","๐Ÿ•","๐ŸŒฎ","๐ŸŒฏ","๐Ÿฅ™","๐Ÿฅš","๐Ÿฒ","๐Ÿฅ—","๐Ÿฟ", + "๐Ÿง‚","๐Ÿฑ","๐Ÿฃ","๐Ÿ›","๐Ÿœ","๐Ÿ","๐Ÿข","๐ŸฅŸ","๐Ÿฅ ","๐Ÿฅก","๐Ÿฆ","๐Ÿง","๐Ÿจ", + "๐Ÿฉ","๐Ÿช","๐ŸŽ‚","๐Ÿฐ","๐Ÿง","๐Ÿซ","๐Ÿฌ","๐Ÿญ","๐Ÿฎ","๐Ÿฏ","๐Ÿฅ›","โ˜•","๐Ÿต", + "๐Ÿงƒ","๐Ÿฅค","๐Ÿง‹","๐Ÿบ","๐Ÿป","๐Ÿฅ‚","๐Ÿท","๐Ÿฅƒ","๐Ÿธ","๐Ÿน","๐Ÿพ","๐ŸงŠ","๐Ÿด", + ]), + ("๐Ÿ ", "Travel", [ + "๐Ÿš—","๐Ÿš•","๐Ÿš™","๐ŸšŒ","๐ŸŽ๏ธ","๐Ÿš“","๐Ÿš‘","๐Ÿš’","๐Ÿš","๐Ÿ›ป","๐Ÿšš","๐Ÿš›","๐Ÿšœ", + "๐Ÿ๏ธ","๐Ÿ›ต","๐Ÿšฒ","๐Ÿ›ด","๐Ÿ›น","โš“","โ›ต","๐Ÿšค","๐Ÿ›ฅ๏ธ","๐Ÿšข","โœˆ๏ธ","๐Ÿ›ฉ๏ธ","๐Ÿš", + "๐Ÿš€","๐Ÿ›ธ","๐Ÿช","๐ŸŒ","๐ŸŒŽ","๐ŸŒ","๐Ÿ—บ๏ธ","๐Ÿงญ","๐Ÿ”๏ธ","โ›ฐ๏ธ","๐ŸŒ‹","๐Ÿ•๏ธ","๐Ÿ–๏ธ", + "๐Ÿœ๏ธ","๐Ÿ๏ธ","๐ŸŸ๏ธ","๐Ÿ›๏ธ","๐Ÿ—๏ธ","๐Ÿ˜๏ธ","๐Ÿ ","๐Ÿก","๐Ÿข","๐Ÿฃ","๐Ÿค","๐Ÿฅ","๐Ÿฆ", + "๐Ÿจ","๐Ÿช","๐Ÿซ","๐Ÿฌ","๐Ÿญ","๐Ÿฏ","๐Ÿฐ","๐Ÿ’’","๐Ÿ—ผ","๐Ÿ—ฝ","โ›ช","๐Ÿ•Œ","โ›ฉ๏ธ", + "๐Ÿ•‹","โ›ฒ","โ›บ","๐ŸŒ","๐ŸŒƒ","๐Ÿ™๏ธ","๐ŸŒ„","๐ŸŒ…","๐ŸŒ†","๐ŸŒ‡","๐ŸŒ‰","๐ŸŒŒ","๐ŸŒ ", + "๐ŸŽ‡","๐ŸŽ†","๐ŸŽ‘","๐Ÿ—พ", + ]), + ("โšฝ", "Activities", [ + "โšฝ","๐Ÿ€","๐Ÿˆ","โšพ","๐ŸฅŽ","๐ŸŽพ","๐Ÿ","๐Ÿ‰","๐Ÿฅ","๐ŸŽฑ","๐Ÿ“","๐Ÿธ","๐Ÿ’", + "๐Ÿฅ","๐Ÿ‘","๐Ÿ","โ›ณ","๐ŸŽฃ","๐Ÿคฟ","๐ŸŽฝ","๐ŸŽฟ","๐Ÿ›ท","๐ŸฅŒ","๐ŸŽฏ","๐ŸŽฎ","๐ŸŽฐ", + "๐ŸŽฒ","โ™Ÿ๏ธ","๐Ÿงฉ","๐Ÿช„","๐ŸŽญ","๐ŸŽจ","๐ŸŽช","๐ŸŽค","๐ŸŽง","๐ŸŽผ","๐ŸŽน","๐Ÿฅ","๐ŸŽท", + "๐ŸŽบ","๐ŸŽธ","๐ŸŽป","๐ŸŽฌ","๐ŸŽฅ","๐Ÿ“ฝ๏ธ","๐ŸŽž๏ธ","๐ŸŽ ","๐ŸŽก","๐ŸŽข","๐ŸŽŸ๏ธ","๐ŸŽซ","๐Ÿ†", + "๐Ÿฅ‡","๐Ÿฅˆ","๐Ÿฅ‰","๐Ÿ…","๐ŸŽ–๏ธ","๐ŸŽ—๏ธ","๐ŸŽ€","๐ŸŽ","๐ŸŽŠ","๐ŸŽ‰", + ]), + ("๐Ÿ’ก", "Objects", [ + "๐Ÿ“ฑ","๐Ÿ“ฒ","๐Ÿ’ป","โŒจ๏ธ","๐Ÿ–ฅ๏ธ","๐Ÿ–จ๏ธ","๐Ÿ–ฑ๏ธ","๐Ÿ’พ","๐Ÿ’ฟ","๐Ÿ“€","๐Ÿงฎ","๐ŸŽฅ","๐Ÿ“ท", + "๐Ÿ“น","๐Ÿ“ผ","๐Ÿ”","๐Ÿ”Ž","๐Ÿ’ก","๐Ÿ”ฆ","๐Ÿฎ","๐Ÿช”","๐Ÿ“”","๐Ÿ“’","๐Ÿ““","๐Ÿ“•","๐Ÿ“—", + "๐Ÿ“˜","๐Ÿ“™","๐Ÿ“š","๐Ÿ“–","๐Ÿ”–","๐Ÿท๏ธ","๐Ÿ’ฐ","๐Ÿ’ณ","๐Ÿช™","๐Ÿ“ˆ","๐Ÿ“‰","๐Ÿ“Š","๐Ÿ“‹", + "๐Ÿ“Œ","๐Ÿ“","โœ‚๏ธ","๐Ÿ”’","๐Ÿ”“","๐Ÿ”","๐Ÿ”","๐Ÿ”‘","๐Ÿ—๏ธ","๐Ÿ”จ","โ›๏ธ","โš’๏ธ","๐Ÿ› ๏ธ", + "๐Ÿ”ง","๐Ÿช›","๐Ÿ”ฉ","โš™๏ธ","โš–๏ธ","๐Ÿ”—","๐Ÿงฒ","๐Ÿชœ","๐Ÿงช","๐Ÿ”ญ","๐Ÿ”ฌ","๐Ÿ’Š","๐Ÿ’‰", + "๐Ÿฉน","๐Ÿฉบ","๐Ÿงด","๐Ÿงท","๐Ÿงน","๐Ÿงบ","๐Ÿงป","๐Ÿชฃ","๐Ÿงผ","๐Ÿช’","๐Ÿ›’","๐Ÿšช","๐Ÿชž", + "๐Ÿ›๏ธ","๐Ÿ›‹๏ธ","๐Ÿช‘","๐Ÿšฝ","๐Ÿšฟ","๐Ÿ›","๐Ÿงธ","๐Ÿช†","๐Ÿ‘“","๐Ÿ•ถ๏ธ","๐Ÿฅฝ","๐Ÿ‘’","๐ŸŽฉ", + "๐Ÿงข","โ›‘๏ธ","๐Ÿ“ฟ","๐Ÿ’","๐Ÿ’Ž","๐ŸŒ‚","๐Ÿงต","๐Ÿงถ","๐Ÿชข","๐ŸŽ’","๐Ÿ‘œ","๐Ÿ‘","๐Ÿ‘›", + "๐Ÿ’ผ","๐Ÿงณ","๐ŸŒ‚","โ˜‚๏ธ","๐Ÿ›ก๏ธ","๐Ÿ—ก๏ธ","โš”๏ธ","๐Ÿชƒ","๐Ÿน","๐Ÿชค","๐Ÿชฌ","๐Ÿงฟ","๐Ÿ”ฎ", + ]), + ("๐Ÿ”ฃ", "Symbols", [ + "โค๏ธ","๐Ÿงก","๐Ÿ’›","๐Ÿ’š","๐Ÿ’™","๐Ÿ’œ","๐Ÿ–ค","๐Ÿค","๐ŸคŽ","๐Ÿ’”","โฃ๏ธ","๐Ÿ’•","๐Ÿ’ž", + "๐Ÿ’“","๐Ÿ’—","๐Ÿ’–","๐Ÿ’˜","๐Ÿ’","โ˜ฎ๏ธ","โœ๏ธ","โ˜ช๏ธ","๐Ÿ•‰๏ธ","โ˜ธ๏ธ","โœก๏ธ","โ˜ฏ๏ธ","โ˜ฆ๏ธ","๐Ÿ›", + "โ™ˆ","โ™‰","โ™Š","โ™‹","โ™Œ","โ™","โ™Ž","โ™","โ™","โ™‘","โ™’","โ™“","โ›Ž", + "๐Ÿ”€","๐Ÿ”","๐Ÿ”‚","โ–ถ๏ธ","โฉ","โญ๏ธ","โฏ๏ธ","โ—€๏ธ","โช","โฎ๏ธ","๐Ÿ”ผ","โซ","๐Ÿ”ฝ", + "โฌ","โธ๏ธ","โน๏ธ","โบ๏ธ","๐ŸŽฆ","๐Ÿ”…","๐Ÿ”†","๐Ÿ“ถ","๐Ÿ”‡","๐Ÿ”ˆ","๐Ÿ”‰","๐Ÿ”Š","๐Ÿ“ข", + "๐Ÿ“ฃ","๐Ÿ””","๐Ÿ”•","โš ๏ธ","๐Ÿšธ","โ›”","๐Ÿšซ","๐Ÿšณ","๐Ÿšญ","๐Ÿšฏ","๐Ÿšฑ","๐Ÿšท","๐Ÿ“ต", + "๐Ÿ”ž","๐Ÿ’ฏ","โ™ป๏ธ","โœ…","โŒ","โŽ","โž•","โž–","โž—","โœ–๏ธ","๐Ÿ’ฒ","โ„ข๏ธ","ยฉ๏ธ","ยฎ๏ธ", + "ใ€ฐ๏ธ","โžฐ","โžฟ","๐Ÿ”š","๐Ÿ”™","๐Ÿ”›","๐Ÿ”œ","๐Ÿ”","๐Ÿ”ด","๐ŸŸ ","๐ŸŸก","๐ŸŸข","๐Ÿ”ต", + "๐ŸŸฃ","โšซ","โšช","๐ŸŸค","๐Ÿ”ถ","๐Ÿ”ท","๐Ÿ”ธ","๐Ÿ”น","๐Ÿ”บ","๐Ÿ”ป","๐Ÿ’ ","๐Ÿ”˜","โญ•", + "โญ","๐ŸŒŸ","๐Ÿ’ซ","โœจ","๐Ÿ”ฅ","๐Ÿ’ง","๐ŸŒŠ","๐ŸŒ€","โšก","โ„๏ธ","๐ŸŒˆ","๐ŸŽต","๐ŸŽถ", + "๐Ÿ’ฌ","๐Ÿ’ญ","๐Ÿ’ค","โ“","โ—","โ‰๏ธ","๐Ÿ”‘","๐ŸŽฏ","๐Ÿ","๐Ÿšฉ","๐ŸŽŒ","๐Ÿด","๐Ÿณ๏ธ", + ]), +] def _dot(color: str) -> str: @@ -520,22 +589,68 @@ class SettingsDialog: def _show_emoji_picker(self, anchor: Gtk.Widget, entry: Gtk.Entry) -> None: pop = Gtk.Popover(relative_to=anchor) - flow = Gtk.FlowBox() - flow.set_max_children_per_line(10) - flow.set_selection_mode(Gtk.SelectionMode.NONE) - flow.set_margin_top(6); flow.set_margin_bottom(6) - flow.set_margin_start(6); flow.set_margin_end(6) - for emoji in _PICKER_EMOJIS: - eb = Gtk.Button(label=emoji) - eb.set_relief(Gtk.ReliefStyle.NONE) - eb.connect("clicked", lambda _b, e=emoji: (entry.set_text(e), pop.popdown())) - flow.add(eb) - sw = Gtk.ScrolledWindow() - sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - sw.set_min_content_height(210) - sw.set_min_content_width(370) - sw.add(flow) - pop.add(sw) + vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=0) + + # -- category tab bar ------------------------------------------------ + stack = Gtk.Stack() + stack.set_transition_type(Gtk.StackTransitionType.NONE) + stack.set_size_request(420, 230) + + cat_bar = Gtk.Box(spacing=0) + cat_bar.set_margin_top(4); cat_bar.set_margin_bottom(4) + cat_bar.set_margin_start(4); cat_bar.set_margin_end(4) + + first_name: str | None = None + active_btn: list[Gtk.Button] = [None] # mutable cell + + def _select(name: str, btn: Gtk.Button) -> None: + stack.set_visible_child_name(name) + if active_btn[0]: + active_btn[0].get_style_context().remove_class("suggested-action") + btn.get_style_context().add_class("suggested-action") + active_btn[0] = btn + + for cat_emoji, cat_name, emojis in _EMOJI_CATEGORIES: + # Build scrollable emoji grid for this category + flow = Gtk.FlowBox() + flow.set_max_children_per_line(10) + flow.set_selection_mode(Gtk.SelectionMode.NONE) + flow.set_margin_top(4); flow.set_margin_bottom(4) + flow.set_margin_start(4); flow.set_margin_end(4) + for emoji in emojis: + eb = Gtk.Button(label=emoji) + eb.set_relief(Gtk.ReliefStyle.NONE) + eb.connect("clicked", lambda _b, e=emoji: (entry.set_text(e), pop.popdown())) + flow.add(eb) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + sw.add(flow) + stack.add_named(sw, cat_name) + + # Category tab button + cb = Gtk.Button(label=cat_emoji) + cb.set_relief(Gtk.ReliefStyle.NONE) + cb.set_tooltip_text(cat_name) + cb.connect("clicked", lambda _b, n=cat_name, b=cb: _select(n, b)) + cat_bar.pack_start(cb, True, True, 0) + + if first_name is None: + first_name = cat_name + active_btn[0] = cb + cb.get_style_context().add_class("suggested-action") + + if first_name: + stack.set_visible_child_name(first_name) + + cat_scroll = Gtk.ScrolledWindow() + cat_scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) + cat_scroll.set_min_content_height(44) + cat_scroll.add(cat_bar) + + vbox.pack_start(cat_scroll, False, False, 0) + vbox.pack_start(Gtk.Separator(), False, False, 0) + vbox.pack_start(stack, True, True, 0) + pop.add(vbox) pop.show_all() # ===== Engines ==========================================================