Start switching to callbacks on SDL input events
This commit is contained in:
parent
ae88521b32
commit
8c11141ac5
11 changed files with 235 additions and 95 deletions
|
|
@ -45,6 +45,87 @@ DrawingProgram::DrawingProgram(World& initWorld):
|
|||
drawTool = DrawingProgramToolBase::allocate_tool_type(*this, DrawingProgramToolType::BRUSH);
|
||||
}
|
||||
|
||||
void DrawingProgram::register_callbacks() {
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_BRUSH] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_BRUSH].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::BRUSH);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_ERASER] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_ERASER].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::ERASER);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_RECTSELECT] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_RECTSELECT].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::RECTSELECT);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_RECTANGLE] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_RECTANGLE].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::RECTANGLE);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_ELLIPSE] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_ELLIPSE].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::ELLIPSE);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_TEXTBOX] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_TEXTBOX].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::TEXTBOX);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_EYEDROPPER] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_EYEDROPPER].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::EYEDROPPER);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_SCREENSHOT] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_SCREENSHOT].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::SCREENSHOT);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_ZOOM] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_ZOOM].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::ZOOM);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_LASSOSELECT] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_LASSOSELECT].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::LASSOSELECT);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_PAN] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_PAN].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::PAN);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_DRAW_TOOL_LINE] = world.main.input.keyCallbacks[InputManager::KEY_DRAW_TOOL_LINE].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
switch_to_tool(DrawingProgramToolType::LINE);
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_HOLD_TO_PAN] = world.main.input.keyCallbacks[InputManager::KEY_HOLD_TO_PAN].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat && tempMoveToolSwitch == TemporaryMoveToolSwitch::NONE) {
|
||||
toolTypeAfterTempMove = drawTool->get_type();
|
||||
switch_to_tool(DrawingProgramToolType::PAN);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::PAN;
|
||||
}
|
||||
else if(!key.down && tempMoveToolSwitch == TemporaryMoveToolSwitch::PAN) {
|
||||
switch_to_tool(toolTypeAfterTempMove);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE;
|
||||
}
|
||||
});
|
||||
keyCallbacks[InputManager::KEY_HOLD_TO_ZOOM] = world.main.input.keyCallbacks[InputManager::KEY_HOLD_TO_ZOOM].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat && tempMoveToolSwitch == TemporaryMoveToolSwitch::NONE) {
|
||||
toolTypeAfterTempMove = drawTool->get_type();
|
||||
switch_to_tool(DrawingProgramToolType::ZOOM);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::ZOOM;
|
||||
}
|
||||
else if(!key.down && tempMoveToolSwitch == TemporaryMoveToolSwitch::ZOOM) {
|
||||
switch_to_tool(toolTypeAfterTempMove);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE;
|
||||
}
|
||||
});
|
||||
selection.register_key_callbacks();
|
||||
}
|
||||
|
||||
void DrawingProgram::deregister_callbacks() {
|
||||
for(auto& [key, callback] : keyCallbacks)
|
||||
world.main.input.keyCallbacks[key].deregister_callback(callback);
|
||||
keyCallbacks.clear();
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE;
|
||||
}
|
||||
|
||||
void DrawingProgram::server_init_no_file() {
|
||||
layerMan.server_init_no_file();
|
||||
}
|
||||
|
|
@ -291,30 +372,6 @@ void DrawingProgram::update() {
|
|||
|
||||
drag_drop_update();
|
||||
|
||||
if(world.main.input.key(InputManager::KEY_DRAW_TOOL_BRUSH).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::BRUSH);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_ERASER).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::ERASER);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_RECTSELECT).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::RECTSELECT);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_RECTANGLE).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::RECTANGLE);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_ELLIPSE).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::ELLIPSE);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_TEXTBOX).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::TEXTBOX);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_EYEDROPPER).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::EYEDROPPER);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_SCREENSHOT).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::SCREENSHOT);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_ZOOM).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::ZOOM);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_LASSOSELECT).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::LASSOSELECT);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_PAN).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::PAN);
|
||||
else if(world.main.input.key(InputManager::KEY_DRAW_TOOL_LINE).pressed)
|
||||
switch_to_tool(DrawingProgramToolType::LINE);
|
||||
|
||||
selection.update();
|
||||
drawTool->tool_update();
|
||||
|
|
@ -336,35 +393,6 @@ void DrawingProgram::update() {
|
|||
}
|
||||
|
||||
void DrawingProgram::tool_temporary_switch_update() {
|
||||
switch(tempMoveToolSwitch) {
|
||||
case TemporaryMoveToolSwitch::NONE:
|
||||
if(world.main.input.key(InputManager::KEY_HOLD_TO_PAN).held) {
|
||||
toolTypeAfterTempMove = drawTool->get_type();
|
||||
switch_to_tool(DrawingProgramToolType::PAN);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::PAN;
|
||||
}
|
||||
if(world.main.input.key(InputManager::KEY_HOLD_TO_ZOOM).held) {
|
||||
toolTypeAfterTempMove = drawTool->get_type();
|
||||
switch_to_tool(DrawingProgramToolType::ZOOM);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::ZOOM;
|
||||
}
|
||||
break;
|
||||
case TemporaryMoveToolSwitch::PAN: {
|
||||
if(!world.main.input.key(InputManager::KEY_HOLD_TO_PAN).held) {
|
||||
switch_to_tool(toolTypeAfterTempMove);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TemporaryMoveToolSwitch::ZOOM: {
|
||||
if(!world.main.input.key(InputManager::KEY_HOLD_TO_ZOOM).held) {
|
||||
switch_to_tool(toolTypeAfterTempMove);
|
||||
tempMoveToolSwitch = TemporaryMoveToolSwitch::NONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(world.main.input.pen.isEraser && !temporaryEraser && tempMoveToolSwitch == TemporaryMoveToolSwitch::NONE) {
|
||||
if(drawTool->get_type() == DrawingProgramToolType::BRUSH)
|
||||
switch_to_tool(DrawingProgramToolType::ERASER);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,10 @@ class DrawingProgram {
|
|||
void invalidate_cache_at_component(CanvasComponentContainer::ObjInfo* objToCheck);
|
||||
void preupdate_component(CanvasComponentContainer::ObjInfo* objToCheck);
|
||||
void send_transforms_for(const std::vector<CanvasComponentContainer::ObjInfo*>& objsToSendTransformsFor);
|
||||
|
||||
void register_callbacks();
|
||||
void deregister_callbacks();
|
||||
|
||||
private:
|
||||
void process_transform_message(const std::vector<std::pair<NetworkingObjects::NetObjID, CoordSpaceHelper>>& transforms);
|
||||
|
||||
|
|
@ -121,6 +125,8 @@ class DrawingProgram {
|
|||
|
||||
uint32_t nextID = 0;
|
||||
|
||||
std::unordered_map<unsigned, InputManager::KeyCallbackManager::Callback*> keyCallbacks;
|
||||
|
||||
friend class EyeDropperTool;
|
||||
friend class RectDrawTool;
|
||||
friend class EllipseDrawTool;
|
||||
|
|
|
|||
|
|
@ -494,32 +494,44 @@ void DrawingProgramSelection::update() {
|
|||
commit_transform_selection();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(drawP.world.main.input.key(InputManager::KEY_GENERIC_ESCAPE).pressed)
|
||||
deselect_all();
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_DRAW_DELETE).pressed)
|
||||
void DrawingProgramSelection::register_key_callbacks() {
|
||||
drawP.keyCallbacks[InputManager::KEY_DRAW_DELETE] = drawP.world.main.input.keyCallbacks[InputManager::KEY_DRAW_DELETE].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
delete_all();
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_COPY).pressed && !is_being_transformed())
|
||||
});
|
||||
drawP.keyCallbacks[InputManager::KEY_COPY] = drawP.world.main.input.keyCallbacks[InputManager::KEY_COPY].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat)
|
||||
selection_to_clipboard();
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_CUT).pressed && !is_being_transformed()) {
|
||||
});
|
||||
drawP.keyCallbacks[InputManager::KEY_CUT] = drawP.world.main.input.keyCallbacks[InputManager::KEY_CUT].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat) {
|
||||
selection_to_clipboard();
|
||||
delete_all();
|
||||
}
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_PASTE).pressed) {
|
||||
});
|
||||
drawP.keyCallbacks[InputManager::KEY_PASTE] = drawP.world.main.input.keyCallbacks[InputManager::KEY_PASTE].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat) {
|
||||
deselect_all();
|
||||
paste_clipboard(drawP.world.main.input.mouse.pos);
|
||||
}
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_PASTE_IMAGE).pressed) {
|
||||
});
|
||||
drawP.keyCallbacks[InputManager::KEY_PASTE_IMAGE] = drawP.world.main.input.keyCallbacks[InputManager::KEY_PASTE_IMAGE].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat) {
|
||||
deselect_all();
|
||||
paste_image(drawP.world.main.input.mouse.pos);
|
||||
}
|
||||
}
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_PASTE).pressed && !drawP.prevent_undo_or_redo())
|
||||
paste_clipboard(drawP.world.main.input.mouse.pos);
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_PASTE_IMAGE).pressed && !drawP.prevent_undo_or_redo())
|
||||
paste_image(drawP.world.main.input.mouse.pos);
|
||||
else if(drawP.world.main.input.key(InputManager::KEY_GENERIC_ESCAPE).pressed)
|
||||
drawP.switch_to_tool(DrawingProgramToolType::EDIT, true);
|
||||
});
|
||||
drawP.keyCallbacks[InputManager::KEY_DESELECT_AND_EDIT_TOOL] = drawP.world.main.input.keyCallbacks[InputManager::KEY_DESELECT_AND_EDIT_TOOL].register_callback([&](auto& key) {
|
||||
if(key.down && !key.repeat) {
|
||||
if(is_something_selected())
|
||||
deselect_all();
|
||||
else
|
||||
drawP.switch_to_tool(DrawingProgramToolType::EDIT, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void DrawingProgramSelection::deselect_all() {
|
||||
|
|
@ -580,16 +592,18 @@ CanvasComponentContainer::ObjInfo* DrawingProgramSelection::get_front_object_col
|
|||
void DrawingProgramSelection::selection_to_clipboard() {
|
||||
check_add_stroke_color_change_undo();
|
||||
|
||||
auto& clipboard = drawP.world.main.clipboard;
|
||||
std::unordered_set<NetworkingObjects::NetObjID> resourceSet;
|
||||
for(auto& c : selectedSet)
|
||||
c->obj->get_comp().get_used_resources(resourceSet);
|
||||
clipboard.components.clear();
|
||||
for(auto& c : selectedSet)
|
||||
clipboard.components.emplace_back(c->obj->get_data_copy());
|
||||
clipboard.pos = initialSelectionAABB.center();
|
||||
clipboard.inverseScale = drawP.world.drawData.cam.c.inverseScale;
|
||||
clipboard.resources = drawP.world.rMan.copy_resource_set_to_map(resourceSet);
|
||||
if(is_something_selected()) {
|
||||
auto& clipboard = drawP.world.main.clipboard;
|
||||
std::unordered_set<NetworkingObjects::NetObjID> resourceSet;
|
||||
for(auto& c : selectedSet)
|
||||
c->obj->get_comp().get_used_resources(resourceSet);
|
||||
clipboard.components.clear();
|
||||
for(auto& c : selectedSet)
|
||||
clipboard.components.emplace_back(c->obj->get_data_copy());
|
||||
clipboard.pos = initialSelectionAABB.center();
|
||||
clipboard.inverseScale = drawP.world.drawData.cam.c.inverseScale;
|
||||
clipboard.resources = drawP.world.rMan.copy_resource_set_to_map(resourceSet);
|
||||
}
|
||||
}
|
||||
|
||||
void DrawingProgramSelection::paste_clipboard(Vector2f pasteScreenPos) {
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ class DrawingProgramSelection {
|
|||
void delete_all();
|
||||
void selection_to_clipboard();
|
||||
CanvasComponentContainer::ObjInfo* get_front_object_colliding_with_in_editing_layer(const SCollision::ColliderCollection<float>& cC);
|
||||
void register_key_callbacks();
|
||||
private:
|
||||
bool mouse_collided_with_selection_aabb();
|
||||
bool mouse_collided_with_scale_point();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue