the-crypt/addons/github-integration/scripts/Gist.gd
2020-07-17 11:26:02 -05:00

331 lines
12 KiB
GDScript

tool
extends Control
onready var CloseBTN = $GistContainer/close
onready var List = $GistContainer/GistEditor/ListContainer/List
onready var ListBar = $GistContainer/GistEditor/ListContainer/ListBar
onready var Content = $GistContainer/GistEditor/ContentContainer/Content
onready var GistName = $GistContainer/gist_name
onready var GistDescription = $GistContainer/description/gist_description
onready var WrapButton = $GistContainer/GistEditor/ContentContainer/TopBar/WrapBtn
onready var MapButton = $GistContainer/GistEditor/ContentContainer/TopBar/MapBtn
onready var NewFileDialog = $NewFile
onready var Readonly = $GistContainer/GistEditor/ContentContainer/TopBar/Readonly
onready var edit_description = $GistContainer/description/edit_description
onready var addfile_btn = $GistContainer/GistEditor/ListContainer/ListBar/addfile
onready var deletefile_btn = $GistContainer/GistEditor/ListContainer/ListBar/deletefile
onready var commit_btn = $GistContainer/GistButtons/commit
onready var delete_btn = $GistContainer/GistButtons/delete
var request = HTTPRequest.new()
enum REQUESTS { REPOS = 0, GIST = 1, UP_REPOS = 2, UP_GISTS = 3, DELETE = 4, COMMIT = 5, BRANCHES = 6, CONTENTS = 7, TREES = 8, DELETE_RESOURCE = 9, END = -1 }
var requesting
var privacy : bool
var description : String
var gistid : String
enum GIST_MODE { CREATING = 0 , GETTING = 1 , EDITING = 2 }
var gist_mode
#signals
signal get_gist()
signal loaded_gist()
signal gist_committed()
signal gist_updated()
signal gist_deleted()
func _ready():
add_child(request)
connect_signals()
Readonly.set_pressed(true)
hide()
func connect_signals():
request.connect("request_completed",self,"request_completed")
CloseBTN.connect("pressed",self,"close_editor")
List.connect("item_selected",self,"on_item_selected")
WrapButton.connect("item_selected",self,"on_wrap_selected")
MapButton.connect("item_selected",self,"on_btn")
addfile_btn.connect("pressed",self,"on_addfile")
deletefile_btn.connect("pressed",self,"on_deletefile")
commit_btn.connect("pressed",self,"on_commit")
delete_btn.connect("pressed",self,"on_delete")
NewFileDialog.connect("confirmed",self,"add_new_file")
Content.connect("text_changed",self,"on_text_changed")
Readonly.connect("toggled",self,"_on_Readonly_toggled")
addfile_btn.set_button_icon(IconLoaderGithub.load_icon_from_name("file"))
deletefile_btn.set_button_icon(IconLoaderGithub.load_icon_from_name("file_broken"))
func request_completed(result, response_code, headers, body ):
# print(JSON.parse(body.get_string_from_utf8()).result)
if result == 0:
match requesting:
REQUESTS.GIST:
if response_code == 200:
load_gist(JSON.parse(body.get_string_from_utf8()).result)
emit_signal("get_gist")
REQUESTS.COMMIT:
if response_code == 201:
GistName.set_text(UserData.USER.login+"/"+JSON.parse(body.get_string_from_utf8()).result.files.values()[0].filename)
get_parent().print_debug_message("gist committed with success!")
get_parent().UserPanel.request_gists(REQUESTS.GIST)
emit_signal("gist_committed")
REQUESTS.UP_GISTS:
if response_code == 200:
get_parent().print_debug_message("gist updated with success!")
get_parent().UserPanel.request_gists(REQUESTS.GIST)
emit_signal("gist_updated")
REQUESTS.DELETE:
if response_code == 204:
get_parent().print_debug_message("gist deleted with success!")
get_parent().UserPanel.request_gists(REQUESTS.GIST)
emit_signal("gist_deleted")
func request_gist(gist_id : String):
gist_mode = GIST_MODE.GETTING
requesting = REQUESTS.GIST
gistid = gist_id
commit_btn.hide()
edit_description.hide()
commit_btn.set_text("Update Gist")
commit_btn.set_button_icon(IconLoaderGithub.load_icon_from_name("edit_"))
request.request("https://api.github.com/gists/"+gist_id,UserData.header,false,HTTPClient.METHOD_GET,"")
yield(self,"get_gist")
func load_gist(gist : Dictionary):
delete_btn.show()
ListBar.hide()
Content.set_readonly(true)
GistName.set_text(UserData.USER.login+"/"+gist.files.values()[0].filename)
if gist.description=="" or gist.description==" " or gist.description==null:
GistDescription.set_text("<no description>")
else:
GistDescription.set_text(gist.description)
description = gist.description
for file in gist.files:
var file_item = List.add_item(file,IconLoaderGithub.load_icon_from_name("gists"))
var this_index = List.get_item_count()-1
List.set_item_metadata(this_index,gist.files[file])
List.select(this_index)
on_item_selected(this_index)
show()
emit_signal("loaded_gist")
func on_item_selected(index : int):
Content.clear_colors()
var item_metadata = List.get_item_metadata(index)
color_region(item_metadata.filename.get_extension())
Content.set_text(item_metadata.content)
func close_editor():
List.clear()
Content.set_text("")
GistName.set_text("")
GistDescription.set_text("")
hide()
get_parent().UserPanel.show()
func on_wrap_selected(index : int):
match index:
0:
Content.set_wrap_enabled(false)
1:
Content.set_wrap_enabled(true)
func initialize_new_gist(privacy : bool , description : String = "" , files : PoolStringArray = []):
delete_btn.hide()
gist_mode = GIST_MODE.CREATING
commit_btn.set_button_icon(IconLoaderGithub.load_icon_from_name("add"))
self.privacy = privacy
self.description = description
if description == "" or description == " ":
GistDescription.hide()
GistDescription.set_text(description)
GistName.set_text("New Gist")
Content.set_readonly(false)
ListBar.show()
commit_btn.show()
commit_btn.set_text("Commit Gist")
if files.size():
for file in files:
var gist_file = File.new()
gist_file.open(file,File.READ)
var filecontent = gist_file.get_as_text()
gist_file.close()
load_file(file.get_file(),filecontent)
show()
func on_addfile():
NewFileDialog.popup()
func load_file(file_name : String, filecontent : String):
var file_item = List.add_item(file_name,IconLoaderGithub.load_icon_from_name("gists"))
var this_index = List.get_item_count()-1
var metadata = { "content":filecontent, "filename":file_name }
List.set_item_metadata(this_index,metadata)
List.select(this_index)
on_item_selected(this_index)
func add_new_file():
var item_filename = NewFileDialog.get_node("HBoxContainer2/filename").get_text()
NewFileDialog.get_node("HBoxContainer2/filename").set_text("")
var file_item = List.add_item(item_filename,IconLoaderGithub.load_icon_from_name("gists"))
var this_index = List.get_item_count()-1
var metadata = { "content":"", "filename":item_filename }
List.set_item_metadata(this_index,metadata)
List.select(this_index)
on_item_selected(this_index)
func on_deletefile():
List.remove_item(List.get_selected_items()[0])
Content.set_text("")
func on_text_changed():
var metadata = { "content":Content.get_text(), "filename":List.get_item_text(List.get_selected_items()[0]) }
List.set_item_metadata(List.get_selected_items()[0],metadata)
func on_commit():
var files : Dictionary
for item in range(0,List.get_item_count()):
if List.get_item_metadata(item).content != "":
files[List.get_item_metadata(item).filename] = {"content":List.get_item_metadata(item).content}
else:
files[List.get_item_metadata(item).filename] = {"content":"null"}
if gist_mode == GIST_MODE.CREATING:
var body : Dictionary = {
"description": description,
"public": !privacy,
"files": files,
}
requesting = REQUESTS.COMMIT
request.request("https://api.github.com/gists",UserData.header,false,HTTPClient.METHOD_POST,JSON.print(body))
get_parent().print_debug_message("committing new gist...")
yield(self,"gist_committed")
close_editor()
elif gist_mode == GIST_MODE.EDITING:
var body : Dictionary = {
"description": description,
"files": files,
}
requesting = REQUESTS.UP_GISTS
request.request("https://api.github.com/gists/"+gistid,UserData.header,false,HTTPClient.METHOD_PATCH,JSON.print(body))
get_parent().print_debug_message("updating this gist...")
get_parent().loading(true)
yield(self,"gist_updated")
get_parent().loading(false)
close_editor()
func _on_Readonly_toggled(button_pressed):
if gist_mode == GIST_MODE.CREATING:
if button_pressed:
Readonly.set_text("Read Only")
Content.set_readonly(true)
else:
Readonly.set_text("Can Edit")
Content.set_readonly(false)
else:
if button_pressed:
Readonly.set_text("Read Only")
Content.set_readonly(true)
ListBar.hide()
gist_mode = GIST_MODE.GETTING
commit_btn.hide()
edit_description.hide()
if edit_description.get_node("gist_editdescription").get_text()!="":
description = edit_description.get_node("gist_editdescription").get_text()
GistDescription.set_text(description)
GistDescription.show()
else:
Readonly.set_text("Can Edit")
Content.set_readonly(false)
ListBar.show()
gist_mode = GIST_MODE.EDITING
commit_btn.show()
edit_description.show()
GistDescription.hide()
if GistDescription.get_text()!="<no description>":
edit_description.get_node("gist_editdescription").set_text(GistDescription.get_text())
func on_delete():
requesting = REQUESTS.DELETE
request.request("https://api.github.com/gists/"+gistid,UserData.header,false,HTTPClient.METHOD_DELETE)
get_parent().print_debug_message("deleting this gist...")
yield(self,"gist_deleted")
close_editor()
func color_region(filextension : String):
match(filextension):
"bbs":
Content.add_color_region("[b]","[/b]",Color8(153,153,255,255),false)
Content.add_color_region("[i]","[/i]",Color8(153,255,153,255),false)
Content.add_color_region("[s]","[/s]",Color8(255,153,153,255),false)
Content.add_color_region("[u]","[/u]",Color8(255,255,102,255),false)
Content.add_color_region("[url","[/url]",Color8(153,204,255,255),false)
Content.add_color_region("[code]","[/code]",Color8(192,192,192,255),false)
Content.add_color_region("[img]","[/img]",Color8(255,204,153,255),false)
Content.add_color_region("[center]","[/center]",Color8(175,238,238,255),false)
Content.add_color_region("[right]","[/right]",Color8(135,206,235,255),false)
"html":
Content.add_color_region("<b>","</b>",Color8(153,153,255,255),false)
Content.add_color_region("<i>","</i>",Color8(153,255,153,255),false)
Content.add_color_region("<del>","</del>",Color8(255,153,153,255),false)
Content.add_color_region("<ins>","</ins>",Color8(255,255,102,255),false)
Content.add_color_region("<a","</a>",Color8(153,204,255,255),false)
Content.add_color_region("<img","/>",Color8(255,204,153,255),true)
Content.add_color_region("<pre>","</pre>",Color8(192,192,192,255),false)
Content.add_color_region("<center>","</center>",Color8(175,238,238,255),false)
Content.add_color_region("<right>","</right>",Color8(135,206,235,255),false)
"md":
Content.add_color_region("***","***",Color8(126,186,181,255),false)
Content.add_color_region("**","**",Color8(153,153,255,255),false)
Content.add_color_region("*","*",Color8(153,255,153,255),false)
Content.add_color_region("+ ","",Color8(255,178,102,255),false)
Content.add_color_region("- ","",Color8(255,178,102,255),false)
Content.add_color_region("~~","~~",Color8(255,153,153,255),false)
Content.add_color_region("__","__",Color8(255,255,102,255),false)
Content.add_color_region("[",")",Color8(153,204,255,255),false)
Content.add_color_region("`","`",Color8(192,192,192,255),false)
Content.add_color_region('"*.','"',Color8(255,255,255,255),true)
Content.add_color_region("# ","",Color8(105,105,105,255),true)
Content.add_color_region("## ","",Color8(128,128,128,255),true)
Content.add_color_region("### ","",Color8(169,169,169,255),true)
Content.add_color_region("#### ","",Color8(192,192,192,255),true)
Content.add_color_region("##### ","",Color8(211,211,211,255),true)
Content.add_color_region("###### ","",Color8(255,255,255,255),true)
Content.add_color_region("> ","",Color8(172,138,79,255),true)
"cfg":
Content.add_color_region("[","]",Color8(153,204,255,255),false)
Content.add_color_region('"','"',Color8(255,255,102,255),false)
Content.add_color_region(';','',Color8(128,128,128,255),true)
"ini":
Content.add_color_region("[","]",Color8(153,204,255,255),false)
Content.add_color_region('"','"',Color8(255,255,102,255),false)
Content.add_color_region(';','',Color8(128,128,128,255),true)
_:
pass