Skip to content

StudioClew/mongol

 
 

Repository files navigation

mongol

This library is a collection of Flutter widgets for displaying and editing traditional Mongolian vertical text.

The primary ones include:

  • MongolText: vertical version of Text
  • MongolListTile: vertical version of ListTile, for use in horizontal list views and menus
  • MongolPopupMenuButton: vertical version of PopupMenuButton, for displaying menus
  • MongolAlertDialog: vertical version of AlertDialog

Browse the sections below to see images of what the widgets look like. Check out the live web version of the example project for a more detailed demonstration.

Displaying vertical text

MongolText is a vertical text version of Flutter's Text widget. Left-to-right line wrapping is supported.

MongolText('ᠨᠢᠭᠡ ᠬᠣᠶᠠᠷ ᠭᠤᠷᠪᠠ ᠳᠦᠷᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤᠭ᠎ᠠ ᠳᠣᠯᠣᠭ᠎ᠠ ᠨᠠᠢᠮᠠ ᠶᠢᠰᠦ ᠠᠷᠪᠠ'),

The library supports mobile, web, and desktop.

Emoji and CJK characters

The library rotates emoji and CJK (Chinese, Japanese, and Korean) characters for proper orientation.

Text styling

You add styling using TextSpan and/or TextStyle, just as you would for a Text widget.

MongolText.rich(
  textSpan,
  textScaleFactor: 2.5,
),

where textSpan is defined like so:

const textSpan = TextSpan(
  style: TextStyle(fontSize: 30, color: Colors.black),
  children: [
    TextSpan(text: 'ᠨᠢᠭᠡ\n', style: TextStyle(fontSize: 40)),
    TextSpan(text: 'ᠬᠣᠶᠠᠷ', style: TextStyle(backgroundColor: Colors.yellow)),
    TextSpan(
      text: ' ᠭᠤᠷᠪᠠ ',
      style: TextStyle(shadows: [
        Shadow(
          blurRadius: 3.0,
          color: Colors.lightGreen,
          offset: Offset(3.0, -3.0),
        ),
      ]),
    ),
    TextSpan(text: 'ᠳᠦᠷ'),
    TextSpan(text: 'ᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤ', style: TextStyle(color: Colors.blue)),
    TextSpan(text: 'ᠭ᠎ᠠ ᠨᠠᠢᠮᠠ '),
    TextSpan(text: 'ᠶᠢᠰᠦ ', style: TextStyle(fontSize: 20)),
    TextSpan(
        text: 'ᠠᠷᠪᠠ',
        style:
            TextStyle(fontFamily: 'MenksoftAmuguleng', color: Colors.purple)),
  ],
);

This all assumes you've added one or more Mongolian fonts to your app assets.

Adding a Mongolian font

The library does not include a Mongolian font. This allows the library to be smaller and also gives developers the freedom to choose any Mongolian font they like.

Since it's likely that some of your users' devices won't have a Mongolian font installed, you should include at least one Mongolian font with your project. Here is what you need to do:

1. Get a font

You can find a font from the following companies:

2. Add the font to your project

You can get directions to do that here and here.

Basically you just need to create an assets/fonts folder for it and then declare the font in pubspec.yaml like this:

flutter:
  fonts:
    - family: MenksoftQagan
      fonts:
        - asset: assets/fonts/MQG8F02.ttf

You can call the family name whatever you want, but this string is what you will use in the next step.

3. Set the default Mongolian font for your app

In your main.dart file, set the fontFamily for the app theme.

MaterialApp(
  title: 'My App',
  theme: ThemeData(fontFamily: 'MenksoftQagan'),
  home: MyHomePage(),
);

Now you won't have to manually set the font for every Mongolian text widget. If you want to use a different font for some widgets, though, you can still set the fontFamily as you normally would inside TextStyle.

You may also consider using mongol_code with a Menksoft font if your users have devices that don't support OpenType Unicode font rendering. mongol_code converts Unicode to Menksoft code, which a Menksoft font can display without any special rendering requirements.

Editing vertical text [BROKEN]

