Справочная информация: я разрабатываю инструментарий виджета пользовательского интерфейса для опыта, и проблема, с которой я столкнулся, заключалась в постоянстве событий.Все события применяются как постоянные, поэтому распространение одного и того же события между виджетами будет оставаться согласованным.
Это нормально для событий мыши и событий клавиш;однако для событий рисования я не могу сохранить постоянство, потому что события рисования по своей природе видоизменяют любой графический контекст, на котором они рисуются.
В этом примере я хотел бы создать изменяемый графический контекст, чтобы само событиеостается постоянным.Я осознаю опасность мутабельности, поэтому я хотел бы услышать причины против изменчивости и альтернатив, если это неприемлемо.
Для полноты, вот пример моего кода, иллюстрирующий проблему:
namespace event {
struct Mouse {
struct Interface {
virtual ~Interface() = 0;
virtual void on_l_press(const Mouse&) {}
virtual void on_l_release(const Mouse&) {}
virtual void on_l_click(const Mouse&) {}
virtual void on_l_drag(const Mouse&) {}
virtual void on_m_press(const Mouse&) {}
virtual void on_m_releas(const Mouse&) {}
virtual void on_m_click(const Mouse&) {}
virtual void on_m_drag(const Mouse&) {}
virtual void on_r_press(const Mouse&) {}
virtual void on_r_release(const Mouse&) {}
virtual void on_r_click(const Mouse&) {}
virtual void on_r_drag(const Mouse&) {}
virtual void on_move(const Mouse&) {}
virtual void on_enter(const Mouse&) {}
virtual void on_exit(const Mouse&) {}
};
gmt::Point<float> point = { -1, -1 };
};
struct Paint {
struct Interface {
virtual ~Interface() = 0;
virtual void on_paint(const Paint&) {}
};
gmt::Rect<float> dirty;
mutable gfx::Context context;
};
}
Я слышал о IO Monads в Haskell, но, к сожалению, у меня нет большого опыта или понимания с ними.
Также в качестве небольшой заметки я понимаю, что события должны бытьзанятия с геттерами и сеттерами.Это то, что я планирую изменить, когда у меня появится лучшее представление о завершении событий.