feat: vytvořit první verzi

This commit is contained in:
Matyáš Caras 2022-11-03 20:03:02 +01:00
commit eada9c6511
21 changed files with 4991 additions and 0 deletions

46
.gitignore vendored Normal file
View file

@ -0,0 +1,46 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
node_modules

30
.metadata Normal file
View file

@ -0,0 +1,30 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: 6928314d505d2bb4777be05e45d7808a5aa91d2a
channel: stable
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: 6928314d505d2bb4777be05e45d7808a5aa91d2a
base_revision: 6928314d505d2bb4777be05e45d7808a5aa91d2a
- platform: web
create_revision: 6928314d505d2bb4777be05e45d7808a5aa91d2a
base_revision: 6928314d505d2bb4777be05e45d7808a5aa91d2a
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'

16
README.md Normal file
View file

@ -0,0 +1,16 @@
# pavouk
A new Flutter project.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.

29
analysis_options.yaml Normal file
View file

@ -0,0 +1,29 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

27
lib/main.dart Normal file
View file

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:pavouk/okna/domov.dart';
import 'package:responsive_sizer/responsive_sizer.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return ResponsiveSizer(
builder: (p0, p1, p2) => MaterialApp(
title: 'Pavouk | subnetování',
theme: ThemeData(
primarySwatch: Colors.red,
),
darkTheme: ThemeData.dark(),
home: const DomovskaStrana(),
),
);
}
}

308
lib/okna/domov.dart Normal file
View file

