OSDN Git Service

marshal database generator & accessor
[amulettoolsmh4/main.git] / view / notebookamuletview.py
1 # -*- coding: utf-8 -*-
2
3 # GUIのメインフレームにおけるお守り検索Notebookのview
4 # 2013/12/15 written by kei9
5 import wx
6 from wx import xrc
7 import wx.grid
8
9 import constnumbers
10
11 class NoteBookAmuletView():
12     u""" メインのフレームのお守り検索タブ """
13     def __init__(self, frame):
14         self.frame = frame
15         self._init_view()
16         self._init_event()
17
18     def _init_view(self):
19         # initialize view
20
21         # button
22         self.button_search = xrc.XRCCTRL(self.frame, "ButtonAmuletSearchSearch")
23         self.button_clear = xrc.XRCCTRL(self.frame, "ButtonAmuletSearchClear")
24         self.button_skill = xrc.XRCCTRL(self.frame, "ButtonAmuletSearchSkill2")
25         self.ID_BUTTON_SEARCH = xrc.XRCID("ButtonAmuletSearchSearch")
26         self.ID_BUTTON_CLEAR = xrc.XRCID("ButtonAmuletSearchClear")
27         self.ID_BUTTON_SKILL = xrc.XRCID("ButtonAmuletSearchSkill2")
28
29         # radio button
30         self.radiobox_amulet = xrc.XRCCTRL(self.frame, "RadioBoxAmulet")
31         self.radiobox_threshold_type = xrc.XRCCTRL(self.frame, "RadioBoxThresholdType")
32
33         # seed2s list
34         self.grid_seed2s = xrc.XRCCTRL(self.frame, "GridAmuletSeed2s")
35         self.grid_seed2s.CreateGrid(1, constnumbers.NUM_AMULET_SEED2S_GRID_COL)
36         self.grid_seed2s.SetColLabelValue(0, constnumbers.LABEL_FORMAT_AMULET_SEED2S_GRID_COL1)
37         self.grid_seed2s.DisableDragGridSize()
38         self.grid_seed2s.EnableEditing(False)
39         self.grid_seed2s.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
40
41         # seed1s list
42         self.grid_seed1s = xrc.XRCCTRL(self.frame, "GridAmuletSeed1s")
43         self.grid_seed1s.CreateGrid(1, constnumbers.NUM_AMULET_SEED1S_GRID_COL)
44         self.grid_seed1s.SetColLabelValue(0, constnumbers.LABEL_FORMAT_AMULET_SEED1S_GRID_COL1)
45         self.grid_seed1s.SetColLabelValue(1, constnumbers.LABEL_FORMAT_AMULET_SEED1S_GRID_COL2)
46         self.grid_seed1s.DisableDragGridSize()
47         self.grid_seed1s.EnableEditing(False)
48         self.grid_seed1s.SetRowLabelSize(1)
49
50         # spin ctrl
51         self.spin_ctrl_skill1_val = xrc.XRCCTRL(self.frame, "SpinCtrlAmuletSearchSkill1Value")
52         self.spin_ctrl_skill2_val = xrc.XRCCTRL(self.frame, "SpinCtrlAmuletSearchSkill2Value")
53         self.spin_ctrl_slot_num = xrc.XRCCTRL(self.frame, "SpinCtrlAmuletSearchSlotNumber")
54         self.ID_SPIN_CTRL_SKILL1_VAL = xrc.XRCID("SpinCtrlAmuletSearchSkill1Value")
55         self.ID_SPIN_CTRL_SKILL2_VAL = xrc.XRCID("SpinCtrlAmuletSearchSkill2Value")
56
57         # combobox
58         self.combo_box_skill1 = xrc.XRCCTRL(self.frame, "ComboBoxAmuletSearchSkill1")
59         self.combo_box_skill2 = xrc.XRCCTRL(self.frame, "ComboBoxAmuletSearchSkill2")
60         self.ID_COMBO_BOX_SKILL1 = xrc.XRCID("ComboBoxAmuletSearchSkill1")
61         self.ID_COMBO_BOX_SKILL2 = xrc.XRCID("ComboBoxAmuletSearchSkill2")
62
63         # text ctrl
64         self.text_ctrl_result = xrc.XRCCTRL(self.frame, "TextCtrlAmuletSearchResult")
65
66         # set min & max of slot
67         self.set_slot_minmax(constnumbers.SLOT_MIN, constnumbers.SLOT_MAX)
68
69     def _init_event(self):
70         # initialize event
71         self.grid_seed1s.Bind(wx.EVT_SIZE, self.OnSeed1GridSizeChanged)
72         self.grid_seed2s.Bind(wx.EVT_SIZE, self.OnSeed2GridSizeChanged)
73
74     def OnSeed1GridSizeChanged(self, event):
75         u""" Seed1Gridサイズの変更時 """
76         width, height = self.grid_seed1s.GetParent().GetSize()
77         each_width = (width) / (constnumbers.NUM_AMULET_SEED1S_GRID_COL) # consider margin size
78         self.grid_seed1s.SetRowLabelValue(0, u"")
79         for col in range(constnumbers.NUM_AMULET_SEED1S_GRID_COL):
80             self.grid_seed1s.SetColSize(col, each_width)
81
82     def OnSeed2GridSizeChanged(self, event):
83         u""" Seed2Gridサイズの変更時 """
84         width, height = self.grid_seed2s.GetParent().GetSize()
85         each_width = (width - 60) / (constnumbers.NUM_AMULET_SEED2S_GRID_COL) # consider margin size
86         self.grid_seed2s.SetRowLabelSize(45)
87         for col in range(constnumbers.NUM_AMULET_SEED2S_GRID_COL):
88             self.grid_seed2s.SetColSize(col, each_width)
89
90     def bind_radiobox_amulet(self, event_func, evt=wx.EVT_RADIOBOX):
91         u""" お守り種類のラジオボタンが押された時のイベントをセットする """
92         self.radiobox_amulet.Bind(evt, event_func)
93
94     def bind_radiobox_threshold_type(self, event_func, evt=wx.EVT_RADIOBOX):
95         u""" 判定値の種類のラジオボタンが押された時のイベントをセットする """
96         self.radiobox_threshold_type.Bind(evt, event_func)
97
98     def bind_combobox(self, event_func, evt=wx.EVT_COMBOBOX):
99         u""" コンボボタンが押された時のイベントをセットする """
100         self.combo_box_skill1.Bind(evt, event_func)
101         self.combo_box_skill2.Bind(evt, event_func)
102
103     def bind_button_search(self, event_func, evt=wx.EVT_BUTTON):
104         u""" 検索ボタンが押された時のイベントをセットする """
105         self.button_search.Bind(evt, event_func)
106
107     def bind_button_clear(self, event_func, evt=wx.EVT_BUTTON):
108         u""" クリアボタンが押された時のイベントをセットする """
109         self.button_clear.Bind(evt, event_func)
110
111     def bind_button_skill(self, event_func, evt=wx.EVT_BUTTON):
112         u""" スキル検索ボタンが押された時のイベントをセットする """
113         self.button_skill.Bind(evt, event_func)
114
115     def set_skill_minmax(self, min1, max1, min2, max2):
116         u""" 第1,2スキルの最大値と最小値をセットする """
117         self.spin_ctrl_skill1_val.SetRange(min1, max1)
118         self.spin_ctrl_skill2_val.SetRange(min2, max2)
119
120     def set_slot_minmax(self, slot_min, slot_max):
121         u""" スロットの最大値と最小値をセットする """
122         self.spin_ctrl_slot_num.SetRange(slot_min, slot_max)
123
124     def get_skill_values(self):
125         u""" 第1,2スキルの値を得る 
126         return (skill1_val, skill2_val)"""
127         skill1_val = self.spin_ctrl_skill1_val.GetValue()
128         skill2_val = self.spin_ctrl_skill2_val.GetValue()
129         return (skill1_val, skill2_val)
130
131     def get_slot_value(self):
132         u""" スロットの値を得る """
133         return self.spin_ctrl_slot_num.GetValue()
134
135     def set_radio_value(self, value, amulet_name=constnumbers.NAME_AMULET1):
136         u""" ラジオボタンの値をセットする 
137             arg: (value, amulet_name)
138         """
139         if amulet_name == constnumbers.NAME_AMULET1:
140             idx = 0
141         elif amulet_name == constnumbers.NAME_AMULET2:
142             idx = 1
143         elif amulet_name == constnumbers.NAME_AMULET3:
144             idx = 2
145         self.radiobox_amulet.SetSelection(idx)
146
147     def get_radio_value(self, amulet_name=constnumbers.NAME_AMULET1):
148         u""" ラジオボタンの値を得る
149             return: (value)
150         """
151         if amulet_name == constnumbers.NAME_AMULET1:
152             idx = 0
153         elif amulet_name == constnumbers.NAME_AMULET2:
154             idx = 1
155         elif amulet_name == constnumbers.NAME_AMULET3:
156             idx = 2
157         return self.radiobox_amulet.GetSelection() == idx
158
159     def get_selected_amulet(self):
160         u""" 選択されているお守り名を得る 
161             return: (NAME_OF_AMULET)
162         """
163         idx = self.radiobox_amulet.GetSelection()
164         if idx == 0:
165             return constnumbers.NAME_AMULET1
166         elif idx == 1:
167             return constnumbers.NAME_AMULET2
168         elif idx == 2:
169             return constnumbers.NAME_AMULET3
170         else:
171             raise NotImplementedError("irregular radio button selected")
172
173     def get_selected_threshold_type(self):
174         u""" 選択されているラジオボタンの検索種類IDを得る
175             return: (THRESHOLD_TYPE_ID)
176         """
177         idx = self.radiobox_threshold_type.GetSelection()
178         if idx == 0:
179             return constnumbers.THRESHOLD_TYPE_ALL
180         elif idx == 1:
181             return constnumbers.THRESHOLD_TYPE_THRESHOLD1
182         elif idx == 2:
183             return constnumbers.THRESHOLD_TYPE_THRESHOLD2
184         elif idx == 3:
185             return constnumbers.THRESHOLD_TYPE_INISHIE
186         else:
187             raise NotImplementedError("irregular radio button selected")
188
189     def set_selection_skill1_combobox(self, idx):
190         u""" skill1のコンボボックスの選択されたインデックスをセットする """
191         self.combo_box_skill1.SetSelection(idx)
192
193     def set_selection_skill2_combobox(self, idx):
194         u""" skill2のコンボボックスの選択されたインデックスをセットする """
195         self.combo_box_skill2.SetSelection(idx)
196
197     def get_string_selection_skill1_combobox(self):
198         u""" skill1のコンボボックスの選択された値を得る """
199         return self.combo_box_skill1.GetStringSelection()
200
201     def get_string_selection_skill2_combobox(self):
202         u""" skill2のコンボボックスの選択された値を得る """
203         return self.combo_box_skill2.GetStringSelection()
204
205     def get_string_selection_skill_names(self):
206         u""" skill1, skill2で選択されているスキル名を返す
207             return (skill1_name, skill2_name)"""
208         skill1_name = self.get_string_selection_skill1_combobox()
209         skill2_name = self.get_string_selection_skill2_combobox()
210         return (skill1_name, skill2_name)
211
212     def set_items_skill1_combobox(self, string_list):
213         u""" skill1のコンボボックスの値をセットする """
214         self.combo_box_skill1.SetItems(string_list)
215
216     def set_items_skill2_combobox(self, string_list):
217         u""" skill2のコンボボックスの値をセットする """
218         self.combo_box_skill2.SetItems(string_list)
219
220     def set_items_skill_combobox(self, idx, string_list):
221         u""" 指定されたインデックスのskillのコンボボックスの値をセットする """
222         if idx == 0:
223             self.set_items_skill1_combobox(string_list)
224         elif idx == 1:
225             self.set_items_skill2_combobox(string_list)
226         else:
227             raise NotImplementedError(u"this idx is not implemented")
228
229     def set_skill_button_enable(self, value):
230         u""" 対応スキル検索ボタンの有効・無効の切り替え """
231         if value is True:
232             self.button_skill.Enable()
233         else:
234             self.button_skill.Disable()
235
236     def set_result_text_ctrl_value(self, value):
237         u""" 結果表示用のTextCtrlに値をセットする """
238         self.text_ctrl_result.SetValue(value)
239
240     def set_grid_seed2s_items(self, items_dict):
241         u""" Seed2一覧のGridに値をセットする。
242         引数はSeed2 -> str_renkin_typeの辞書とする。
243         Noneが与えられた時はClearする"""
244
245         if items_dict is not None:
246             row_num = len(items_dict)
247             diff = row_num - self.grid_seed2s.GetNumberRows()
248             if diff > 0:
249                 self.grid_seed2s.AppendRows(diff, False)
250             elif diff < 0:
251                 self.grid_seed2s.DeleteRows(0, -diff, False)
252
253             for row, seed2 in enumerate(sorted(items_dict.keys())):
254                 self.grid_seed2s.SetRowLabelValue(row, u"{0}".format(seed2))
255                 renkin_type = items_dict[seed2]
256                 self.grid_seed2s.SetCellValue(row, 0, renkin_type)
257         else:
258             self.clear_grid_seed2s()
259
260     def set_grid_seed1s_items(self, tenun555_seed1s, tenun888_seed1s):
261         u""" Seed1一覧のGridに天運555と天運888のSeed1の値をセットする。"""
262         self.clear_grid_seed1s()
263         max_len = max([len(tenun555_seed1s, tenun888_seed2s)])
264         diff = max_len - self.grid_seed2s.GetNumberRows()
265         if diff > 0:
266             self.grid_seed1s.AppendRows(diff, False)
267         elif diff < 0:
268             self.grid_seed1s.DeleteRows(0, -diff, False)
269
270         for row in range(max_len):
271             self.grid_seed1s.SetRowLabelValue(row, u"")
272         for row, seed1 in enumerate(sorted(tenun555_seed1s)):
273             self.grid_seed1s.SetCellValue(row, 0, seed1)
274         for row, seed1 in enumerate(sorted(tenun888_seed1s)):
275             self.grid_seed1s.SetCellValue(row, 1, seed1)
276
277     def get_grid_selected_seed2(self):
278         u""" Seed2一覧のGridの選択されたSeed2の値を得る。"""
279         rows = [x for x in self.grid_seed2s.GetSelectedRows()]
280         print rows
281         if len(rows) > 0:
282             return int(self.grid_seed2s.GetRowLabelValue(rows[0]))
283         else:
284             return None
285
286     def set_grid_seed2s_selected_idx(self, idx):
287         u""" Seed2一覧のGridの選択された行を選択状態にする。"""
288         if idx >= 0 and idx < self.grid_seed2s.GetNumberRows():
289             self.grid_seed2s.MakeCellVisible(idx, 0)
290             self.grid_seed2s.SelectRow(idx)
291
292     def clear_grid_seed2s(self):
293         u""" Seed2一覧のGridから値をClearする"""
294         for row in range(self.grid_seed2s.GetNumberRows()):
295             self.grid_seed2s.SetRowLabelValue(row, u"")
296             for col in range(self.grid_seed2s.GetNumberCols()):
297                 self.grid_seed2s.SetCellValue(row, col, u"")
298         self.grid_seed2s.ClearSelection()
299
300     def clear_grid_seed1s(self):
301         u""" Seed1一覧のGridから値をClearする"""
302         for row in range(self.grid_seed1s.GetNumberRows()):
303             self.grid_seed1s.SetRowLabelValue(row, u"")
304             for col in range(self.grid_seed1s.GetNumberCols()):
305                 self.grid_seed1s.SetCellValue(row, col, u"")
306         self.grid_seed1s.ClearSelection()
307
308     def clear_grid(self):
309         u"""Gridの値をクリアする"""
310         self.clear_grid_seed1s()
311         self.clear_grid_seed2s()