Skip to content

Commit e683cb4

Browse files
committed
Database: Primitive keep changes implementation
1 parent 2b22b5d commit e683cb4

File tree

5 files changed

+282
-95
lines changed

5 files changed

+282
-95
lines changed

data/ui/actor.glade

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,18 @@
88
<column type="gchararray"/>
99
</columns>
1010
</object>
11+
<object class="GtkListStore" id="weapon_id_list">
12+
<columns>
13+
<!-- column-name gchararray1 -->
14+
<column type="gchararray"/>
15+
</columns>
16+
</object>
17+
<object class="GtkListStore" id="armor_id_list">
18+
<columns>
19+
<!-- column-name gchararray1 -->
20+
<column type="gchararray"/>
21+
</columns>
22+
</object>
1123
<object class="GtkAdjustment" id="exp_basis">
1224
<property name="lower">10</property>
1325
<property name="upper">50</property>
@@ -700,10 +712,11 @@
700712
</packing>
701713
</child>
702714
<child>
703-
<object class="GtkComboBox" id="weapon">
715+
<object class="GtkComboBox" id="weapon_id">
704716
<property name="visible">True</property>
705717
<property name="can_focus">False</property>
706718
<property name="hexpand">True</property>
719+
<property name="model">weapon_id_list</property>
707720
<child>
708721
<object class="GtkCellRendererText" id="cellrenderertext7"/>
709722
<attributes>
@@ -717,10 +730,11 @@
717730
</packing>
718731
</child>
719732
<child>
720-
<object class="GtkComboBox" id="armor1">
733+
<object class="GtkComboBox" id="armor1_id">
721734
<property name="visible">True</property>
722735
<property name="can_focus">False</property>
723736
<property name="hexpand">True</property>
737+
<property name="model">armor_id_list</property>
724738
<child>
725739
<object class="GtkCellRendererText" id="cellrenderertext1"/>
726740
<attributes>
@@ -734,10 +748,11 @@
734748
</packing>
735749
</child>
736750
<child>
737-
<object class="GtkComboBox" id="armor2">
751+
<object class="GtkComboBox" id="armor2_id">
738752
<property name="visible">True</property>
739753
<property name="can_focus">False</property>
740754
<property name="hexpand">True</property>
755+
<property name="model">armor_id_list</property>
741756
<child>
742757
<object class="GtkCellRendererText" id="cellrenderertext2"/>
743758
<attributes>
@@ -751,10 +766,11 @@
751766
</packing>
752767
</child>
753768
<child>
754-
<object class="GtkComboBox" id="armor3">
769+
<object class="GtkComboBox" id="armor3_id">
755770
<property name="visible">True</property>
756771
<property name="can_focus">False</property>
757772
<property name="hexpand">True</property>
773+
<property name="model">armor_id_list</property>
758774
<child>
759775
<object class="GtkCellRendererText" id="cellrenderertext3"/>
760776
<attributes>
@@ -768,10 +784,11 @@
768784
</packing>
769785
</child>
770786
<child>
771-
<object class="GtkComboBox" id="armor4">
787+
<object class="GtkComboBox" id="armor4_id">
772788
<property name="visible">True</property>
773789
<property name="can_focus">False</property>
774790
<property name="hexpand">True</property>
791+
<property name="model">armor_id_list</property>
775792
<child>
776793
<object class="GtkCellRendererText" id="cellrenderertext4"/>
777794
<attributes>
@@ -798,7 +815,7 @@
798815
</packing>
799816
</child>
800817
<child>
801-
<object class="GtkCheckButton" id="shield_fix">
818+
<object class="GtkCheckButton" id="armor1_fix">
802819
<property name="label" translatable="yes" comments="As in &quot;You can't change this item&quot;">Fix</property>
803820
<property name="visible">True</property>
804821
<property name="can_focus">True</property>

src/database.rb

Lines changed: 91 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# along with RPGXP. If not, see <http://www.gnu.org/licenses/>.
1616
#
1717
require 'gtk3'
18+
require_relative 'drawable_curve.rb'
1819

1920
class 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
66107
end
67108

68109
class 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
187176
end
188177

189178
class 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
264269
end
265-

0 commit comments

Comments
 (0)