@ -0,0 +1,308 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pavouk/okna/reseni.dart';
import 'package:pavouk/util/appbar.dart';
import 'package:pavouk/util/subnet_masky.dart';
import 'package:pavouk/util/vzhled.dart';
import 'package:responsive_sizer/responsive_sizer.dart';
class DomovskaStrana extends StatefulWidget {
const DomovskaStrana({super.key});
@override
State<DomovskaStrana> createState() => _DomovskaStranaState();
}
class _DomovskaStranaState extends State<DomovskaStrana> {
// proměnné pro řešitel
var origoIp = "";
var subnety = <int>[];
var content = [];
final _origoController = TextEditingController();
// proměnné pro generátor
var pocetSubnetu = 0;
var maxPocetRealnych = 0;
var chytakovyMod = false;
@override
void initState() {
super.initState();
setState(() {
generovatSubnetFieldy(3);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: bar(context),
body: SingleChildScrollView(
child: Center(
child: SizedBox(
width:
(Device.orientation == Orientation.landscape) ? 45.w : 100.w,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(
height: 50,
),
Text("Parametry pro generátor", style: Vzhled.nadpis),
const SizedBox(height: 15),
SizedBox(
width: 20.w,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Počet subnetů:",
style: Vzhled.fieldNadpis),
const SizedBox(
width: 20,
),
SizedBox(
width: 100,
child: Tooltip(
message:
"Maximální počet: ${Util.alphabet.length - 1}",
child: TextField(
inputFormatters: [
FilteringTextInputFormatter.digitsOnly
],
onChanged: (value) {
if (value.isNotEmpty) {
pocetSubnetu = int.parse(value);
}
},
),
),
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Max. počet reálných hostů:",
style: Vzhled.fieldNadpis),
const SizedBox(
width: 20,
),
SizedBox(
width: 100,
child: TextField(
inputFormatters: [
FilteringTextInputFormatter.digitsOnly
],
onChanged: (value) {
if (value.isNotEmpty) {
maxPocetRealnych = int.parse(value);
}
},
),
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Chytákový režim:",
style: Vzhled.fieldNadpis),
const SizedBox(
width: 20,
),
Tooltip(
message:
"Garantuje 20% šanci na subnet, který bude mít počet reálných hostů 64, 128 atp.",
child: Checkbox(
value: chytakovyMod,
onChanged: (value) {
setState(() {
chytakovyMod = value ?? false;
});
},
))
],
),
],
),
),
TextButton(
onPressed: () => generuj(),
style: Vzhled.tlacitkoStyl,
child: const Text(
"Generuj příklad",
style: Vzhled.tlacitkoText,
)),
const Divider(
height: 20,
),
Text(
"Parametry pro řešitel",
style: Vzhled.nadpis,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"Zadaná (originální) síť:",
style: Vzhled.fieldNadpis,
),
SizedBox(
width: 30.w,
child: TextField(
onChanged: (value) {
origoIp = value;
},
controller: _origoController,
),
)
],
),
...content,
],
)
],
),
),
),
));
}
final chytaky = [64, 128, 32, 16, 8, 4];
void generovatSubnetFieldy(int pocet, {List<int>? hodnoty}) {
if (pocet > Util.alphabet.length - 1) return;
content = [];
subnety = hodnoty ?? [];
for (var i = 0; i < pocet; i++) {
if (subnety.length == i) subnety.add(40); // dummy hodnoty
content.add(Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
Util.alphabet[i],
style: Vzhled.fieldNadpis,
),
SizedBox(
width: 30.w,
child: Tooltip(
message: "Počet reálných hostů",
child: TextField(
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
onChanged: (value) {
subnety[i] = int.parse(value);
},
controller: TextEditingController(text: subnety[i].toString()),
),
),
)
],
));
}
content.add(const SizedBox(
height: 30,
));
content.add(Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Počet subnetů:", style: Vzhled.fieldNadpis),
const SizedBox(
width: 20,
),
SizedBox(
width: 100,
child: Tooltip(
message: "Maximální počet: ${Util.alphabet.length - 1}",
child: TextField(
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
onChanged: (value) {
if (value.isNotEmpty) {
generovatSubnetFieldy(int.parse(value));
}
},
controller: TextEditingController(text: pocet.toString()),
),
),
)
],
));
content.add(const SizedBox(
height: 20,
));
content.add(
TextButton(
onPressed: () {
var checkIp =
RegExp(r'(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}\/\d{1,2}')
.hasMatch(_origoController.text);
if (!checkIp) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Nezadali jste platný tvar IP adresy a masky.",
style: TextStyle(fontSize: 12.sp),
),
),
);
return;
}
Navigator.push(
context,
MaterialPageRoute(
builder: (c) => Reseni(
origoIp: _origoController.text, subnety: subnety)));
},
style: Vzhled.tlacitkoStyl,
child: const Text(
"Vyřešit příklad",
style: Vzhled.tlacitkoText,
)),
);
setState(() {});
}
void generuj() {
if (pocetSubnetu == 0 || maxPocetRealnych == 0) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Nezadali jste platné údaje pro generátor.",
style: TextStyle(fontSize: 12.sp),
),
),
);
}
Random rnd = Random();
// vytvořit zdrojovou IP
var ip = "";
for (var i = 0; i < 4; i++) {
var p = rnd.nextInt(254) + 1;
ip += p.toString();
if (i != 3) ip += ".";
}
// vytvořit subnet data
var subnetData = <int>[];
for (var i = 0; i < pocetSubnetu; i++) {
if (chytakovyMod) {
var sance = rnd.nextInt(4) + 1;
if (sance == 1) {
subnetData.add(chytaky[rnd.nextInt(chytaky.length)]);
continue;
}
}
subnetData.add(rnd.nextInt(maxPocetRealnych) + 2);
}
// vložit
_origoController.text = "$ip/22";
generovatSubnetFieldy(pocetSubnetu, hodnoty: subnetData);
}
}

305
lib/okna/reseni.dart Normal file
View file

@ -0,0 +1,305 @@
import 'package:flutter/material.dart';
import 'package:pavouk/util/appbar.dart';
import 'package:pavouk/util/subnet_masky.dart';
import 'package:pavouk/util/vzhled.dart';
import 'package:responsive_sizer/responsive_sizer.dart';
class Reseni extends StatefulWidget {
const Reseni({super.key, required this.origoIp, required this.subnety});
final String origoIp;
final List<int> subnety;
@override
State<Reseni> createState() => _ReseniState();
}
class _ReseniState extends State<Reseni> {
var origoNetIP = "";
var content = <TableRow>[
TableRow(children: [
TableCell(
child: Text(
"Název",
style: Vzhled.text,
textAlign: TextAlign.center,
),
),
TableCell(
child: Text("Požadovaný počet zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Reálný počet zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa sítě",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Prefix masky",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa prvního zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa posledního zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa broadcastu",
style: Vzhled.text, textAlign: TextAlign.center),
),
])
];
@override
void initState() {
super.initState();
var p = widget.origoIp.split("/");
var nm = p[1];
origoNetIP = "${Util.ipToNetworkAdd(p[0], Util.prefixToMask(nm))}/$nm";
for (var i = 0; i < widget.subnety.length; i++) {
content.add(TableRow(children: [
TableCell(
child: Text(Util.alphabet[i],
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child:
Text(widget.subnety[i].toString(), textAlign: TextAlign.center),
),
const TableCell(
child: SizedBox(height: 50),
),
const TableCell(
child: SizedBox(height: 50),
),
const TableCell(
child: SizedBox(height: 50),
),
const TableCell(
child: SizedBox(height: 50),
),
const TableCell(
child: SizedBox(height: 50),
),
const TableCell(
child: SizedBox(height: 50),
),
]));
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: bar(context, i: 1),
body: SingleChildScrollView(
child: Center(
child: SizedBox(
width: (Device.orientation == Orientation.landscape) ? 90.w : 100.w,
height: 100.h,
child:
Column(mainAxisAlignment: MainAxisAlignment.center, children: [
const SizedBox(
height: 30,
),
TextButton(
onPressed: () => ukaz(),
style: Vzhled.tlacitkoStyl,
child: const Text(
"Ukázat řešení",
style: Vzhled.tlacitkoText,
),
),
const SizedBox(
height: 30,
),
Row(
children: [
Text(
"Zadaná IP:",
style: Vzhled.tableContent,
),
const SizedBox(
width: 20,
),
Text(origoNetIP, style: Vzhled.tableContent)
],
),
DefaultTextStyle(
style: Vzhled.tableContent,
child: Expanded(
child: Table(
border: TableBorder.all(),
defaultVerticalAlignment: TableCellVerticalAlignment.middle,
defaultColumnWidth: FixedColumnWidth(
Device.orientation == Orientation.landscape
? 90.w / 8
: 100.w / 8),
children: content,
),
),
)
]),
),
),
),
);
}
void ukaz() {
// Resetovat obsah
content = <TableRow>[
TableRow(children: [
TableCell(
child: Text(
"Název",
style: Vzhled.text,
textAlign: TextAlign.center,
),
),
TableCell(
child: Text("Požadovaný počet zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Reálný počet zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa sítě",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Prefix masky",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa prvního zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa posledního zařízení",
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text("Adresa broadcastu",
style: Vzhled.text, textAlign: TextAlign.center),
),
])
];
// seřazení
var kopie = [];
kopie.addAll(widget.subnety);
widget.subnety.sort((a, b) => b.compareTo(a));
var iplist = [];
for (var i = 0; i < widget.subnety.length; i++) {
var sub = Util.subnety(); // načíst možné subnet masky
var ip = "";
if (i == 0) {
ip = origoNetIP.split("/")[0]; // na začátku nastavíme OG adresu
} else {
ip = zvysitIp(iplist[i -
1]); // jinak nastavujeme předchozí adresu broadcastu o jedno větší
}
var prefix = sub.where((element) {
var id = sub.indexOf(element);
bool levo, pravo = false;
// kontrolujeme, že zleva i zprava nejsou lepší hodnoty
if (id > 0) {
levo = (sub[id - 1]["hosti"]! - 2 <= widget.subnety[i]);
} else {
levo = true;
}
if (id < widget.subnety.length - 1) {
pravo = (sub[id + 1]["hosti"]! - 2 >= widget.subnety[i]);
} else {
pravo = true;
}
if (levo && pravo) {
return sub[id]["hosti"]! - 2 >=
widget.subnety[
i]; // a zkontrolujeme že naše samotná hodnota je dostatečná
} else {
return false;
}
}).toList()[0];
var prvni = zvysitIp(ip);
var posledni = zvysitIp(ip);
for (var j = 0; j < prefix["hosti"]! - 3; j++) {
posledni = zvysitIp(posledni);
}
var broadcast = zvysitIp(posledni);
iplist.add(broadcast);
content.add(TableRow(children: [
TableCell(
child: Text(Util.alphabet[kopie.indexOf(widget.subnety[i])],
style: Vzhled.text, textAlign: TextAlign.center),
),
TableCell(
child: Text(
widget.subnety[i].toString(),
textAlign: TextAlign.center,
)),
TableCell(
child: Text((prefix["hosti"]! - 2).toString(),
textAlign: TextAlign.center)),
TableCell(
child: Text(ip, textAlign: TextAlign.center),
),
TableCell(
child:
Text(prefix["prefix"]!.toString(), textAlign: TextAlign.center),
),
TableCell(
child: Text(prvni, textAlign: TextAlign.center),
),
TableCell(
child: Text(posledni, textAlign: TextAlign.center),
),
TableCell(
child: Text(broadcast, textAlign: TextAlign.center),
),
]));
}
setState(() {});
}
String zvysitIp(String ip) {
var p = ip.split(".");
var p1 = int.parse(p[0]);
var p2 = int.parse(p[1]);
var p3 = int.parse(p[2]);
var p4 = int.parse(p[3]);
if (p4 == 255) {
if (p3 == 255) {
if (p2 == 255) {
p1++;
p2 = 0;
p3 = 0;
p4 = 0;
} else {
p2++;
p3 = 0;
p4 = 0;
}
} else {
p3++;
p4 = 0;
}
} else {
p4++;
}
return "$p1.$p2.$p3.$p4";
}
}

21
lib/util/appbar.dart Normal file
View file

@ -0,0 +1,21 @@
import 'package:flutter/material.dart';
import 'package:package_info_plus/package_info_plus.dart';
AppBar bar(BuildContext context, {int i = 0}) => AppBar(
title: const Text('Pavouk - generátor příkladů pro výuku subnetování'),
centerTitle: true,
backgroundColor: Colors.red,
actions: [
IconButton(
icon: const Icon(Icons.info_outline),
onPressed: () {
PackageInfo.fromPlatform().then((v) => showAboutDialog(
context: context,
applicationName: "Pavouk",
applicationVersion: v.version,
applicationLegalese:
"© 2022 Matyáš Caras\nVydáno pod licencí GNU AGPLv3\nVěnováno SŠTE Brno, Olomoucká"));
},
)
],
);

View file

@ -0,0 +1,77 @@
import 'dart:math';
class Util {
static List<Map<String, int>> subnety() {
var list = <Map<String, int>>[
{
"prefix": 30,
"hosti": 4,
}
];
for (int i = 30; i > 8; i--) {
list.add({"prefix": i - 1, "hosti": list[30 - i]["hosti"]! * 2});
}
return list;
}
static List<String> _strToBin(String input) {
var list = <String>[];
input.split(".").forEach((numero) {
print(numero);
var bin = int.parse(numero).toRadixString(2);
while (bin.length < 8) {
bin = "0$bin";
}
print(bin);
list.add(bin);
});
return list;
}
static List<String> _binToStr(List<String> input) {
var list = <String>[];
for (var numero in input) {
list.add(int.parse(numero, radix: 2).toString());
}
return list;
}
static String prefixToMask(String prefix) {
var bin = "1" * int.parse(prefix);
while (bin.length < 32) {
bin += "0";
}
var match = RegExp(r"\d{8}").allMatches(bin);
return _binToStr(match
.map(
(e) => e.group(0)!,
)
.toList())
.join(".");
}
static String ipToNetworkAdd(String ip, String nm) {
var nmBin = _strToBin(nm);
print(nmBin);
var ipBin = _strToBin(ip);
print(ipBin);
var networkAdd = <String>[];
for (int i = 0; i < 4; i++) {
var nmBinChar = nmBin[i].split("");
var ipBinChar = ipBin[i].split("");
var networkAddChar = <String>[];
for (int j = 0; j < 8; j++) {
if (nmBinChar[j] == "1" && ipBinChar[j] == "1") {
networkAddChar.add(ipBinChar[j]);
} else {
networkAddChar.add("0");
}
}
networkAdd.add(networkAddChar.join());
}
return _binToStr(networkAdd).join(".");
}
static const String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
}

18
lib/util/vzhled.dart Normal file
View file

@ -0,0 +1,18 @@
import 'package:flutter/material.dart';
import 'package:responsive_sizer/responsive_sizer.dart';
class Vzhled {
static final TextStyle nadpis = TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.bold,
);
static final TextStyle fieldNadpis =
TextStyle(fontWeight: FontWeight.bold, fontSize: 12.sp);
static const TextStyle tlacitkoText = TextStyle(color: Colors.white);
static final ButtonStyle tlacitkoStyl =
ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.red));
static final TextStyle text = TextStyle(fontSize: 13.sp);
static final TextStyle tableContent = TextStyle(fontSize: 11.sp);
}

