feat: campaigns wip

This commit is contained in:
Chen Asraf
2023-05-24 00:53:40 +03:00
parent 9d3442a75d
commit 384dbf9e50
16 changed files with 206 additions and 205 deletions

View File

@@ -4,7 +4,7 @@
# This file should be version controlled.
version:
revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
channel: beta
project_type: app
@@ -13,26 +13,26 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
- platform: android
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
- platform: ios
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
- platform: linux
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
- platform: macos
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
- platform: web
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
- platform: windows
create_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
base_revision: ecdb7841df7de82e8c1abf6d98db25f160e7fde4
create_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
base_revision: 74e4b092e5212ebf8292dde2a48d3da960c0920b
# User provided section

View File

@@ -1,13 +1,6 @@
package app.dungeonpaper
package app.dungeon_paper
import android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
}
}

View File

@@ -1,6 +0,0 @@
package app.dungeon_paper_app
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

View File

@@ -1,6 +0,0 @@
package app.dungeonpaper
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

View File

@@ -90,7 +90,9 @@ class Campaign with WithIcon implements WithMeta {
String get displayName => name;
@override
IconData get icon => Icons.groups;
IconData get icon => genericIcon;
static IconData get genericIcon => Icons.groups;
@override
String get storageKey => 'Campaigns';

View File

@@ -0,0 +1,12 @@
import 'package:get/get.dart';
import '../controllers/campaigns_list_controller.dart';
class CampaignsListBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<CampaignsListController>(
() => CampaignsListController(),
);
}
}

View File

@@ -0,0 +1,29 @@
import 'dart:async';
import 'package:dungeon_paper/app/data/models/campaign.dart';
import 'package:dungeon_paper/core/storage_handler/storage_handler.dart';
import 'package:get/get.dart';
class CampaignsListController extends GetxController {
StreamSubscription? _campaignsListenerSubscription;
final _campaigns = <Campaign>[].obs;
List<Campaign> get campaigns => _campaigns.toList();
final count = 0.obs;
@override
void onInit() {
super.onInit();
_campaignsListenerSubscription = StorageHandler.instance.collectionListener('Campaigns', _campaignsListener);
}
@override
void onClose() {
_campaignsListenerSubscription?.cancel();
super.onClose();
}
void _campaignsListener(List<DocData> data) {
_campaigns.value = data.map((e) => Campaign.fromJson(e)).toList();
}
}

View File

@@ -0,0 +1,39 @@
import 'package:dungeon_paper/app/data/models/campaign.dart';
import 'package:dungeon_paper/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../controllers/campaigns_list_controller.dart';
class CampaignsListView extends GetView<CampaignsListController> {
const CampaignsListView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(S.current.myGeneric(S.current.entityPlural(Campaign))),
centerTitle: true,
),
body: Obx(
() => controller.campaigns.isEmpty
? Center(
child: Text(S.current.noGeneric(S.current.entityPlural(Campaign))),
)
: ListView.builder(
itemCount: controller.campaigns.length,
itemBuilder: (context, index) {
final campaign = controller.campaigns[index];
return ListTile(
title: Text(campaign.name),
subtitle: Text(campaign.description),
// onTap: () => controller.openCampaign(campaign),
// ignore: avoid_returning_null_for_void
onTap: () => null,
);
},
),
),
);
}
}

View File

@@ -0,0 +1,12 @@
import 'package:get/get.dart';
import '../controllers/campaign_controller.dart';
class CampaignBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<CampaignController>(
() => CampaignController(),
);
}
}

View File

@@ -0,0 +1,23 @@
import 'package:get/get.dart';
class CampaignController extends GetxController {
//TODO: Implement CampaignController
final count = 0.obs;
@override
void onInit() {
super.onInit();
}
@override
void onReady() {
super.onReady();
}
@override
void onClose() {
super.onClose();
}
void increment() => count.value++;
}

View File

@@ -0,0 +1,24 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../controllers/campaign_controller.dart';
class CampaignView extends GetView<CampaignController> {
const CampaignView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('CampaignView'),
centerTitle: true,
),
body: const Center(
child: Text(
'CampaignView is working',
style: TextStyle(fontSize: 20),
),
),
);
}
}

View File

