00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef INSTIGATE_TOOLKIT_QT_WIDGET
00011 #define INSTIGATE_TOOLKIT_QT_WIDGET
00012
00022
00023 #include "event_names.hpp"
00024
00025
00026
00027
00028
00029
00031 template <typename T>
00032 class instigate::toolkit::qt_widget
00033 : public T
00034 {
00035 private:
00036 typedef std::multimap<std::string, window::callback*> callbacks;
00037 callbacks m_callbacks;
00038 window* m_window;
00039 public:
00040 void set_callback(const std::string& s, window::callback* c) throw();
00041
00042 void notify(const std::string& s, QEvent* e) throw();
00043
00044 bool notify(const std::string& s) throw();
00045
00047 void closeEvent(QCloseEvent* e) throw();
00048
00049 protected:
00050 void mousePressEvent(QMouseEvent* e) throw();
00051
00052 void mouseReleaseEvent(QMouseEvent* e) throw();
00053
00054 void set_key_state(QKeyEvent* e) throw();
00055
00056 void set_key_text(QKeyEvent* e) throw();
00057
00058 void keyPressEvent(QKeyEvent* e) throw();
00059
00060 void keyReleaseEvent(QKeyEvent* e) throw();
00061
00062 public:
00063 qt_widget(QWidget* p = 0, window* w = 0);
00064 };
00065
00066 template <typename T>
00067 void instigate::toolkit::qt_widget<T>::
00068 set_callback(const std::string& s, window::callback* c) throw()
00069 {
00070 assert(!s.empty()); assert(0 != c);
00071 m_callbacks.insert(std::make_pair(s, c));
00072 }
00073
00074 template <typename T>
00075 void instigate::toolkit::qt_widget<T>::
00076 notify(const std::string& s, QEvent* e) throw()
00077 {
00078 assert(!s.empty()); assert(0 != e);
00079 callbacks::const_iterator i = m_callbacks.find(s);
00080 typedef callbacks::iterator I;
00081 std::pair<I, I> p = m_callbacks.equal_range(s);
00082 if (m_callbacks.end() != p.first) {
00083 for (I j = p.first; j != p.second; ++j) {
00084 assert(0 != j->second);
00085 j->second->call();
00086 }
00087 e->accept();
00088 } else {
00089 e->ignore();
00090 }
00091 }
00092
00093 template <typename T>
00094 bool instigate::toolkit::qt_widget<T>::
00095 notify(const std::string& s) throw()
00096 {
00097 assert(!s.empty());
00098 callbacks::const_iterator i = m_callbacks.find(s);
00099 typedef callbacks::iterator I;
00100 std::pair<I, I> p = m_callbacks.equal_range(s);
00101 if (m_callbacks.end() != p.first) {
00102 for (I j = p.first; j != p.second; ++j) {
00103 assert(0 != j->second);
00104 j->second->call();
00105 }
00106 return true;
00107 }
00108 return false;
00109 }
00110
00111 template <typename T>
00112 void instigate::toolkit::qt_widget<T>::
00113 closeEvent(QCloseEvent* e ) throw()
00114 {
00115 e->ignore();
00116 assert(0 != m_window);
00117 m_window->close_qt_window_event();
00118 }
00119
00120 template <typename T>
00121 void instigate::toolkit::qt_widget<T>::
00122 mousePressEvent(QMouseEvent* e) throw()
00123 {
00124 assert(0 != e);
00125 if (e->button() == Qt::LeftButton) {
00126 notify(mouse_left_button_press, e);
00127 } else if (e->button() == Qt::RightButton) {
00128 notify(mouse_right_button_press, e);
00129 } else if (e->button() == Qt::MidButton) {
00130 notify(mouse_middle_button_press, e);
00131 }
00132 T::mousePressEvent(e);
00133 }
00134
00135 template <typename T>
00136 void instigate::toolkit::qt_widget<T>::
00137 mouseReleaseEvent(QMouseEvent* e) throw()
00138 {
00139 assert(0 != e);
00140 if (e->button() == Qt::LeftButton) {
00141 notify(mouse_left_button_release, e);
00142 } else if (e->button() == Qt::RightButton) {
00143 notify(mouse_right_button_release, e);
00144 } else if (e->button() == Qt::MidButton) {
00145 notify(mouse_middle_button_release, e);
00146 }
00147 T::mouseReleaseEvent(e);
00148 }
00149
00150
00151 template <typename T>
00152 void instigate::toolkit::qt_widget<T>::
00153 set_key_state(QKeyEvent* e) throw()
00154 {
00155 assert(0 != e); assert(0 != m_window);
00156 if (Qt::ControlModifier & e->modifiers()) {
00157 m_window->m_control_pressed = true;
00158 } else {
00159 m_window->m_control_pressed = false;
00160 }
00161 if (Qt::ShiftModifier & e->modifiers()) {
00162 m_window->m_shift_pressed = true;
00163 } else {
00164 m_window->m_shift_pressed = false;
00165 }
00166 }
00167
00168 template <typename T>
00169 void instigate::toolkit::qt_widget<T>::
00170 set_key_text(QKeyEvent* e) throw()
00171 {
00172 assert(0 != e); assert(0 != m_window);
00173 if (e->key() == Qt::Key_Control) {
00174 m_window->set_pressed_key("Ctrl");
00175 } else if (e->key() == Qt::Key_Alt) {
00176 m_window->set_pressed_key("Alt");
00177 } else if (e->key() == Qt::Key_Shift) {
00178 m_window->set_pressed_key("Shift");
00179 } else if (e->key() == Qt::Key_Up) {
00180 m_window->set_pressed_key("Up");
00181 } else if (e->key() == Qt::Key_Down) {
00182 m_window->set_pressed_key("Down");
00183 } else if (Qt::ControlModifier & e->modifiers()) {
00184 std::stringstream s;
00185 s << char(e->key());
00186 m_window->set_pressed_key(s.str());
00187 } else {
00188 m_window->set_pressed_key(e->text().toStdString());
00189 }
00190 }
00191
00192 template <typename T>
00193 void instigate::toolkit::qt_widget<T>::
00194 keyPressEvent(QKeyEvent* e) throw()
00195 {
00196 assert(0 != e);
00197 if (0 != m_window) {
00198 set_key_state(e);
00199 set_key_text(e);
00200 }
00201 notify(key_pressed, e);
00202 T::keyPressEvent(e);
00203 }
00204
00205 template <typename T>
00206 void instigate::toolkit::qt_widget<T>::
00207 keyReleaseEvent(QKeyEvent* e) throw()
00208 {
00209 assert(0 != e);
00210 if (0 != m_window) {
00211 set_key_state(e);
00212 set_key_text(e);
00213 }
00214 notify(key_released, e);
00215 T::keyReleaseEvent(e);
00216 }
00217
00218 template <typename T>
00219 instigate::toolkit::qt_widget<T>::
00220 qt_widget(QWidget* p , window* w )
00221 : T(p)
00222 , m_callbacks()
00223 , m_window(w)
00224 {
00225 }
00226
00227 #endif //INSTIGATE_TOOLKIT_QT_WIDGET