3715
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

10
package.json Normal file
View file

@ -0,0 +1,10 @@
{
"devDependencies": {
"cz-conventional-changelog": "^3.3.0"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
}
}

229
pubspec.lock Normal file
View file

@ -0,0 +1,229 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.9.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
source: hosted
version: "1.16.0"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.4"
lints:
dependency: transitive
description:
name: lints
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.12"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.5"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
package_info_plus:
dependency: "direct main"
description:
name: package_info_plus
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.2"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
responsive_sizer:
dependency: "direct main"
description:
name: responsive_sizer
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.12"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
sdks:
dart: ">=2.18.2 <3.0.0"
flutter: ">=2.11.0"

67
pubspec.yaml Normal file
View file

@ -0,0 +1,67 @@
name: pavouk
description: Generátor příkladu k výuce subnetování
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: '>=2.18.2 <3.0.0'
dependencies:
flutter:
sdk: flutter
package_info_plus: ^3.0.1
responsive_sizer: ^3.1.1
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^2.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages

BIN
web/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

BIN
web/icons/Icon-192.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
web/icons/Icon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

58
web/index.html Normal file
View file

@ -0,0 +1,58 @@
<!DOCTYPE html>
<html>
<head>
<!--
If you are serving your web app in a path other than the root, change the
href value below to reflect the base path you are serving from.
The path provided below has to start and end with a slash "/" in order for
it to work correctly.
For more details:
* https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base
This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`.
-->
<base href="$FLUTTER_BASE_HREF">
<meta charset="UTF-8">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<meta name="description" content="A new Flutter project.">
<!-- iOS meta tags & icons -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="pavouk">
<link rel="apple-touch-icon" href="icons/Icon-192.png">
<!-- Favicon -->
<link rel="icon" type="image/png" href="favicon.png"/>
<title>pavouk</title>
<link rel="manifest" href="manifest.json">
<script>
// The value below is injected by flutter build, do not touch.
var serviceWorkerVersion = null;
</script>
<!-- This script adds the flutter initialization JS code -->
<script src="flutter.js" defer></script>
</head>
<body>
<script>
window.addEventListener('load', function(ev) {
// Download main.dart.js
_flutter.loader.loadEntrypoint({
serviceWorker: {
serviceWorkerVersion: serviceWorkerVersion,
}
}).then(function(engineInitializer) {
return engineInitializer.initializeEngine();
}).then(function(appRunner) {
return appRunner.runApp();
});
});
</script>
</body>
</html>

35
web/manifest.json Normal file
View file

@ -0,0 +1,35 @@
{
"name": "pavouk",
"short_name": "pavouk",
"start_url": ".",
"display": "standalone",
"background_color": "#0175C2",
"theme_color": "#0175C2",
"description": "A new Flutter project.",
"orientation": "portrait-primary",
"prefer_related_applications": false,
"icons": [
{
"src": "icons/Icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icons/Icon-512.png",
"sizes": "512x512",
"type": "image/png"
},
{
"src": "icons/Icon-maskable-192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "maskable"
},
{
"src": "icons/Icon-maskable-512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "maskable"
}
]
}