@@ -1,9 +1,3 @@
import 'package:dungeon_paper/app/widgets/forms/character_class_form.dart';
import 'package:dungeon_paper/app/widgets/forms/item_form.dart';
import 'package:dungeon_paper/app/widgets/forms/move_form.dart';
import 'package:dungeon_paper/app/widgets/forms/note_form.dart';
import 'package:dungeon_paper/app/widgets/forms/race_form.dart';
import 'package:dungeon_paper/app/widgets/forms/spell_form.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
@@ -30,6 +24,10 @@ import '../modules/BioForm/bindings/bio_form_binding.dart';
import '../modules/BioForm/views/bio_form_view.dart';
import '../modules/BondsFlagsForm/bindings/bonds_flags_form_binding.dart';
import '../modules/BondsFlagsForm/views/bonds_flags_form_view.dart';
import '../modules/Campaign/CampaignsList/bindings/campaigns_list_binding.dart';
import '../modules/Campaign/CampaignsList/views/campaigns_list_view.dart';
import '../modules/Campaign/bindings/campaign_binding.dart';
import '../modules/Campaign/views/campaign_view.dart';
import '../modules/CharacterList/bindings/character_list_binding.dart';
import '../modules/CharacterList/views/character_list_view.dart';
import '../modules/ClassAlignments/bindings/class_alignments_binding.dart';
@@ -65,6 +63,12 @@ import '../modules/StartingGearForm/bindings/starting_gear_form_binding.dart';
import '../modules/StartingGearForm/views/starting_gear_form_view.dart';
import '../modules/UniversalSearch/bindings/universal_search_binding.dart';
import '../modules/UniversalSearch/views/universal_search_view.dart';
import '../widgets/forms/character_class_form.dart';
import '../widgets/forms/item_form.dart';
import '../widgets/forms/move_form.dart';
import '../widgets/forms/note_form.dart';
import '../widgets/forms/race_form.dart';
import '../widgets/forms/spell_form.dart';
import '../widgets/molecules/user_menu_popover.dart';
import '../widgets/views/roll_dice_view.dart';
import 'custom_transitions.dart';
@@ -343,6 +347,11 @@ class AppPages {
page: () => const SendFeedbackView(),
binding: SendFeedbackBinding(),
),
GetPage(
name: _Paths.campaigns,
page: () => const CampaignsListView(),
binding: CampaignsListBinding(),
),
];
}

View File

