mirror of
https://github.com/alibaba/flutter-go.git
synced 2025-05-24 08:37:00 +08:00
refactor:code view
This commit is contained in:
@ -2,15 +2,17 @@
|
|||||||
* @Author: 一凨
|
* @Author: 一凨
|
||||||
* @Date: 2019-01-14 11:42:36
|
* @Date: 2019-01-14 11:42:36
|
||||||
* @Last Modified by: 一凨
|
* @Last Modified by: 一凨
|
||||||
* @Last Modified time: 2019-01-14 15:53:20
|
* @Last Modified time: 2019-01-14 16:53:11
|
||||||
*/
|
*/
|
||||||
// Copyright 2016 The Chromium Authors. All rights reserved.
|
// Copyright 2016 The Chromium Authors. All rights reserved.
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import '../routers/application.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
const String _kStartTag = '// START ';
|
const String _kStartTag = '// START ';
|
||||||
const String _kEndTag = '// END';
|
const String _kEndTag = '// END';
|
||||||
@ -18,47 +20,27 @@ const String _kEndTag = '// END';
|
|||||||
Map<String, String> _exampleCode;
|
Map<String, String> _exampleCode;
|
||||||
String _code;
|
String _code;
|
||||||
|
|
||||||
Future<String> getExampleCode(String filePath, AssetBundle bundle) async {
|
void _launchURL(String url) async {
|
||||||
if (_exampleCode == null)
|
if (await canLaunch(url)) {
|
||||||
await _parseExampleCode(filePath,bundle);
|
await launch(url);
|
||||||
// return _exampleCode[filePath];
|
} else {
|
||||||
|
throw 'Could not launch $url';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> getExampleCode(context,String filePath, AssetBundle bundle) async {
|
||||||
|
if (_exampleCode == null) await _parseExampleCode(context,filePath, bundle);
|
||||||
return _code;
|
return _code;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _parseExampleCode(String filePath,AssetBundle bundle) async {
|
Future<void> _parseExampleCode(context,String filePath, AssetBundle bundle) async {
|
||||||
|
String code;
|
||||||
final String code = await bundle.loadString('$filePath') ??
|
try {
|
||||||
'// $filePath not found\n';
|
code = await bundle.loadString('lib/widgets/$filePath');
|
||||||
print('$filePath 1234567Nealyang');
|
} catch (err) {
|
||||||
|
print('${Application.github['widgetsURL']} $filePath');
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
_launchURL(Application.github['widgetsURL'] + filePath);
|
||||||
|
}
|
||||||
_code = code;
|
_code = code;
|
||||||
// _exampleCode = <String, String>{};
|
|
||||||
// final List<String> lines = code.split('\n');
|
|
||||||
// List<String> codeBlock;
|
|
||||||
// String codeTag;
|
|
||||||
|
|
||||||
// for (String line in lines) {
|
|
||||||
// if (codeBlock == null) {
|
|
||||||
// // Outside a block.
|
|
||||||
// if (line.startsWith(_kStartTag)) {
|
|
||||||
// // Starting a new code block.
|
|
||||||
// codeBlock = <String>[];
|
|
||||||
// codeTag = line.substring(_kStartTag.length).trim();
|
|
||||||
// } else {
|
|
||||||
// // Just skipping the line.
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// // Inside a block.
|
|
||||||
// if (line.startsWith(_kEndTag)) {
|
|
||||||
// // Add the block.
|
|
||||||
// _exampleCode[codeTag] = codeBlock.join('\n');
|
|
||||||
// codeBlock = null;
|
|
||||||
// codeTag = null;
|
|
||||||
// } else {
|
|
||||||
// // Add to the current block
|
|
||||||
// // trimRight() to remove any \r on Windows
|
|
||||||
// // without removing any useful indentation
|
|
||||||
// codeBlock.add(line.trimRight());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ class _FullScreenCodeDialogState extends State<FullScreenCodeDialog> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void didChangeDependencies() {
|
void didChangeDependencies() {
|
||||||
getExampleCode(widget.filePath, DefaultAssetBundle.of(context))
|
getExampleCode(context,'${widget.filePath}', DefaultAssetBundle.of(context))
|
||||||
.then<void>((String code) {
|
.then<void>((String code) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
@ -146,8 +146,7 @@ class _WidgetDemoState extends State<WidgetDemo> {
|
|||||||
_launchURL(widget.docUrl);
|
_launchURL(widget.docUrl);
|
||||||
}else if(value =='code'){
|
}else if(value =='code'){
|
||||||
// _launchURL(Application.github['widgetsURL'] + widget.codeUrl);
|
// _launchURL(Application.github['widgetsURL'] + widget.codeUrl);
|
||||||
String targetUrl = 'lib/widgets/${widget.codeUrl}';
|
Application.router.navigateTo(context, '${Routes.codeView}?filePath=${Uri.encodeComponent(widget.codeUrl)}');
|
||||||
Application.router.navigateTo(context, '${Routes.codeView}?filePath=${Uri.encodeComponent(targetUrl)}');
|
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
_getCollection();
|
_getCollection();
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
* @Author: xiaojia.dxj
|
* @Author: xiaojia.dxj
|
||||||
* @Date: 2018-12-18 11:40:57
|
* @Date: 2018-12-18 11:40:57
|
||||||
* @Last Modified by: xiaojia.dxj
|
* @Last Modified by: 一凨
|
||||||
* @Last Modified time: 2018-12-20 15:03:18
|
* @Last Modified time: 2019-01-14 16:50:43
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class ChipDemo extends StatefulWidget {
|
class ChipDemo extends StatefulWidget {
|
||||||
@ -11,13 +12,12 @@ class ChipDemo extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _ChipDemoState extends State<ChipDemo> {
|
class _ChipDemoState extends State<ChipDemo> {
|
||||||
String dec='点击回收';
|
String dec = '点击回收';
|
||||||
int count=0;
|
int count = 0;
|
||||||
_modifty(){
|
_modifty() {
|
||||||
setState(() {
|
setState(() {
|
||||||
dec='delete success: $count';
|
dec = 'delete success: $count';
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -26,42 +26,53 @@ class _ChipDemoState extends State<ChipDemo> {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Container(
|
Container(
|
||||||
child: Chip(
|
child: Chip(
|
||||||
padding: EdgeInsets.only(right: 100.0,),
|
padding: EdgeInsets.only(
|
||||||
|
right: 100.0,
|
||||||
|
),
|
||||||
//标签前面的小widget
|
//标签前面的小widget
|
||||||
avatar: CircleAvatar(
|
avatar: CircleAvatar(
|
||||||
backgroundColor: Colors.red.shade200,
|
backgroundColor: Colors.red.shade200,
|
||||||
child: Text('A',style: TextStyle(color: Colors.white),),
|
child: Text(
|
||||||
|
'A',
|
||||||
|
style: TextStyle(color: Colors.white),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
label: Text(
|
||||||
|
'pai mai ',
|
||||||
|
style: TextStyle(color: Colors.white, fontSize: 18.0),
|
||||||
),
|
),
|
||||||
label: Text('pai mai ',style: TextStyle(color: Colors.white,fontSize: 18.0),),
|
|
||||||
backgroundColor: Colors.red.shade100,
|
backgroundColor: Colors.red.shade100,
|
||||||
labelPadding: EdgeInsets.all(6.0),
|
labelPadding: EdgeInsets.all(6.0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
|
|
||||||
height: 100.0,
|
height: 100.0,
|
||||||
child: Chip(
|
child: Chip(
|
||||||
//头像
|
//头像
|
||||||
avatar: CircleAvatar(
|
avatar: CircleAvatar(
|
||||||
child: Icon(Icons.account_circle,color: Colors.red.shade200,),
|
child: Icon(
|
||||||
backgroundColor:Colors.white,
|
Icons.account_circle,
|
||||||
|
color: Colors.red.shade200,
|
||||||
|
),
|
||||||
|
backgroundColor: Colors.white,
|
||||||
),
|
),
|
||||||
//设置widget背景颜色
|
//设置widget背景颜色
|
||||||
backgroundColor: Colors.red.shade100,
|
backgroundColor: Colors.red.shade100,
|
||||||
/**剪辑窗口widget内容
|
//剪辑窗口widget内容
|
||||||
* antiAlias:剪辑具有抗锯齿功能,它比antiAliasWithSaveLayer快得多,但比hardEdge慢。
|
// antiAlias:剪辑具有抗锯齿功能,它比antiAliasWithSaveLayer快得多,但比hardEdge慢。
|
||||||
antiAliasWithSaveLayer:立即剪辑具有抗锯齿,并且可以分配屏幕外缓冲区,后续涂料都在该缓冲区完成,然后再进行修剪和合成
|
//antiAliasWithSaveLayer:立即剪辑具有抗锯齿,并且可以分配屏幕外缓冲区,后续涂料都在该缓冲区完成,然后再进行修剪和合成
|
||||||
*/
|
|
||||||
clipBehavior: Clip.antiAlias,
|
clipBehavior: Clip.antiAlias,
|
||||||
|
|
||||||
//设置padding值
|
//设置padding值
|
||||||
labelPadding: EdgeInsets.all(8.0),
|
labelPadding: EdgeInsets.all(8.0),
|
||||||
label: Text(dec),
|
label: Text(dec),
|
||||||
//设置onDeleted时候显示的图标
|
//设置onDeleted时候显示的图标
|
||||||
deleteIcon: Icon(Icons.delete,color: Colors.white,size: 20.0,),
|
deleteIcon: Icon(
|
||||||
onDeleted: (){
|
Icons.delete,
|
||||||
|
color: Colors.white,
|
||||||
|
size: 20.0,
|
||||||
|
),
|
||||||
|
onDeleted: () {
|
||||||
count++;
|
count++;
|
||||||
_modifty();
|
_modifty();
|
||||||
},
|
},
|
||||||
@ -79,6 +90,3 @@ class _ChipDemoState extends State<ChipDemo> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,10 +9,8 @@
|
|||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
/*
|
// FlatButton 默认按钮的实例
|
||||||
* FlatButton 默认按钮的实例
|
// isDisabled:是否是禁用,isDisabled 默认为true
|
||||||
* isDisabled:是否是禁用,isDisabled 默认为true
|
|
||||||
* */
|
|
||||||
class FlatButtonDefault extends StatelessWidget {
|
class FlatButtonDefault extends StatelessWidget {
|
||||||
final bool isDisabled;
|
final bool isDisabled;
|
||||||
|
|
||||||
@ -29,11 +27,10 @@ class FlatButtonDefault extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* FlatButton.icon 默认按钮的实例
|
// FlatButton.icon 默认按钮的实例
|
||||||
* Create a text button from a pair of widgets that serve as the button's icon and label
|
// * Create a text button from a pair of widgets that serve as the button's icon and label
|
||||||
* isDisabled:是否是禁用
|
// * isDisabled:是否是禁用
|
||||||
* */
|
|
||||||
class FlatButtonIconDefault extends StatelessWidget {
|
class FlatButtonIconDefault extends StatelessWidget {
|
||||||
final bool isDisabled;
|
final bool isDisabled;
|
||||||
final IconData icon;
|
final IconData icon;
|
||||||
@ -63,9 +60,9 @@ class FlatButtonIconDefault extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* FlatButton 自定义的实例
|
// FlatButton 自定义的实例
|
||||||
* */
|
|
||||||
class FlatButtonCustom extends StatelessWidget {
|
class FlatButtonCustom extends StatelessWidget {
|
||||||
final String txt;
|
final String txt;
|
||||||
final Color color;
|
final Color color;
|
||||||
|
@ -47,7 +47,7 @@ class _DemoState extends State<Demo> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return WidgetDemo(
|
return WidgetDemo(
|
||||||
title: 'Checkbox',
|
title: 'Checkbox',
|
||||||
codeUrl: 'elements/Form/Checkbox/Checkbox/demo.dart',
|
codeUrl: 'elements/Form/CheckBox/Checkbox/demo.dart',
|
||||||
contentList: [allCheckboxs(context,this)],
|
contentList: [allCheckboxs(context,this)],
|
||||||
docUrl: 'https://docs.flutter.io/flutter/material/Checkbox-class.html',
|
docUrl: 'https://docs.flutter.io/flutter/material/Checkbox-class.html',
|
||||||
);
|
);
|
||||||
|
@ -9,10 +9,8 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
/*
|
// Checkbox 默认的实例
|
||||||
* Checkbox 默认的实例
|
// index 当前checkbox 的索引值
|
||||||
* index 当前checkbox 的索引值
|
|
||||||
* */
|
|
||||||
class CheckboxListTileStateDefault extends StatefulWidget {
|
class CheckboxListTileStateDefault extends StatefulWidget {
|
||||||
const CheckboxListTileStateDefault() : super();
|
const CheckboxListTileStateDefault() : super();
|
||||||
|
|
||||||
@ -20,9 +18,7 @@ class CheckboxListTileStateDefault extends StatefulWidget {
|
|||||||
State<StatefulWidget> createState() => _CheckboxListTileStateDefault();
|
State<StatefulWidget> createState() => _CheckboxListTileStateDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// CheckboxListTile 默认的实例,有状态
|
||||||
* CheckboxListTile 默认的实例,有状态
|
|
||||||
* */
|
|
||||||
class _CheckboxListTileStateDefault extends State {
|
class _CheckboxListTileStateDefault extends State {
|
||||||
bool _value = false;
|
bool _value = false;
|
||||||
void _valueChanged(bool value) {
|
void _valueChanged(bool value) {
|
||||||
@ -105,9 +101,7 @@ class _CheckboxListTileStateDefault extends State {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// CheckboxListTile 默认的实例,无状态
|
||||||
* CheckboxListTile 默认的实例,无状态
|
|
||||||
* */
|
|
||||||
class CheckboxListTileDefault extends StatelessWidget {
|
class CheckboxListTileDefault extends StatelessWidget {
|
||||||
final widget;
|
final widget;
|
||||||
final parant;
|
final parant;
|
||||||
|
@ -47,7 +47,7 @@ class _DemoState extends State<Demo> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return WidgetDemo(
|
return WidgetDemo(
|
||||||
title: 'CheckboxListTile',
|
title: 'CheckboxListTile',
|
||||||
codeUrl: 'elements/Form/Checkbox/CheckboxListTile/demo.dart',
|
codeUrl: 'elements/Form/CheckBox/CheckboxListTile/demo.dart',
|
||||||
contentList: [allCheckboxs(context, this)],
|
contentList: [allCheckboxs(context, this)],
|
||||||
docUrl: 'https://docs.flutter.io/flutter/material/CheckboxListTile-class.html',
|
docUrl: 'https://docs.flutter.io/flutter/material/CheckboxListTile-class.html',
|
||||||
);
|
);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @Author: 一凨
|
* @Author: 一凨
|
||||||
* @Date: 2018-11-28 20:44:13
|
* @Date: 2018-11-28 20:44:13
|
||||||
* @Last Modified by: 一凨
|
* @Last Modified by: 一凨
|
||||||
* @Last Modified time: 2018-11-28 20:51:20
|
* @Last Modified time: 2019-01-14 17:02:20
|
||||||
*/
|
*/
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import '../../../../../common/widget_demo.dart';
|
import '../../../../../common/widget_demo.dart';
|
||||||
@ -37,7 +37,7 @@ class _DemoState extends State<Demo> {
|
|||||||
],
|
],
|
||||||
docUrl:
|
docUrl:
|
||||||
'https://docs.flutter.io/flutter/widgets/AnimatedPadding-class.html',
|
'https://docs.flutter.io/flutter/widgets/AnimatedPadding-class.html',
|
||||||
codeUrl: 'elements/Frame/spacing/AnimatedPadding/animatedPadding_demo.dart',
|
codeUrl: 'elements/Frame/Spacing/AnimatedPadding/animatedPadding_demo.dart',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @Author: 一凨
|
* @Author: 一凨
|
||||||
* @Date: 2018-11-28 20:25:24
|
* @Date: 2018-11-28 20:25:24
|
||||||
* @Last Modified by: 一凨
|
* @Last Modified by: 一凨
|
||||||
* @Last Modified time: 2018-11-28 20:25:24
|
* @Last Modified time: 2019-01-14 17:01:55
|
||||||
*/
|
*/
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import '../../../../../common/widget_demo.dart';
|
import '../../../../../common/widget_demo.dart';
|
||||||
@ -38,7 +38,7 @@ class _DemoState extends State<Demo> {
|
|||||||
],
|
],
|
||||||
docUrl: 'https://docs.flutter.io/flutter/widgets/Padding-class.html',
|
docUrl: 'https://docs.flutter.io/flutter/widgets/Padding-class.html',
|
||||||
codeUrl:
|
codeUrl:
|
||||||
'elements/Frame/spacing/Padding/padding_demo.dart',
|
'elements/Frame/Spacing/Padding/padding_demo.dart',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
/*
|
/*
|
||||||
* @Author: 一凨
|
* @Author: 一凨
|
||||||
* @Date: 2018-11-28 20:20:04
|
* @Date: 2018-11-28 20:20:04
|
||||||
* @Last Modified by: 一凨
|
* @Last Modified by: 一凨
|
||||||
* @Last Modified time: 2018-11-28 20:20:49
|
* @Last Modified time: 2019-01-14 16:30:16
|
||||||
*/
|
*/
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class PaddingDemo extends StatelessWidget {
|
class PaddingDemo extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @Author: 一凨
|
* @Author: 一凨
|
||||||
* @Date: 2018-11-28 20:26:16
|
* @Date: 2018-11-28 20:26:16
|
||||||
* @Last Modified by: 一凨
|
* @Last Modified by: 一凨
|
||||||
* @Last Modified time: 2018-11-28 20:39:28
|
* @Last Modified time: 2019-01-14 17:06:36
|
||||||
*/
|
*/
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_go/common/widget_demo.dart';
|
import 'package:flutter_go/common/widget_demo.dart';
|
||||||
@ -33,7 +33,7 @@ class _DemoState extends State<Demo> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return WidgetDemo(
|
return WidgetDemo(
|
||||||
title: 'SliverPadding',
|
title: 'SliverPadding',
|
||||||
codeUrl: 'elements/Frame/spacing/SliverPadding/sliverpadding_demo.dart',
|
codeUrl: 'elements/Frame/Spacing/SliverPadding/sliverpadding_demo.dart',
|
||||||
contentList: [
|
contentList: [
|
||||||
contentDesc0,
|
contentDesc0,
|
||||||
contentDesc1,
|
contentDesc1,
|
||||||
|
@ -39,7 +39,7 @@ class _DemoState extends State<Demo> {
|
|||||||
title: 'IndexedStack',
|
title: 'IndexedStack',
|
||||||
// desc: _desc,
|
// desc: _desc,
|
||||||
codeUrl:
|
codeUrl:
|
||||||
'https://github.com/alibaba-paimai-frontend/flutter-common-widgets-app/blob/dev/sanlu-0.0.4/lib/widgets/elements/Frame/Stack/IndexedStack/demo.dart',
|
'elements/Frame/Stack/IndexedStack/demo.dart',
|
||||||
docUrl: 'https://docs.flutter.io/flutter/widgets/IndexedStack-class.html',
|
docUrl: 'https://docs.flutter.io/flutter/widgets/IndexedStack-class.html',
|
||||||
contentList: [
|
contentList: [
|
||||||
_stackText0,
|
_stackText0,
|
||||||
|
@ -41,7 +41,7 @@ class _DemoState extends State<Demo> {
|
|||||||
return WidgetDemo(
|
return WidgetDemo(
|
||||||
title: 'Stack',
|
title: 'Stack',
|
||||||
codeUrl:
|
codeUrl:
|
||||||
'https://github.com/alibaba-paimai-frontend/flutter-common-widgets-app/blob/dev/sanlu-0.0.4/lib/widgets/elements/Frame/Stack/Stack/demo.dart',
|
'elements/Frame/Stack/Stack/demo.dart',
|
||||||
docUrl: 'https://docs.flutter.io/flutter/widgets/Stack-class.html',
|
docUrl: 'https://docs.flutter.io/flutter/widgets/Stack-class.html',
|
||||||
contentList: [
|
contentList: [
|
||||||
_stackText0,
|
_stackText0,
|
||||||
|
@ -168,6 +168,7 @@ flutter:
|
|||||||
- lib/common/syntax_highlighter.dart
|
- lib/common/syntax_highlighter.dart
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# To add assets to your application, add an assets section, like this:
|
# To add assets to your application, add an assets section, like this:
|
||||||
# assets:
|
# assets:
|
||||||
# - images/a_dot_burr.jpeg
|
# - images/a_dot_burr.jpeg
|
||||||
|
Reference in New Issue
Block a user