Keep several recently generated sounds in the menu

This commit is contained in:
Haoyu Qiu 2022-03-10 17:18:25 +08:00
parent a6a4a93485
commit 8c3a37a3cb
4 changed files with 161 additions and 81 deletions

View File

@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Extra options menu: Save As, Copy, and Paste. - Extra options menu: Save As, Copy, and Paste.
- Add a copy of the LICENSE in the plugin folder. - Add a copy of the LICENSE in the plugin folder.
- Keep several recently generated sounds in the menu.
## [1.0.0] - 2022-02-25 ## [1.0.0] - 2022-02-25
### Added ### Added

View File

@ -1,21 +1,29 @@
tool tool
extends Container extends Container
enum ExtraOption { SAVE_AS, COPY, PASTE } enum ExtraOption { SAVE_AS, COPY, PASTE, RECENT }
const SFXRConfig := preload("../SFXRConfig.gd") const SFXRConfig := preload("../SFXRConfig.gd")
const SFXRGenerator := preload("../SFXRGenerator.gd") const SFXRGenerator := preload("../SFXRGenerator.gd")
const NUM_RECENTS := 4
class RecentEntry:
var title: String
var config := SFXRConfig.new()
var plugin: EditorPlugin var plugin: EditorPlugin
var _config := SFXRConfig.new() var _config := SFXRConfig.new()
var _config_defaults := SFXRConfig.new() var _config_defaults := SFXRConfig.new()
var _config_clipboard: SFXRConfig var _config_clipboard: SFXRConfig
var _config_recents: Array
var _recents_id := 0
var _generator := SFXRGenerator.new() var _generator := SFXRGenerator.new()
var _path: String var _path: String
var _modified := false var _modified := false
var _param_map := {} var _param_map := {}
var _syncing_ui := false # a hack since Range set_value emits value_changed var _syncing_ui := false # a hack since Range set_value emits value_changed
var _category_names := {}
onready var audio_player := $AudioStreamPlayer as AudioStreamPlayer onready var audio_player := $AudioStreamPlayer as AudioStreamPlayer
onready var filename_label := find_node("Filename") as Label onready var filename_label := find_node("Filename") as Label
@ -38,8 +46,19 @@ func _ready():
popup.add_separator() popup.add_separator()
popup.add_item(translator.tr("Copy"), ExtraOption.COPY) popup.add_item(translator.tr("Copy"), ExtraOption.COPY)
popup.add_item(translator.tr("Paste"), ExtraOption.PASTE) popup.add_item(translator.tr("Paste"), ExtraOption.PASTE)
popup.add_separator(translator.tr("Recently Generated"))
popup.connect("id_pressed", self, "_on_Extra_id_pressed") popup.connect("id_pressed", self, "_on_Extra_id_pressed")
_category_names = {
SFXRConfig.Category.PICKUP_COIN: translator.tr("Pickup/Coin"),
SFXRConfig.Category.LASER_SHOOT: translator.tr("Laser/Shoot"),
SFXRConfig.Category.EXPLOSION: translator.tr("Explosion"),
SFXRConfig.Category.POWERUP: translator.tr("Powerup"),
SFXRConfig.Category.HIT_HURT: translator.tr("Hit/Hurt"),
SFXRConfig.Category.JUMP: translator.tr("Jump"),
SFXRConfig.Category.BLIP_SELECT: translator.tr("Blip/Select"),
}
var params := find_node("Params") as Container var params := find_node("Params") as Container
for category in params.get_children(): for category in params.get_children():
for control in category.get_children(): for control in category.get_children():
@ -81,6 +100,20 @@ func _hook_plugin(node: Node) -> void:
_hook_plugin(child) _hook_plugin(child)
func _push_recent(title: String) -> void:
var recent: RecentEntry
if _config_recents.size() < NUM_RECENTS:
recent = RecentEntry.new()
else:
recent = _config_recents.pop_back()
_recents_id += 1
recent.title = "#%d %s" % [_recents_id, title]
recent.config.copy_from(_config)
_config_recents.push_front(recent)
func _popup_confirm(content: String, callback: String, binds := []) -> void: func _popup_confirm(content: String, callback: String, binds := []) -> void:
var dialog := ConfirmationDialog.new() var dialog := ConfirmationDialog.new()
add_child(dialog) add_child(dialog)
@ -111,12 +144,19 @@ func _popup_file_dialog(mode: int, callback: String) -> void:
dialog.popup_centered_ratio() dialog.popup_centered_ratio()
func _reset_defaults() -> void: # SFXRConfig func _reset_defaults() -> void:
_config_defaults.copy_from(_config) _config_defaults.copy_from(_config)
_set_modified(false) _set_modified(false)
_sync_ui() _sync_ui()
func _restore_from_config(config: SFXRConfig) -> void:
_config.copy_from(config)
_sync_ui()
_set_modified(not config.is_equal(_config_defaults))
audio_player.stream = null
func _set_editing_file(path: String) -> int: # Error func _set_editing_file(path: String) -> int: # Error
if path.empty(): if path.empty():
_config.reset() _config.reset()
@ -190,8 +230,10 @@ func _on_Play_pressed(force_regenerate := false):
func _on_Randomize_pressed(category: int): func _on_Randomize_pressed(category: int):
if category == -1: if category == -1:
_config.randomize() _config.randomize()
_push_recent(translator.tr("Randomize"))
else: else:
_config.randomize_in_category(category) _config.randomize_in_category(category)
_push_recent(_category_names.get(category, "Unknown"))
_set_modified(true) _set_modified(true)
_sync_ui() _sync_ui()
@ -201,6 +243,7 @@ func _on_Randomize_pressed(category: int):
func _on_Mutate_pressed(): func _on_Mutate_pressed():
_config.mutate() _config.mutate()
_push_recent(translator.tr("Mutate"))
_set_modified(true) _set_modified(true)
_sync_ui() _sync_ui()
_on_Play_pressed(true) _on_Play_pressed(true)
@ -253,6 +296,20 @@ func _on_Load_pressed():
func _on_Extra_about_to_show(): func _on_Extra_about_to_show():
var popup := extra_button.get_popup() var popup := extra_button.get_popup()
popup.set_item_disabled(popup.get_item_index(ExtraOption.PASTE), _config_clipboard == null) popup.set_item_disabled(popup.get_item_index(ExtraOption.PASTE), _config_clipboard == null)
# Rebuild recents menu everytime :)
var first_recent_index := popup.get_item_index(ExtraOption.RECENT)
if first_recent_index != -1:
var count := popup.get_item_count()
for i in count - first_recent_index:
popup.remove_item(count - 1 - i)
if _config_recents.empty():
popup.add_item(translator.tr("None"), ExtraOption.RECENT)
popup.set_item_disabled(popup.get_item_index(ExtraOption.RECENT), true)
else:
for i in _config_recents.size():
popup.add_item(_config_recents[i].title, ExtraOption.RECENT + i)
func _on_Extra_id_pressed(id: int) -> void: func _on_Extra_id_pressed(id: int) -> void:
@ -266,8 +323,14 @@ func _on_Extra_id_pressed(id: int) -> void:
_config_clipboard.copy_from(_config) _config_clipboard.copy_from(_config)
ExtraOption.PASTE: ExtraOption.PASTE:
_config.copy_from(_config_clipboard) _restore_from_config(_config_clipboard)
_sync_ui()
_set_modified(not _config.is_equal(_config_defaults)) _:
audio_player.stream = null var i := id - ExtraOption.RECENT as int
if i < 0 or _config_recents.size() <= i:
printerr("Bad index %d (%d in total)" % [i, _config_recents.size()])
return
var recent: RecentEntry = _config_recents[i]
_restore_from_config(recent.config)
_on_Play_pressed()

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gdfxr 1.0\n" "Project-Id-Version: gdfxr 1.0\n"
"Report-Msgid-Bugs-To: timothyqiu32@gmail.com\n" "Report-Msgid-Bugs-To: timothyqiu32@gmail.com\n"
"POT-Creation-Date: 2022-03-07 18:27+0800\n" "POT-Creation-Date: 2022-03-10 17:02+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -29,6 +29,38 @@ msgstr ""
msgid "Paste" msgid "Paste"
msgstr "" msgstr ""
#: addons/gdfxr/editor/Editor.gd
msgid "Recently Generated"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Pickup/Coin"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Laser/Shoot"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Explosion"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Powerup"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Hit/Hurt"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Jump"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Blip/Select"
msgstr ""
#: addons/gdfxr/editor/Editor.gd #: addons/gdfxr/editor/Editor.gd
#, python-format #, python-format
msgid "" msgid ""
@ -53,6 +85,14 @@ msgstr ""
msgid "Unsaved sound" msgid "Unsaved sound"
msgstr "" msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Randomize"
msgstr ""
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Mutate"
msgstr ""
#: addons/gdfxr/editor/Editor.gd #: addons/gdfxr/editor/Editor.gd
msgid "" msgid ""
"There are unsaved changes.\n" "There are unsaved changes.\n"
@ -65,6 +105,10 @@ msgid ""
"Load anyway?" "Load anyway?"
msgstr "" msgstr ""
#: addons/gdfxr/editor/Editor.gd
msgid "None"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn #: addons/gdfxr/editor/Editor.tscn
msgid "New" msgid "New"
msgstr "" msgstr ""
@ -89,42 +133,6 @@ msgstr ""
msgid "Restore" msgid "Restore"
msgstr "" msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Pickup/Coin"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Laser/Shoot"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Explosion"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Powerup"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Hit/Hurt"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Jump"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Blip/Select"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Mutate"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn
msgid "Randomize"
msgstr ""
#: addons/gdfxr/editor/Editor.tscn #: addons/gdfxr/editor/Editor.tscn
msgid "Attack Time" msgid "Attack Time"
msgstr "" msgstr ""

