diff --git a/frontend/Savor-22b/gql/query.gd b/frontend/Savor-22b/gql/query.gd index 217aeda0..e44cd488 100644 --- a/frontend/Savor-22b/gql/query.gd +++ b/frontend/Savor-22b/gql/query.gd @@ -75,3 +75,38 @@ var uninstall_kitchen_equipment_query = GQLQuery.new("createAction_UninstallKitc "publicKey": "publicKey", "spaceNumber": "spaceNumber" }); + +var register_trade_good_query = GQLQuery.new("createAction_RegisterTradeGoodAction").set_args({ + "publicKey": "publicKey", + "price": "price", + "foodStateId": "foodStateId", + "itemStateIds": "itemStateIds" +}); + +var trade_inventory_state_query = GQLQuery.new("tradeInventoryState").set_props([ + GQLQuery.new("tradeGoods").set_props([ + "sellerAddress", + "productStateId", + "price", + "type", + GQLQuery.new("food").set_props([ + "stateId", + "ingredientId", + "foodID", + "name", + "grade", + "hp", + "attack", + "defense", + "speed", + "isSuperFood", + "level", + "isAvailable" + ]), + GQLQuery.new("items").set_props([ + "stateID", + "itemID", + "itemName" + ]) + ]) +]) diff --git a/frontend/Savor-22b/gql/query_executor.gd b/frontend/Savor-22b/gql/query_executor.gd index 12c30ea7..7f74dbb7 100644 --- a/frontend/Savor-22b/gql/query_executor.gd +++ b/frontend/Savor-22b/gql/query_executor.gd @@ -45,7 +45,7 @@ var plant_seed_query_executor = SvrGqlClient.query( { "publicKey": "String!", "fieldIndex": "Int!", - "itemStateIdToUse": "Int!" + "itemStateIdToUse": "Guid!" }, gql_query.plant_seed_query ); @@ -125,6 +125,25 @@ var uninstall_kitchen_equipment_query_executor = SvrGqlClient.query( gql_query.uninstall_kitchen_equipment_query ); + +var register_trade_good_query_executor = SvrGqlClient.query( + 'RegisterTradeGood', + { + "publicKey": "String!", + "price": "Int!", + "foodStateId": "Guid", + "itemStateIds": "[Guid]" + }, + gql_query.register_trade_good_query +); + +var trade_inventory_state_executor = SvrGqlClient.query( + 'tradeInventoryState', + {}, + gql_query.trade_inventory_state_query +); + + func stage_action(params, query_executor, mutation_executor): query_executor.graphql_response.connect( func(data): diff --git a/frontend/Savor-22b/scenes/farm/farm.gd b/frontend/Savor-22b/scenes/farm/farm.gd index acb1e621..87ef735c 100644 --- a/frontend/Savor-22b/scenes/farm/farm.gd +++ b/frontend/Savor-22b/scenes/farm/farm.gd @@ -241,3 +241,6 @@ func _on_refresh_button_down(): func _on_home_button_down(): get_tree().change_scene_to_file("res://scenes/house/house.tscn") + +func _on_market_button_down(): + get_tree().change_scene_to_file("res://scenes/market/market.tscn") diff --git a/frontend/Savor-22b/scenes/farm/farm.tscn b/frontend/Savor-22b/scenes/farm/farm.tscn index 838188d2..9ab2bdee 100644 --- a/frontend/Savor-22b/scenes/farm/farm.tscn +++ b/frontend/Savor-22b/scenes/farm/farm.tscn @@ -94,6 +94,12 @@ size_flags_vertical = 0 theme_override_font_sizes/font_size = 50 text = "부엌으로" +[node name="MarketButton" type="Button" parent="MC/HC/VBoxContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 0 +theme_override_font_sizes/font_size = 50 +text = "무역 상점" + [node name="InventoryButton" type="Button" parent="MC/HC/VBoxContainer/MarginContainer/VBoxContainer"] layout_mode = 2 size_flags_vertical = 0 @@ -112,4 +118,5 @@ offset_right = 40.0 offset_bottom = 40.0 [connection signal="button_down" from="MC/HC/VBoxContainer/MarginContainer/VBoxContainer/HomeButton" to="." method="_on_home_button_down"] +[connection signal="button_down" from="MC/HC/VBoxContainer/MarginContainer/VBoxContainer/MarketButton" to="." method="_on_market_button_down"] [connection signal="button_down" from="MC/HC/VBoxContainer/MarginContainer/VBoxContainer/RefreshButton" to="." method="_on_refresh_button_down"] diff --git a/frontend/Savor-22b/scenes/house/cook/cook_book.tscn b/frontend/Savor-22b/scenes/house/cook/cook_book.tscn index 5e96b6c9..0dbb2154 100644 --- a/frontend/Savor-22b/scenes/house/cook/cook_book.tscn +++ b/frontend/Savor-22b/scenes/house/cook/cook_book.tscn @@ -1,7 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://bb0hth2o7k30q"] [ext_resource type="Script" path="res://scenes/house/cook/cook_book.gd" id="1_q1ejr"] -[ext_resource type="Script" path="res://scenes/house/recipe_book/recipe_book.gd" id="1_2wc5e"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tvose"] bg_color = Color(0.94902, 0.694118, 0.0784314, 1) diff --git a/frontend/Savor-22b/scenes/house/food.gd b/frontend/Savor-22b/scenes/house/food.gd index b77a9370..dbbb29dc 100644 --- a/frontend/Savor-22b/scenes/house/food.gd +++ b/frontend/Savor-22b/scenes/house/food.gd @@ -18,4 +18,4 @@ func _update_info(): func set_info(info: Dictionary): self.info = info - \ No newline at end of file + diff --git a/frontend/Savor-22b/scenes/house/house.gd b/frontend/Savor-22b/scenes/house/house.gd index d998ba36..60a3690d 100644 --- a/frontend/Savor-22b/scenes/house/house.gd +++ b/frontend/Savor-22b/scenes/house/house.gd @@ -107,6 +107,9 @@ func _on_farm_button_down(): func _on_village_button_down(): get_tree().change_scene_to_file("res://scenes/village/village_view.tscn") +func _on_market_button_down(): + get_tree().change_scene_to_file("res://scenes/market/market.tscn") + func _on_refresh_button_down(): clear_popup() reload_sub_scene() diff --git a/frontend/Savor-22b/scenes/house/house.tscn b/frontend/Savor-22b/scenes/house/house.tscn index 283d27df..58a4c35b 100644 --- a/frontend/Savor-22b/scenes/house/house.tscn +++ b/frontend/Savor-22b/scenes/house/house.tscn @@ -32,7 +32,7 @@ offset_right = 40.0 offset_bottom = 23.0 theme_override_colors/font_color = Color(0, 0, 0, 1) theme_override_font_sizes/font_size = 60 -text = " 집 화면" +text = " 집 " [node name="M" type="MarginContainer" parent="."] layout_mode = 1 @@ -56,47 +56,54 @@ theme_override_constants/margin_bottom = 20 custom_minimum_size = Vector2(500, 2.08165e-12) layout_mode = 2 size_flags_horizontal = 8 -columns = 5 +columns = 6 [node name="FarmButton" type="Button" parent="M/V/menus/V"] custom_minimum_size = Vector2(200, 2.08165e-12) layout_mode = 2 size_flags_vertical = 0 -theme_override_font_sizes/font_size = 50 +theme_override_font_sizes/font_size = 45 text = "밭으로" [node name="VillageButton" type="Button" parent="M/V/menus/V"] custom_minimum_size = Vector2(200, 2.08165e-12) layout_mode = 2 size_flags_vertical = 0 -theme_override_font_sizes/font_size = 50 +theme_override_font_sizes/font_size = 45 text = " 마을로 " +[node name="MarketButton" type="Button" parent="M/V/menus/V"] +custom_minimum_size = Vector2(200, 2.08165e-12) +layout_mode = 2 +size_flags_vertical = 0 +theme_override_font_sizes/font_size = 45 +text = " 무역 상점 " + [node name="RecipeButton" type="Button" parent="M/V/menus/V"] custom_minimum_size = Vector2(200, 2.08165e-12) layout_mode = 2 size_flags_vertical = 0 -theme_override_font_sizes/font_size = 50 +theme_override_font_sizes/font_size = 45 text = " 레시피북 " [node name="InventoryButton" type="Button" parent="M/V/menus/V"] custom_minimum_size = Vector2(200, 2.08165e-12) layout_mode = 2 size_flags_vertical = 0 -theme_override_font_sizes/font_size = 50 +theme_override_font_sizes/font_size = 45 text = " 인벤토리 " [node name="RefreshButton" type="Button" parent="M/V/menus/V"] custom_minimum_size = Vector2(200, 2.08165e-12) layout_mode = 2 size_flags_vertical = 0 -theme_override_font_sizes/font_size = 50 +theme_override_font_sizes/font_size = 45 text = " 새로고침 " [node name="M" type="MarginContainer" parent="M/V/menus"] layout_mode = 2 size_flags_horizontal = 0 -theme_override_constants/margin_left = 250 +theme_override_constants/margin_left = 100 [node name="CookButton" type="Button" parent="M/V/menus/M"] custom_minimum_size = Vector2(380, 2.08165e-12) @@ -132,6 +139,7 @@ offset_bottom = 340.0 [connection signal="button_down" from="M/V/menus/V/FarmButton" to="." method="_on_farm_button_down"] [connection signal="button_down" from="M/V/menus/V/VillageButton" to="." method="_on_village_button_down"] +[connection signal="button_down" from="M/V/menus/V/MarketButton" to="." method="_on_market_button_down"] [connection signal="button_down" from="M/V/menus/V/RecipeButton" to="." method="_on_recipe_button_down"] [connection signal="button_down" from="M/V/menus/V/InventoryButton" to="." method="_on_inventory_button_down"] [connection signal="button_down" from="M/V/menus/V/RefreshButton" to="." method="_on_refresh_button_down"] diff --git a/frontend/Savor-22b/scenes/market/inventory.gd b/frontend/Savor-22b/scenes/market/inventory.gd new file mode 100644 index 00000000..cc668d3b --- /dev/null +++ b/frontend/Savor-22b/scenes/market/inventory.gd @@ -0,0 +1,38 @@ +extends Control + +const MyItemScn = preload("res://scenes/market/my_item.tscn") + +@onready var inventory_container = $MarginContainer/VBoxContainer/InventoryPanel/ScrollContainer/CenterContainer/MarginContainer/GridContainer + +var items +var grouped_items = {} + +func _ready(): + load_items() + + +func load_items(): + items = SceneContext.user_state.inventoryState["refrigeratorStateList"] + sort_inventory_by_items() + + for item in grouped_items.values(): + for grade in item.values(): + var item_scene = MyItemScn.instantiate() + item_scene.set_info(grade) + inventory_container.add_child(item_scene) + +func sort_inventory_by_items(): + for item in items: + var name = item["name"] + var grade = item["grade"] + + # 이름이 존재하지 않으면 새로 추가 + if not grouped_items.has(name): + grouped_items[name] = {} + + # 등급이 존재하지 않으면 이름 하위에 새로 추가 + if not grouped_items[name].has(grade): + grouped_items[name][grade] = [] + + # 아이템을 등급 배열에 추가 + grouped_items[name][grade].append(item) diff --git a/frontend/Savor-22b/scenes/market/inventory.tscn b/frontend/Savor-22b/scenes/market/inventory.tscn new file mode 100644 index 00000000..d3ec04c3 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/inventory.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=4 format=3 uid="uid://81w3i6nbxjix"] + +[ext_resource type="Script" path="res://scenes/market/inventory.gd" id="1_xk4wq"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8vjfi"] +bg_color = Color(0, 0, 0, 0) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_as0cg"] +bg_color = Color(0.94902, 0.694118, 0.243137, 1) + +[node name="Inventory" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -1220.0 +offset_bottom = -130.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_xk4wq") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 3 + +[node name="TitlePanel" type="Panel" parent="MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(200, 70) +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_8vjfi") + +[node name="TitleLabel" type="Label" parent="MarginContainer/VBoxContainer/TitlePanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 40 +text = "인벤토리" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="InventoryPanel" type="Panel" parent="MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(2.08165e-12, 750) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_as0cg") + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/InventoryPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="CenterContainer" type="CenterContainer" parent="MarginContainer/VBoxContainer/InventoryPanel/ScrollContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/InventoryPanel/ScrollContainer/CenterContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 20 + +[node name="GridContainer" type="GridContainer" parent="MarginContainer/VBoxContainer/InventoryPanel/ScrollContainer/CenterContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/h_separation = 25 +theme_override_constants/v_separation = 50 +columns = 2 diff --git a/frontend/Savor-22b/scenes/market/market.gd b/frontend/Savor-22b/scenes/market/market.gd new file mode 100644 index 00000000..036a0e58 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/market.gd @@ -0,0 +1,55 @@ +extends Control + +signal query_received + +const InventoryScn = preload("res://scenes/market/inventory.tscn") +const SellListScn = preload("res://scenes/market/trade_inventory.tscn") + +@onready var inventory_container = $VBoxContainer/MarginContainer/SubMenuHBoxContainer/InventoryMarginContainer +@onready var trade_inventory_container = $VBoxContainer/MarginContainer/SubMenuHBoxContainer/SellListMarginContainer + +var query_executor = QueryExecutor.new() +var stage_tx_mutation_executor +var trade_inventory_state_executor + +var inventory_state + +func _ready(): + stage_tx_mutation_executor = query_executor.stage_tx_mutation_executor + trade_inventory_state_executor = query_executor.trade_inventory_state_executor + add_child(stage_tx_mutation_executor) + add_child(trade_inventory_state_executor) + + load_initial_scene() + +func load_initial_scene(): + load_inventory() + + query_trade_inventory_state() + query_received.connect(load_trade_inventory) + +func load_inventory(): + var inventory = InventoryScn.instantiate() + inventory_container.add_child(inventory) + +func load_trade_inventory(): + if (inventory_state != null): + var trade_inventory = SellListScn.instantiate() + trade_inventory_container.add_child(trade_inventory) + trade_inventory.set_list(inventory_state) + +func props_only_query_action(query_executor): # query with no args + query_executor.graphql_response.connect( + func(data): + inventory_state = data["data"]["tradeInventoryState"]["tradeGoods"] + query_received.emit() + ) + query_executor.run({}) + +func query_trade_inventory_state(): + props_only_query_action( + trade_inventory_state_executor + ) + +func _on_village_button_down(): + get_tree().change_scene_to_file("res://scenes/village/village_view.tscn") diff --git a/frontend/Savor-22b/scenes/market/market.tscn b/frontend/Savor-22b/scenes/market/market.tscn new file mode 100644 index 00000000..537e9a23 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/market.tscn @@ -0,0 +1,100 @@ +[gd_scene load_steps=3 format=3 uid="uid://5hl0imlbiaaj"] + +[ext_resource type="Script" path="res://scenes/market/market.gd" id="1_ibysf"] +[ext_resource type="PackedScene" uid="uid://co4t4p5pawylr" path="res://scenes/common/prefabs/asset.tscn" id="2_mauxh"] + +[node name="Market" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_ibysf") + +[node name="Background" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Title" type="Label" parent="Background"] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 23.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_font_sizes/font_size = 60 +text = " 무역 상점" + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +custom_minimum_size = Vector2(1920, 1080) +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = 4.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer2" type="MarginContainer" parent="VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 20 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 20 + +[node name="TopMenuHBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer2"] +layout_mode = 2 +theme_override_constants/separation = 50 +alignment = 2 + +[node name="AssetPanel" type="Panel" parent="VBoxContainer/MarginContainer2/TopMenuHBoxContainer"] +custom_minimum_size = Vector2(600, 2.08165e-12) +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/MarginContainer2/TopMenuHBoxContainer/AssetPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_right = 50 + +[node name="Asset" parent="VBoxContainer/MarginContainer2/TopMenuHBoxContainer/AssetPanel/MarginContainer" instance=ExtResource("2_mauxh")] +layout_mode = 2 + +[node name="VillageButton" type="Button" parent="VBoxContainer/MarginContainer2/TopMenuHBoxContainer"] +custom_minimum_size = Vector2(200, 2.08165e-12) +layout_mode = 2 +size_flags_vertical = 0 +theme_override_font_sizes/font_size = 50 +text = " 마을로 " + +[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer"] +custom_minimum_size = Vector2(1920, 950) +layout_mode = 2 + +[node name="SubMenuHBoxContainer" type="HBoxContainer" parent="VBoxContainer/MarginContainer"] +layout_mode = 2 + +[node name="InventoryMarginContainer" type="MarginContainer" parent="VBoxContainer/MarginContainer/SubMenuHBoxContainer"] +custom_minimum_size = Vector2(700, 2.08165e-12) +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 50 + +[node name="SellListMarginContainer" type="MarginContainer" parent="VBoxContainer/MarginContainer/SubMenuHBoxContainer"] +custom_minimum_size = Vector2(1220, 2.08165e-12) +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 50 + +[connection signal="button_down" from="VBoxContainer/MarginContainer2/TopMenuHBoxContainer/VillageButton" to="." method="_on_village_button_down"] diff --git a/frontend/Savor-22b/scenes/market/my_item.gd b/frontend/Savor-22b/scenes/market/my_item.gd new file mode 100644 index 00000000..440971ad --- /dev/null +++ b/frontend/Savor-22b/scenes/market/my_item.gd @@ -0,0 +1,24 @@ +extends Control + +@onready var item_name_label = $Background/MarginContainer/VBoxContainer/NameLabel +@onready var item_grade_label = $Background/MarginContainer/VBoxContainer/HBoxContainer/GradeLabel +@onready var item_amount_label = $Background/MarginContainer/VBoxContainer/HBoxContainer/AmountLabel + +var info + +func _ready(): + _update_info() + +func _update_info(): + if $Background == null: + return + + item_name_label.text = info[0]["name"] + item_grade_label.text = info[0]["grade"] + "등급" + item_amount_label.text = "%s 개" % [info.size()] + +func set_info(info: Array): + self.info = info + +func _on_register_trade_button_down(): + pass # 물건 올리기 기능이 들어갈 예정 diff --git a/frontend/Savor-22b/scenes/market/my_item.tscn b/frontend/Savor-22b/scenes/market/my_item.tscn new file mode 100644 index 00000000..e6076ec7 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/my_item.tscn @@ -0,0 +1,96 @@ +[gd_scene load_steps=4 format=3 uid="uid://c7yghm5bsqwif"] + +[ext_resource type="Script" path="res://scenes/market/my_item.gd" id="1_5wh4n"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_21if1"] +bg_color = Color(0, 0, 0, 1) +corner_radius_top_left = 30 +corner_radius_top_right = 30 +corner_radius_bottom_right = 30 +corner_radius_bottom_left = 30 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_oq8hu"] +bg_color = Color(0, 0, 0, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 15 +corner_radius_top_right = 15 +corner_radius_bottom_right = 15 +corner_radius_bottom_left = 15 + +[node name="MyItem" type="Control"] +custom_minimum_size = Vector2(320, 190) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -1610.0 +offset_bottom = -890.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_5wh4n") + +[node name="Background" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_21if1") + +[node name="MarginContainer" type="MarginContainer" parent="Background"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 5 + +[node name="VBoxContainer" type="VBoxContainer" parent="Background/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 10 + +[node name="NameLabel" type="Label" parent="Background/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 40 +text = "아이템 이름" + +[node name="HBoxContainer" type="HBoxContainer" parent="Background/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="AmountLabel" type="Label" parent="Background/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 25 +text = "10 개" +horizontal_alignment = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Background/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="GradeLabel" type="Label" parent="Background/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 25 +text = "A등급" +horizontal_alignment = 2 + +[node name="RegisterTradeButton" type="Button" parent="Background/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 35 +theme_override_styles/normal = SubResource("StyleBoxFlat_oq8hu") +text = " 아이템 등록하기 " + +[connection signal="button_down" from="Background/MarginContainer/VBoxContainer/RegisterTradeButton" to="." method="_on_register_trade_button_down"] diff --git a/frontend/Savor-22b/scenes/market/my_trade_goods.gd b/frontend/Savor-22b/scenes/market/my_trade_goods.gd new file mode 100644 index 00000000..d2791664 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/my_trade_goods.gd @@ -0,0 +1,21 @@ +extends Control + +@onready var item_button = $ItemSelectButton +@onready var description_label = $BackgroundPanel/MarginContainer/VBoxContainer/DescriptionLabel + +var info +var desc_format_string = "%s : %s +%s %s +%s : %s +%s : %s%s" + +func _ready(): + _update_info() + +func _update_info(): + if description_label == null: + return + description_label.text = desc_format_string % ["품목명",info.food["name"],info.food["grade"]," 등급","stateId",info.food["stateId"],"가격",info.price," BBG"] + +func set_info(info: Dictionary): + self.info = info diff --git a/frontend/Savor-22b/scenes/market/my_trade_goods.tscn b/frontend/Savor-22b/scenes/market/my_trade_goods.tscn new file mode 100644 index 00000000..e341a11d --- /dev/null +++ b/frontend/Savor-22b/scenes/market/my_trade_goods.tscn @@ -0,0 +1,92 @@ +[gd_scene load_steps=4 format=3 uid="uid://bwosqhxgrw2w5"] + +[ext_resource type="Script" path="res://scenes/market/my_trade_goods.gd" id="1_4ajeb"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3bs65"] +bg_color = Color(0, 0, 0, 1) +corner_radius_top_left = 40 +corner_radius_top_right = 40 +corner_radius_bottom_right = 40 +corner_radius_bottom_left = 40 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lobix"] +bg_color = Color(0, 0, 0, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 15 +corner_radius_top_right = 15 +corner_radius_bottom_right = 15 +corner_radius_bottom_left = 15 + +[node name="MyTradeGoods" type="Control"] +custom_minimum_size = Vector2(500, 430) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -25.0 +offset_right = -1445.0 +offset_bottom = -670.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_4ajeb") + +[node name="BackgroundPanel" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_3bs65") + +[node name="MarginContainer" type="MarginContainer" parent="BackgroundPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 30 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 30 + +[node name="VBoxContainer" type="VBoxContainer" parent="BackgroundPanel/MarginContainer"] +layout_mode = 2 + +[node name="DescriptionLabel" type="Label" parent="BackgroundPanel/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(2.08165e-12, 280) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 30 +text = "품목명 : 참치 +A 등급 +foodstateId : ~~ +가격 : 10 +" +autowrap_mode = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="BackgroundPanel/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 +alignment = 2 + +[node name="PriceEditButton" type="Button" parent="BackgroundPanel/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 40 +theme_override_styles/normal = SubResource("StyleBoxFlat_lobix") +text = " 가격 수정 " + +[node name="CancelButton" type="Button" parent="BackgroundPanel/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 40 +theme_override_styles/normal = SubResource("StyleBoxFlat_lobix") +text = " 등록 취소 " diff --git a/frontend/Savor-22b/scenes/market/sell_list_button_group.tres b/frontend/Savor-22b/scenes/market/sell_list_button_group.tres new file mode 100644 index 00000000..5c8d95f1 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/sell_list_button_group.tres @@ -0,0 +1,3 @@ +[gd_resource type="ButtonGroup" format=3 uid="uid://di66p0jb8cdpk"] + +[resource] diff --git a/frontend/Savor-22b/scenes/market/trade_goods.gd b/frontend/Savor-22b/scenes/market/trade_goods.gd new file mode 100644 index 00000000..49276702 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/trade_goods.gd @@ -0,0 +1,22 @@ +extends Control + +@onready var item_button = $ItemSelectButton +@onready var description_label = $BackgroundPanel/MarginContainer/VBoxContainer/DescriptionLabel + +var info +var desc_format_string = "%s : %s +%s %s +%s : %s +%s : %s%s +%s : %s" + +func _ready(): + _update_info() + +func _update_info(): + if description_label == null: + return + description_label.text = desc_format_string % ["품목명",info.food["name"],info.food["grade"]," 등급","stateId",info.food["stateId"],"가격",info.price," BBG","게시자",info.sellerAddress] + +func set_info(info: Dictionary): + self.info = info diff --git a/frontend/Savor-22b/scenes/market/trade_goods.tscn b/frontend/Savor-22b/scenes/market/trade_goods.tscn new file mode 100644 index 00000000..c8f28daa --- /dev/null +++ b/frontend/Savor-22b/scenes/market/trade_goods.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=4 format=3 uid="uid://crw3yutudcodf"] + +[ext_resource type="Script" path="res://scenes/market/trade_goods.gd" id="1_vfbu4"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_3bs65"] +bg_color = Color(0, 0, 0, 1) +corner_radius_top_left = 40 +corner_radius_top_right = 40 +corner_radius_bottom_right = 40 +corner_radius_bottom_left = 40 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lobix"] +bg_color = Color(0, 0, 0, 1) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 15 +corner_radius_top_right = 15 +corner_radius_bottom_right = 15 +corner_radius_bottom_left = 15 + +[node name="TradeGoods" type="Control"] +custom_minimum_size = Vector2(500, 430) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -25.0 +offset_right = -1445.0 +offset_bottom = -670.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_vfbu4") + +[node name="BackgroundPanel" type="Panel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_3bs65") + +[node name="MarginContainer" type="MarginContainer" parent="BackgroundPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 25 +theme_override_constants/margin_top = 30 +theme_override_constants/margin_right = 25 +theme_override_constants/margin_bottom = 30 + +[node name="VBoxContainer" type="VBoxContainer" parent="BackgroundPanel/MarginContainer"] +layout_mode = 2 + +[node name="DescriptionLabel" type="Label" parent="BackgroundPanel/MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(2.08165e-12, 280) +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 30 +text = "품목명 : 김 +A 등급 +foodstateId : dbfb5df1-9a5a-4f03-b19b-f385595ddc14 +가격 : 10 +게시자 : 0xae9bbb0090e20a8d1c8c3a2667b55951f8e +" +autowrap_mode = 1 + +[node name="BuyButton" type="Button" parent="BackgroundPanel/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 8 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 40 +theme_override_styles/normal = SubResource("StyleBoxFlat_lobix") +text = " 구매 " diff --git a/frontend/Savor-22b/scenes/market/trade_inventory.gd b/frontend/Savor-22b/scenes/market/trade_inventory.gd new file mode 100644 index 00000000..7874c232 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/trade_inventory.gd @@ -0,0 +1,47 @@ +extends Control + +const TradeGoodsScn = preload("res://scenes/market/trade_goods.tscn") +const MyTradeGoodsScn = preload("res://scenes/market/my_trade_goods.tscn") + +@onready var list_container = $MarginContainer/VBoxContainer/ListPanel/ScrollContainer/MarginContainer/CenterContainer/GridContainer + +var goods +var my_address = GlobalSigner.signer_address + +func _ready(): + pass + +func set_list(data: Array): + goods = data + load_list() + +func load_list(): + clear_list_panel() + + for good in goods: + if(good["sellerAddress"] != my_address): + add_lists(good, false) + +func _on_my_sell_list_button_down(): + clear_list_panel() + + for good in goods: + if(good["sellerAddress"] == my_address): + add_lists(good, true) + +func clear_list_panel(): + if is_instance_valid(list_container): + for posted_item in list_container.get_children(): + posted_item.queue_free() + +func add_lists(good: Dictionary, is_mine: bool): + var trade_goods_scene + if(!is_mine): + trade_goods_scene = TradeGoodsScn.instantiate() + else: + trade_goods_scene = MyTradeGoodsScn.instantiate() + trade_goods_scene.set_info(good) + list_container.add_child(trade_goods_scene) + +func _on_whole_sell_list_button_down(): + load_list() diff --git a/frontend/Savor-22b/scenes/market/trade_inventory.tscn b/frontend/Savor-22b/scenes/market/trade_inventory.tscn new file mode 100644 index 00000000..3168a5a5 --- /dev/null +++ b/frontend/Savor-22b/scenes/market/trade_inventory.tscn @@ -0,0 +1,107 @@ +[gd_scene load_steps=7 format=3 uid="uid://bu43d13qwmtcr"] + +[ext_resource type="Script" path="res://scenes/market/trade_inventory.gd" id="1_2sbin"] +[ext_resource type="ButtonGroup" uid="uid://di66p0jb8cdpk" path="res://scenes/market/sell_list_button_group.tres" id="2_68j2i"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_4l2s6"] +bg_color = Color(0, 0, 0, 1) +corner_radius_top_left = 25 +corner_radius_top_right = 25 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vqa0t"] +bg_color = Color(0.94902, 0.694118, 0.243137, 1) +corner_radius_top_left = 25 +corner_radius_top_right = 25 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_af182"] +bg_color = Color(0.94902, 0.694118, 0.243137, 1) +corner_radius_top_left = 25 +corner_radius_top_right = 25 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_as0cg"] +bg_color = Color(0.94902, 0.694118, 0.243137, 1) + +[node name="SellList" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -700.0 +offset_bottom = -130.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_2sbin") + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = -1 + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 20 + +[node name="WholeSellListButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(200, 70) +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_font_sizes/font_size = 40 +theme_override_styles/normal = SubResource("StyleBoxFlat_4l2s6") +theme_override_styles/pressed = SubResource("StyleBoxFlat_vqa0t") +theme_override_styles/focus = SubResource("StyleBoxFlat_vqa0t") +toggle_mode = true +button_pressed = true +button_group = ExtResource("2_68j2i") +text = "판매목록" + +[node name="MySellListButton" type="Button" parent="MarginContainer/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(240, 70) +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_font_sizes/font_size = 40 +theme_override_styles/normal = SubResource("StyleBoxFlat_4l2s6") +theme_override_styles/pressed = SubResource("StyleBoxFlat_af182") +theme_override_styles/focus = SubResource("StyleBoxFlat_af182") +toggle_mode = true +button_group = ExtResource("2_68j2i") +text = "내 판매목록" + +[node name="ListPanel" type="Panel" parent="MarginContainer/VBoxContainer"] +custom_minimum_size = Vector2(2.08165e-12, 750) +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_as0cg") + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/VBoxContainer/ListPanel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/ListPanel/ScrollContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 50 + +[node name="CenterContainer" type="CenterContainer" parent="MarginContainer/VBoxContainer/ListPanel/ScrollContainer/MarginContainer"] +layout_mode = 2 + +[node name="GridContainer" type="GridContainer" parent="MarginContainer/VBoxContainer/ListPanel/ScrollContainer/MarginContainer/CenterContainer"] +layout_mode = 2 +theme_override_constants/h_separation = 50 +theme_override_constants/v_separation = 50 +columns = 2 + +[connection signal="button_down" from="MarginContainer/VBoxContainer/HBoxContainer/WholeSellListButton" to="." method="_on_whole_sell_list_button_down"] +[connection signal="button_down" from="MarginContainer/VBoxContainer/HBoxContainer/MySellListButton" to="." method="_on_my_sell_list_button_down"] diff --git a/frontend/Savor-22b/scenes/village/village_view.gd b/frontend/Savor-22b/scenes/village/village_view.gd index 995eb494..1264eb52 100644 --- a/frontend/Savor-22b/scenes/village/village_view.gd +++ b/frontend/Savor-22b/scenes/village/village_view.gd @@ -66,6 +66,8 @@ func _on_enter_button_down(): func _on_farm_button_down(): get_tree().change_scene_to_file("res://scenes/farm/farm.tscn") + + #open shop with S input func _input(event): if event is InputEventKey and event.pressed: @@ -73,3 +75,5 @@ func _input(event): var shop = SystemShopScn.instantiate() popups.add_child(shop) shop.set_position(Vector2(400, 150)) + + diff --git a/frontend/Savor-22b/scenes/village/village_view.tscn b/frontend/Savor-22b/scenes/village/village_view.tscn index b2800bc0..a1995620 100644 --- a/frontend/Savor-22b/scenes/village/village_view.tscn +++ b/frontend/Savor-22b/scenes/village/village_view.tscn @@ -68,6 +68,11 @@ grow_vertical = 2 theme_override_font_sizes/font_size = 70 text = " 내 밭으로 가기 " +[node name="HBoxContainer" type="HBoxContainer" parent="TopMenuMarginContainer/Control"] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + [node name="BottomMenuMarginContainer" type="MarginContainer" parent="."] layout_mode = 0 offset_top = 940.0