diff --git a/bin/internal/material_fonts.version b/bin/internal/material_fonts.version index 83bc7d2edf..08eb4ba69b 100644 --- a/bin/internal/material_fonts.version +++ b/bin/internal/material_fonts.version @@ -1 +1 @@ -https://storage.googleapis.com/flutter_infra/flutter/fonts/13ac995daa9dda0a6ba0a45f1fccc541e616a74c/fonts.zip +https://storage.googleapis.com/flutter_infra/flutter/fonts/7a25ab00acc9a9e4a498641dcbd5a923a1249239/fonts.zip diff --git a/dev/tools/update_icons.dart b/dev/tools/update_icons.dart index 71ac37c13d..c7796c72f4 100644 --- a/dev/tools/update_icons.dart +++ b/dev/tools/update_icons.dart @@ -28,6 +28,82 @@ const Map kIdentifierRewrites = const { 'class': 'class_', }; +final Set kMirroredIcons = new Set.from([ + // This list is obtained from: + // http://google.github.io/material-design-icons/#icons-in-rtl + 'arrow_back', + 'arrow_back_ios', + 'arrow_forward', + 'arrow_forward_ios', + 'arrow_left', + 'arrow_right', + 'assignment', + 'assignment_return', + 'backspace', + 'battery_unknown', + 'call_made', + 'call_merge', + 'call_missed', + 'call_missed_outgoing', + 'call_received', + 'call_split', + 'chevron_left', + 'chevron_right', + 'chrome_reader_mode', + 'device_unknown', + 'dvr', + 'event_note', + 'featured_play_list', + 'featured_video', + 'first_page', + 'flight_land', + 'flight_takeoff', + 'format_indent_decrease', + 'format_indent_increase', + 'format_list_bulleted', + 'forward', + 'functions', + 'help', + 'help_outline', + 'input', + 'keyboard_backspace', + 'keyboard_tab', + 'label', + 'label_important', + 'label_outline', + 'last_page', + 'launch', + 'list', + 'live_help', + 'mobile_screen_share', + 'multiline_chart', + 'navigate_before', + 'navigate_next', + 'next_week', + 'note', + 'open_in_new', + 'playlist_add', + 'queue_music', + 'redo', + 'reply', + 'reply_all', + 'screen_share', + 'send', + 'short_text', + 'show_chart', + 'sort', + 'star_half', + 'subject', + 'trending_flat', + 'toc', + 'trending_down', + 'trending_up', + 'undo', + 'view_list', + 'view_quilt', + 'wrap_text', +]); + void main(List args) { // If we're run from the `tools` dir, set the cwd to the repo root. if (path.basename(Directory.current.path) == 'tools') @@ -94,9 +170,10 @@ String getIconDeclaration(String line) { final String codepoint = tokens[1]; final String identifier = kIdentifierRewrites[name] ?? name; final String description = name.replaceAll('_', ' '); + final String rtl = kMirroredIcons.contains(name) ? ', matchTextDirection: true' : ''; return ''' ///

$name — material icon named "$description".

