void Input::checkFocus() { using M = tank::Mouse; if (M::isInEntity(*this)) { gainFocus(); } else { loseFocus(); } }
void EventSystem::viewDying(View* view) { // DOUT(view->name()); #define rm(vec, elem) {auto pos = find(vec.begin(), vec.end(), elem); if(pos != vec.end()) { vec.erase(pos); }} //DOUT(#vec<<" removing "<<elem->name());\ loseFocus(view); // make sure current focus and its stack are consistent rm(currentViewStack, view); rm(previousMouseMoveStack, view); rm(previousMouseClickStack, view); rm(currentFocusStack, view); rm(previousFocusStack, view); }
bool bGroup::clickDown(int _x, int _y) { bool ret=false; if(current){ if(current->newClickDD(_x, _y, ddopen)) ret=1; loseFocus(); } else{ ret=bar.clickDown(_x, _y); for (unsigned int i=0; i<blocks.size()&&!ret; i++) { if(!ret) ret=newHandleClick(blocks,i,_x,_y,true); } for (unsigned int i=0; i<base.blocksOn.size()&&!ret; i++) { if(!ret) if(ret=newHandleClick(base.blocksOn,i,_x,_y)) bChanged=true; } if(!ret) ret=base.clickDown(_x, _y); } return ret; }
void Input::handleInput() { // FIXME: This assumes ASCII -> is not portable char c; while (tank::Game::keystream >> c) { try { if (c < 0x20 or c >= 0x7F) { // Outside display char range switch (c) { case 0x15: // CTRL + w //TODO: "delete word" case 0x17: // CTRL + u input_.clear(); break; case 0x1B: // ESC loseFocus(); break; case 0x08: // BS / CTRL + h if (tank::Keyboard::control() and tank::Keyboard::isKeyDown(tank::Key::BackSpace)) { input_.clear(); // TODO: "delete word" break; } case 0x7F: // DEL input_.pop_back(); break; default: std::cout << static_cast<unsigned>(c) << std::endl; break; } } else { input_.push_back(c); } } catch (std::out_of_range const& e) { } } text_->setText(input_); tank::Game::keystream.str(""); tank::Game::keystream.clear(); }