Notice: Unfortunately MongolTextField is currently not working. You shouldn't use it in a production app. Something in the Flutter 2.5 update broke this widget and causes your app to freeze if the cursor has to scroll out of view. As a workaround for single line text you can rotate a standard TextField. There is no current workaround for multiline text. If you can find the source of the error please open an issue on GitHub. The error is apparently in EditableText. I'm looking at other options such as possibly cloning SuperEditor.

You can use MongolTextField to receive and edit text from the system keyboard. This widget includes most of the functionality of the standard Flutter TextField widget.

Here is it on iOS and Android interacting with a system keyboard:

There are a few known issues with MongolTextField:

  • The cursor shows up on the right side of hint text.
  • The gesture detection region for the left text selection handle does not appear directly on the handle.
  • On web and desktop the arrow keys don't move in the expected direction.

If you discover any other problems please open an issue. And if you have time to find the source of the known issues, that would be very helpful.

Horizontal lists

You can display horizontally scrolling lists with the standard ListView widget. All you need to do is set the scroll direction to horizontal.

ListView(
  scrollDirection: Axis.horizontal,
  children: [
    MongolText('ᠨᠢᠭᠡ'),
    MongolText('ᠬᠣᠶᠠᠷ'),
    MongolText('ᠭᠤᠷᠪᠠ'),
  ],
),

For something a little fancier, you can also use the MongolListTile widget just like you would use ListTile. Here is an example from the example project:

Card(
  child: MongolListTile(
    leading: FlutterLogo(size: 56.0),
    title: MongolText('ᠨᠢᠭᠡ ᠬᠣᠶᠠᠷ ᠭᠤᠷᠪᠠ'),
    subtitle: MongolText('ᠳᠦᠷᠪᠡ ᠲᠠᠪᠤ ᠵᠢᠷᠭᠤᠭ᠎ᠠ ᠳᠣᠯᠣᠭ᠎ᠠ ᠨᠠᠢᠮᠠ'),
    trailing: Icon(Icons.more_vert),
  ),
),

Menus

To add a popup menu with horizontal items, you can use MongolPopupMenuButton. It is customizable in all the ways that the standard PopupMenuButton is.

Scaffold(
  appBar: AppBar(
    title: const Text('MongolPopupMenuButton'),
    actions: [
      MongolPopupMenuButton(
        itemBuilder: (context) => const [
          MongolPopupMenuItem(child: MongolText('ᠨᠢᠭᠡ'), value: 1),
          MongolPopupMenuItem(child: MongolText('ᠬᠣᠶᠠᠷ'), value: 2),
          MongolPopupMenuItem(child: MongolText('ᠭᠤᠷᠪᠠ'), value: 3),
        ],
        tooltip: 'vertical tooltip text',
        onSelected: (value) => print(value),
      ),
    ],
  ),
  body: Container(),
);

Buttons

There are Mongol equivalents to all of the Flutter buttons:

  • MongolTextButton
  • MongolOutlinedButton
  • MongolElevatedButton
  • MongolTextButton.icon
  • MongolOutlinedButton.icon
  • MongolElevatedButton.icon
  • MongolIconButton

The reason for the Mongol icon button is to provide a vertical tooltip that will appear for a longpress on mobile and for a mouse hover on desktop and web.

Other widgets

MongolAlertDialog

This alert dialog works mostly the same as the Flutter AlertDialog.

Keyboard

This are not part of mongol library yet, but you can see an example of how to make a custom in-app keyboard in the example app that's included with this library. Here is a screenshot from the demo app:

TODO

  • Improve keyboard (this may be better as a separate package)
  • Various other text based widgets
  • Support WidgetSpan.
  • Add missing tests (currently commented out)
  • For MongolTextAlign.bottom don't count final space in line height
  • Fix known issues with MongolTextField
  • Add MongolSelectableText widget

About

Mongolian vertical script widgets for Flutter apps

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • HTML 71.5%
  • Dart 28.2%
  • CSS 0.3%
  • Swift 0.0%
  • Ruby 0.0%
  • Kotlin 0.0%