From adb6c2d20b169b2ece5dc1263bdfdb988f7f7fa0 Mon Sep 17 00:00:00 2001 From: Horoli Date: Wed, 4 Feb 2026 12:00:38 +0900 Subject: [PATCH] update --- lib/utils/item_utils.dart | 15 +++++ lib/widgets/battle/battle_controls.dart | 59 ++++++++++++++------ lib/widgets/common/custom_button_widget.dart | 54 ++++++++++++++++++ prompt/69_custom_button_and_assets.md | 26 +++++++++ 4 files changed, 138 insertions(+), 16 deletions(-) create mode 100644 lib/widgets/common/custom_button_widget.dart create mode 100644 prompt/69_custom_button_and_assets.md diff --git a/lib/utils/item_utils.dart b/lib/utils/item_utils.dart index a91fc2a..d45b155 100644 --- a/lib/utils/item_utils.dart +++ b/lib/utils/item_utils.dart @@ -32,4 +32,19 @@ class ItemUtils { return 'assets/images/icons/potions/potion_blue.png'; } } + + static String getBorderPath(ItemRarity rarity) { + switch (rarity) { + case ItemRarity.normal: + return 'assets/images/icons/borders/border_000.png'; + case ItemRarity.magic: + return 'assets/images/icons/borders/border_001.png'; + case ItemRarity.rare: + return 'assets/images/icons/borders/border_004.png'; + case ItemRarity.legendary: + return 'assets/images/icons/borders/border_005.png'; + case ItemRarity.unique: + return 'assets/images/icons/borders/border_014.png'; + } + } } diff --git a/lib/widgets/battle/battle_controls.dart b/lib/widgets/battle/battle_controls.dart index 9a39c78..5d55620 100644 --- a/lib/widgets/battle/battle_controls.dart +++ b/lib/widgets/battle/battle_controls.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../common/custom_icon_button.dart'; +import '../common/custom_button_widget.dart'; class BattleControls extends StatelessWidget { final bool isAttackEnabled; @@ -23,25 +23,52 @@ class BattleControls extends StatelessWidget { return Column( mainAxisSize: MainAxisSize.min, children: [ - CustomIconButton( - iconPath: 'assets/images/icons/weapons/sword_02.png', - isEnabled: isAttackEnabled, - onTap: onAttackPressed, - iconColor: Colors.white, + CustomButtonWidget( + width: 64, + height: 64, + padding: const EdgeInsets.all(12), + onTap: isAttackEnabled ? onAttackPressed : null, + child: Opacity( + opacity: isAttackEnabled ? 1.0 : 0.5, + child: Image.asset( + 'assets/images/icons/weapons/sword_02.png', + color: Colors.white, + fit: BoxFit.contain, + ), + ), ), const SizedBox(height: 16), - CustomIconButton( - iconPath: 'assets/images/icons/subweapons/shield_01.png', - isEnabled: isDefendEnabled, - onTap: onDefendPressed, - iconColor: Colors.white, + CustomButtonWidget( + width: 64, + height: 64, + padding: const EdgeInsets.all(12), + onTap: isDefendEnabled ? onDefendPressed : null, + child: Opacity( + opacity: isDefendEnabled ? 1.0 : 0.5, + child: Image.asset( + 'assets/images/icons/subweapons/shield_02.png', + color: Colors.white, + fit: BoxFit.contain, + ), + ), ), const SizedBox(height: 16), - CustomIconButton( - iconPath: 'assets/images/icons/potions/potion_blue.png', - isEnabled: isAttackEnabled, // Enabled when it's player turn - onTap: onItemPressed, - iconColor: Colors.white, + CustomButtonWidget( + width: 64, + height: 64, + padding: const EdgeInsets.all(12), + onTap: + onItemPressed, // Item usually always enabled or managed by parent? Sticking to logic + child: Opacity( + opacity: isAttackEnabled + ? 1.0 + : 0.5, // Using AttackEnabled as proxy for "Player Turn"? Text implies "Enabled when it's player turn" + child: Image.asset( + 'assets/images/icons/potions/potion_blue.png', + color: Colors.white, + fit: BoxFit.contain, + ), + ), ), ], ); diff --git a/lib/widgets/common/custom_button_widget.dart b/lib/widgets/common/custom_button_widget.dart new file mode 100644 index 0000000..c89b4e9 --- /dev/null +++ b/lib/widgets/common/custom_button_widget.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +class CustomButtonWidget extends StatelessWidget { + final Widget child; + final VoidCallback? onTap; + final String imagePath; + final double? width; + final double? height; + final EdgeInsetsGeometry padding; + final Color? backgroundColor; + + const CustomButtonWidget({ + super.key, + required this.child, + this.onTap, + this.imagePath = 'assets/images/icons/borders/border_000.png', + this.width, + this.height, + this.padding = EdgeInsets.zero, + this.backgroundColor, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + behavior: HitTestBehavior.opaque, + child: SizedBox( + width: width, + height: height, + child: Stack( + children: [ + // Background Color + if (backgroundColor != null) + Positioned.fill(child: Container(color: backgroundColor)), + // Background Image (Border) + Positioned.fill( + child: Image.asset( + imagePath, + fit: BoxFit.fill, + filterQuality: FilterQuality.high, + ), + ), + // Content + Padding( + padding: padding, + child: Center(child: child), + ), + ], + ), + ), + ); + } +} diff --git a/prompt/69_custom_button_and_assets.md b/prompt/69_custom_button_and_assets.md new file mode 100644 index 0000000..cc68d38 --- /dev/null +++ b/prompt/69_custom_button_and_assets.md @@ -0,0 +1,26 @@ +# Custom Button Widget & Asset Implementation + +> Restoration of Prompt 69 + +## Goal + +Implement a unified `CustomButtonWidget` that utilizes game assets (borders/panels) for a consistent UI look, and apply it to both `ItemCardWidget` and `BattleControls`. + +## Tasks + +1. **Create `CustomButtonWidget`** (`lib/widgets/common/custom_button_widget.dart`) + - Should support an image background (`assets/images/icons/borders/...`). + - Should support `onTap`. + - Should support arbitrary `child` content. + - Should support `size` or adaptive sizing. + - Optional: Support "Icon Button" mode for convenience or just composability. + +2. **Refactor `BattleControls`** (`lib/widgets/battle/battle_controls.dart`) + - Replace `CustomIconButton` with `CustomButtonWidget` (or wrap content in it). + - Use appropriate border assets (e.g., `border_000.png` or specialized ones). + +3. **Refactor `ItemCardWidget`** (`lib/widgets/common/item_card_widget.dart`) + - (Cancelled) User decided to keep the current version of ItemCardWidget without CustomButtonWidget integration. + +4. **Asset Verification** + - Ensure `assets/images/icons/borders/` and `panel-border-...` are used correctly.