1515# along with RPGXP. If not, see <http://www.gnu.org/licenses/>.
1616#
1717require 'gtk3'
18+ require_relative 'drawable_curve.rb'
1819
1920class DatabaseWindow < Gtk ::Window
2021 def initialize
@@ -24,10 +25,15 @@ def initialize
2425 buttons = Gtk ::ButtonBox . new ( :horizontal )
2526 buttons . layout = :end
2627 buttons . spacing = 4
28+
2729 cancel = Gtk ::Button . new ( stock_id : Gtk ::Stock ::CANCEL )
30+ cancel . signal_connect ( "clicked" ) { on_cancel }
31+
2832 apply = Gtk ::Button . new ( stock_id : Gtk ::Stock ::APPLY )
33+
2934 ok = Gtk ::Button . new ( stock_id : Gtk ::Stock ::OK )
3035 ok . style_context . add_class ( "suggested-action" )
36+
3137 buttons . add ( cancel )
3238 buttons . add ( apply )
3339 buttons . add ( ok )
@@ -36,6 +42,29 @@ def initialize
3642 notebook . tab_pos = :left
3743 notebook . vexpand = true
3844 notebook . scrollable = true
45+ notebook . signal_connect ( "switch-page" ) do |w , new_page |
46+ if @page
47+ @page . apply_object_changes
48+ if !( @page . data == @stored )
49+ msg = "Do you want to keep changes?"
50+ ask = Gtk ::MessageDialog . new ( message : msg , buttons_type : :none ,
51+ parent : self , flags : :modal )
52+ ask . add_button ( "Discard Changes" , :cancel )
53+ ok = ask . add_button ( "Keep Changes" , :ok )
54+ ok . style_context . add_class ( "suggested-action" )
55+ if ask . run == :ok
56+ @page . apply_changes
57+ else
58+ @page . reload_data
59+ end
60+ ask . destroy
61+ end
62+ end
63+ # Set new values
64+ @page = new_page
65+ @page . reload_object
66+ @stored = new_page . data . deep_clone
67+ end
3968
4069 widget = ActorEditor . new
4170 notebook . append_page ( widget , Gtk ::Label . new ( "Actors" ) )
@@ -54,24 +83,37 @@ def initialize
5483 not_implemented ( notebook , "System" )
5584
5685 vbox = Gtk ::Box . new ( :vertical )
86+ vbox . spacing = 4
5787 vbox . add ( notebook )
5888 vbox . add ( buttons )
5989 self . add ( vbox )
6090 self . show_all
6191 end
6292 def not_implemented ( notebook , name )
6393 label = Gtk ::Label . new ( "This has not been implemented yet" )
94+ class << label
95+ def data
96+ nil
97+ end
98+ def apply_object_changes ; end
99+ def reload_data ; end
100+ def reload_object ; end
101+ end
64102 notebook . append_page ( label , Gtk ::Label . new ( name ) )
65103 end
104+ def on_cancel
105+ self . destroy
106+ end
66107end
67108
68109class GenericDatabaseEditor < Gtk ::Box
69110 def initialize ( ui , array , name_getter = :name )
70111 super ( :horizontal )
71112 @builder = ExtraBuilder . new ( ui )
72- @array = array
113+ @array_src = array
73114 @name_getter = name_getter
74115 @store = Gtk ::ListStore . new ( String )
116+ reload_data
75117 refresh_store
76118
77119 @tv = Gtk ::TreeView . new ( @store )
@@ -80,13 +122,7 @@ def initialize(ui, array, name_getter = :name)
80122 column = Gtk ::TreeViewColumn . new ( "Name" , renderer , { :text => 0 , } )
81123 @tv . append_column ( column )
82124 @tv . signal_connect ( "cursor-changed" ) do
83- path = @tv . cursor [ 0 ]
84- if path
85- index = path . indices [ 0 ]
86- @object = @array [ index +1 ] . deep_clone
87- @object . class . bind_to ( @builder , @object )
88- on_object_change
89- end
125+ reload_object
90126 end
91127
92128 scroll = Gtk ::ScrolledWindow . new ( nil , nil )
@@ -97,102 +133,61 @@ def initialize(ui, array, name_getter = :name)
97133 self . add ( big_widget ( self [ "widget" ] , self . screen , 620 , 400 ) )
98134 self . show_all
99135 end
136+ def reload_data
137+ @array = @array_src . deep_clone
138+ end
139+ def reload_object
140+ path = @tv . cursor [ 0 ]
141+ if path
142+ apply_object_changes
143+ @index = path . indices [ 0 ] + 1
144+ @object = @array [ @index ] . deep_clone
145+ @object . class . bind_to ( @builder , @object )
146+ on_object_change
147+ end
148+ end
100149 def refresh_store
150+ @store . clear
101151 for object in @array [ 1 ..-1 ]
102152 item = @store . append
103153 item . set_value ( 0 , object . public_send ( @name_getter ) )
104154 end
105155 end
106- def on_object_change
107- # Ignore
108- end
109- def []( widget_name )
110- @builder . get_object ( widget_name )
111- end
112- end
113-
114- class DrawableCurve < Gtk ::DrawingArea
115- def initialize ( max )
116- super ( )
117- @max = max . to_f
118- @color = [ 0.0 , 0.0 , 0.0 ]
119-
120- self . signal_connect ( "draw" ) do |w , cr |
121- on_draw ( cr )
122- cr . destroy
156+ def apply_object_changes
157+ if @object
158+ new = @object . class . extract_from ( @builder )
159+ on_extract ( new )
160+ @array [ @index ] = new
123161 end
124162 end
125- def on_draw ( cr )
126- cr . set_source_rgb ( *@color )
127- height = self . allocated_height
128- dx = self . allocated_width / length . to_f
129-
130- for index in 0 ...length
131- y = ( self [ index ] * height ) / @max
132- x = dx * index
133- cr . rectangle ( x , height -y , dx , y )
134- end
135- cr . fill
163+ def apply_changes
164+ raise "Apply changes not implemented"
136165 end
137- def max = ( max )
138- @max = max
139- self . queue_draw
166+ def data
167+ @array
140168 end
141- def color = ( color )
142- @color = color
143- self . queue_draw
144- end
145- end
146-
147- class ListCurve < DrawableCurve
148- def initialize ( max )
149- super
150- @list = [ ]
151- end
152- def on_draw ( cr )
153- super unless @list . empty?
154- end
155- def list = ( list )
156- @list = list
157- self . queue_draw
158- end
159- def length
160- @list . length
161- end
162- def []( index )
163- @list [ index ]
164- end
165- end
166-
167- class ParameterCurve < DrawableCurve
168- def initialize ( max , index , r , g , b )
169- super ( max )
170- @index = index
171- @parameters = nil
172- self . color = [ r , g , b ]
173- end
174- def on_draw ( cr )
175- super if @parameters
176- end
177- def parameters = ( parameters )
178- @parameters = parameters
179- self . queue_draw
169+ def on_object_change
180170 end
181- def length
182- 99
171+ def on_extract ( new )
183172 end
184- def []( level )
185- @parameters [ @index , level + 1 ]
173+ def []( widget_name )
174+ @builder . get_object ( widget_name )
186175 end
187176end
188177
189178class ActorEditor < GenericDatabaseEditor
179+ def apply_changes
180+ $project. actors = @array . deep_clone
181+ end
190182 def initialize
191183 super ( "actor" , $project. actors )
192184 fill_with_classes ( self [ "class_id_list" ] )
193-
194- # Magic number calculated using 50 base 50 inflation values
195- @exp_graph = ListCurve . new ( 322987 )
185+ fill_with_weapons ( self [ "weapon_id_list" ] )
186+ fill_with_armors ( self [ "armor_id_list" ] )
187+
188+ # Magic number calculated using 50 base 50 inflation values
189+ max_exp = 322987
190+ @exp_graph = ListCurve . new ( max_exp )
196191 @exp_graph . color = [ 0.05 , 0.57 , 0.05 ]
197192 self [ "exp_graph_container" ] . add ( @exp_graph )
198193
@@ -213,8 +208,18 @@ def initialize
213208 link_refresh ( "initial_level" , "final_level" , "exp_basis" , "exp_inflation" )
214209 end
215210 def on_object_change
211+ super
216212 refresh
217213 end
214+ def on_extract ( new )
215+ super
216+ new . character_name = @object . character_name
217+ new . parameters = @object . parameters
218+ new . battler_hue = @object . battler_hue
219+ new . character_hue = @object . character_hue
220+ new . id = @object . id
221+ new . battler_name = @object . battler_name
222+ end
218223 def refresh
219224 refresh_parameters
220225 refresh_exp_graph
@@ -240,7 +245,7 @@ def refresh_exp_graph
240245 @exp_graph . list = @exp_list
241246 end
242247 def self . widget_reader ( name )
243- var = "@#{ name } #{ rand ( 1000 ) } " . to_sym
248+ var = "@__ #{ name } " . to_sym
244249 define_method name do
245250 value = self . instance_variable_get ( var )
246251 unless value
@@ -262,4 +267,3 @@ def link_refresh(*widgets)
262267 end
263268 end
264269end
265-
0 commit comments