- static const IconData $identifier = const IconData(0x$codepoint, fontFamily: 'MaterialIcons'); + static const IconData $identifier = const IconData(0x$codepoint, fontFamily: 'MaterialIcons'$rtl); '''; } diff --git a/packages/flutter/lib/src/material/date_picker.dart b/packages/flutter/lib/src/material/date_picker.dart index 7ef040a602..f570ba0890 100644 --- a/packages/flutter/lib/src/material/date_picker.dart +++ b/packages/flutter/lib/src/material/date_picker.dart @@ -599,31 +599,8 @@ class _MonthPickerState extends State { }); } - Icon _getPreviousMonthIcon(TextDirection textDirection) { - assert(textDirection != null); - switch (textDirection) { - case TextDirection.rtl: - return const Icon(Icons.chevron_right); - case TextDirection.ltr: - return const Icon(Icons.chevron_left); - } - return null; - } - - Icon _getNextMonthIcon(TextDirection textDirection) { - assert(textDirection != null); - switch (textDirection) { - case TextDirection.rtl: - return const Icon(Icons.chevron_left); - case TextDirection.ltr: - return const Icon(Icons.chevron_right); - } - return null; - } - @override Widget build(BuildContext context) { - final TextDirection textDirection = Directionality.of(context); final MaterialLocalizations localizations = MaterialLocalizations.of(context); return new SizedBox( width: _kMonthPickerPortraitWidth, @@ -642,7 +619,7 @@ class _MonthPickerState extends State { top: 0.0, start: 8.0, child: new IconButton( - icon: _getPreviousMonthIcon(textDirection), + icon: const Icon(Icons.chevron_left), tooltip: localizations.previousMonthTooltip, onPressed: _isDisplayingFirstMonth ? null : _handlePreviousMonth, ), @@ -651,7 +628,7 @@ class _MonthPickerState extends State { top: 0.0, end: 8.0, child: new IconButton( - icon: _getNextMonthIcon(textDirection), + icon: const Icon(Icons.chevron_right), tooltip: localizations.nextMonthTooltip, onPressed: _isDisplayingLastMonth ? null : _handleNextMonth, ), diff --git a/packages/flutter/lib/src/material/icons.dart b/packages/flutter/lib/src/material/icons.dart index 83935a377d..e07529df21 100644 --- a/packages/flutter/lib/src/material/icons.dart +++ b/packages/flutter/lib/src/material/icons.dart @@ -202,10 +202,10 @@ class Icons { static const IconData archive = const IconData(0xe149, fontFamily: 'MaterialIcons'); ///

arrow_back — material icon named "arrow back".

- static const IconData arrow_back = const IconData(0xe5c4, fontFamily: 'MaterialIcons'); + static const IconData arrow_back = const IconData(0xe5c4, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

arrow_back_ios — material icon named "arrow back ios".

- static const IconData arrow_back_ios = const IconData(0xe5e0, fontFamily: 'MaterialIcons'); + static const IconData arrow_back_ios = const IconData(0xe5e0, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

arrow_downward — material icon named "arrow downward".

static const IconData arrow_downward = const IconData(0xe5db, fontFamily: 'MaterialIcons'); @@ -220,16 +220,16 @@ class Icons { static const IconData arrow_drop_up = const IconData(0xe5c7, fontFamily: 'MaterialIcons'); ///

arrow_forward — material icon named "arrow forward".

- static const IconData arrow_forward = const IconData(0xe5c8, fontFamily: 'MaterialIcons'); + static const IconData arrow_forward = const IconData(0xe5c8, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

arrow_forward_ios — material icon named "arrow forward ios".

- static const IconData arrow_forward_ios = const IconData(0xe5e1, fontFamily: 'MaterialIcons'); + static const IconData arrow_forward_ios = const IconData(0xe5e1, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

arrow_left — material icon named "arrow left".

- static const IconData arrow_left = const IconData(0xe5de, fontFamily: 'MaterialIcons'); + static const IconData arrow_left = const IconData(0xe5de, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

arrow_right — material icon named "arrow right".

- static const IconData arrow_right = const IconData(0xe5df, fontFamily: 'MaterialIcons'); + static const IconData arrow_right = const IconData(0xe5df, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

arrow_upward — material icon named "arrow upward".

static const IconData arrow_upward = const IconData(0xe5d8, fontFamily: 'MaterialIcons'); @@ -244,7 +244,7 @@ class Icons { static const IconData assessment = const IconData(0xe85c, fontFamily: 'MaterialIcons'); ///

assignment — material icon named "assignment".

- static const IconData assignment = const IconData(0xe85d, fontFamily: 'MaterialIcons'); + static const IconData assignment = const IconData(0xe85d, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

assignment_ind — material icon named "assignment ind".

static const IconData assignment_ind = const IconData(0xe85e, fontFamily: 'MaterialIcons'); @@ -253,7 +253,7 @@ class Icons { static const IconData assignment_late = const IconData(0xe85f, fontFamily: 'MaterialIcons'); ///

assignment_return — material icon named "assignment return".

- static const IconData assignment_return = const IconData(0xe860, fontFamily: 'MaterialIcons'); + static const IconData assignment_return = const IconData(0xe860, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

assignment_returned — material icon named "assignment returned".

static const IconData assignment_returned = const IconData(0xe861, fontFamily: 'MaterialIcons'); @@ -289,7 +289,7 @@ class Icons { static const IconData av_timer = const IconData(0xe01b, fontFamily: 'MaterialIcons'); ///

backspace — material icon named "backspace".

- static const IconData backspace = const IconData(0xe14a, fontFamily: 'MaterialIcons'); + static const IconData backspace = const IconData(0xe14a, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

backup — material icon named "backup".

static const IconData backup = const IconData(0xe864, fontFamily: 'MaterialIcons'); @@ -307,7 +307,7 @@ class Icons { static const IconData battery_std = const IconData(0xe1a5, fontFamily: 'MaterialIcons'); ///

battery_unknown — material icon named "battery unknown".

- static const IconData battery_unknown = const IconData(0xe1a6, fontFamily: 'MaterialIcons'); + static const IconData battery_unknown = const IconData(0xe1a6, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

beach_access — material icon named "beach access".

static const IconData beach_access = const IconData(0xeb3e, fontFamily: 'MaterialIcons'); @@ -469,22 +469,22 @@ class Icons { static const IconData call_end = const IconData(0xe0b1, fontFamily: 'MaterialIcons'); ///

call_made — material icon named "call made".

- static const IconData call_made = const IconData(0xe0b2, fontFamily: 'MaterialIcons'); + static const IconData call_made = const IconData(0xe0b2, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

call_merge — material icon named "call merge".

- static const IconData call_merge = const IconData(0xe0b3, fontFamily: 'MaterialIcons'); + static const IconData call_merge = const IconData(0xe0b3, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

call_missed — material icon named "call missed".

- static const IconData call_missed = const IconData(0xe0b4, fontFamily: 'MaterialIcons'); + static const IconData call_missed = const IconData(0xe0b4, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

call_missed_outgoing — material icon named "call missed outgoing".

- static const IconData call_missed_outgoing = const IconData(0xe0e4, fontFamily: 'MaterialIcons'); + static const IconData call_missed_outgoing = const IconData(0xe0e4, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

call_received — material icon named "call received".

- static const IconData call_received = const IconData(0xe0b5, fontFamily: 'MaterialIcons'); + static const IconData call_received = const IconData(0xe0b5, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

call_split — material icon named "call split".

- static const IconData call_split = const IconData(0xe0b6, fontFamily: 'MaterialIcons'); + static const IconData call_split = const IconData(0xe0b6, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

call_to_action — material icon named "call to action".

static const IconData call_to_action = const IconData(0xe06c, fontFamily: 'MaterialIcons'); @@ -565,10 +565,10 @@ class Icons { static const IconData check_circle_outline = const IconData(0xe92d, fontFamily: 'MaterialIcons'); ///

chevron_left — material icon named "chevron left".

- static const IconData chevron_left = const IconData(0xe5cb, fontFamily: 'MaterialIcons'); + static const IconData chevron_left = const IconData(0xe5cb, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

chevron_right — material icon named "chevron right".

- static const IconData chevron_right = const IconData(0xe5cc, fontFamily: 'MaterialIcons'); + static const IconData chevron_right = const IconData(0xe5cc, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

child_care — material icon named "child care".

static const IconData child_care = const IconData(0xeb41, fontFamily: 'MaterialIcons'); @@ -577,7 +577,7 @@ class Icons { static const IconData child_friendly = const IconData(0xeb42, fontFamily: 'MaterialIcons'); ///

chrome_reader_mode — material icon named "chrome reader mode".

- static const IconData chrome_reader_mode = const IconData(0xe86d, fontFamily: 'MaterialIcons'); + static const IconData chrome_reader_mode = const IconData(0xe86d, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

class — material icon named "class".

static const IconData class_ = const IconData(0xe86e, fontFamily: 'MaterialIcons'); @@ -766,7 +766,7 @@ class Icons { static const IconData device_hub = const IconData(0xe335, fontFamily: 'MaterialIcons'); ///

device_unknown — material icon named "device unknown".

- static const IconData device_unknown = const IconData(0xe339, fontFamily: 'MaterialIcons'); + static const IconData device_unknown = const IconData(0xe339, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

devices — material icon named "devices".

static const IconData devices = const IconData(0xe1b1, fontFamily: 'MaterialIcons'); @@ -859,7 +859,7 @@ class Icons { static const IconData drive_eta = const IconData(0xe613, fontFamily: 'MaterialIcons'); ///

dvr — material icon named "dvr".

- static const IconData dvr = const IconData(0xe1b2, fontFamily: 'MaterialIcons'); + static const IconData dvr = const IconData(0xe1b2, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

edit — material icon named "edit".

static const IconData edit = const IconData(0xe3c9, fontFamily: 'MaterialIcons'); @@ -904,7 +904,7 @@ class Icons { static const IconData event_busy = const IconData(0xe615, fontFamily: 'MaterialIcons'); ///

event_note — material icon named "event note".

- static const IconData event_note = const IconData(0xe616, fontFamily: 'MaterialIcons'); + static const IconData event_note = const IconData(0xe616, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

event_seat — material icon named "event seat".

static const IconData event_seat = const IconData(0xe903, fontFamily: 'MaterialIcons'); @@ -964,10 +964,10 @@ class Icons { static const IconData favorite_border = const IconData(0xe87e, fontFamily: 'MaterialIcons'); ///

featured_play_list — material icon named "featured play list".

- static const IconData featured_play_list = const IconData(0xe06d, fontFamily: 'MaterialIcons'); + static const IconData featured_play_list = const IconData(0xe06d, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

featured_video — material icon named "featured video".

- static const IconData featured_video = const IconData(0xe06e, fontFamily: 'MaterialIcons'); + static const IconData featured_video = const IconData(0xe06e, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

feedback — material icon named "feedback".

static const IconData feedback = const IconData(0xe87f, fontFamily: 'MaterialIcons'); @@ -1063,7 +1063,7 @@ class Icons { static const IconData fingerprint = const IconData(0xe90d, fontFamily: 'MaterialIcons'); ///

first_page — material icon named "first page".

- static const IconData first_page = const IconData(0xe5dc, fontFamily: 'MaterialIcons'); + static const IconData first_page = const IconData(0xe5dc, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

fitness_center — material icon named "fitness center".

static const IconData fitness_center = const IconData(0xeb43, fontFamily: 'MaterialIcons'); @@ -1087,10 +1087,10 @@ class Icons { static const IconData flight = const IconData(0xe539, fontFamily: 'MaterialIcons'); ///

flight_land — material icon named "flight land".

- static const IconData flight_land = const IconData(0xe904, fontFamily: 'MaterialIcons'); + static const IconData flight_land = const IconData(0xe904, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

flight_takeoff — material icon named "flight takeoff".

- static const IconData flight_takeoff = const IconData(0xe905, fontFamily: 'MaterialIcons'); + static const IconData flight_takeoff = const IconData(0xe905, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

flip — material icon named "flip".

static const IconData flip = const IconData(0xe3e8, fontFamily: 'MaterialIcons'); @@ -1144,10 +1144,10 @@ class Icons { static const IconData format_color_text = const IconData(0xe23c, fontFamily: 'MaterialIcons'); ///

format_indent_decrease — material icon named "format indent decrease".

- static const IconData format_indent_decrease = const IconData(0xe23d, fontFamily: 'MaterialIcons'); + static const IconData format_indent_decrease = const IconData(0xe23d, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

format_indent_increase — material icon named "format indent increase".

- static const IconData format_indent_increase = const IconData(0xe23e, fontFamily: 'MaterialIcons'); + static const IconData format_indent_increase = const IconData(0xe23e, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

format_italic — material icon named "format italic".

static const IconData format_italic = const IconData(0xe23f, fontFamily: 'MaterialIcons'); @@ -1156,7 +1156,7 @@ class Icons { static const IconData format_line_spacing = const IconData(0xe240, fontFamily: 'MaterialIcons'); ///

format_list_bulleted — material icon named "format list bulleted".

- static const IconData format_list_bulleted = const IconData(0xe241, fontFamily: 'MaterialIcons'); + static const IconData format_list_bulleted = const IconData(0xe241, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

format_list_numbered — material icon named "format list numbered".

static const IconData format_list_numbered = const IconData(0xe242, fontFamily: 'MaterialIcons'); @@ -1192,7 +1192,7 @@ class Icons { static const IconData forum = const IconData(0xe0bf, fontFamily: 'MaterialIcons'); ///

forward — material icon named "forward".

- static const IconData forward = const IconData(0xe154, fontFamily: 'MaterialIcons'); + static const IconData forward = const IconData(0xe154, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

forward_10 — material icon named "forward 10".

static const IconData forward_10 = const IconData(0xe056, fontFamily: 'MaterialIcons'); @@ -1213,7 +1213,7 @@ class Icons { static const IconData fullscreen_exit = const IconData(0xe5d1, fontFamily: 'MaterialIcons'); ///

functions — material icon named "functions".

- static const IconData functions = const IconData(0xe24a, fontFamily: 'MaterialIcons'); + static const IconData functions = const IconData(0xe24a, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

g_translate — material icon named "g translate".

static const IconData g_translate = const IconData(0xe927, fontFamily: 'MaterialIcons'); @@ -1306,10 +1306,10 @@ class Icons { static const IconData hearing = const IconData(0xe023, fontFamily: 'MaterialIcons'); ///

help — material icon named "help".

- static const IconData help = const IconData(0xe887, fontFamily: 'MaterialIcons'); + static const IconData help = const IconData(0xe887, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

help_outline — material icon named "help outline".

- static const IconData help_outline = const IconData(0xe8fd, fontFamily: 'MaterialIcons'); + static const IconData help_outline = const IconData(0xe8fd, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

high_quality — material icon named "high quality".

static const IconData high_quality = const IconData(0xe024, fontFamily: 'MaterialIcons'); @@ -1372,7 +1372,7 @@ class Icons { static const IconData info_outline = const IconData(0xe88f, fontFamily: 'MaterialIcons'); ///

input — material icon named "input".

- static const IconData input = const IconData(0xe890, fontFamily: 'MaterialIcons'); + static const IconData input = const IconData(0xe890, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

insert_chart — material icon named "insert chart".

static const IconData insert_chart = const IconData(0xe24b, fontFamily: 'MaterialIcons'); @@ -1420,7 +1420,7 @@ class Icons { static const IconData keyboard_arrow_up = const IconData(0xe316, fontFamily: 'MaterialIcons'); ///

keyboard_backspace — material icon named "keyboard backspace".

- static const IconData keyboard_backspace = const IconData(0xe317, fontFamily: 'MaterialIcons'); + static const IconData keyboard_backspace = const IconData(0xe317, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

keyboard_capslock — material icon named "keyboard capslock".

static const IconData keyboard_capslock = const IconData(0xe318, fontFamily: 'MaterialIcons'); @@ -1432,7 +1432,7 @@ class Icons { static const IconData keyboard_return = const IconData(0xe31b, fontFamily: 'MaterialIcons'); ///

keyboard_tab — material icon named "keyboard tab".

- static const IconData keyboard_tab = const IconData(0xe31c, fontFamily: 'MaterialIcons'); + static const IconData keyboard_tab = const IconData(0xe31c, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

keyboard_voice — material icon named "keyboard voice".

static const IconData keyboard_voice = const IconData(0xe31d, fontFamily: 'MaterialIcons'); @@ -1441,13 +1441,13 @@ class Icons { static const IconData kitchen = const IconData(0xeb47, fontFamily: 'MaterialIcons'); ///

label — material icon named "label".

- static const IconData label = const IconData(0xe892, fontFamily: 'MaterialIcons'); + static const IconData label = const IconData(0xe892, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

label_important — material icon named "label important".

- static const IconData label_important = const IconData(0xe937, fontFamily: 'MaterialIcons'); + static const IconData label_important = const IconData(0xe937, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

label_outline — material icon named "label outline".

- static const IconData label_outline = const IconData(0xe893, fontFamily: 'MaterialIcons'); + static const IconData label_outline = const IconData(0xe893, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

landscape — material icon named "landscape".

static const IconData landscape = const IconData(0xe3f7, fontFamily: 'MaterialIcons'); @@ -1468,10 +1468,10 @@ class Icons { static const IconData laptop_windows = const IconData(0xe321, fontFamily: 'MaterialIcons'); ///

last_page — material icon named "last page".

- static const IconData last_page = const IconData(0xe5dd, fontFamily: 'MaterialIcons'); + static const IconData last_page = const IconData(0xe5dd, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

launch — material icon named "launch".

- static const IconData launch = const IconData(0xe895, fontFamily: 'MaterialIcons'); + static const IconData launch = const IconData(0xe895, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

layers — material icon named "layers".

static const IconData layers = const IconData(0xe53b, fontFamily: 'MaterialIcons'); @@ -1519,10 +1519,10 @@ class Icons { static const IconData linked_camera = const IconData(0xe438, fontFamily: 'MaterialIcons'); ///

list — material icon named "list".

- static const IconData list = const IconData(0xe896, fontFamily: 'MaterialIcons'); + static const IconData list = const IconData(0xe896, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

live_help — material icon named "live help".

- static const IconData live_help = const IconData(0xe0c6, fontFamily: 'MaterialIcons'); + static const IconData live_help = const IconData(0xe0c6, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

live_tv — material icon named "live tv".

static const IconData live_tv = const IconData(0xe639, fontFamily: 'MaterialIcons'); @@ -1720,7 +1720,7 @@ class Icons { static const IconData mms = const IconData(0xe618, fontFamily: 'MaterialIcons'); ///

mobile_screen_share — material icon named "mobile screen share".

- static const IconData mobile_screen_share = const IconData(0xe0e7, fontFamily: 'MaterialIcons'); + static const IconData mobile_screen_share = const IconData(0xe0e7, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

mode_comment — material icon named "mode comment".

static const IconData mode_comment = const IconData(0xe253, fontFamily: 'MaterialIcons'); @@ -1771,7 +1771,7 @@ class Icons { static const IconData movie_filter = const IconData(0xe43a, fontFamily: 'MaterialIcons'); ///

multiline_chart — material icon named "multiline chart".

- static const IconData multiline_chart = const IconData(0xe6df, fontFamily: 'MaterialIcons'); + static const IconData multiline_chart = const IconData(0xe6df, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

music_note — material icon named "music note".

static const IconData music_note = const IconData(0xe405, fontFamily: 'MaterialIcons'); @@ -1789,10 +1789,10 @@ class Icons { static const IconData nature_people = const IconData(0xe407, fontFamily: 'MaterialIcons'); ///

navigate_before — material icon named "navigate before".

- static const IconData navigate_before = const IconData(0xe408, fontFamily: 'MaterialIcons'); + static const IconData navigate_before = const IconData(0xe408, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

navigate_next — material icon named "navigate next".

- static const IconData navigate_next = const IconData(0xe409, fontFamily: 'MaterialIcons'); + static const IconData navigate_next = const IconData(0xe409, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

navigation — material icon named "navigation".

static const IconData navigation = const IconData(0xe55d, fontFamily: 'MaterialIcons'); @@ -1816,7 +1816,7 @@ class Icons { static const IconData new_releases = const IconData(0xe031, fontFamily: 'MaterialIcons'); ///

next_week — material icon named "next week".

- static const IconData next_week = const IconData(0xe16a, fontFamily: 'MaterialIcons'); + static const IconData next_week = const IconData(0xe16a, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

nfc — material icon named "nfc".

static const IconData nfc = const IconData(0xe1bb, fontFamily: 'MaterialIcons'); @@ -1834,7 +1834,7 @@ class Icons { static const IconData not_listed_location = const IconData(0xe575, fontFamily: 'MaterialIcons'); ///

note — material icon named "note".

- static const IconData note = const IconData(0xe06f, fontFamily: 'MaterialIcons'); + static const IconData note = const IconData(0xe06f, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

note_add — material icon named "note add".

static const IconData note_add = const IconData(0xe89c, fontFamily: 'MaterialIcons'); @@ -1873,7 +1873,7 @@ class Icons { static const IconData open_in_browser = const IconData(0xe89d, fontFamily: 'MaterialIcons'); ///

open_in_new — material icon named "open in new".

- static const IconData open_in_new = const IconData(0xe89e, fontFamily: 'MaterialIcons'); + static const IconData open_in_new = const IconData(0xe89e, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

open_with — material icon named "open with".

static const IconData open_with = const IconData(0xe89f, fontFamily: 'MaterialIcons'); @@ -2077,7 +2077,7 @@ class Icons { static const IconData play_for_work = const IconData(0xe906, fontFamily: 'MaterialIcons'); ///

playlist_add — material icon named "playlist add".

- static const IconData playlist_add = const IconData(0xe03b, fontFamily: 'MaterialIcons'); + static const IconData playlist_add = const IconData(0xe03b, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

playlist_add_check — material icon named "playlist add check".

static const IconData playlist_add_check = const IconData(0xe065, fontFamily: 'MaterialIcons'); @@ -2140,7 +2140,7 @@ class Icons { static const IconData queue = const IconData(0xe03c, fontFamily: 'MaterialIcons'); ///

queue_music — material icon named "queue music".

- static const IconData queue_music = const IconData(0xe03d, fontFamily: 'MaterialIcons'); + static const IconData queue_music = const IconData(0xe03d, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

queue_play_next — material icon named "queue play next".

static const IconData queue_play_next = const IconData(0xe066, fontFamily: 'MaterialIcons'); @@ -2170,7 +2170,7 @@ class Icons { static const IconData redeem = const IconData(0xe8b1, fontFamily: 'MaterialIcons'); ///

redo — material icon named "redo".

- static const IconData redo = const IconData(0xe15a, fontFamily: 'MaterialIcons'); + static const IconData redo = const IconData(0xe15a, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

refresh — material icon named "refresh".

static const IconData refresh = const IconData(0xe5d5, fontFamily: 'MaterialIcons'); @@ -2215,10 +2215,10 @@ class Icons { static const IconData replay_5 = const IconData(0xe05b, fontFamily: 'MaterialIcons'); ///

reply — material icon named "reply".

- static const IconData reply = const IconData(0xe15e, fontFamily: 'MaterialIcons'); + static const IconData reply = const IconData(0xe15e, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

reply_all — material icon named "reply all".

- static const IconData reply_all = const IconData(0xe15f, fontFamily: 'MaterialIcons'); + static const IconData reply_all = const IconData(0xe15f, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

report — material icon named "report".

static const IconData report = const IconData(0xe160, fontFamily: 'MaterialIcons'); @@ -2314,7 +2314,7 @@ class Icons { static const IconData screen_rotation = const IconData(0xe1c1, fontFamily: 'MaterialIcons'); ///

screen_share — material icon named "screen share".

- static const IconData screen_share = const IconData(0xe0e2, fontFamily: 'MaterialIcons'); + static const IconData screen_share = const IconData(0xe0e2, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

sd_card — material icon named "sd card".

static const IconData sd_card = const IconData(0xe623, fontFamily: 'MaterialIcons'); @@ -2332,7 +2332,7 @@ class Icons { static const IconData select_all = const IconData(0xe162, fontFamily: 'MaterialIcons'); ///

send — material icon named "send".

- static const IconData send = const IconData(0xe163, fontFamily: 'MaterialIcons'); + static const IconData send = const IconData(0xe163, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

sentiment_dissatisfied — material icon named "sentiment dissatisfied".

static const IconData sentiment_dissatisfied = const IconData(0xe811, fontFamily: 'MaterialIcons'); @@ -2419,10 +2419,10 @@ class Icons { static const IconData shopping_cart = const IconData(0xe8cc, fontFamily: 'MaterialIcons'); ///

short_text — material icon named "short text".

- static const IconData short_text = const IconData(0xe261, fontFamily: 'MaterialIcons'); + static const IconData short_text = const IconData(0xe261, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

show_chart — material icon named "show chart".

- static const IconData show_chart = const IconData(0xe6e1, fontFamily: 'MaterialIcons'); + static const IconData show_chart = const IconData(0xe6e1, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

shuffle — material icon named "shuffle".

static const IconData shuffle = const IconData(0xe043, fontFamily: 'MaterialIcons'); @@ -2491,7 +2491,7 @@ class Icons { static const IconData snooze = const IconData(0xe046, fontFamily: 'MaterialIcons'); ///

sort — material icon named "sort".

- static const IconData sort = const IconData(0xe164, fontFamily: 'MaterialIcons'); + static const IconData sort = const IconData(0xe164, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

sort_by_alpha — material icon named "sort by alpha".

static const IconData sort_by_alpha = const IconData(0xe053, fontFamily: 'MaterialIcons'); @@ -2527,7 +2527,7 @@ class Icons { static const IconData star_border = const IconData(0xe83a, fontFamily: 'MaterialIcons'); ///

star_half — material icon named "star half".

- static const IconData star_half = const IconData(0xe839, fontFamily: 'MaterialIcons'); + static const IconData star_half = const IconData(0xe839, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

stars — material icon named "stars".

static const IconData stars = const IconData(0xe8d0, fontFamily: 'MaterialIcons'); @@ -2578,7 +2578,7 @@ class Icons { static const IconData subdirectory_arrow_right = const IconData(0xe5da, fontFamily: 'MaterialIcons'); ///

subject — material icon named "subject".

- static const IconData subject = const IconData(0xe8d2, fontFamily: 'MaterialIcons'); + static const IconData subject = const IconData(0xe8d2, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

subscriptions — material icon named "subscriptions".

static const IconData subscriptions = const IconData(0xe064, fontFamily: 'MaterialIcons'); @@ -2728,7 +2728,7 @@ class Icons { static const IconData title = const IconData(0xe264, fontFamily: 'MaterialIcons'); ///

toc — material icon named "toc".

- static const IconData toc = const IconData(0xe8de, fontFamily: 'MaterialIcons'); + static const IconData toc = const IconData(0xe8de, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

today — material icon named "today".

static const IconData today = const IconData(0xe8df, fontFamily: 'MaterialIcons'); @@ -2770,13 +2770,13 @@ class Icons { static const IconData translate = const IconData(0xe8e2, fontFamily: 'MaterialIcons'); ///

trending_down — material icon named "trending down".

- static const IconData trending_down = const IconData(0xe8e3, fontFamily: 'MaterialIcons'); + static const IconData trending_down = const IconData(0xe8e3, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

trending_flat — material icon named "trending flat".

- static const IconData trending_flat = const IconData(0xe8e4, fontFamily: 'MaterialIcons'); + static const IconData trending_flat = const IconData(0xe8e4, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

trending_up — material icon named "trending up".

- static const IconData trending_up = const IconData(0xe8e5, fontFamily: 'MaterialIcons'); + static const IconData trending_up = const IconData(0xe8e5, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

trip_origin — material icon named "trip origin".

static const IconData trip_origin = const IconData(0xe57b, fontFamily: 'MaterialIcons'); @@ -2797,7 +2797,7 @@ class Icons { static const IconData unarchive = const IconData(0xe169, fontFamily: 'MaterialIcons'); ///

undo — material icon named "undo".

- static const IconData undo = const IconData(0xe166, fontFamily: 'MaterialIcons'); + static const IconData undo = const IconData(0xe166, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

unfold_less — material icon named "unfold less".

static const IconData unfold_less = const IconData(0xe5d6, fontFamily: 'MaterialIcons'); @@ -2869,13 +2869,13 @@ class Icons { static const IconData view_headline = const IconData(0xe8ee, fontFamily: 'MaterialIcons'); ///

view_list — material icon named "view list".

- static const IconData view_list = const IconData(0xe8ef, fontFamily: 'MaterialIcons'); + static const IconData view_list = const IconData(0xe8ef, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

view_module — material icon named "view module".

static const IconData view_module = const IconData(0xe8f0, fontFamily: 'MaterialIcons'); ///

view_quilt — material icon named "view quilt".

- static const IconData view_quilt = const IconData(0xe8f1, fontFamily: 'MaterialIcons'); + static const IconData view_quilt = const IconData(0xe8f1, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

view_stream — material icon named "view stream".

static const IconData view_stream = const IconData(0xe8f2, fontFamily: 'MaterialIcons'); @@ -2974,7 +2974,7 @@ class Icons { static const IconData work = const IconData(0xe8f9, fontFamily: 'MaterialIcons'); ///

wrap_text — material icon named "wrap text".

- static const IconData wrap_text = const IconData(0xe25b, fontFamily: 'MaterialIcons'); + static const IconData wrap_text = const IconData(0xe25b, fontFamily: 'MaterialIcons', matchTextDirection: true); ///

youtube_searched_for — material icon named "youtube searched for".

static const IconData youtube_searched_for = const IconData(0xe8fa, fontFamily: 'MaterialIcons'); diff --git a/packages/flutter/lib/src/widgets/icon.dart b/packages/flutter/lib/src/widgets/icon.dart index b89390b1c4..1149847b07 100644 --- a/packages/flutter/lib/src/widgets/icon.dart +++ b/packages/flutter/lib/src/widgets/icon.dart @@ -11,7 +11,6 @@ import 'icon_data.dart'; import 'icon_theme.dart'; import 'icon_theme_data.dart'; - /// A graphical icon widget drawn with a glyph from a font described in /// an [IconData] such as material's predefined [IconData]s in [Icons]. /// @@ -37,6 +36,7 @@ class Icon extends StatelessWidget { this.size, this.color, this.semanticLabel, + this.textDirection, }) : super(key: key); /// The icon to display. The available icons are described in [Icons]. @@ -91,14 +91,29 @@ class Icon extends StatelessWidget { /// /// See also: /// - /// * [Semantics.label] which is set with [semanticLabel] in the underlying + /// * [Semantics.label], which is set to [semanticLabel] in the underlying /// [Semantics] widget. final String semanticLabel; + /// The text direction to use for rendering the icon. + /// + /// If this is null, the ambient [Directionality] is used instead. + /// + /// Some icons follow the reading direction. For example, "back" buttons point + /// left in left-to-right environments and right in right-to-left + /// environments. Such icons have their [IconData.matchTextDirection] field + /// set to true, and the [Icon] widget uses the [textDirection] to determine + /// the orientation in which to draw the icon. + /// + /// This property has no effect if the [icon]'s [IconData.matchTextDirection] + /// field is false, but for consistency a text direction value must always be + /// specified, either directly using this property or using [Directionality]. + final TextDirection textDirection; + @override Widget build(BuildContext context) { - assert(debugCheckHasDirectionality(context)); - final TextDirection textDirection = Directionality.of(context); + assert(this.textDirection != null || debugCheckHasDirectionality(context)); + final TextDirection textDirection = this.textDirection ?? Directionality.of(context); final IconThemeData iconTheme = IconTheme.of(context); @@ -116,6 +131,35 @@ class Icon extends StatelessWidget { if (iconOpacity != 1.0) iconColor = iconColor.withOpacity(iconColor.opacity * iconOpacity); + Widget iconWidget = new RichText( + textDirection: textDirection, // Since we already fetched it for the assert... + text: new TextSpan( + text: new String.fromCharCode(icon.codePoint), + style: new TextStyle( + inherit: false, + color: iconColor, + fontSize: iconSize, + fontFamily: icon.fontFamily, + package: icon.fontPackage, + ), + ), + ); + + if (icon.matchTextDirection) { + switch (textDirection) { + case TextDirection.rtl: + iconWidget = new Transform( + transform: new Matrix4.identity()..scale(-1.0), + alignment: Alignment.center, + transformHitTests: false, + child: iconWidget, + ); + break; + case TextDirection.ltr: + break; + } + } + return new Semantics( label: semanticLabel, child: new ExcludeSemantics( @@ -123,19 +167,7 @@ class Icon extends StatelessWidget { width: iconSize, height: iconSize, child: new Center( - child: new RichText( - textDirection: textDirection, // Since we already fetched it for the assert... - text: new TextSpan( - text: new String.fromCharCode(icon.codePoint), - style: new TextStyle( - inherit: false, - color: iconColor, - fontSize: iconSize, - fontFamily: icon.fontFamily, - package: icon.fontPackage, - ), - ), - ), + child: iconWidget, ), ), ), diff --git a/packages/flutter/lib/src/widgets/icon_data.dart b/packages/flutter/lib/src/widgets/icon_data.dart index c34a754110..35698c0138 100644 --- a/packages/flutter/lib/src/widgets/icon_data.dart +++ b/packages/flutter/lib/src/widgets/icon_data.dart @@ -21,6 +21,7 @@ class IconData { this.codePoint, { this.fontFamily, this.fontPackage, + this.matchTextDirection: false, }); /// The Unicode code point at which this icon is stored in the icon font. @@ -39,6 +40,13 @@ class IconData { /// * [TextStyle], which describes how to use fonts from other packages. final String fontPackage; + /// Whether this icon should be automatically mirrored in right-to-left + /// environments. + /// + /// The [Icon] widget respects this value by mirroring the icon when the + /// [Directionality] is [TextDirection.rtl]. + final bool matchTextDirection; + @override bool operator ==(dynamic other) { if (runtimeType != other.runtimeType)