diff --git a/.gitignore b/.gitignore index b43bd647..d05f9d27 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,6 @@ ios/Runner/GeneratedPluginRegistrant.* ios/Flutter/flutter_export_environment.sh pubspec.lock -example/ios/Flutter/flutter_export_environment.sh \ No newline at end of file +example/ios/Flutter/flutter_export_environment.sh + +__pycache__ \ No newline at end of file diff --git a/example/lib/icons_page.dart b/example/lib/icons_page.dart index 78c9637d..39ddee2a 100644 --- a/example/lib/icons_page.dart +++ b/example/lib/icons_page.dart @@ -1,3 +1,12 @@ +/// Platform Icons Example Page. +/// This file generated by script, do not edit this file directly. + +/// Local SDK version information: +/// Flutter 3.10.6 • channel stable • https://github.com/flutter/flutter.git +/// Framework • revision f468f3366c (5 days ago) • 2023-07-12 15:19:05 -0700 +/// Engine • revision cdbeda788a +/// Tools • Dart 3.0.6 • DevTools 2.23.1 + import 'package:flutter/material.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; @@ -50,6 +59,10 @@ class IconsPage extends StatelessWidget { (c) => c.platformIcons.addCircledOutline), _IconCompared('addCircledSolid', (c) => c.platformIcons.addCircledSolid), + _IconCompared('alarm', (c) => c.platformIcons.alarm), + _IconCompared('arrowLeft', (c) => c.platformIcons.arrowLeft), + _IconCompared( + 'arrowRight', (c) => c.platformIcons.arrowRight), _IconCompared('back', (c) => c.platformIcons.back), _IconCompared('batteryCharging', (c) => c.platformIcons.batteryCharging), @@ -58,6 +71,7 @@ class IconsPage extends StatelessWidget { _IconCompared( 'batteryFull', (c) => c.platformIcons.batteryFull), _IconCompared('bluetooth', (c) => c.platformIcons.bluetooth), + _IconCompared('bolt', (c) => c.platformIcons.bolt), _IconCompared('book', (c) => c.platformIcons.book), _IconCompared('bookmark', (c) => c.platformIcons.bookmark), _IconCompared('bookmarkOutline', @@ -69,15 +83,20 @@ class IconsPage extends StatelessWidget { _IconCompared('brightnessSolid', (c) => c.platformIcons.brightnessSolid), _IconCompared('bus', (c) => c.platformIcons.bus), + _IconCompared( + 'calendarToday', (c) => c.platformIcons.calendarToday), + _IconCompared('camera', (c) => c.platformIcons.camera), _IconCompared('car', (c) => c.platformIcons.car), + _IconCompared( + 'chatBubble', (c) => c.platformIcons.chatBubble), _IconCompared('checkBoxBlankOutlineRounded', (c) => c.platformIcons.checkBoxBlankOutlineRounded), + _IconCompared('checkBoxCheckedOutlineRounded', + (c) => c.platformIcons.checkBoxCheckedOutlineRounded), _IconCompared( 'checkBoxIndeterminateOutlineRounded', (c) => c.platformIcons.checkBoxIndeterminateOutlineRounded), - _IconCompared('checkBoxCheckedOutlineRounded', - (c) => c.platformIcons.checkBoxCheckedOutlineRounded), _IconCompared('checkMark', (c) => c.platformIcons.checkMark), _IconCompared('checkMarkCircled', (c) => c.platformIcons.checkMarkCircled), @@ -85,6 +104,11 @@ class IconsPage extends StatelessWidget { (c) => c.platformIcons.checkMarkCircledOutline), _IconCompared('checkMarkCircledSolid', (c) => c.platformIcons.checkMarkCircledSolid), + _IconCompared( + 'chevronLeft', (c) => c.platformIcons.chevronLeft), + _IconCompared( + 'chevronRight', (c) => c.platformIcons.chevronRight), + _IconCompared('circle', (c) => c.platformIcons.circle), _IconCompared('clear', (c) => c.platformIcons.clear), _IconCompared( 'clearThick', (c) => c.platformIcons.clearThick), @@ -93,12 +117,12 @@ class IconsPage extends StatelessWidget { _IconCompared( 'clockSolid', (c) => c.platformIcons.clockSolid), _IconCompared('cloud', (c) => c.platformIcons.cloud), - _IconCompared( - 'cloudSolid', (c) => c.platformIcons.cloudSolid), _IconCompared( 'cloudDownload', (c) => c.platformIcons.cloudDownload), _IconCompared('cloudDownloadSolid', (c) => c.platformIcons.cloudDownloadSolid), + _IconCompared( + 'cloudSolid', (c) => c.platformIcons.cloudSolid), _IconCompared( 'cloudUpload', (c) => c.platformIcons.cloudUpload), _IconCompared('cloudUploadSolid', @@ -112,25 +136,31 @@ class IconsPage extends StatelessWidget { _IconCompared('conversationBubbleOutline', (c) => c.platformIcons.conversationBubbleOutline), _IconCompared('create', (c) => c.platformIcons.create), - _IconCompared('delete', (c) => c.platformIcons.delete), - _IconCompared('dehaze', (c) => c.platformIcons.dehaze), + _IconCompared('crop', (c) => c.platformIcons.crop), _IconCompared( - 'deleteSolid', (c) => c.platformIcons.deleteSolid), + 'cropRotate', (c) => c.platformIcons.cropRotate), + _IconCompared('dehaze', (c) => c.platformIcons.dehaze), + _IconCompared('delete', (c) => c.platformIcons.delete), _IconCompared( 'deleteOutline', (c) => c.platformIcons.deleteOutline), + _IconCompared( + 'deleteSolid', (c) => c.platformIcons.deleteSolid), _IconCompared('downArrow', (c) => c.platformIcons.downArrow), _IconCompared('edit', (c) => c.platformIcons.edit), + _IconCompared('eject', (c) => c.platformIcons.eject), _IconCompared('ellipsis', (c) => c.platformIcons.ellipsis), _IconCompared('error', (c) => c.platformIcons.error), _IconCompared('eyeSlash', (c) => c.platformIcons.eyeSlash), _IconCompared( 'eyeSlashSolid', (c) => c.platformIcons.eyeSlashSolid), _IconCompared('eyeSolid', (c) => c.platformIcons.eyeSolid), - _IconCompared( - 'favoriteSolid', (c) => c.platformIcons.favoriteSolid), _IconCompared('favoriteOutline', (c) => c.platformIcons.favoriteOutline), + _IconCompared( + 'favoriteSolid', (c) => c.platformIcons.favoriteSolid), _IconCompared('flag', (c) => c.platformIcons.flag), + _IconCompared( + 'flagCircle', (c) => c.platformIcons.flagCircle), _IconCompared('folder', (c) => c.platformIcons.folder), _IconCompared( 'folderOpen', (c) => c.platformIcons.folderOpen), @@ -149,23 +179,34 @@ class IconsPage extends StatelessWidget { _IconCompared('group', (c) => c.platformIcons.group), _IconCompared( 'groupSolid', (c) => c.platformIcons.groupSolid), + _IconCompared( + 'headphones', (c) => c.platformIcons.headphones), _IconCompared( 'heartSolid', (c) => c.platformIcons.heartSolid), _IconCompared('help', (c) => c.platformIcons.help), _IconCompared( 'helpOutline', (c) => c.platformIcons.helpOutline), + _IconCompared('hexagon', (c) => c.platformIcons.hexagon), _IconCompared('home', (c) => c.platformIcons.home), + _IconCompared('house', (c) => c.platformIcons.house), _IconCompared('info', (c) => c.platformIcons.info), + _IconCompared('keyboard', (c) => c.platformIcons.keyboard), + _IconCompared('layers', (c) => c.platformIcons.layers), _IconCompared( 'leftChevron', (c) => c.platformIcons.leftChevron), + _IconCompared('lightbulb', (c) => c.platformIcons.lightbulb), + _IconCompared('link', (c) => c.platformIcons.link), _IconCompared('location', (c) => c.platformIcons.location), _IconCompared( 'locationSolid', (c) => c.platformIcons.locationSolid), + _IconCompared('lock', (c) => c.platformIcons.lock), + _IconCompared('lockOpen', (c) => c.platformIcons.lockOpen), _IconCompared('loop', (c) => c.platformIcons.loop), _IconCompared('mail', (c) => c.platformIcons.mail), - _IconCompared('mailSolid', (c) => c.platformIcons.mailSolid), _IconCompared( 'mailOutline', (c) => c.platformIcons.mailOutline), + _IconCompared('mailSolid', (c) => c.platformIcons.mailSolid), + _IconCompared('map', (c) => c.platformIcons.map), _IconCompared('mic', (c) => c.platformIcons.mic), _IconCompared('micOff', (c) => c.platformIcons.micOff), _IconCompared( @@ -178,9 +219,14 @@ class IconsPage extends StatelessWidget { _IconCompared( 'padlockSolid', (c) => c.platformIcons.padlockSolid), _IconCompared('pause', (c) => c.platformIcons.pause), + _IconCompared( + 'pauseCircle', (c) => c.platformIcons.pauseCircle), _IconCompared('pawSolid', (c) => c.platformIcons.pawSolid), _IconCompared('pen', (c) => c.platformIcons.pen), + _IconCompared('percent', (c) => c.platformIcons.percent), _IconCompared('person', (c) => c.platformIcons.person), + _IconCompared('person2', (c) => c.platformIcons.person2), + _IconCompared('person3', (c) => c.platformIcons.person3), _IconCompared('personAdd', (c) => c.platformIcons.personAdd), _IconCompared( 'personAddSolid', (c) => c.platformIcons.personAddSolid), @@ -191,6 +237,7 @@ class IconsPage extends StatelessWidget { _IconCompared('phone', (c) => c.platformIcons.phone), _IconCompared( 'phoneSolid', (c) => c.platformIcons.phoneSolid), + _IconCompared('photo', (c) => c.platformIcons.photo), _IconCompared( 'photoCamera', (c) => c.platformIcons.photoCamera), _IconCompared('photoCameraSolid', @@ -199,13 +246,19 @@ class IconsPage extends StatelessWidget { 'photoLibrary', (c) => c.platformIcons.photoLibrary), _IconCompared('photoLibrarySolid', (c) => c.platformIcons.photoLibrarySolid), + _IconCompared('piano', (c) => c.platformIcons.piano), + _IconCompared('pin', (c) => c.platformIcons.pin), _IconCompared('playArrow', (c) => c.platformIcons.playArrow), + _IconCompared( + 'playArrowSolid', (c) => c.platformIcons.playArrowSolid), _IconCompared( 'playCircle', (c) => c.platformIcons.playCircle), + _IconCompared( + 'playCircleFill', (c) => c.platformIcons.playCircleFill), _IconCompared('playCircleSolid', (c) => c.platformIcons.playCircleSolid), - _IconCompared( - 'playArrowSolid', (c) => c.platformIcons.playArrowSolid), + _IconCompared('power', (c) => c.platformIcons.power), + _IconCompared('rectangle', (c) => c.platformIcons.rectangle), _IconCompared('refresh', (c) => c.platformIcons.refresh), _IconCompared( 'refreshBold', (c) => c.platformIcons.refreshBold), @@ -216,10 +269,16 @@ class IconsPage extends StatelessWidget { (c) => c.platformIcons.removeCircledOutline), _IconCompared('removeCircledSolid', (c) => c.platformIcons.removeCircledSolid), + _IconCompared('repeat', (c) => c.platformIcons.repeat), _IconCompared('reply', (c) => c.platformIcons.reply), _IconCompared('replyAll', (c) => c.platformIcons.replyAll), _IconCompared( 'rightChevron', (c) => c.platformIcons.rightChevron), + _IconCompared('rocket', (c) => c.platformIcons.rocket), + _IconCompared( + 'rotateLeft', (c) => c.platformIcons.rotateLeft), + _IconCompared( + 'rotateRight', (c) => c.platformIcons.rotateRight), _IconCompared('search', (c) => c.platformIcons.search), _IconCompared('settings', (c) => c.platformIcons.settings), _IconCompared( @@ -227,12 +286,18 @@ class IconsPage extends StatelessWidget { _IconCompared('share', (c) => c.platformIcons.share), _IconCompared( 'shareSolid', (c) => c.platformIcons.shareSolid), + _IconCompared('shield', (c) => c.platformIcons.shield), _IconCompared( 'shoppingCart', (c) => c.platformIcons.shoppingCart), _IconCompared('shuffle', (c) => c.platformIcons.shuffle), + _IconCompared('speaker', (c) => c.platformIcons.speaker), + _IconCompared('square', (c) => c.platformIcons.square), _IconCompared('star', (c) => c.platformIcons.star), _IconCompared('starCircleSolid', (c) => c.platformIcons.starCircleSolid), + _IconCompared('stop', (c) => c.platformIcons.stop), + _IconCompared( + 'stopCircle', (c) => c.platformIcons.stopCircle), _IconCompared( 'switchCamera', (c) => c.platformIcons.switchCamera), _IconCompared('switchCameraSolid', @@ -249,12 +314,19 @@ class IconsPage extends StatelessWidget { (c) => c.platformIcons.thumbUpOutlined), _IconCompared('time', (c) => c.platformIcons.time), _IconCompared('timeSolid', (c) => c.platformIcons.timeSolid), + _IconCompared('timelapse', (c) => c.platformIcons.timelapse), + _IconCompared('timer', (c) => c.platformIcons.timer), + _IconCompared('today', (c) => c.platformIcons.today), + _IconCompared('tornado', (c) => c.platformIcons.tornado), _IconCompared('train', (c) => c.platformIcons.train), + _IconCompared('tv', (c) => c.platformIcons.tv), + _IconCompared('umbrella', (c) => c.platformIcons.umbrella), _IconCompared('upArrow', (c) => c.platformIcons.upArrow), _IconCompared( 'videoCamera', (c) => c.platformIcons.videoCamera), _IconCompared('videoCameraSolid', (c) => c.platformIcons.videoCameraSolid), + _IconCompared('videocam', (c) => c.platformIcons.videocam), _IconCompared( 'volumeDown', (c) => c.platformIcons.volumeDown), _IconCompared( @@ -263,6 +335,8 @@ class IconsPage extends StatelessWidget { _IconCompared('volumeUp', (c) => c.platformIcons.volumeUp), _IconCompared('wifi', (c) => c.platformIcons.wifi), _IconCompared('wifiOff', (c) => c.platformIcons.wifiOff), + _IconCompared('zoomIn', (c) => c.platformIcons.zoomIn), + _IconCompared('zoomOut', (c) => c.platformIcons.zoomOut), ], ), ), diff --git a/lib/flutter_platform_widgets.dart b/lib/flutter_platform_widgets.dart index b033d502..189846f9 100644 --- a/lib/flutter_platform_widgets.dart +++ b/lib/flutter_platform_widgets.dart @@ -30,6 +30,7 @@ export 'src/platform_dialog_action.dart'; export 'src/platform_elevated_button.dart'; export 'src/platform_icon_button.dart'; export 'src/platform_icons.dart'; +export 'src/platform_icons_gen.dart'; export 'src/platform_nav_bar.dart'; export 'src/platform_page.dart'; export 'src/platform_page_route.dart'; diff --git a/lib/src/platform_icons.dart b/lib/src/platform_icons.dart index 87f8645b..61f8baf6 100644 --- a/lib/src/platform_icons.dart +++ b/lib/src/platform_icons.dart @@ -188,20 +188,24 @@ class PlatformIcons { isMaterial(context) ? Icons.cloud : CupertinoIcons.cloud_fill; /// Icons: Icons.cloud_download_outlined : CupertinoIcons.cloud_download - IconData get cloudDownload => - isMaterial(context) ? Icons.cloud_download_outlined : CupertinoIcons.cloud_download; + IconData get cloudDownload => isMaterial(context) + ? Icons.cloud_download_outlined + : CupertinoIcons.cloud_download; /// Icons: Icons.cloud_download : CupertinoIcons.cloud_download_fill - IconData get cloudDownloadSolid => - isMaterial(context) ? Icons.cloud_download : CupertinoIcons.cloud_download_fill; + IconData get cloudDownloadSolid => isMaterial(context) + ? Icons.cloud_download + : CupertinoIcons.cloud_download_fill; /// Icons: Icons.cloud_upload_outlined : CupertinoIcons.cloud_upload - IconData get cloudUpload => - isMaterial(context) ? Icons.cloud_upload_outlined : CupertinoIcons.cloud_upload; + IconData get cloudUpload => isMaterial(context) + ? Icons.cloud_upload_outlined + : CupertinoIcons.cloud_upload; /// Icons: Icons.cloud_upload : CupertinoIcons.cloud_upload_fill - IconData get cloudUploadSolid => - isMaterial(context) ? Icons.cloud_upload : CupertinoIcons.cloud_upload_fill; + IconData get cloudUploadSolid => isMaterial(context) + ? Icons.cloud_upload + : CupertinoIcons.cloud_upload_fill; /// Icons: Icons.collections : CupertinoIcons.collections IconData get collections => diff --git a/lib/src/platform_icons_gen.dart b/lib/src/platform_icons_gen.dart new file mode 100644 index 00000000..9cf08a95 --- /dev/null +++ b/lib/src/platform_icons_gen.dart @@ -0,0 +1,405 @@ +/// All same name icons of material and cupertino. +/// This file generated by script, do not edit this file directly. + +/// Local SDK version information: +/// Flutter 3.10.6 • channel stable • https://github.com/flutter/flutter.git +/// Framework • revision f468f3366c (5 days ago) • 2023-07-12 15:19:05 -0700 +/// Engine • revision cdbeda788a +/// Tools • Dart 3.0.6 • DevTools 2.23.1 + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'platform.dart'; +import 'platform_icons.dart'; + +extension PlatformIconsGen on PlatformIcons { + /// Icons: Icons.add : CupertinoIcons.add + IconData get add => isMaterial(context) ? Icons.add : CupertinoIcons.add; + + /// Icons: Icons.alarm : CupertinoIcons.alarm + IconData get alarm => + isMaterial(context) ? Icons.alarm : CupertinoIcons.alarm; + + /// Icons: Icons.arrow_left : CupertinoIcons.arrow_left + IconData get arrowLeft => + isMaterial(context) ? Icons.arrow_left : CupertinoIcons.arrow_left; + + /// Icons: Icons.arrow_right : CupertinoIcons.arrow_right + IconData get arrowRight => + isMaterial(context) ? Icons.arrow_right : CupertinoIcons.arrow_right; + + /// Icons: Icons.battery_full : CupertinoIcons.battery_full + IconData get batteryFull => + isMaterial(context) ? Icons.battery_full : CupertinoIcons.battery_full; + + /// Icons: Icons.bluetooth : CupertinoIcons.bluetooth + IconData get bluetooth => + isMaterial(context) ? Icons.bluetooth : CupertinoIcons.bluetooth; + + /// Icons: Icons.bolt : CupertinoIcons.bolt + IconData get bolt => isMaterial(context) ? Icons.bolt : CupertinoIcons.bolt; + + /// Icons: Icons.book : CupertinoIcons.book + IconData get book => isMaterial(context) ? Icons.book : CupertinoIcons.book; + + /// Icons: Icons.bookmark : CupertinoIcons.bookmark + IconData get bookmark => + isMaterial(context) ? Icons.bookmark : CupertinoIcons.bookmark; + + /// Icons: Icons.calendar_today : CupertinoIcons.calendar_today + IconData get calendarToday => isMaterial(context) + ? Icons.calendar_today + : CupertinoIcons.calendar_today; + + /// Icons: Icons.camera : CupertinoIcons.camera + IconData get camera => + isMaterial(context) ? Icons.camera : CupertinoIcons.camera; + + /// Icons: Icons.chat_bubble : CupertinoIcons.chat_bubble + IconData get chatBubble => + isMaterial(context) ? Icons.chat_bubble : CupertinoIcons.chat_bubble; + + /// Icons: Icons.chevron_left : CupertinoIcons.chevron_left + IconData get chevronLeft => + isMaterial(context) ? Icons.chevron_left : CupertinoIcons.chevron_left; + + /// Icons: Icons.chevron_right : CupertinoIcons.chevron_right + IconData get chevronRight => + isMaterial(context) ? Icons.chevron_right : CupertinoIcons.chevron_right; + + /// Icons: Icons.circle : CupertinoIcons.circle + IconData get circle => + isMaterial(context) ? Icons.circle : CupertinoIcons.circle; + + /// Icons: Icons.clear : CupertinoIcons.clear + IconData get clear => + isMaterial(context) ? Icons.clear : CupertinoIcons.clear; + + /// Icons: Icons.cloud : CupertinoIcons.cloud + IconData get cloud => + isMaterial(context) ? Icons.cloud : CupertinoIcons.cloud; + + /// Icons: Icons.cloud_download : CupertinoIcons.cloud_download + IconData get cloudDownload => isMaterial(context) + ? Icons.cloud_download + : CupertinoIcons.cloud_download; + + /// Icons: Icons.cloud_upload : CupertinoIcons.cloud_upload + IconData get cloudUpload => + isMaterial(context) ? Icons.cloud_upload : CupertinoIcons.cloud_upload; + + /// Icons: Icons.collections : CupertinoIcons.collections + IconData get collections => + isMaterial(context) ? Icons.collections : CupertinoIcons.collections; + + /// Icons: Icons.create : CupertinoIcons.create + IconData get create => + isMaterial(context) ? Icons.create : CupertinoIcons.create; + + /// Icons: Icons.crop : CupertinoIcons.crop + IconData get crop => isMaterial(context) ? Icons.crop : CupertinoIcons.crop; + + /// Icons: Icons.crop_rotate : CupertinoIcons.crop_rotate + IconData get cropRotate => + isMaterial(context) ? Icons.crop_rotate : CupertinoIcons.crop_rotate; + + /// Icons: Icons.delete : CupertinoIcons.delete + IconData get delete => + isMaterial(context) ? Icons.delete : CupertinoIcons.delete; + + /// Icons: Icons.eject : CupertinoIcons.eject + IconData get eject => + isMaterial(context) ? Icons.eject : CupertinoIcons.eject; + + /// Icons: Icons.flag : CupertinoIcons.flag + IconData get flag => isMaterial(context) ? Icons.flag : CupertinoIcons.flag; + + /// Icons: Icons.flag_circle : CupertinoIcons.flag_circle + IconData get flagCircle => + isMaterial(context) ? Icons.flag_circle : CupertinoIcons.flag_circle; + + /// Icons: Icons.folder : CupertinoIcons.folder + IconData get folder => + isMaterial(context) ? Icons.folder : CupertinoIcons.folder; + + /// Icons: Icons.folder_open : CupertinoIcons.folder_open + IconData get folderOpen => + isMaterial(context) ? Icons.folder_open : CupertinoIcons.folder_open; + + /// Icons: Icons.forward : CupertinoIcons.forward + IconData get forward => + isMaterial(context) ? Icons.forward : CupertinoIcons.forward; + + /// Icons: Icons.fullscreen : CupertinoIcons.fullscreen + IconData get fullscreen => + isMaterial(context) ? Icons.fullscreen : CupertinoIcons.fullscreen; + + /// Icons: Icons.fullscreen_exit : CupertinoIcons.fullscreen_exit + IconData get fullscreenExit => isMaterial(context) + ? Icons.fullscreen_exit + : CupertinoIcons.fullscreen_exit; + + /// Icons: Icons.group : CupertinoIcons.group + IconData get group => + isMaterial(context) ? Icons.group : CupertinoIcons.group; + + /// Icons: Icons.headphones : CupertinoIcons.headphones + IconData get headphones => + isMaterial(context) ? Icons.headphones : CupertinoIcons.headphones; + + /// Icons: Icons.hexagon : CupertinoIcons.hexagon + IconData get hexagon => + isMaterial(context) ? Icons.hexagon : CupertinoIcons.hexagon; + + /// Icons: Icons.home : CupertinoIcons.home + IconData get home => isMaterial(context) ? Icons.home : CupertinoIcons.home; + + /// Icons: Icons.house : CupertinoIcons.house + IconData get house => + isMaterial(context) ? Icons.house : CupertinoIcons.house; + + /// Icons: Icons.info : CupertinoIcons.info + IconData get info => isMaterial(context) ? Icons.info : CupertinoIcons.info; + + /// Icons: Icons.keyboard : CupertinoIcons.keyboard + IconData get keyboard => + isMaterial(context) ? Icons.keyboard : CupertinoIcons.keyboard; + + /// Icons: Icons.layers : CupertinoIcons.layers + IconData get layers => + isMaterial(context) ? Icons.layers : CupertinoIcons.layers; + + /// Icons: Icons.lightbulb : CupertinoIcons.lightbulb + IconData get lightbulb => + isMaterial(context) ? Icons.lightbulb : CupertinoIcons.lightbulb; + + /// Icons: Icons.link : CupertinoIcons.link + IconData get link => isMaterial(context) ? Icons.link : CupertinoIcons.link; + + /// Icons: Icons.lock : CupertinoIcons.lock + IconData get lock => isMaterial(context) ? Icons.lock : CupertinoIcons.lock; + + /// Icons: Icons.lock_open : CupertinoIcons.lock_open + IconData get lockOpen => + isMaterial(context) ? Icons.lock_open : CupertinoIcons.lock_open; + + /// Icons: Icons.loop : CupertinoIcons.loop + IconData get loop => isMaterial(context) ? Icons.loop : CupertinoIcons.loop; + + /// Icons: Icons.mail : CupertinoIcons.mail + IconData get mail => isMaterial(context) ? Icons.mail : CupertinoIcons.mail; + + /// Icons: Icons.map : CupertinoIcons.map + IconData get map => isMaterial(context) ? Icons.map : CupertinoIcons.map; + + /// Icons: Icons.mic : CupertinoIcons.mic + IconData get mic => isMaterial(context) ? Icons.mic : CupertinoIcons.mic; + + /// Icons: Icons.mic_off : CupertinoIcons.mic_off + IconData get micOff => + isMaterial(context) ? Icons.mic_off : CupertinoIcons.mic_off; + + /// Icons: Icons.music_note : CupertinoIcons.music_note + IconData get musicNote => + isMaterial(context) ? Icons.music_note : CupertinoIcons.music_note; + + /// Icons: Icons.pause : CupertinoIcons.pause + IconData get pause => + isMaterial(context) ? Icons.pause : CupertinoIcons.pause; + + /// Icons: Icons.pause_circle : CupertinoIcons.pause_circle + IconData get pauseCircle => + isMaterial(context) ? Icons.pause_circle : CupertinoIcons.pause_circle; + + /// Icons: Icons.percent : CupertinoIcons.percent + IconData get percent => + isMaterial(context) ? Icons.percent : CupertinoIcons.percent; + + /// Icons: Icons.person : CupertinoIcons.person + IconData get person => + isMaterial(context) ? Icons.person : CupertinoIcons.person; + + /// Icons: Icons.person_2 : CupertinoIcons.person_2 + IconData get person2 => + isMaterial(context) ? Icons.person_2 : CupertinoIcons.person_2; + + /// Icons: Icons.person_3 : CupertinoIcons.person_3 + IconData get person3 => + isMaterial(context) ? Icons.person_3 : CupertinoIcons.person_3; + + /// Icons: Icons.person_add : CupertinoIcons.person_add + IconData get personAdd => + isMaterial(context) ? Icons.person_add : CupertinoIcons.person_add; + + /// Icons: Icons.phone : CupertinoIcons.phone + IconData get phone => + isMaterial(context) ? Icons.phone : CupertinoIcons.phone; + + /// Icons: Icons.photo : CupertinoIcons.photo + IconData get photo => + isMaterial(context) ? Icons.photo : CupertinoIcons.photo; + + /// Icons: Icons.photo_camera : CupertinoIcons.photo_camera + IconData get photoCamera => + isMaterial(context) ? Icons.photo_camera : CupertinoIcons.photo_camera; + + /// Icons: Icons.piano : CupertinoIcons.piano + IconData get piano => + isMaterial(context) ? Icons.piano : CupertinoIcons.piano; + + /// Icons: Icons.pin : CupertinoIcons.pin + IconData get pin => isMaterial(context) ? Icons.pin : CupertinoIcons.pin; + + /// Icons: Icons.play_arrow : CupertinoIcons.play_arrow + IconData get playArrow => + isMaterial(context) ? Icons.play_arrow : CupertinoIcons.play_arrow; + + /// Icons: Icons.play_circle : CupertinoIcons.play_circle + IconData get playCircle => + isMaterial(context) ? Icons.play_circle : CupertinoIcons.play_circle; + + /// Icons: Icons.play_circle_fill : CupertinoIcons.play_circle_fill + IconData get playCircleFill => isMaterial(context) + ? Icons.play_circle_fill + : CupertinoIcons.play_circle_fill; + + /// Icons: Icons.power : CupertinoIcons.power + IconData get power => + isMaterial(context) ? Icons.power : CupertinoIcons.power; + + /// Icons: Icons.rectangle : CupertinoIcons.rectangle + IconData get rectangle => + isMaterial(context) ? Icons.rectangle : CupertinoIcons.rectangle; + + /// Icons: Icons.refresh : CupertinoIcons.refresh + IconData get refresh => + isMaterial(context) ? Icons.refresh : CupertinoIcons.refresh; + + /// Icons: Icons.repeat : CupertinoIcons.repeat + IconData get repeat => + isMaterial(context) ? Icons.repeat : CupertinoIcons.repeat; + + /// Icons: Icons.reply : CupertinoIcons.reply + IconData get reply => + isMaterial(context) ? Icons.reply : CupertinoIcons.reply; + + /// Icons: Icons.reply_all : CupertinoIcons.reply_all + IconData get replyAll => + isMaterial(context) ? Icons.reply_all : CupertinoIcons.reply_all; + + /// Icons: Icons.rocket : CupertinoIcons.rocket + IconData get rocket => + isMaterial(context) ? Icons.rocket : CupertinoIcons.rocket; + + /// Icons: Icons.rotate_left : CupertinoIcons.rotate_left + IconData get rotateLeft => + isMaterial(context) ? Icons.rotate_left : CupertinoIcons.rotate_left; + + /// Icons: Icons.rotate_right : CupertinoIcons.rotate_right + IconData get rotateRight => + isMaterial(context) ? Icons.rotate_right : CupertinoIcons.rotate_right; + + /// Icons: Icons.search : CupertinoIcons.search + IconData get search => + isMaterial(context) ? Icons.search : CupertinoIcons.search; + + /// Icons: Icons.settings : CupertinoIcons.settings + IconData get settings => + isMaterial(context) ? Icons.settings : CupertinoIcons.settings; + + /// Icons: Icons.share : CupertinoIcons.share + IconData get share => + isMaterial(context) ? Icons.share : CupertinoIcons.share; + + /// Icons: Icons.shield : CupertinoIcons.shield + IconData get shield => + isMaterial(context) ? Icons.shield : CupertinoIcons.shield; + + /// Icons: Icons.shopping_cart : CupertinoIcons.shopping_cart + IconData get shoppingCart => + isMaterial(context) ? Icons.shopping_cart : CupertinoIcons.shopping_cart; + + /// Icons: Icons.shuffle : CupertinoIcons.shuffle + IconData get shuffle => + isMaterial(context) ? Icons.shuffle : CupertinoIcons.shuffle; + + /// Icons: Icons.speaker : CupertinoIcons.speaker + IconData get speaker => + isMaterial(context) ? Icons.speaker : CupertinoIcons.speaker; + + /// Icons: Icons.square : CupertinoIcons.square + IconData get square => + isMaterial(context) ? Icons.square : CupertinoIcons.square; + + /// Icons: Icons.star : CupertinoIcons.star + IconData get star => isMaterial(context) ? Icons.star : CupertinoIcons.star; + + /// Icons: Icons.stop : CupertinoIcons.stop + IconData get stop => isMaterial(context) ? Icons.stop : CupertinoIcons.stop; + + /// Icons: Icons.stop_circle : CupertinoIcons.stop_circle + IconData get stopCircle => + isMaterial(context) ? Icons.stop_circle : CupertinoIcons.stop_circle; + + /// Icons: Icons.switch_camera : CupertinoIcons.switch_camera + IconData get switchCamera => + isMaterial(context) ? Icons.switch_camera : CupertinoIcons.switch_camera; + + /// Icons: Icons.tag : CupertinoIcons.tag + IconData get tag => isMaterial(context) ? Icons.tag : CupertinoIcons.tag; + + /// Icons: Icons.timelapse : CupertinoIcons.timelapse + IconData get timelapse => + isMaterial(context) ? Icons.timelapse : CupertinoIcons.timelapse; + + /// Icons: Icons.timer : CupertinoIcons.timer + IconData get timer => + isMaterial(context) ? Icons.timer : CupertinoIcons.timer; + + /// Icons: Icons.today : CupertinoIcons.today + IconData get today => + isMaterial(context) ? Icons.today : CupertinoIcons.today; + + /// Icons: Icons.tornado : CupertinoIcons.tornado + IconData get tornado => + isMaterial(context) ? Icons.tornado : CupertinoIcons.tornado; + + /// Icons: Icons.tv : CupertinoIcons.tv + IconData get tv => isMaterial(context) ? Icons.tv : CupertinoIcons.tv; + + /// Icons: Icons.umbrella : CupertinoIcons.umbrella + IconData get umbrella => + isMaterial(context) ? Icons.umbrella : CupertinoIcons.umbrella; + + /// Icons: Icons.videocam : CupertinoIcons.videocam + IconData get videocam => + isMaterial(context) ? Icons.videocam : CupertinoIcons.videocam; + + /// Icons: Icons.volume_down : CupertinoIcons.volume_down + IconData get volumeDown => + isMaterial(context) ? Icons.volume_down : CupertinoIcons.volume_down; + + /// Icons: Icons.volume_mute : CupertinoIcons.volume_mute + IconData get volumeMute => + isMaterial(context) ? Icons.volume_mute : CupertinoIcons.volume_mute; + + /// Icons: Icons.volume_off : CupertinoIcons.volume_off + IconData get volumeOff => + isMaterial(context) ? Icons.volume_off : CupertinoIcons.volume_off; + + /// Icons: Icons.volume_up : CupertinoIcons.volume_up + IconData get volumeUp => + isMaterial(context) ? Icons.volume_up : CupertinoIcons.volume_up; + + /// Icons: Icons.wifi : CupertinoIcons.wifi + IconData get wifi => isMaterial(context) ? Icons.wifi : CupertinoIcons.wifi; + + /// Icons: Icons.zoom_in : CupertinoIcons.zoom_in + IconData get zoomIn => + isMaterial(context) ? Icons.zoom_in : CupertinoIcons.zoom_in; + + /// Icons: Icons.zoom_out : CupertinoIcons.zoom_out + IconData get zoomOut => + isMaterial(context) ? Icons.zoom_out : CupertinoIcons.zoom_out; +} diff --git a/utils/README.md b/utils/README.md new file mode 100644 index 00000000..4959d6ce --- /dev/null +++ b/utils/README.md @@ -0,0 +1,23 @@ +# Utils + +## icons_gen + +### Description: + +- Automatically generate platform icons extension class (library file) with the same name between Material and Cupertino to `lib/src/platform_icons_gen.dart` file with sorted by name by dart's `Extension`, without changing the existing code(`lib/src/platform_icons.dart`) + +- Automatically generate example page of all icons to file `example/lib//icons_page.dart` with sorted by name, from file `lib/src/platform_icons.dart` and `lib/src/platform_icons_gen.dart`. + +### Usage: + +- Automatically detect (Based on `flutter doctor -v` command, may be slowly): + + ``` + python3 utils/icons_gen/main.py + ``` + +- Manually: + + ``` + python3 utils/icons_gen/main.py --flutter-path + ``` diff --git a/utils/icons_gen/__init__.py b/utils/icons_gen/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/utils/icons_gen/constant.py b/utils/icons_gen/constant.py new file mode 100644 index 00000000..22b34b3f --- /dev/null +++ b/utils/icons_gen/constant.py @@ -0,0 +1,106 @@ +import subprocess + +# Constant variables of paths +material_icons_relative_path = 'packages/flutter/lib/src/material/icons.dart' +cupertino_icons_relative_path = 'packages/flutter/lib/src/cupertino/icons.dart' +platform_icons_relative_path = './lib/src/platform_icons.dart' +platform_icons_gen_relative_path = './lib/src/platform_icons_gen.dart' +platform_icons_example_page_relative_path = './example/lib/icons_page.dart' + +# Code snippets for header of platform_icons_gen.dart file. +platform_icons_dart_header = """ +/// All same name icons of material and cupertino. +/// This file generated by script, do not edit this file directly. + +/// Local SDK version information: +""" + '/// ' + subprocess.check_output(['flutter', '--version']).decode('utf-8').rstrip().replace('\n','\n/// ') + """ + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'platform.dart'; +import 'platform_icons.dart'; + +extension PlatformIconsGen on PlatformIcons { +""" + + +# Code snippets for header of icons_page.dart file (example page). +platform_icons_example_page_header = """ +/// Platform Icons Example Page. +/// This file generated by script, do not edit this file directly. + +/// Local SDK version information: +""" + '/// ' + subprocess.check_output(['flutter', '--version']).decode('utf-8').rstrip().replace('\n','\n/// ') + """ + +import 'package:flutter/material.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; + +import 'platform_widget_example.dart'; + +class IconsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return PlatformScaffold( + iosContentPadding: true, + appBar: PlatformAppBar(title: Text('Platform Icons')), + body: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text( + 'Material', + textAlign: TextAlign.center, + ), + ), + Expanded( + child: Text( + 'Cupertino', + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + Divider( + thickness: 2, + ), + Expanded( + child: SingleChildScrollView( + child: Column( + children: [ +""" + +# Code snippets for end of icons_page.dart file (example page). +platform_icons_example_page_end = """ + ], + ), + ), + ), + ], + ), + ); + } +} + +class _IconCompared extends StatelessWidget { + _IconCompared(this.title, this.icon); + + final String title; + final IconData Function(BuildContext context) icon; + + @override + Widget build(BuildContext context) { + return PlatformWidgetExample( + title: title, + showBothPlatforms: true, + builder: (context, platform) => Icon(icon(context)), + ); + } +} +""" \ No newline at end of file diff --git a/utils/icons_gen/functions.py b/utils/icons_gen/functions.py new file mode 100644 index 00000000..ae2ba1cb --- /dev/null +++ b/utils/icons_gen/functions.py @@ -0,0 +1,124 @@ +import argparse +import subprocess +import os +import re + +from constant import * + +# Get the Flutter SDK path (manually specify or automatically find) +def get_flutter_sdk_path(): + # When the Flutter SDK path is specified manually, use it directly + parser = argparse.ArgumentParser() + parser.add_argument('--flutter-path', help='Manually specify the Flutter SDK path') + flutter_path = parser.parse_args().flutter_path + if flutter_path: + return flutter_path + # When the Flutter SDK path is not specified, automatically find it + try: # Run the command "flutter doctor -v" to get the Flutter SDK path + output = subprocess.check_output(['flutter', 'doctor', '-v']).decode('utf-8') + lines = output.split('\n') + for line in lines: + if line.startswith('• Flutter version'): + return line.split(' at ')[-1] + except subprocess.CalledProcessError: + pass + +# Get the Flutter SDK version on the current machine +def get_flutter_version(): + output = subprocess.check_output(['flutter', '--version']).decode('utf-8') + return output + +# Extract the icon names from the specified file +def read_icons(file_path,pattern): + icons = [] + with open(file_path, 'r') as file: + content = file.read() + matches = re.findall(pattern, content) + icons.extend(matches) + return icons + +# Append new icons to the target file +def append_new_icons_to_file(new_icons, file_path): + with open(file_path, 'r') as file: + lines = file.readlines() + + # Find the last "}" in the file + last_bracket_index = None + for i in range(len(lines) - 1, -1, -1): + if lines[i].strip() == '}': + last_bracket_index = i + break + + if last_bracket_index is not None: + # Generate new code + new_code = [] + for icon in new_icons: + # camel_case_name = ''.join(word.capitalize() for word in icon.split('_')) + words = icon.split('_') + camel_case_name = words[0] + ''.join(word.capitalize() if i > 0 else word for i, word in enumerate(words[1:])) + camel_case_name = camel_case_name[0].lower() + camel_case_name[1:] # 将首字母转换为小写 + new_code.append(f' /// Icons: Icons.{icon} : CupertinoIcons.{icon}\n') + new_code.append(f' IconData get {camel_case_name} => isMaterial(context)\n') + new_code.append(f' ? Icons.{icon}\n') + new_code.append(f' : CupertinoIcons.{icon};\n') + new_code.append('\n') + + # Delete the last "}" line and add new icon code before it + del lines[last_bracket_index] + lines[last_bracket_index:last_bracket_index] = new_code + + with open(file_path, 'w') as file: + file.writelines(lines) + print('Icons added to the file successfully.') + else: + print('Error: Failed to find the last "}" in the file.') + +# Generate extension class file +def generate_icons_library_file(file_path,icons): + # If file already exists, then delete it + if os.path.exists(file_path): + os.remove(file_path) + with open(file_path, 'w') as file: + file.write(platform_icons_dart_header) # Write header of file + for icon in icons: + words = icon.split('_') + icon_name_camel_case = words[0] + ''.join(word.title() for word in words[1:]) + file.write(f' /// Icons: Icons.{icon} : CupertinoIcons.{icon}\n') + file.write(f' IconData get {icon_name_camel_case} => isMaterial(context)\n') + file.write(f' ? Icons.{icon}\n') + file.write(f' : CupertinoIcons.{icon};\n') + file.write('\n') + file.write('}\n') + +# Generate icons example page file +def generate_icons_example_page_file(file_path,camel_case_icons): + # If file already exists, then delete it + if os.path.exists(file_path): + os.remove(file_path) + with open(file_path, 'w') as file: + file.write(platform_icons_example_page_header) # Write header of file + for icon in camel_case_icons: + file.write(f' _IconCompared(\'{icon}\', (c) => c.platformIcons.{icon}),\n') + file.write(platform_icons_example_page_end) # Write end of file + +# Transform the icon name from under_score to camelCase (for example: add_alert -> addAlert) +def under_score_to_camel_case(icon_list): + result = [] + for icon_name in icon_list: + words = icon_name.split('_') + camel_case_name = words[0].lower() + ''.join(word.capitalize() for word in words[1:]) + result.append(camel_case_name) + return result + +# Transform the icon name from camelCase to under_score (for example: addAlert -> add_alert) +def camel_case_to_under_score(camel_case_list): + result = [] + for camel_case_name in camel_case_list: + under_score_name = '' + for i, char in enumerate(camel_case_name): + if char.isupper(): + under_score_name += '_' + char.lower() + else: + under_score_name += char + result.append(under_score_name) + return result \ No newline at end of file diff --git a/utils/icons_gen/main.py b/utils/icons_gen/main.py new file mode 100644 index 00000000..9f5201e1 --- /dev/null +++ b/utils/icons_gen/main.py @@ -0,0 +1,45 @@ +from functions import * +from constant import * + +# Get the Flutter SDK path (manually specify or automatically find) +flutter_sdk_path = get_flutter_sdk_path() +print('Flutter SDK Path:', flutter_sdk_path) + +# Extract the icon names of material style +material_icons = read_icons(flutter_sdk_path + '/' + material_icons_relative_path,pattern='static const IconData (\w+)') +print('Material Icons:', len(material_icons)) + +# Extract the icon names of cupertino style +cupertino_icons = read_icons(flutter_sdk_path + '/' + cupertino_icons_relative_path,pattern='static const IconData (\w+)') +print('Cupertino Icons:', len(cupertino_icons)) + +# Find the common icons of material and cupertino +common_name_icons = set(material_icons) & set(cupertino_icons) +print('Common Name Icons:', len(common_name_icons)) + +# Generate library file (with sorted) +generate_icons_library_file(platform_icons_gen_relative_path,sorted(list(common_name_icons))) +print('PlatformIconsGen generated:',platform_icons_gen_relative_path) + +# Read the icon names in the platform_icons.dart file (the icons that have been encapsulated) +existing_platform_icons = read_icons(platform_icons_relative_path,pattern='(?') +print('Existing Platform Icons:', len(existing_platform_icons)) + +# Calculate all platform icons(union of platform_icons.dart and platform_icons_gen.dart) +all_platform_icons = set(existing_platform_icons) | set(under_score_to_camel_case(common_name_icons)) +print('All Platform Icons:', len(all_platform_icons)) + +# Generate example page file (with sorted) +generate_icons_example_page_file(platform_icons_example_page_relative_path,sorted(list(all_platform_icons))) +print('IconsPage generated:',platform_icons_example_page_relative_path) + + + +# Calculate the icons that need to be added +# new_common_name_icons = set(under_score_to_camel_case(common_name_icons)) - set(existing_platform_icons) +# print('new_common_name_icons: ',len(new_common_name_icons)) + +# Append new icons to the target file +# append_new_icons_to_file(camel_case_to_under_score(common_name_icons),platform_icons_relative_path) +# print('Target file updated successfully.') +