1
- tool
2
- extends Control
1
+ @ tool
2
+ extends TextureRect
3
3
4
4
const MAX_COUNT = 4
5
5
6
- export var max_size = 256
7
- export var background = Color (0 , 0 , 0 , 0 )
8
- export var immediate = false
6
+ @ export var max_size = 256
7
+ @ export var background = Color (0 , 0 , 0 , 0 )
8
+ @ export var immediate = false
9
9
10
- var url setget _set_url
10
+ var url : set = _set_url
11
11
var url_to_load
12
12
13
- var http = HTTPRequest . new ()
13
+ var http_request = null
14
14
var busy
15
15
16
- var texture
17
-
18
16
func _enter_tree ():
19
- if ! get_tree ().has_meta ("__http_image_count" ):
20
- get_tree ().set_meta ("__http_image_count" , 0 )
21
17
22
- if ! http .get_parent ():
23
- add_child (http )
18
+ if ! http_request :
19
+ http_request = HTTPRequest .new ()
20
+ add_child (http_request )
21
+ http_request .request_completed .connect (self ._http_request_completed )
22
+ http_request .set_tls_options (TLSOptions .client ())
24
23
25
24
busy = false
26
25
if url_to_load :
27
26
_start_load ()
28
27
29
28
func _exit_tree ():
30
29
if busy :
31
- http .cancel_request ()
30
+ http_request .cancel_request ()
32
31
get_tree ().set_meta ("__http_image_count" , get_tree ().get_meta ("__http_image_count" ) - 1 )
33
32
busy = false
34
33
35
- func _draw ():
36
- var rect = Rect2 (0 , 0 , get_rect ().size .x , get_rect ().size .y )
37
- draw_rect (rect , background )
38
-
39
- if ! texture :
40
- return
41
34
42
- var tw = texture .get_width ()
43
- var th = texture .get_height ()
44
35
45
- if float (tw ) / th > rect .size .x / rect .size .y :
46
- var old = rect .size .y
47
- rect .size .y = rect .size .x * float (th ) / tw
48
- rect .position .y += 0.5 * (old - rect .size .y )
49
- else :
50
- var old = rect .size .x
51
- rect .size .x = rect .size .y * float (tw ) / th
52
- rect .position .x += 0.5 * (old - rect .size .x )
53
-
54
- draw_texture_rect (texture , rect , false )
55
36
56
37
func _set_url (url ):
57
38
url_to_load = url
@@ -61,11 +42,12 @@ func _set_url(url):
61
42
_start_load ()
62
43
63
44
func _start_load ():
64
- http .cancel_request ()
45
+ http_request .cancel_request ()
65
46
texture = null
66
- update ()
47
+ queue_redraw ()
67
48
68
49
if ! url_to_load :
50
+ print ("there was no url to load from" )
69
51
return
70
52
71
53
while true :
@@ -76,39 +58,40 @@ func _start_load():
76
58
get_tree ().set_meta ("__http_image_count" , count + 1 )
77
59
break
78
60
else :
79
- yield ( get_tree (), "idle_frame" )
61
+ await get_tree (). process_frame
80
62
81
63
_load (url_to_load )
82
64
url_to_load = null
83
65
84
- func _load (url_to_load ):
85
- http .request (url_to_load , [], false )
66
+ func _load (url_to_load ):# Create an HTTP request node and connect its completion signal.
67
+ # Perform the HTTP request. The URL below returns a PNG image as of writing.
68
+ var error = http_request .request (url_to_load )
69
+ if error != OK :
70
+ push_error ("An error occurred in the HTTP request." )
86
71
87
- busy = true
88
- var data = yield ( http , "request_completed" )
72
+ # Called when the HTTP request is completed.
73
+ func _http_request_completed ( result , response_code , headers , body ):
89
74
90
- busy = false
91
75
get_tree ().set_meta ("__http_image_count" , get_tree ().get_meta ("__http_image_count" ) - 1 )
92
-
93
- var result = data [0 ]
94
- var code = data [1 ]
95
- var headers = data [2 ]
96
- var body = data [3 ]
97
-
98
76
if result != HTTPRequest .RESULT_SUCCESS :
77
+ push_error ("Image couldn't be downloaded. Try a different image." )
78
+
79
+ var image = Image .new ()
80
+ var error = image .load_jpg_from_buffer (body )
81
+ if error != OK :
82
+ push_error ("Couldn't load the image." )
99
83
return
100
84
101
- var img = Image .new ()
102
- if img .load_jpg_from_buffer (body ) == OK || img .load_png_from_buffer (body ) == OK :
103
- var w = img .get_width ()
104
- var h = img .get_height ()
105
- if w > h :
106
- var new_w = min (w , max_size )
107
- img .resize (new_w , (float (h ) / w ) * new_w )
108
- else :
109
- var new_h = min (h , max_size )
110
- img .resize ((float (w ) / h ) * new_h , new_h )
85
+ # Display the image in a TextureRect node.
86
+ var w = image .get_width ()
87
+ var h = image .get_height ()
88
+ if w > h :
89
+ var new_w = min (w , max_size )
90
+ image .resize (new_w , (float (h ) / w ) * new_w )
91
+ else :
92
+ var new_h = min (h , max_size )
93
+ image .resize ((float (w ) / h ) * new_h , new_h )
94
+
95
+ texture = ImageTexture .create_from_image (image )
96
+
111
97
112
- texture = ImageTexture .new ()
113
- texture .create_from_image (img )
114
- update ()
0 commit comments