std::unique_ptr<Pointer> CoreDriver::create_pointer(const ReaderObject& reader_object, Control* parent) { if (reader_object.get_name() == "core:axis-pointer") { ReaderMapping reader = reader_object.get_mapping(); auto axis = util::make_unique<AxisPointer>(parent); ReaderObject x_reader; if (!reader.read_object("x-axis", x_reader)) { log_error("CoreDriver: Couldn't find x-axis"); return {}; } ReaderObject y_reader; if (!reader.read_object("y-axis", y_reader)) { log_error("CoreDriver: Couldn't find y-axis"); return {}; } std::unique_ptr<Axis> x_axis = manager->create_axis(x_reader, axis.get()); std::unique_ptr<Axis> y_axis = manager->create_axis(y_reader, axis.get()); std::unique_ptr<Button> button; ReaderObject button_reader; if (reader.read_object("button", button_reader)) { button = manager->create_button(button_reader, axis.get()); } if (x_axis && y_axis) { axis->setup(std::move(x_axis), std::move(y_axis), std::move(button)); return std::move(axis); } else { return {}; } } else { return {}; } }
std::unique_ptr<Scroller> CoreDriver::create_scroller(const ReaderObject& reader_object, Control* parent) { if (reader_object.get_name() == "core:axis-scroller") { ReaderMapping reader = reader_object.get_mapping(); auto axis = util::make_unique<AxisScroller>(parent); ReaderObject x_reader; if (!reader.read_object("x-axis", x_reader)) { log_error("CoreDriver: Couldn't find x-axis"); return {}; } ReaderObject y_reader; if (!reader.read_object("y-axis", y_reader)) { log_error("CoreDriver: Couldn't find y-axis"); return {}; } std::unique_ptr<Axis> x_axis = manager->create_axis(x_reader, axis.get()); std::unique_ptr<Axis> y_axis = manager->create_axis(y_reader, axis.get()); std::unique_ptr<Button> button; ReaderObject button_reader; if (reader.read_object("button", button_reader)) { button = manager->create_button(button_reader, axis.get()); } if (x_axis && y_axis) { axis->setup(std::move(x_axis), std::move(y_axis), std::move(button)); return std::move(axis); } else { return {}; } } else if (reader_object.get_name() == "core:button-scroller") { ReaderMapping reader = reader_object.get_mapping(); auto scroller = util::make_unique<ButtonScroller>(parent); ReaderObject left_reader; if (!reader.read_object("left", left_reader)) { log_error("CoreDriver: core:button-scroller: Couldn't find 'left'"); return {}; } ReaderObject right_reader; if (!reader.read_object("right", right_reader)) { log_error("CoreDriver: core:button-scroller: Couldn't find 'right'"); return {}; } ReaderObject up_reader; if (!reader.read_object("up", up_reader)) { log_error("CoreDriver: core:button-scroller: Couldn't find 'up'"); return {}; } ReaderObject down_reader; if (!reader.read_object("down", down_reader)) { log_error("CoreDriver: core:button-scroller: Couldn't find 'down'"); return {}; } // FIXME: Add more error checking auto up_button = manager->create_button(up_reader, scroller.get()); auto down_button = manager->create_button(down_reader, scroller.get()); auto left_button = manager->create_button(left_reader, scroller.get()); auto right_button = manager->create_button(right_reader, scroller.get()); scroller->setup(std::move(up_button), std::move(down_button), std::move(left_button), std::move(right_button)); return std::move(scroller); } else { return {}; } }