@@ -95,22 +95,28 @@ abstract class Routes {
static const createCharacter = _Paths.character + _Paths.create;
/// `/character/create/roll-stats`
static const createCharacterAbilityScores = _Paths.character + _Paths.create + _Paths.abilityScores;
static const createCharacterAbilityScores =
_Paths.character + _Paths.create + _Paths.abilityScores;
/// `/character/create/basic-info`
static const createCharacterBasicInfo = _Paths.character + _Paths.create + _Paths.basicInfo;
static const createCharacterBasicInfo =
_Paths.character + _Paths.create + _Paths.basicInfo;
/// `/character/create/moves-and-spells`
static const createCharacterMovesSpells = _Paths.character + _Paths.create + _Paths.selectMovesSpells;
static const createCharacterMovesSpells =
_Paths.character + _Paths.create + _Paths.selectMovesSpells;
/// `/character/create/`class
static const createCharacterSelectClass = _Paths.character + _Paths.create + _Paths.characterClass;
/// `/character/create/class`
static const createCharacterSelectClass =
_Paths.character + _Paths.create + _Paths.characterClass;
/// `/character/create/starting-gear`
static const createCharacterStartingGear = _Paths.character + _Paths.create + _Paths.startingGear;
static const createCharacterStartingGear =
_Paths.character + _Paths.create + _Paths.startingGear;
/// `/character/class`
static const characterClass = _Paths.character + _Paths.characterClass; // TODO add page
static const characterClass =
_Paths.character + _Paths.characterClass; // TODO add page
/// `/character/ability-score`
static const abilityScoreForm = _Paths.character + _Paths.abilityScoreForm;
@@ -138,6 +144,9 @@ abstract class Routes {
/// `/feedback`
static const sendFeedback = _Paths.sendFeedback;
/// `/campaigns`
static const campaigns = _Paths.campaigns;
}
abstract class _Paths {
@@ -235,4 +244,7 @@ abstract class _Paths {
/// `/feedback`
static const sendFeedback = '/feedback';
/// `/campaign`
static const campaigns = '/campaigns';
}

View File

@@ -1,6 +1,7 @@
import 'dart:math';
import 'dart:ui';
import 'package:dungeon_paper/app/data/models/campaign.dart';
import 'package:dungeon_paper/app/data/models/character.dart';
import 'package:dungeon_paper/app/data/services/auth_service.dart';
import 'package:dungeon_paper/app/data/services/character_service.dart';
@@ -166,6 +167,17 @@ class UserMenuPopover extends GetView<CharacterService> with AuthServiceMixin, U
Get.toNamed(Routes.library);
},
),
if (user.isDm)
// My Campaigns
ListTile(
visualDensity: VisualDensity.compact,
title: Text(S.current.myGeneric(S.current.entityPlural(Campaign))),
leading: Icon(Campaign.genericIcon),
onTap: () {
Get.back();
Get.toNamed(Routes.campaigns);
},
),
// Export/Import
ListTile(
visualDensity: VisualDensity.compact,

View File

@@ -1,154 +0,0 @@
enum Routes {
// Home
home,
battle,
reference,
inventory,
notes,
// General
about,
account,
settings,
backup,
dice,
// Campaigns
campaignsList,
// Custom Classes
customClassesList,
customClassCreate,
customClassEdit,
// Characters
characterList,
characterCreate,
characterEdit,
statEdit,
// Moves
moveAdd,
moveEdit,
// RaceMoves
raceMoveAdd,
raceMoveEdit,
// Spells
spellAdd,
spellEdit,
// Inventory Items
itemAdd,
itemEdit,
// Notes
noteAdd,
noteEdit,
}
extension RouteData on Routes {
String get path => routePaths[this];
String get analyticsName => routeNames[this];
}
final routePaths = <Routes, String>{
// Home
Routes.home: '/',
Routes.battle: '/battle',
Routes.reference: '/reference',
Routes.inventory: '/inventory',
Routes.notes: '/notes',
// General
Routes.about: '/about',
Routes.account: '/account',
Routes.settings: '/settings',
Routes.backup: '/settings/backup',
Routes.dice: '/dice',
// Campaigns
Routes.campaignsList: '/campaigns',
// Custom Classes
Routes.customClassesList: '/custom-classes',
Routes.customClassCreate: '/custom-classes/create',
Routes.customClassEdit: '/custom-classes/edit',
// Characters
Routes.characterList: '/characters',
Routes.characterCreate: '/characters/create',
Routes.characterEdit: '/characters/edit',
Routes.statEdit: '/stat/edit',
// Moves
Routes.moveAdd: '/moves/add',
Routes.moveEdit: '/moves/edit',
// RaceMoves
Routes.raceMoveAdd: '/race-moves/add',
Routes.raceMoveEdit: '/race-moves/edit',
// Spells
Routes.spellAdd: '/spells/add',
Routes.spellEdit: '/spells/edit',
// Inventory Items
Routes.itemAdd: '/items/add',
Routes.itemEdit: '/items/edit',
// Notes
Routes.noteAdd: '/notes/add',
Routes.noteEdit: '/notes/edit',
};
final routeNames = <Routes, String>{
// Home
Routes.home: 'Home',
Routes.battle: 'Battle',
Routes.reference: 'Reference',
Routes.inventory: 'Inventory',
Routes.notes: 'Notes',
// General
Routes.about: 'About',
Routes.account: 'Account',
Routes.settings: 'Settings',
Routes.backup: 'Backup',
Routes.dice: 'Dice',
// Campaigns
Routes.campaignsList: 'Campaigns',
// Custom Classes
Routes.customClassesList: 'Custom Classes',
Routes.customClassCreate: 'Create Custom Class',
Routes.customClassEdit: 'Edit Custom Class',
// Characters
Routes.characterList: 'Characters',
Routes.characterCreate: 'Create Character',
Routes.characterEdit: 'Edit Character',
Routes.statEdit: 'Edit Stat',
// Moves
Routes.moveAdd: 'Add Move',
Routes.moveEdit: 'Edit Moves',
// RaceMoves
Routes.raceMoveAdd: 'Add Race move',
Routes.raceMoveEdit: 'Edit Race Moves',
// Spells
Routes.spellAdd: 'Add Spell',
Routes.spellEdit: 'Edit Spell',
// Inventory Items
Routes.itemAdd: 'Add Item',
Routes.itemEdit: 'Edit Item',
// Notes
Routes.noteAdd: 'Add Note',
Routes.noteEdit: 'Edit Note',
};

View File

@@ -1,6 +1,6 @@
name: dungeon_paper
description: A new Flutter project.
version: 2.0.0+291
version: 2.0.0+292
# The above field defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.