if (window_flags & (PW_INVEN)) {
player_ptr->window_flags &= ~(PW_INVEN);
- fix_inventory(player_ptr, AllMatchItemTester());
+ fix_inventory(player_ptr);
}
if (window_flags & (PW_EQUIP)) {
player_ptr->window_flags &= ~(PW_EQUIP);
- fix_equip(player_ptr, AllMatchItemTester());
+ fix_equip(player_ptr);
}
if (window_flags & (PW_SPELL)) {
#include "target/projection-path-calculator.h"
#include "util/bit-flags-calculator.h"
#include "view/display-messages.h"
+#include "window/display-sub-windows.h"
#include "wizard/wizard-messages.h"
#include "world/world-object.h"
#include "world/world.h"
if (idx)
*idx = INVEN_NONE;
+ FixItemTesterSetter setter(item_tester);
+
if (!get_item(owner_ptr, &item, q, s, option, item_tester))
return NULL;
#include <sstream>
#include <string>
+/*! サブウィンドウ表示用の ItemTester オブジェクト */
+static std::unique_ptr<ItemTester> fix_item_tester = std::make_unique<AllMatchItemTester>();
+
+FixItemTesterSetter::FixItemTesterSetter(const ItemTester& item_tester)
+{
+ fix_item_tester = item_tester.clone();
+}
+
+FixItemTesterSetter::~FixItemTesterSetter()
+{
+ fix_item_tester = std::make_unique<AllMatchItemTester>();
+}
+
/*!
* @brief サブウィンドウに所持品一覧を表示する / Hack -- display inventory in sub-windows
* @param player_ptr プレーヤーへの参照ポインタ
*/
-void fix_inventory(player_type *player_ptr, const ItemTester &item_tester)
+void fix_inventory(player_type *player_ptr)
{
for (int j = 0; j < 8; j++) {
term_type *old = Term;
continue;
term_activate(angband_term[j]);
- display_inventory(player_ptr, item_tester);
+ display_inventory(player_ptr, *fix_item_tester);
term_fresh();
term_activate(old);
}
* Hack -- display equipment in sub-windows
* @param player_ptr プレーヤーへの参照ポインタ
*/
-void fix_equip(player_type *player_ptr, const ItemTester &item_tester)
+void fix_equip(player_type *player_ptr)
{
for (int j = 0; j < 8; j++) {
term_type *old = Term;
continue;
term_activate(angband_term[j]);
- display_equipment(player_ptr, item_tester);
+ display_equipment(player_ptr, *fix_item_tester);
term_fresh();
term_activate(old);
}
typedef struct floor_type floor_type;
typedef struct player_type player_type;
class ItemTester;
-void fix_inventory(player_type *player_ptr, const ItemTester &item_tester);
+void fix_inventory(player_type *player_ptr);
void print_monster_list(floor_type *floor_ptr, const std::vector<MONSTER_IDX> &monster_list, TERM_LEN x, TERM_LEN y, TERM_LEN max_lines);
void fix_monster_list(player_type *player_ptr);
-void fix_equip(player_type *player_ptr, const ItemTester &item_tester);
+void fix_equip(player_type *player_ptr);
void fix_player(player_type *player_ptr);
void fix_message(void);
void fix_overhead(player_type *player_ptr);
void fix_object(player_type *player_ptr);
void fix_floor_item_list(player_type *player_ptr, const int y, const int x);
void toggle_inventory_equipment(player_type *owner_ptr);
+
+/*!
+ * @brief サブウィンドウ表示用の ItemTester オブジェクトを設定するクラス
+ *
+ * @details オブジェクトが生存している間コンストラクタで指定した ItemTester オブジェクトにより
+ * アイテム表示が絞り込まれるようになる。
+ * オブジェクトが破棄されるとデストラクタによりサブウィンドウ表示用 ItemTester オブジェクトは
+ * AllMatchItemTester(全てのアイテムを表示)のインスタンスがセットされる。
+ * なお、現状の仕様はアイテム表示の絞り込みとは、アイテムの先頭に表示されるアルファベットの
+ * 選択記号が表示されるか否かの違いであり、アイテムそのものの表示が絞り込まれるわけではない。
+ */
+class FixItemTesterSetter {
+public:
+ explicit FixItemTesterSetter(const ItemTester &item_tester);
+ ~FixItemTesterSetter();
+
+ FixItemTesterSetter(const FixItemTesterSetter &) = delete;
+ FixItemTesterSetter &operator=(const FixItemTesterSetter &) = delete;
+ FixItemTesterSetter(FixItemTesterSetter &&) = delete;
+ FixItemTesterSetter &operator=(FixItemTesterSetter &&) = delete;
+};