void EntitiesEditor::onInput(const InputState &state) { auto mouse_pos = state.mousePos() - clippedRect().min; computeCursor(mouse_pos, mouse_pos, state.isKeyPressed(InputKey::lshift)); if(state.isKeyDown('s')) { m_mode = Mode::selecting; sendEvent(this, Event::button_clicked, m_mode); } if(state.isKeyDown('p')) { m_mode = Mode::placing; sendEvent(this, Event::button_clicked, m_mode); } if(m_proto) { int inc = 0; if(state.isKeyDown(InputKey::left)) inc = -1; if(state.isKeyDown(InputKey::right)) inc = 1; int dir_count = m_proto->sprite().dirCount(0); if(inc && dir_count) m_proto_angle = (m_proto_angle + inc + dir_count) % dir_count; m_proto->setDirAngle(constant::pi * 2.0f * (float)m_proto_angle / float(dir_count)); } if(state.isKeyPressed(InputKey::del)) { for(int i = 0; i < (int)m_selected_ids.size(); i++) m_entity_map.remove(m_selected_ids[i]); m_selected_ids.clear(); } m_view.update(state); }
void GroupEditor::onInput(const InputState &state) { ASSERT(m_tile_group); if(state.isKeyDown(InputKey::space)) { m_offset[m_mode] = innerOffset(); m_mode = (m_mode == mAddRemove ? mModify : mAddRemove); updateSelector(); return; } const ui::TileList::Entry *entry = m_tile_list.find(state.mousePos() + innerOffset()); m_current_entry = entry; if(m_mode == mModify) { if(state.isKeyDown('D') && entry) { int entry_id = m_tile_group->findEntry(entry->tile); m_tile_group->setEntryDirty(entry_id, !m_tile_group->isEntryDirty(entry_id)); } if(state.isKeyDown('G') && entry && m_selected_group_id != -1) { m_tile_group->setEntryGroup(m_tile_group->findEntry(entry->tile), entry->group_id == m_selected_group_id? m_tile_group->groupCount() : m_selected_group_id); m_tile_list.update(); } if(state.isKeyDown('A') && entry && m_selected_group_id == entry->group_id) { enum { subgroup_count = 3 }; const char *infixes[subgroup_count] = { "CONCAVE_", "CONVEX_", "SIDE_", }; int subgroup_id[subgroup_count] = {-1, -1, -1}; for(int n = 0; n < m_tile_group->entryCount(); n++) { if(m_tile_group->entryGroup(n) == m_selected_group_id) { const char *name = m_tile_group->entryTile(n)->resourceName().c_str(); for(int s = 0; s < subgroup_count; s++) if(!caseEqual(name, infixes[s])) { if(subgroup_id[s] == -1) subgroup_id[s] = m_tile_group->groupCount(); m_tile_group->setEntryGroup(n, subgroup_id[s]); break; } } } m_tile_list.update(); } struct { int key; int side; } actions[] = { { InputKey::kp_1, 0 }, { InputKey::kp_2, 1 }, { InputKey::kp_3, 2 }, { InputKey::kp_6, 3 }, { InputKey::kp_9, 4 }, { InputKey::kp_8, 5 }, { InputKey::kp_7, 6 }, { InputKey::kp_4, 7 } }; if(m_selected_group_id != -1) { for(int a = 0; a < arraySize(actions); a++) if(state.isKeyDown(actions[a].key) || state.isKeyDown(InputKey::kp_5)) m_tile_group->setGroupSurface(m_selected_group_id, actions[a].side, m_selected_surface_id); } for(int n = 0; n <= 9; n++) if(state.isKeyDown('0' + n)) m_selected_surface_id = n; if(state.isKeyDown('-')) m_selected_surface_id = -1; } }
void Window::process(const InputState &state) { Window *popup = nullptr; m_is_focused = true; for(int n = 0; n < (int)m_children.size(); n++) { m_children[n]->m_is_focused = false; m_children[n]->m_is_mouse_over = false; if(m_children[n]->m_is_closing) { PWindow window = m_children[n]; m_children.erase(m_children.begin() + n); sendEvent(window.get(), Event::window_closed, m_children[n]->m_closing_value); n--; } else if(m_children[n]->m_is_popup) popup = m_children[n].get(); } if(popup) { popup->process(state); return; } int2 mouse_pos = state.mousePos(); int2 local_mouse_pos = mouse_pos - m_clipped_rect.min; int finished_dragging = 0; bool escape = state.isKeyDown(InputKey::esc); InputButton button_map[3] = { InputButton::left, InputButton::right, InputButton::middle }; if(m_dragging_mode) { if(!state.isMouseButtonPressed(button_map[m_dragging_mode - 1]) || escape) finished_dragging = escape? -1 : 1; } else { for(int k = 0; k < 3; k++) { if(state.isMouseButtonDown(button_map[k])) { m_dragging_mode = k + 1; m_drag_start = local_mouse_pos; break; } } } int2 focus_point = m_dragging_mode? m_drag_start : local_mouse_pos; bool is_handled = false; for(int n = (int)m_children.size() - 1; n >= 0; n--) { Window *child = m_children[n].get(); if(child->isVisible() && m_has_hard_focus == child->m_has_hard_focus) { if(m_has_hard_focus || child->rect().isInside(focus_point)) { child->m_is_mouse_over = child->clippedRect().isInside(mouse_pos); child->process(state); is_handled = true; break; } } } if(!is_handled) { if(m_dragging_mode && !is_handled) { if(m_has_inner_rect && m_dragging_mode - 1 == 2) { setInnerRect(m_inner_rect + state.mouseMove()); is_handled = true; } if(!is_handled) is_handled = onMouseDrag(state, m_drag_start, local_mouse_pos, m_dragging_mode - 1, finished_dragging); if(!is_handled) is_handled = onMouseClick(state, local_mouse_pos, m_dragging_mode - 1, finished_dragging); } if(!is_handled) { if(m_has_inner_rect) { int wheel = state.mouseWheelMove(); int2 vector(0, 0); if(wheel) vector.y += wheel * rect().height() / 8; if(state.isKeyDownAuto(InputKey::pageup, 2)) vector.y += rect().height(); if(state.isKeyDownAuto(InputKey::pagedown, 2)) vector.y -= rect().height(); setInnerRect(m_inner_rect + vector); } onInput(state); } } if(escape && (!m_parent || m_is_popup) && !m_dragging_mode) // sending Event::escape only from main window sendEvent(this, Event::escape); //TODO: send only to focused windows if(finished_dragging) m_dragging_mode = 0; }