diff --git a/lib/assets/color/color.dart b/lib/assets/color/color.dart deleted file mode 100644 index ccd60ee..0000000 --- a/lib/assets/color/color.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter/material.dart'; - -// 색상 정의 - -// 주황색 -const Color mainOrange = Color(0xFFFF7A5D); -// 갈색 -const Color mainBrown = Color(0xFF754342); -// 회색 [ 밝은 순 ] -const Color grey1 = Color(0xFFF5F5F5); -const Color grey2 = Color(0xFFdedede); -const Color grey3 = Color(0xFFC8C8C8); -const Color grey4 = Color(0xFF828282); - diff --git a/lib/ui/alarm/view/alram_main.dart b/lib/ui/alarm/view/alram_main.dart index 1b6fcfa..2ac1279 100644 --- a/lib/ui/alarm/view/alram_main.dart +++ b/lib/ui/alarm/view/alram_main.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:schedule_with/assets/colors/color.dart'; import 'package:schedule_with/ui/alarm/view/alram_detail.dart'; -import '../../../widget/main_appbar.dart'; +import '../../../widget/main_app_bar.dart'; import '../widget/alram_item.dart'; class AlramMain extends StatefulWidget { @@ -22,6 +22,7 @@ class _AlramMainState extends State { @override Widget build(BuildContext context) { return MaterialApp( + debugShowCheckedModeBanner: false, home: Scaffold( appBar: PreferredSize( preferredSize: Size.fromHeight(50), diff --git a/lib/ui/memo/view/memo.dart b/lib/ui/memo/view/memo.dart new file mode 100644 index 0000000..fbddd2f --- /dev/null +++ b/lib/ui/memo/view/memo.dart @@ -0,0 +1,107 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:schedule_with/assets/colors/color.dart'; +import 'memo_main.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: MemoScreen(), + ); + } +} + +class MemoScreen extends StatefulWidget { + @override + _MemoScreenState createState() => _MemoScreenState(); +} + +class _MemoScreenState extends State { + final TextEditingController _titleController = TextEditingController(); + final TextEditingController _contentController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: AppBar( + backgroundColor: Colors.white, + leading: IconButton( + icon: Icon(CupertinoIcons.back), + onPressed: () => Navigator.pop(context), + ), + title: Text( + '메모', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), + centerTitle: true, + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + print('Title: ${_titleController.text}'); + print('Content: ${_contentController.text}'); + }, + child: Text('완료', style: TextStyle( + color: mainOrange, fontWeight: FontWeight.bold, fontSize: 16)), + ), + ], + ), + body: Padding( + padding: EdgeInsets.all(16.0), + child: Column( + children: [ + Container( + decoration: BoxDecoration( + border: Border(bottom: BorderSide(color: grey2)), + ), + child: TextField( + controller: _titleController, + style: TextStyle(color: grey2, fontSize: 16), + decoration: InputDecoration( + hintText: '제목을 입력해 주세요.', + border: InputBorder.none, + ), + ), + ), + Expanded( + child: TextField( + controller: _contentController, + style: TextStyle(color: grey2, fontSize: 14), + decoration: InputDecoration( + hintText: '내용을 입력해 주세요.', + border: InputBorder.none, + ), + keyboardType: TextInputType.multiline, + maxLines: null, + ), + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + // 버튼이 눌렸을 때의 동작 정의 + }, + backgroundColor: mainOrange, + child: SvgPicture.asset( + "lib/assets/icon/icon_camera.svg", + color: Colors.white, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + ); + } +} + +class CreateMemo { + String content; + DateTime date; + + CreateMemo({required this.content, required this.date}); +} diff --git a/lib/ui/memo/view/memo_item.dart b/lib/ui/memo/view/memo_item.dart new file mode 100644 index 0000000..67baeff --- /dev/null +++ b/lib/ui/memo/view/memo_item.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:schedule_with/assets/colors/color.dart'; + +class Memo { + String date; + String title; + String body; + bool hasImage; + bool isPublic; + + Memo({required this.date, required this.title, required this.body, this.hasImage = false, this.isPublic = true}); +} + +class MemoItem extends StatelessWidget { + final Memo memo; + + const MemoItem({Key? key, required this.memo}) : super(key: key); + + @override + Widget build(BuildContext context) { + Color statusColor = memo.isPublic ? mainOrange : mainBrown; + return Container( + padding: EdgeInsets.only(left: 16, top: 10, right: 16, bottom: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 날짜 타이틀 + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(memo.date, style: TextStyle(fontSize: 10, color: grey4)), + Text(memo.title, style: TextStyle( + fontSize: 14, fontWeight: FontWeight.bold)), + ], + ), + // 공개/비공개 + Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 2), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: statusColor, width: 1), + ), + child: Text(memo.isPublic ? '공개' : '비공개', + style: TextStyle(color: statusColor, fontSize: 10)), + ), + ], + ), + SizedBox(height: 6), + Text( + memo.body, + style: TextStyle(fontSize: 12), + maxLines: memo.hasImage ? 2 : 4, + overflow: TextOverflow.ellipsis, + ), + // Image Container if available + if (memo.hasImage) Container( + width: 70, + height: 70, + margin: EdgeInsets.only(top: 10), + color: Colors.pink[300], + ), + ], + ), + ); + } +} diff --git a/lib/ui/memo/view/memo_main.dart b/lib/ui/memo/view/memo_main.dart new file mode 100644 index 0000000..dc80850 --- /dev/null +++ b/lib/ui/memo/view/memo_main.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:schedule_with/assets/colors/color.dart'; +import 'package:schedule_with/ui/memo/view/paymemo.dart'; +import '../../../widget/main_tab_bar.dart'; +import 'memo.dart'; +import 'paymemolist.dart'; +import 'memolist.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: MemoMainScreen(), + ); + } +} + +class MemoMainScreen extends StatefulWidget { + const MemoMainScreen({super.key}); + @override + _MainScreenState createState() => _MainScreenState(); +} + +class _MainScreenState extends State with SingleTickerProviderStateMixin { + late TabController _tabController; + bool isFABOpen = false; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this, initialIndex: 2); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + children: [ + Expanded( + child: MemoListView(), + ), + Expanded( + child: PayMemoListView(), + ), + ], + ), + floatingActionButton: buildExpandableFAB(), + ); + } + + Widget buildExpandableFAB() { + return Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + if (isFABOpen) ...[ + SizedBox( + child: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => PayMemoScreen()), + ); + }, + backgroundColor: mainBrown, + child: Padding( + padding: const EdgeInsets.only(left: 0, bottom: 0), + child: SvgPicture.asset("lib/assets/icon/icon_paymemo_add.svg", + color: Colors.white), + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + ), + SizedBox(height: 10), + SizedBox( + child: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => MemoScreen()), + ); + }, + backgroundColor: mainBrown, + child: Padding( + // 아이콘의 위치 조정 + padding: const EdgeInsets.only(left: 2, bottom: 1.5), + child: SvgPicture.asset( + "lib/assets/icon/icon_memo_add.svg", color: Colors.white), + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + ), + SizedBox(height: 10), + ], + SizedBox( + child: FloatingActionButton( + onPressed: toggleFAB, + backgroundColor: mainOrange, + child: Icon( + isFABOpen ? Icons.close : Icons.add, color: Colors.white), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30)), + ), + ), + ], + ); + } + + void toggleFAB() { + setState(() { + isFABOpen = !isFABOpen; + }); + } + +} \ No newline at end of file diff --git a/lib/ui/memo/view/memolist.dart b/lib/ui/memo/view/memolist.dart new file mode 100644 index 0000000..1f31fe1 --- /dev/null +++ b/lib/ui/memo/view/memolist.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:schedule_with/assets/colors/color.dart'; +import 'package:schedule_with/ui/memo/view/memo.dart' as MemoView; + +import 'memo_item.dart'; + +class MemoListView extends StatefulWidget { + final List memos = [ + Memo(date: '2024.05.13', title: '메모 제목입니다.', body: '메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.', hasImage: true, isPublic: true), + Memo(date: '2024.05.13', title: '다른 메모 제목입니다.', body: '다른 메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.', hasImage: false, isPublic: false), + Memo(date: '2024.05.13', title: '다른 메모 제목입니다.', body: '다른 메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.', hasImage: false, isPublic: false), + Memo(date: '2024.05.13', title: '다른 메모 제목입니다.', body: '다른 메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.', hasImage: false, isPublic: false), + Memo(date: '2024.05.13', title: '다른 메모 제목입니다.', body: '다른 메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.메모 내용입니다.', hasImage: false, isPublic: false), + ]; + + + @override + _MemoListViewState createState() => _MemoListViewState(); +} + +class _MemoListViewState extends State { + bool isExpanded = true; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + children: [ + Container( + height: 40, + color: Colors.white, + child: Row( + children: [ + Expanded(child: SizedBox()), + Expanded( + child: Center( + child: Text( + '메모', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: mainOrange), + ), + ), + ), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: IconButton( + icon: Icon(isExpanded ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down, color: mainOrange), + onPressed: () { + setState(() { + isExpanded = !isExpanded; + }); + }, + ), + ), + ), + ], + ), + ), + Divider( + height: 1.5, + thickness: 1.5, + color: mainOrange, + ), + Expanded( + child: AnimatedSize( + duration: Duration(milliseconds: 300), + child: ListView( + children: isExpanded ? widget.memos.map((memo) => MemoItem(memo: memo)).toList() : [], + ), + ), + ), + ], + ), + ); + } +} + +// class MemoListWidget extends StatelessWidget { +// final List memos; +// +// const MemoListWidget({Key? key, required this.memos}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return MemoListView(memos: memos); +// } +// } diff --git a/lib/ui/memo/view/paymemo.dart b/lib/ui/memo/view/paymemo.dart new file mode 100644 index 0000000..e6c10bf --- /dev/null +++ b/lib/ui/memo/view/paymemo.dart @@ -0,0 +1,283 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:schedule_with/assets/colors/color.dart'; +import '../widget/pay_bankaccount_bottomsheet.dart'; +import '../widget/pay_settlement_status.dart'; +import '../widget/pay_title__field.dart'; +import '../widget/pay_usage_bottomsheet.dart'; +import 'memo_main.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: PayMemoScreen(), + ); + } +} + +class PayMemoScreen extends StatefulWidget { + @override + _MemoScreenState createState() => _MemoScreenState(); +} + + +class _MemoScreenState extends State { + final TextEditingController _titleController = TextEditingController(); + int _count = 0; + List _usageDetails = ["사용내역1 20000원", "사용내역2 15000원", "사용내역3 5000원"]; + String _selectedAccount = '계좌번호를 입력해 주세요.'; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: PreferredSize( + preferredSize: Size.fromHeight(50), + child: AppBar( + backgroundColor: Colors.white, + elevation: 0, + leading: IconButton( + icon: Icon(CupertinoIcons.back), + onPressed: () => Navigator.pop(context), + ), + title: Text('금액 계산', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16, color: Colors.black)), + centerTitle: true, + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text('완료', style: TextStyle(color: mainOrange, fontWeight: FontWeight.bold, fontSize: 16)), + ), + ], + ), + ), + body: Column( + children: [ + Column( // Non-scrollable part + children: [ + PaySettlementStatus(), + PayTitleField(titleController: _titleController), + _buildBankFields(), + _buildPersonCounter(), + _buildUsageFields(), + ], + ), + Expanded( + child: Stack( + children: [ + _buildUsageList(), + Positioned( + right: 20, + bottom: 20, + child: FloatingActionButton( + onPressed: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return Wrap( + children: [ + BottomSheetWidget(), + ], + ); + }, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(10.0)), + ), + barrierColor: grey4.withOpacity(0.5), + ); + }, + backgroundColor: mainOrange, + child: Icon(Icons.add, color: Colors.white), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), + ), + ), + ], + ), + ), + Container( + color: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildTotalAmount(), + _buildAmountPerPerson(), + ], + ), + ), + ], + ), + ); + } + + Widget _buildBankFields() { + return Padding( + padding: EdgeInsets.only(left: 20, top: 10, right: 20, bottom: 10), + child: Container( + decoration: BoxDecoration(border: Border(bottom: BorderSide(color: grey2))), + child: Padding( + padding: EdgeInsets.only(bottom: 15), + child: Row( + children: [ + Expanded( + flex: 1, + child: Text('계좌번호', style: TextStyle(fontSize: 14)), + ), + Expanded( + flex: 2, + child: Align( + alignment: Alignment.centerRight, + child: InkWell( + onTap: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: (BuildContext context) { + return BankAccountBottomSheetWidget(onSelectAccount: (account) { + setState(() { + _selectedAccount = account; + }); + }); + }, + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(10.0)), + ), + barrierColor: grey4.withOpacity(0.5), + ); + }, + child: Text(_selectedAccount, + style: TextStyle( + fontSize: 14, + color: _selectedAccount == '계좌번호를 입력해 주세요.' ? grey3 : Colors.black) + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildPersonCounter() { + return Padding( + padding: EdgeInsets.only(left: 20, top: 0, right: 20, bottom: 10), + child: Container( + decoration: BoxDecoration(border: Border(bottom: BorderSide(color: grey2))), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("인원", style: TextStyle(fontSize: 14)), + Row( + children: [ + IconButton( + icon: SvgPicture.asset("lib/assets/icon/icon_minus.svg"), + onPressed: () { + setState(() { + if (_count > 0) _count--; + }); + }, + ), + Text('$_count', style: TextStyle(fontSize: 14)), + IconButton( + icon: SvgPicture.asset("lib/assets/icon/icon_plus.svg"), + onPressed: () { + setState(() { + _count++; + }); + }, + ), + ], + ), + ], + ), + ), + ); + } + + Widget _buildUsageFields() { + return Padding( + padding: EdgeInsets.only(left: 20, top: 10, right: 20, bottom: 10), + child: Container( + decoration: BoxDecoration(border: Border(bottom: BorderSide(color: Colors.white))), + child: Container( + alignment: Alignment.centerLeft, + child: Text('사용내역', style: TextStyle(fontSize: 14)), + ), + ), + ); + } + + Widget _buildUsageList() { + return Expanded( + child: ListView.builder( + itemCount: _usageDetails.length, + padding: EdgeInsets.only(bottom: 60), + itemBuilder: (context, index) { + List parts = _usageDetails[index].split(' '); + return Padding( + padding: EdgeInsets.only(left: 30, top: 5, right: 20, bottom: 5), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(parts[0], style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: mainOrange)), + Text(parts[1], style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: mainOrange)), + ], + ), + ); + }, + ), + ); + } + + Widget _buildTotalAmount() { + int totalAmount = calculateTotalAmount(); + return Padding( + padding: EdgeInsets.only(left: 20, top: 10, right: 20, bottom: 10), + child: Container( + decoration: BoxDecoration(border: Border(bottom: BorderSide(color: grey2))), + child: Row( + children: [ + Expanded(flex: 1, child: Text('총 금액', style: TextStyle(fontSize: 14))), + Expanded(flex: 2, child: Text('$totalAmount 원', style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold), textAlign: TextAlign.right)), + ], + ), + ), + ); + } + + Widget _buildAmountPerPerson() { + double perPerson = _count > 0 ? calculateTotalAmount() / _count : 0; + return Padding( + padding: EdgeInsets.only(left: 20, top: 10, right: 20, bottom: 10), + child: Container( + decoration: BoxDecoration(border: Border(bottom: BorderSide(color: Colors.white))), + child: Row( + children: [ + Expanded(flex: 1, child: Text('인당 금액', style: TextStyle(fontSize: 14))), + Expanded(flex: 2, child: Text('${perPerson.toStringAsFixed(0)} 원', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), textAlign: TextAlign.right)), + ], + ), + ), + ); + } + + int calculateTotalAmount() { + return _usageDetails.fold(0, (sum, detail) { + List parts = detail.split(' '); + return sum + int.parse(parts[1].replaceAll('원', '')); + }); + } +} diff --git a/lib/ui/memo/view/paymemolist.dart b/lib/ui/memo/view/paymemolist.dart new file mode 100644 index 0000000..9a56d27 --- /dev/null +++ b/lib/ui/memo/view/paymemolist.dart @@ -0,0 +1,171 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:schedule_with/assets/colors/color.dart'; + +class PayMemo { + String date; + String title; + String amounttitle; + String amount; + bool isCompleted; + + PayMemo({required this.date, required this.title, required this.amounttitle, required this.amount, this.isCompleted = false}); +} + +class MemoItem extends StatelessWidget { + final PayMemo paymemo; + + const MemoItem({Key? key, required this.paymemo}) : super(key: key); + + @override + Widget build(BuildContext context) { + Color statusColor = paymemo.isCompleted ? mainOrange : mainBrown; + List amounts = paymemo.amount.split(' | '); + String totalAmount = amounts[0]; + String personalAmount = amounts[1]; + + return Container( + padding: EdgeInsets.only(left: 16, top: 10, right: 16, bottom: 15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 날짜 타이틀 + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(paymemo.date, style: TextStyle(fontSize: 10, color: grey4)), + Text(paymemo.title, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + ], + ), + ), + // Status indicator vertically centered + Container( + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 2), + width: 60, + height: 20, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: statusColor, width: 1), + ), + child: Center( + child: Text( + paymemo.isCompleted ? '정산완료' : '정산중', + style: TextStyle(color: statusColor, fontSize: 10), + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 1, + child: Text( + paymemo.amounttitle, + style: TextStyle(fontSize: 10), + ), + ), + Spacer(), + Expanded( + flex: 2, + child: Align( + alignment: Alignment.centerRight, + child: RichText( + text: TextSpan( + children: [ + TextSpan( + text: "$totalAmount", + style: TextStyle(color: grey4, fontSize: 10), + ), + TextSpan( + text: " | $personalAmount", + style: TextStyle(color: Colors.black, fontSize: 14, fontWeight: FontWeight.bold), + ), + ], + ), + ), + ), + ), + ], + ), + ] + ), + ); + } +} + +class PayMemoListView extends StatefulWidget { + final List memos = [ + PayMemo(date: '24.05.16', title: '24.05.16 인천 정모~!', amounttitle: '금액', amount: '334,000원 | 68,000원', isCompleted: true), + PayMemo(date: '24.05.16', title: '24.05.16 인천 정모~!', amounttitle: '금액', amount: '234,000원 | 78,000원', isCompleted: false), + ]; + + @override + _PayMemoListViewState createState() => _PayMemoListViewState(); +} + +class _PayMemoListViewState extends State { + bool isExpanded = true; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Stack( + children: [ + Column( + children: [ + Container( + height: 40, + color: Colors.white, + child: Row( + children: [ + Expanded(child: SizedBox()), + Expanded( // Centered title + child: Center(child: Text('금액 계산', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: mainOrange))), + ), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: IconButton( + icon: Icon(isExpanded ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down, color: mainOrange), + onPressed: () { + setState(() { + isExpanded = !isExpanded; + }); + }, + ), + ), + ), + ], + ), + ), + Expanded( + child: AnimatedSize( + duration: Duration(milliseconds: 300), + child: ListView( + children: isExpanded ? widget.memos.map((memo) => MemoItem(paymemo: memo)).toList() : [], + ), + ), + ), + ], + ), + Positioned( + left: 0, + right: 0, + top: MediaQuery.of(context).size.height * 0.045, + child: Container( + height: 1.5, + color: mainOrange + ), + ), + ], + ), + ); + } +} diff --git a/lib/ui/memo/widget/pay_bankaccount_bottomsheet.dart b/lib/ui/memo/widget/pay_bankaccount_bottomsheet.dart index 82f9098..fb762a6 100644 --- a/lib/ui/memo/widget/pay_bankaccount_bottomsheet.dart +++ b/lib/ui/memo/widget/pay_bankaccount_bottomsheet.dart @@ -2,8 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import '../../../assets/color/color.dart'; -import '../view/paymemo.dart'; +import '../../../assets/colors/color.dart'; + class BankAccountBottomSheetWidget extends StatefulWidget { final Function(String) onSelectAccount; diff --git a/lib/ui/memo/widget/pay_settlement_status.dart b/lib/ui/memo/widget/pay_settlement_status.dart index b1393f7..3386c3c 100644 --- a/lib/ui/memo/widget/pay_settlement_status.dart +++ b/lib/ui/memo/widget/pay_settlement_status.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:schedule_with/assets/color/color.dart'; +import 'package:schedule_with/assets/colors/color.dart'; class PaySettlementStatus extends StatefulWidget { const PaySettlementStatus({Key? key}) : super(key: key); diff --git a/lib/ui/memo/widget/pay_title__field.dart b/lib/ui/memo/widget/pay_title__field.dart index 4a748ff..1795b58 100644 --- a/lib/ui/memo/widget/pay_title__field.dart +++ b/lib/ui/memo/widget/pay_title__field.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:schedule_with/assets/color/color.dart'; +import 'package:schedule_with/assets/colors/color.dart'; class PayTitleField extends StatelessWidget { final TextEditingController titleController; diff --git a/lib/ui/memo/widget/pay_usage_bottomsheet.dart b/lib/ui/memo/widget/pay_usage_bottomsheet.dart index eb7bda8..a1dbb1a 100644 --- a/lib/ui/memo/widget/pay_usage_bottomsheet.dart +++ b/lib/ui/memo/widget/pay_usage_bottomsheet.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:schedule_with/assets/color/color.dart'; +import 'package:schedule_with/assets/colors/color.dart'; import '../../../widget/main_button.dart'; class MyHomePage extends StatefulWidget { diff --git a/lib/ui/memo/widget/textfield_underline.dart b/lib/ui/memo/widget/textfield_underline.dart index f798345..f208131 100644 --- a/lib/ui/memo/widget/textfield_underline.dart +++ b/lib/ui/memo/widget/textfield_underline.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:schedule_with/assets/color/color.dart'; +import 'package:schedule_with/assets/colors/color.dart'; class TitleFieldUnderline extends StatelessWidget { final TextEditingController titleController; diff --git a/lib/ui/schedule/view/schedule_main.dart b/lib/ui/schedule/view/schedule_main.dart index 6b23808..2ddb07b 100644 --- a/lib/ui/schedule/view/schedule_main.dart +++ b/lib/ui/schedule/view/schedule_main.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:schedule_with/widget/view/main_appbar.dart'; -import 'package:schedule_with/widget/view/main_tab_bar.dart'; +import 'package:schedule_with/widget/main_app_bar.dart'; +import 'package:schedule_with/widget/main_tab_bar.dart'; class ScheduleMain extends StatefulWidget { const ScheduleMain({super.key}); @@ -19,13 +19,7 @@ class _ScheduleMainState extends State { child: MainAppBar()), // 탭바 body: MainTabBar(), - floatingActionButton: FloatingActionButton( - onPressed: () { - // 스케쥴 추가 화면으로 이동 - print("object"); - }, - child: Icon(Icons.add), - ), + ); } } diff --git a/lib/ui/todo/view/todo_main_screen.dart b/lib/ui/todo/view/todo_main_screen.dart index 4d42bb1..f46c35b 100644 --- a/lib/ui/todo/view/todo_main_screen.dart +++ b/lib/ui/todo/view/todo_main_screen.dart @@ -7,19 +7,6 @@ import '../widget/todo_app_bar.dart'; import '../widget/todo_edit_bottom_sheet.dart'; import '../widget/todo_page_share.dart'; -void main() { - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - home: TodoMainScreen(), - ); - } -} - class TodoMainScreen extends StatefulWidget { const TodoMainScreen({super.key}); @@ -164,7 +151,6 @@ class _TodoMainScreenState extends State with SingleTickerProvid : null, child: Scaffold( resizeToAvoidBottomInset: false, - appBar: TodoAppBar(tabController: _tabController), body: Column( children: [ CalendarWidget(onDateSelected: onDateSelected), @@ -208,36 +194,7 @@ class _TodoMainScreenState extends State with SingleTickerProvid ], ), ), - Expanded( - child: TabBarView( - controller: _tabController, - children: [ - CalendarTab(), - ListView.builder( - itemCount: todosForSelectedDate.length, - itemBuilder: (context, index) { - final item = todosForSelectedDate[index]; - return ListTile( - leading: Checkbox( - value: item.isCompleted, - onChanged: (bool? value) { - setState(() { - item.isCompleted = value ?? false; - }); - }, - activeColor: mainOrange, - checkColor: Colors.white, - side: BorderSide(color: mainOrange), - ), - title: Text(item.content), - onTap: () => onTodoEdit(item), - ); - }, - ), - Center(child: Text('메모 탭 (아직 구현되지 않음)')), - ], - ), - ), + ], ), floatingActionButton: FloatingActionButton( diff --git a/lib/widget/main_appbar.dart b/lib/widget/main_appbar.dart deleted file mode 100644 index 1e36bd5..0000000 --- a/lib/widget/main_appbar.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; - -class MainAppBar extends StatefulWidget implements PreferredSizeWidget { - const MainAppBar({super.key}); - - @override - State createState() => _MainAppBarState(); - @override - Size get preferredSize => Size.fromHeight(50); -} - -class _MainAppBarState extends State { - @override - Widget build(BuildContext context) { - return AppBar( - backgroundColor: Colors.white, - title: Container( - alignment: Alignment.centerLeft, - child: Image.asset( "lib/assets/image/logo.png", - height: 35, - ), - ), - actions: [ - IconButton(onPressed: (){}, - icon: SvgPicture.asset("lib/assets/icon/icon_bell_outline.svg")) - ], - ); - } -} \ No newline at end of file diff --git a/lib/widget/main_bottom_navigation_bar.dart b/lib/widget/main_bottom_navigation_bar.dart index a090470..9e1ccd1 100644 --- a/lib/widget/main_bottom_navigation_bar.dart +++ b/lib/widget/main_bottom_navigation_bar.dart @@ -2,10 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:schedule_with/assets/colors/color.dart'; +import 'package:schedule_with/ui/alarm/view/alram_main.dart'; import 'package:schedule_with/ui/home/view/home_main.dart'; import 'package:schedule_with/ui/login/view/login_main.dart'; import 'package:schedule_with/ui/mypage/view/my_page_main.dart'; import 'package:schedule_with/ui/notification/view/notification_main.dart'; +import 'package:schedule_with/ui/schedule/view/schedule_main.dart'; import 'package:stylish_bottom_bar/stylish_bottom_bar.dart'; class BottomNavigationBarController extends GetxController { @@ -19,11 +21,11 @@ class MainBottomNavigationBar extends StatelessWidget { // 친구/그룹 목록 메인 화면 NotificationMain(), // 캘린더 메인 화면 - LoginMain(), + ScheduleMain(), // 홈 메인 화면 HomeMain(), // 알람 메인 화면 - HomeMain(), + AlramMain(), // 더보기 메인 화면 MyPageMain(), ]; @@ -33,45 +35,48 @@ class MainBottomNavigationBar extends StatelessWidget { return Obx(() { return Scaffold( body: pages[controller.tabIndex.value], // 현재 선택된 페이지 표시 - bottomNavigationBar: StylishBottomBar( - option: DotBarOptions( - dotStyle: DotStyle.tile, - iconSize: 30 - ), - backgroundColor: Colors.white, - currentIndex: controller.tabIndex.value, // 현재 선택된 탭의 인덱스 - onTap: (index) { - controller.tabIndex.value = index; // 탭을 누르면 인덱스 변경 - }, - items: [ - BottomBarItem( - icon: SvgPicture.asset("lib/assets/icon/icon_group_outline.svg"), - title: Text("친구/그룹"), - selectedColor: mainBrown - ), - BottomBarItem( - icon: SvgPicture.asset("lib/assets/icon/icon_calender_outline.svg"), - title: Text("캘린더"), - selectedColor: mainBrown - ), - BottomBarItem( - icon: SvgPicture.asset("lib/assets/icon/icon_home_outline.svg"), - title: Text("홈"), - selectedColor: mainBrown - ), - BottomBarItem( - icon: SvgPicture.asset("lib/assets/icon/icon_alarm_outline.svg"), - title: Text("알람"), - selectedColor: mainBrown - ), - BottomBarItem( - icon: SvgPicture.asset("lib/assets/icon/icon_meatball_menu.svg"), - title: Text("더보기"), - selectedColor: mainBrown + bottomNavigationBar: Container( + + child: StylishBottomBar( + option: DotBarOptions( + dotStyle: DotStyle.tile, + iconSize: 30 ), + backgroundColor: Colors.white, + currentIndex: controller.tabIndex.value, // 현재 선택된 탭의 인덱스 + onTap: (index) { + controller.tabIndex.value = index; // 탭을 누르면 인덱스 변경 + }, + items: [ + BottomBarItem( + icon: SvgPicture.asset("lib/assets/icon/icon_group_outline.svg"), + title: Text("친구/그룹"), + selectedColor: mainBrown + ), + BottomBarItem( + icon: SvgPicture.asset("lib/assets/icon/icon_calender_outline.svg"), + title: Text("캘린더"), + selectedColor: mainBrown + ), + BottomBarItem( + icon: SvgPicture.asset("lib/assets/icon/icon_home_outline.svg"), + title: Text("홈"), + selectedColor: mainBrown + ), + BottomBarItem( + icon: SvgPicture.asset("lib/assets/icon/icon_alarm_outline.svg"), + title: Text("알람"), + selectedColor: mainBrown + ), + BottomBarItem( + icon: SvgPicture.asset("lib/assets/icon/icon_meatball_menu.svg"), + title: Text("더보기"), + selectedColor: mainBrown + ), - ], + ], + ), ), ); }); diff --git a/lib/widget/main_tab_bar.dart b/lib/widget/main_tab_bar.dart index 982362e..c466900 100644 --- a/lib/widget/main_tab_bar.dart +++ b/lib/widget/main_tab_bar.dart @@ -1,8 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:schedule_with/ui/todo/view/todo_main_screen.dart'; import 'package:schedule_with/widget/main_calendar_day.dart'; import 'package:schedule_with/widget/main_calendar_month.dart'; import '../assets/colors/color.dart'; +import '../ui/memo/view/memo_main.dart'; class MainTabBar extends StatefulWidget { const MainTabBar({super.key}); @@ -58,7 +60,9 @@ class _MainTabBarState extends State // 탭1 : 캘린더 TabViewCalendar(), // 탭2 : 투두 + TodoMainScreen(), // 탭3 : 메모 + MemoMainScreen() ], ) ) diff --git a/lib/widget/main_tapbar.dart b/lib/widget/main_tapbar.dart deleted file mode 100644 index d07b3cf..0000000 --- a/lib/widget/main_tapbar.dart +++ /dev/null @@ -1,136 +0,0 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/painting.dart'; -import 'package:schedule_with/widget/main_calendar_day.dart'; -import 'package:schedule_with/widget/main_calendar_month.dart'; -import '../assets/color/color.dart'; - -class MainTabBar extends StatefulWidget { - const MainTabBar({super.key}); - - @override - State createState() => _MainTabBarState(); -} - -class _MainTabBarState extends State - with SingleTickerProviderStateMixin { - late TabController _tabController; - - @override - void initState() { - super.initState(); - // 탭의 수에 따라 length 값을 조정 - _tabController = - TabController(length: 3, vsync: this); // 탭의 수에 따라 length 값을 조정 - } - - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - TabBar( - // 색상 설정 - controller: _tabController, - indicatorColor: mainOrange, - labelColor: Colors.white, - unselectedLabelColor: grey4, - labelStyle: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), - unselectedLabelStyle: TextStyle(fontSize: 14), - indicator: BoxDecoration(color: mainOrange), - indicatorSize: TabBarIndicatorSize.tab, - // 탭 제목 - tabs: [ - Tab(text: '캘린더'), - Tab(text: 'TODO'), - Tab(text: '메모'), - ], - ), - Expanded( - // 각 탭바에 나타낼 View - child: TabBarView( - controller: _tabController, - children: const [ - // 탭1 : 캘린더 - TabViewCalendar(), - // 탭2 : 투두 - TabViewCalendar(), - // 탭3 : 메모 - ], - ) - ) - ], - ); - } -} - - -// 캘린더 탭에 보일 항목들 -class TabViewCalendar extends StatelessWidget { - const TabViewCalendar({super.key}); - @override - Widget build(BuildContext context) { - return const CustomScrollView( - // 커스텀 스크롤뷰 사용을 위해 위젯을 Sliver 타입으로 변경 - slivers: [ - // 월간, 주간 일정 - SliverToBoxAdapter( - child: MainCalendarMonth(), - ), - // 상세 일정 - SliverToBoxAdapter( - child: DayWork(), - ), - // 일간 일정 - SliverToBoxAdapter( - child: MainCalendarDay(), - ), - // 여백 - SliverPadding(padding: EdgeInsets.all(20)) - ], - ); - } -} - - - - -// 장기일정 숨기기 펼치기 -class DayWork extends StatelessWidget { - const DayWork({super.key}); - - @override - Widget build(BuildContext context) { - return ExpansionTile( - leading: Container(width: 24), - title: const Center( - child: Text( - '상세 일정', - style: TextStyle(fontSize: 14), - )), - collapsedBackgroundColor: grey1, - children: [ - Row(children: [ - const Padding(padding: EdgeInsets.all(10)), - TextButton( - onPressed: () {}, - child: Text( - '장기일정1', - )), - const Padding(padding: EdgeInsets.all(10)), - TextButton(onPressed: () {}, child: Text('장기일정2')), - const Padding(padding: EdgeInsets.all(10)), - TextButton(onPressed: () {}, child: Text('장기일정3')), - const Padding(padding: EdgeInsets.all(10)), - TextButton(onPressed: () {}, child: Text('장기일정4')) - ] - ) - ] - ); - } -} \ No newline at end of file diff --git a/lib/widget/select_date.dart b/lib/widget/select_date.dart index 256316f..b54159b 100644 --- a/lib/widget/select_date.dart +++ b/lib/widget/select_date.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../assets/color/color.dart'; +import '../assets/colors/color.dart'; class SelectDate extends StatefulWidget { final Widget back_page ; diff --git a/pubspec.lock b/pubspec.lock index ee6a522..4a3c9a3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" fake_async: dependency: transitive description: @@ -121,8 +129,7 @@ packages: source: hosted version: "4.0.2" intl: - # dependency: "direct main" - dependency: transitive + dependency: "direct main" description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf @@ -201,16 +208,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" - #명재 - path_drawing: - dependency: transitive - description: - name: path_drawing - sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 - url: "https://pub.dev" - source: hosted - version: "1.0.1" -# path_parsing: dependency: transitive description: @@ -227,16 +224,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.2" -#명재 - simple_gesture_detector: - dependency: transitive - description: - name: simple_gesture_detector - sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 - url: "https://pub.dev" - source: hosted - version: "0.2.1" -# sky_engine: dependency: transitive description: flutter @@ -314,16 +301,6 @@ packages: url: "https://pub.dev" source: hosted version: "25.2.6" -#명재 - table_calendar: - dependency: "direct main" - description: - name: table_calendar - sha256: b759eb6caa88dda8e51c70ee43c19d1682f8244458f84cced9138ee35b2ce416 - url: "https://pub.dev" - source: hosted - version: "3.1.1" -# term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ceeab3f..f016bb8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -64,10 +64,6 @@ dev_dependencies: # The following section is specific to Flutter packages. flutter: - assets: - - lib/assets/image/logo.png - - lib/assets/icon/icon_bell_outline.svg - fonts: - family: FontMD fonts: