OSDN Git Service

add amulet search only by seed2
[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_skill2 = 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_search_type = xrc.XRCCTRL(self.frame, "RadioBoxSearchType")
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         self.combo_box_skill1.Bind(wx.EVT_COMBOBOX, self.OnComboSkill1Changed)
74         self.combo_box_skill2.Bind(wx.EVT_COMBOBOX, self.OnComboSkill2Changed)
75         self.radiobox_amulet.Bind(wx.EVT_RADIOBOX, self.OnRadioAmuletChanged)
76
77     def OnSeed1GridSizeChanged(self, event):
78         u""" Seed1Gridサイズの変更時 """
79         width, height = self.grid_seed1s.GetParent().GetSize()
80         each_width = (width) / (constnumbers.NUM_AMULET_SEED1S_GRID_COL) # consider margin size
81         self.grid_seed1s.SetRowLabelValue(0, u"")
82         for col in range(constnumbers.NUM_AMULET_SEED1S_GRID_COL):
83             self.grid_seed1s.SetColSize(col, each_width)
84
85     def OnSeed2GridSizeChanged(self, event):
86         u""" Seed2Gridサイズの変更時 """
87         width, height = self.grid_seed2s.GetParent().GetSize()
88         each_width = (width - 60) / (constnumbers.NUM_AMULET_SEED2S_GRID_COL) # consider margin size
89         self.grid_seed2s.SetRowLabelSize(45)
90         for col in range(constnumbers.NUM_AMULET_SEED2S_GRID_COL):
91             self.grid_seed2s.SetColSize(col, each_width)
92
93     def OnComboSkill1Changed(self, event):
94         u""" スキル1のコンボボックスの変更時 """
95         self.update_skill_minmax(1)
96
97     def OnComboSkill2Changed(self, event):
98         u""" スキル2のコンボボックスの変更時 """
99         self.update_skill_minmax(2)
100
101     def OnRadioAmuletChanged(self, event):
102         u""" お守り選択のラジオボタン変更時 """
103         self.update_skill_names()
104
105     def bind_radiobox_search_type(self, event_func, evt=wx.EVT_RADIOBOX):
106         u""" 判定値の種類のラジオボタンが押された時のイベントをセットする """
107         self.radiobox_search_type.Bind(evt, event_func)
108
109     def bind_button_search(self, event_func, evt=wx.EVT_BUTTON):
110         u""" 検索ボタンが押された時のイベントをセットする """
111         self.button_search.Bind(evt, event_func)
112
113     def bind_button_clear(self, event_func, evt=wx.EVT_BUTTON):
114         u""" クリアボタンが押された時のイベントをセットする """
115         self.button_clear.Bind(evt, event_func)
116
117     def bind_button_skill2(self, event_func, evt=wx.EVT_BUTTON):
118         u""" スキル2検索ボタンが押された時のイベントをセットする """
119         self.button_skill2.Bind(evt, event_func)
120
121     def set_skillminmax_dict(self, skill_names, amulet_names, minmax_dict):
122         u"""スキル名のリスト、お守り名のリスト、
123         そのお守りに対応する第1,2スキルの最大最小の辞書をセットする
124         {amulet_name:({skill1_name:(min1,max1)}, {skill2_name:(min2,max2)})}
125         """
126         self._skill_names = skill_names
127         self._amulet_names = amulet_names
128         self._minmax_dict = minmax_dict
129         self.set_selected_amulet(constnumbers.NAME_AMULET1)
130         self.update_skill_names()
131         self.update_skill_minmax()
132
133     def set_skillnames_ordered(self, skillnames):
134         u""" 順番に並べられたスキル名のシーケンスをセットする """
135         self._skillnames = skillnames
136
137     def update_skill_names(self):
138         u""" 選択されたお守り名に応じてスキル名のリストを更新する """
139         amu_name = self.get_selected_amulet()
140         skill1_minmax, skill2_minmax = self._minmax_dict[amu_name]
141
142         self.combo_box_skill1.SetItems([x for x in self._skill_names if x in skill1_minmax])
143         self.combo_box_skill2.SetItems([constnumbers.VAL_NO_SKILL] + 
144                 [x for x in self._skill_names if x in skill2_minmax])
145         self.combo_box_skill1.SetSelection(0)
146         self.combo_box_skill2.SetSelection(0)
147
148     def update_skill_minmax(self, index=None):
149         u""" 選択されたスキル名に応じて値の範囲を設定する """
150         amu_name = self.get_selected_amulet()
151         skill1_minmax, skill2_minmax = self._minmax_dict[amu_name]
152
153         if index is None or index == 1:
154             skill1_name = self.combo_box_skill1.GetStringSelection()
155             if skill1_name in skill1_minmax:
156                 min1, max1 = skill1_minmax[skill1_name]
157                 self.spin_ctrl_skill1_val.SetRange(min1, max1)
158             else:
159                 self.spin_ctrl_skill1_val.SetRange(0, 0)
160
161         if index is None or index == 2:
162             skill2_name = self.combo_box_skill2.GetStringSelection()
163             if skill2_name in skill2_minmax:
164                 min2, max2 = skill2_minmax[skill2_name]
165                 self.spin_ctrl_skill2_val.SetRange(min2, max2)
166             else:
167                 self.spin_ctrl_skill2_val.SetRange(0, 0)
168
169     def set_slot_minmax(self, slot_min, slot_max):
170         u""" スロットの最大値と最小値をセットする """
171         self.spin_ctrl_slot_num.SetRange(slot_min, slot_max)
172
173     def get_skill_values(self):
174         u""" 第1,2スキルの値を得る 
175         return (skill1_val, skill2_val)"""
176         skill1_val = self.spin_ctrl_skill1_val.GetValue()
177         skill2_val = self.spin_ctrl_skill2_val.GetValue()
178         return (skill1_val, skill2_val)
179
180     def get_slot_value(self):
181         u""" スロットの値を得る """
182         return self.spin_ctrl_slot_num.GetValue()
183
184     def clear_input_values(self):
185         u""" 入力された値を初期化する """
186         self.combo_box_skill1.SetSelection(0)
187         self.combo_box_skill2.SetSelection(0)
188         self.spin_ctrl_skill1_val.SetValue(1)
189         self.spin_ctrl_skill2_val.SetValue(0)
190         self.spin_ctrl_slot_num.SetValue(1)
191
192     def set_selected_amulet(self, value, amulet_name=constnumbers.NAME_AMULET1):
193         u""" ラジオボタンの値をセットする 
194             arg: (value, amulet_name)
195         """
196         if amulet_name == constnumbers.NAME_AMULET1:
197             idx = 0
198         elif amulet_name == constnumbers.NAME_AMULET2:
199             idx = 1
200         elif amulet_name == constnumbers.NAME_AMULET3:
201             idx = 2
202         self.radiobox_amulet.SetSelection(idx)
203
204     def get_selected_amulet(self):
205         u""" 選択されているお守り名を得る 
206             return: (NAME_OF_AMULET)
207         """
208         idx = self.radiobox_amulet.GetSelection()
209         if idx == 0:
210             return constnumbers.NAME_AMULET1
211         elif idx == 1:
212             return constnumbers.NAME_AMULET2
213         elif idx == 2:
214             return constnumbers.NAME_AMULET3
215         else:
216             raise NotImplementedError("irregular radio button selected")
217
218     def get_selected_search_type(self):
219         u""" 選択されているラジオボタンの検索種類IDを得る
220             return: (THRESHOLD_TYPE_ID)
221         """
222         idx = self.radiobox_search_type.GetSelection()
223         if idx == 0:
224             return constnumbers.SEARCH_TYPE_SEED2
225         elif idx == 1:
226             return constnumbers.SEARCH_TYPE_SEED1_SEED2
227         elif idx == 2:
228             return constnumbers.SEARCH_TYPE_FIXED_SEED2
229         else:
230             raise NotImplementedError("irregular radio button selected")
231
232     def get_skill_names(self):
233         u""" skill1, skill2で選択されているスキル名を返す
234             return (skill1_name, skill2_name)"""
235         skill1_name = self.combo_box_skill1.GetStringSelection()
236         skill2_name = self.combo_box_skill2.GetStringSelection()
237         return (skill1_name, skill2_name)
238
239     def set_skill_names(self, skill1_names, skill2_names):
240         u""" スキル1、スキル2のコンボボックスの一覧をセットする """
241         self.combo_box_skill1.SetItems(skill1_names)
242         self.combo_box_skill2.SetItems(skill2_names)
243
244     def set_skill_button_enable(self, value):
245         u""" 対応スキル検索ボタンの有効・無効の切り替え """
246         if value is True:
247             self.button_skill.Enable()
248         else:
249             self.button_skill.Disable()
250
251     def set_result(self, value):
252         u""" 結果表示用のTextCtrlに値をセットする """
253         self.text_ctrl_result.SetValue(value)
254
255     def set_result_only_seed2(self, suff_val, threshold, th1_seed2s, th2_seed2s):
256         u""" Seed2のみからの検索結果表示用に値をセットする """
257         seed2s = th1_seed2s | th2_seed2s
258         self.text_ctrl_result.SetValue(u"""充足値: {0}, 必要な判定値: {1}
259 {1}以上の判定値1を持つSeed2: {2}
260 {1}以上の判定値2を持つSeed2: {3}
261 {1}以上の判定値を持つSeed2: {4}""".format(
262             suff_val, threshold, len(th1_seed2s), len(th2_seed2s), len(seed2s)))
263         items_dict = {}
264         for seed2 in seed2s:
265             texts = []
266             if seed2 in th1_seed2s:
267                 texts.append(u"判定値1")
268             if seed2 in th2_seed2s:
269                 texts.append(u"判定値2")
270             texts = u", ".join(texts)
271             texts = u"Seed2({0})".format(texts) if len(texts) > 0 else texts
272             items_dict[seed2] = texts
273         self.set_grid_seed2s_items(items_dict)
274
275     def set_grid_seed2s_items(self, items_dict):
276         u""" Seed2一覧のGridに値をセットする。
277         引数はSeed2 -> str_renkin_typeの辞書とする。
278         Noneが与えられた時はClearする"""
279
280         if items_dict is not None:
281             row_num = len(items_dict)
282             diff = row_num - self.grid_seed2s.GetNumberRows()
283             if diff > 0:
284                 self.grid_seed2s.AppendRows(diff, False)
285             elif diff < 0:
286                 self.grid_seed2s.DeleteRows(0, -diff, False)
287
288             for row, seed2 in enumerate(sorted(items_dict.keys())):
289                 self.grid_seed2s.SetRowLabelValue(row, u"{0}".format(seed2))
290                 renkin_type = items_dict[seed2]
291                 self.grid_seed2s.SetCellValue(row, 0, renkin_type)
292         else:
293             self.clear_grid_seed2s()
294
295     def set_grid_seed1s_items(self, tenun555_seed1s, tenun888_seed1s):
296         u""" Seed1一覧のGridに天運555と天運888のSeed1の値をセットする。"""
297         self.clear_grid_seed1s()
298         max_len = max([len(tenun555_seed1s, tenun888_seed2s)])
299         diff = max_len - self.grid_seed2s.GetNumberRows()
300         if diff > 0:
301             self.grid_seed1s.AppendRows(diff, False)
302         elif diff < 0:
303             self.grid_seed1s.DeleteRows(0, -diff, False)
304
305         for row in range(max_len):
306             self.grid_seed1s.SetRowLabelValue(row, u"")
307         for row, seed1 in enumerate(sorted(tenun555_seed1s)):
308             self.grid_seed1s.SetCellValue(row, 0, seed1)
309         for row, seed1 in enumerate(sorted(tenun888_seed1s)):
310             self.grid_seed1s.SetCellValue(row, 1, seed1)
311
312     def get_grid_selected_seed2(self):
313         u""" Seed2一覧のGridの選択されたSeed2の値を得る。"""
314         rows = [x for x in self.grid_seed2s.GetSelectedRows()]
315         print rows
316         if len(rows) > 0:
317             return int(self.grid_seed2s.GetRowLabelValue(rows[0]))
318         else:
319             return None
320
321     def set_grid_seed2s_selected_idx(self, idx):
322         u""" Seed2一覧のGridの選択された行を選択状態にする。"""
323         if idx >= 0 and idx < self.grid_seed2s.GetNumberRows():
324             self.grid_seed2s.MakeCellVisible(idx, 0)
325             self.grid_seed2s.SelectRow(idx)
326
327     def set_grid_seed1_enable(self, value):
328         u""" Seed1表示ボタンの有効・無効の切り替え """
329         if value is True:
330             self.grid_seed1.Enable()
331         else:
332             self.grid_seed1.Disable()
333
334     def clear_grid_seed2s(self):
335         u""" Seed2一覧のGridから値をClearする"""
336         for row in range(self.grid_seed2s.GetNumberRows()):
337             self.grid_seed2s.SetRowLabelValue(row, u"")
338             for col in range(self.grid_seed2s.GetNumberCols()):
339                 self.grid_seed2s.SetCellValue(row, col, u"")
340         self.grid_seed2s.ClearSelection()
341
342     def clear_grid_seed1s(self):
343         u""" Seed1一覧のGridから値をClearする"""
344         for row in range(self.grid_seed1s.GetNumberRows()):
345             self.grid_seed1s.SetRowLabelValue(row, u"")
346             for col in range(self.grid_seed1s.GetNumberCols()):
347                 self.grid_seed1s.SetCellValue(row, col, u"")
348         self.grid_seed1s.ClearSelection()
349
350     def clear_grid(self):
351         u"""Gridの値をクリアする"""
352         self.clear_grid_seed1s()
353         self.clear_grid_seed2s()