View File

@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gdfxr 1.0\n" "Project-Id-Version: gdfxr 1.0\n"
"Report-Msgid-Bugs-To: timothyqiu32@gmail.com\n" "Report-Msgid-Bugs-To: timothyqiu32@gmail.com\n"
"POT-Creation-Date: 2022-03-07 18:27+0800\n" "POT-Creation-Date: 2022-03-10 17:02+0800\n"
"PO-Revision-Date: 2022-03-07 18:27+0800\n" "PO-Revision-Date: 2022-03-10 17:02+0800\n"
"Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: zh_CN\n" "Language: zh_CN\n"
@ -31,6 +31,38 @@ msgstr "复制"
msgid "Paste" msgid "Paste"
msgstr "粘贴" msgstr "粘贴"
#: addons/gdfxr/editor/Editor.gd
msgid "Recently Generated"
msgstr "最近生成"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Pickup/Coin"
msgstr "拾取/金币"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Laser/Shoot"
msgstr "激光/射击"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Explosion"
msgstr "爆炸"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Powerup"
msgstr "升级"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Hit/Hurt"
msgstr "击中/受伤"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Jump"
msgstr "跳跃"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Blip/Select"
msgstr "短滴/选择"
#: addons/gdfxr/editor/Editor.gd #: addons/gdfxr/editor/Editor.gd
#, python-format #, python-format
msgid "" msgid ""
@ -57,6 +89,14 @@ msgstr "“%s”不是有效的 SFXR 文件。"
msgid "Unsaved sound" msgid "Unsaved sound"
msgstr "未保存音效" msgstr "未保存音效"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Randomize"
msgstr "随机"
#: addons/gdfxr/editor/Editor.gd addons/gdfxr/editor/Editor.tscn
msgid "Mutate"
msgstr "演化"
#: addons/gdfxr/editor/Editor.gd #: addons/gdfxr/editor/Editor.gd
msgid "" msgid ""
"There are unsaved changes.\n" "There are unsaved changes.\n"
@ -73,6 +113,10 @@ msgstr ""
"存在未保存的修改。\n" "存在未保存的修改。\n"
"仍然要加载吗?" "仍然要加载吗?"
#: addons/gdfxr/editor/Editor.gd
msgid "None"
msgstr "无"
#: addons/gdfxr/editor/Editor.tscn #: addons/gdfxr/editor/Editor.tscn
msgid "New" msgid "New"
msgstr "新建" msgstr "新建"
@ -97,42 +141,6 @@ msgstr "播放"
msgid "Restore" msgid "Restore"
msgstr "恢复" msgstr "恢复"
#: addons/gdfxr/editor/Editor.tscn
msgid "Pickup/Coin"
msgstr "拾取/金币"
#: addons/gdfxr/editor/Editor.tscn
msgid "Laser/Shoot"
msgstr "激光/射击"
#: addons/gdfxr/editor/Editor.tscn
msgid "Explosion"
msgstr "爆炸"
#: addons/gdfxr/editor/Editor.tscn
msgid "Powerup"
msgstr "升级"
#: addons/gdfxr/editor/Editor.tscn
msgid "Hit/Hurt"
msgstr "击中/受伤"
#: addons/gdfxr/editor/Editor.tscn
msgid "Jump"
msgstr "跳跃"
#: addons/gdfxr/editor/Editor.tscn
msgid "Blip/Select"
msgstr "短滴/选择"
#: addons/gdfxr/editor/Editor.tscn
msgid "Mutate"
msgstr "演化"
#: addons/gdfxr/editor/Editor.tscn
msgid "Randomize"
msgstr "随机"
#: addons/gdfxr/editor/Editor.tscn #: addons/gdfxr/editor/Editor.tscn
msgid "Attack Time" msgid "Attack Time"
msgstr "起音时间" msgstr "起音时间"