1 # -*- coding: utf-8 -*-
3 # GUIのメインフレームにおけるお守り検索Notebookのview
4 # 2013/12/15 written by kei9
11 class NoteBookAmuletView():
12 u""" メインのフレームのお守り検索タブ """
13 def __init__(self, frame):
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")
30 self.radiobox_amulet = xrc.XRCCTRL(self.frame, "RadioBoxAmulet")
31 self.radiobox_search_type = xrc.XRCCTRL(self.frame, "RadioBoxSearchType")
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)
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)
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")
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")
64 self.text_ctrl_result = xrc.XRCCTRL(self.frame, "TextCtrlAmuletSearchResult")
66 # set min & max of slot
67 self.set_slot_minmax(constnumbers.SLOT_MIN, constnumbers.SLOT_MAX)
69 def _init_event(self):
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)
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)
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)
93 def OnComboSkill1Changed(self, event):
94 u""" スキル1のコンボボックスの変更時 """
95 self.update_skill_minmax(1)
97 def OnComboSkill2Changed(self, event):
98 u""" スキル2のコンボボックスの変更時 """
99 self.update_skill_minmax(2)
101 def OnRadioAmuletChanged(self, event):
102 u""" お守り選択のラジオボタン変更時 """
103 self.update_skill_names()
105 def bind_radiobox_search_type(self, event_func, evt=wx.EVT_RADIOBOX):
106 u""" 判定値の種類のラジオボタンが押された時のイベントをセットする """
107 self.radiobox_search_type.Bind(evt, event_func)
109 def bind_button_search(self, event_func, evt=wx.EVT_BUTTON):
110 u""" 検索ボタンが押された時のイベントをセットする """
111 self.button_search.Bind(evt, event_func)
113 def bind_button_clear(self, event_func, evt=wx.EVT_BUTTON):
114 u""" クリアボタンが押された時のイベントをセットする """
115 self.button_clear.Bind(evt, event_func)
117 def bind_button_skill2(self, event_func, evt=wx.EVT_BUTTON):
118 u""" スキル2検索ボタンが押された時のイベントをセットする """
119 self.button_skill2.Bind(evt, event_func)
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)})}
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()
133 def set_skillnames_ordered(self, skillnames):
134 u""" 順番に並べられたスキル名のシーケンスをセットする """
135 self._skillnames = skillnames
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]
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)
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]
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)
159 self.spin_ctrl_skill1_val.SetRange(0, 0)
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)
167 self.spin_ctrl_skill2_val.SetRange(0, 0)
169 def set_slot_minmax(self, slot_min, slot_max):
170 u""" スロットの最大値と最小値をセットする """
171 self.spin_ctrl_slot_num.SetRange(slot_min, slot_max)
173 def get_skill_values(self):
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)
180 def get_slot_value(self):
182 return self.spin_ctrl_slot_num.GetValue()
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)
192 def set_selected_amulet(self, value, amulet_name=constnumbers.NAME_AMULET1):
194 arg: (value, amulet_name)
196 if amulet_name == constnumbers.NAME_AMULET1:
198 elif amulet_name == constnumbers.NAME_AMULET2:
200 elif amulet_name == constnumbers.NAME_AMULET3:
202 self.radiobox_amulet.SetSelection(idx)
204 def get_selected_amulet(self):
206 return: (NAME_OF_AMULET)
208 idx = self.radiobox_amulet.GetSelection()
210 return constnumbers.NAME_AMULET1
212 return constnumbers.NAME_AMULET2
214 return constnumbers.NAME_AMULET3
216 raise NotImplementedError("irregular radio button selected")
218 def get_selected_search_type(self):
219 u""" 選択されているラジオボタンの検索種類IDを得る
220 return: (THRESHOLD_TYPE_ID)
222 idx = self.radiobox_search_type.GetSelection()
224 return constnumbers.SEARCH_TYPE_SEED2
226 return constnumbers.SEARCH_TYPE_SEED1_SEED2
228 return constnumbers.SEARCH_TYPE_FIXED_SEED2
230 raise NotImplementedError("irregular radio button selected")
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)
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)
244 def set_skill_button_enable(self, value):
245 u""" 対応スキル検索ボタンの有効・無効の切り替え """
247 self.button_skill.Enable()
249 self.button_skill.Disable()
251 def set_result(self, value):
252 u""" 結果表示用のTextCtrlに値をセットする """
253 self.text_ctrl_result.SetValue(value)
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)))
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)
275 def set_grid_seed2s_items(self, items_dict):
276 u""" Seed2一覧のGridに値をセットする。
277 引数はSeed2 -> str_renkin_typeの辞書とする。
278 Noneが与えられた時はClearする"""
280 if items_dict is not None:
281 row_num = len(items_dict)
282 diff = row_num - self.grid_seed2s.GetNumberRows()
284 self.grid_seed2s.AppendRows(diff, False)
286 self.grid_seed2s.DeleteRows(0, -diff, False)
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)
293 self.clear_grid_seed2s()
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()
301 self.grid_seed1s.AppendRows(diff, False)
303 self.grid_seed1s.DeleteRows(0, -diff, False)
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)
312 def get_grid_selected_seed2(self):
313 u""" Seed2一覧のGridの選択されたSeed2の値を得る。"""
314 rows = [x for x in self.grid_seed2s.GetSelectedRows()]
317 return int(self.grid_seed2s.GetRowLabelValue(rows[0]))
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)
327 def set_grid_seed1_enable(self, value):
328 u""" Seed1表示ボタンの有効・無効の切り替え """
330 self.grid_seed1.Enable()
332 self.grid_seed1.Disable()
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()
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()
350 def clear_grid(self):
352 self.clear_grid_seed1s()
353 self.clear_grid_seed2s()