/** * @brief Slot called when the user wants to convert tiles to or from dynamic ones. * @param indexes Indexes of the tiles or dynamic tiles to convert. */ void MapEditor::convert_tiles_requested(const EntityIndexes& indexes) { if (indexes.isEmpty()) { return; } const bool dynamic = map->get_entity(indexes.first()).is_dynamic(); for (const EntityIndex& index : indexes) { EntityType current_type = map->get_entity_type(index); if (current_type != EntityType::TILE && current_type != EntityType::DYNAMIC_TILE) { return; } if (map->get_entity(index).is_dynamic() != dynamic) { return; } } if (dynamic) { try_command(new ConvertTilesFromDynamicCommand(*this, indexes)); } else { try_command(new ConvertTilesToDynamicCommand(*this, indexes)); } }
/** * @brief Slot called when the user wants to delete an animation or a direction. */ void SpriteEditor::delete_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_valid()) { // No selection. return; } if (index.is_animation_index()) { try_command(new DeleteAnimationCommand(*this, index)); } else { try_command(new DeleteDirectionCommand(*this, index)); } }
/** * @brief Slot called when the user wants to duplicate the selection. */ void SpriteEditor::duplicate_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_valid()) { // No selection. return; } if (index.is_animation_index()) { try_command(new DuplicateAnimationCommand(*this, index)); } else { QPoint position = model->get_direction_position(index); try_command(new DuplicateDirectionCommand(*this, index, position)); } }
/** * @brief Slot called when the user wants to delete entities. * @param indexes Indexes of entities to remove. */ void MapEditor::remove_entities_requested(const EntityIndexes& indexes) { if (indexes.empty()) { return; } try_command(new RemoveEntitiesCommand(*this, indexes)); }
/** * @brief Slot called when the user wants to bring some entities to the back. * @param indexes Indexes of the entities to change. */ void MapEditor::bring_entities_to_back_requested(const EntityIndexes& indexes) { if (indexes.isEmpty()) { return; } try_command(new BringEntitiesToBackCommand(*this, indexes)); }
/** * @brief Modifies the map size with new values entered by the user. */ void MapEditor::change_size_requested() { QSize size = ui.size_field->get_size(); if (size == map->get_size()) { return; } try_command(new SetSizeCommand(*this, size)); }
/** * @brief Changes the floor value with the new text entered by the user. */ void MapEditor::change_floor_requested() { int floor = ui.floor_field->value(); if (floor == map->get_floor()) { return; } try_command(new SetFloorCommand(*this, floor)); }
/** * @brief Modifies the map location with new values entered by the user. */ void MapEditor::change_location_requested() { QPoint location = ui.location_field->get_point(); if (location == map->get_location()) { return; } try_command(new SetLocationCommand(*this, location)); }
/** * @brief Slot called when the user wants to add entities. * @param entities Entities ready to be added to the map. */ void MapEditor::add_entities_requested(AddableEntities& entities) { if (entities.empty()) { return; } try_command(new AddEntitiesCommand(*this, std::move(entities))); }
/** * @brief Changes the world value with the new text entered by the user. */ void MapEditor::change_world_requested() { QString world = ui.world_field->text(); if (world == map->get_world()) { return; } try_command(new SetWorldCommand(*this, world)); }
/** * @brief Slot called when the user wants to duplicate the selected direction. */ void SpriteEditor::duplicate_selected_direction_requested(const QPoint& position) { SpriteModel::Index index = model->get_selected_index(); if (!index.is_direction_index()) { // No selection. return; } try_command(new DuplicateDirectionCommand(*this, index, position)); }
/** * @brief Slot called when the user wants to resize entities. * @param boxes New bounding box of each entity to change. * @param allow_merge_to_previous @c true to merge this resizing with the previous one if any. */ void MapEditor::resize_entities_requested(const QMap<EntityIndex, QRect>& boxes, bool allow_merge_to_previous) { if (boxes.isEmpty()) { return; } try_command(new ResizeEntitiesCommand(*this, boxes, allow_merge_to_previous)); }
/** * @brief Slot called when the user wants to delete a direction. */ void SpriteEditor::delete_direction_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_direction_index()) { // No selection. return; } try_command(new DeleteDirectionCommand(*this, index)); }
/** * @brief Slot called when the user clicks the "Set a floor" checkbox. */ void MapEditor::floor_check_box_changed() { bool checked = ui.floor_check_box->isChecked(); if (checked) { ui.floor_field->setEnabled(true); if (!map->has_floor()) { // Use the value that was still in the disabled field. try_command(new SetFloorCommand(*this, ui.floor_field->value())); } } else { ui.floor_field->setEnabled(false); if (map->has_floor()) { // Remove the floor but keep the value in the field. try_command(new SetFloorCommand(*this, MapModel::NO_FLOOR)); } } }
int main(int argc, char **argv) { bool ran; json_t *cmd; parse_cmdline(&argc, &argv); if (foreground) { run_service(); return 0; } cmd = build_command(argc, argv); preprocess_command(cmd, output_pdu); ran = try_command(cmd, 0); if (!ran && should_start(errno)) { if (no_spawn) { if (!no_local) { ran = try_client_mode_command(cmd, !no_pretty); } } else { #ifdef USE_GIMLI spawn_via_gimli(); #elif defined(__APPLE__) spawn_via_launchd(); #else daemonize(); #endif ran = try_command(cmd, 10); } } json_decref(cmd); if (ran) { return 0; } if (!no_spawn) { w_log(W_LOG_ERR, "unable to talk to your watchman!\n"); } return 1; }
/** * @brief Slot called when the user wants to add a new direction. */ void SpriteEditor::add_direction_requested(const QRect& frame) { SpriteModel::Index index = model->get_selected_index(); if (!index.is_valid()) { // No selection. return; } try_command(new CreateDirectionCommand(*this, index, frame)); }
/** * @brief Slot called when the user clicks the "Set a world" checkbox. */ void MapEditor::world_check_box_changed() { bool checked = ui.world_check_box->isChecked(); if (checked) { ui.world_field->setEnabled(true); if (!map->has_world() && !ui.world_field->text().isEmpty()) { // Use the text that was still in the disabled field. try_command(new SetWorldCommand(*this, ui.world_field->text())); } } else { ui.world_field->setEnabled(false); if (map->has_world()) { // Remove the world but keep the text in the field. try_command(new SetWorldCommand(*this, "")); } } }
/** * @brief Slot called when the user wants to move entities. * @param indexes Indexes of the entities to move. * @param translation XY translation to make. * @param allow_merge_to_previous @c true to merge this move with the previous one if any. */ void MapEditor::move_entities_requested(const EntityIndexes& indexes, const QPoint& translation, bool allow_merge_to_previous) { if (indexes.isEmpty()) { return; } try_command(new MoveEntitiesCommand(*this, indexes, translation, allow_merge_to_previous)); }
/** * @brief Slot called when the user changes the music in the selector. */ void MapEditor::music_selector_activated() { const QString& old_music_id = map->get_music_id(); const QString& new_music_id = ui.music_field->get_selected_id(); if (new_music_id == old_music_id) { // No change. return; } try_command(new SetMusicCommand(*this, new_music_id)); }
/** * @brief Slot called when the user changes the tileset in the selector. */ void MapEditor::tileset_selector_activated() { const QString& old_tileset_id = map->get_tileset_id(); const QString& new_tileset_id = ui.tileset_field->get_selected_id(); if (new_tileset_id == old_tileset_id) { // No change. return; } try_command(new SetTilesetCommand(*this, new_tileset_id)); }
int main(int argc, char **argv) { bool ran; json_t *cmd; parse_cmdline(&argc, &argv); if (foreground) { unlink(sock_name); run_service(); return 0; } cmd = build_command(argc, argv); ran = try_command(cmd, 0); if (!ran && should_start(errno)) { if (no_spawn) { ran = try_client_mode_command(cmd, !no_pretty); } else { unlink(sock_name); #ifdef USE_GIMLI spawn_via_gimli(); #else daemonize(); #endif ran = try_command(cmd, 10); } } json_decref(cmd); if (ran) { return 0; } if (!no_spawn) { w_log(W_LOG_ERR, "unable to talk to your watchman!\n"); } return 1; }
/** * @brief Slot called when the user wants to change the layer of some entities. * @param indexes Indexes of the entities to change. * @param layer The layer to set. */ void MapEditor::set_entities_layer_requested(const EntityIndexes& indexes, int layer) { if (indexes.isEmpty()) { return; } int common_layer = 0; if (map->is_common_layer(indexes, common_layer) && layer == common_layer) { // Nothing to do. return; } try_command(new SetEntitiesLayerCommand(*this, indexes, layer)); }
/** * @brief Slot called when the user wants to change the direction of some entities. * @param indexes Indexes of the entities to change. * @param direction The direction to set. */ void MapEditor::set_entities_direction_requested(const EntityIndexes& indexes, int direction) { if (indexes.isEmpty()) { return; } int num_directions; QString no_direction_text; if (!map->is_common_direction_rules(indexes, num_directions, no_direction_text)) { // Incompatible direction rules. return; } try_command(new SetEntitiesDirectionCommand(*this, indexes, direction)); }
/** * @brief Slot called when the user wants to change the animation frame delay. */ void SpriteEditor::change_animation_frame_delay_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_valid()) { // No animation selected or several animations selected. return; } int frame_delay = ui.frame_delay_field->value(); int old_frame_delay = model->get_animation_frame_delay(index); if (frame_delay == old_frame_delay) { // No change. return; } try_command(new SetAnimationFrameDelayCommand(*this, index, (uint32_t)frame_delay)); }
/** * @brief Slot called when the user wants to change the default animation. */ void SpriteEditor::change_default_animation_requested() { if (!ui.default_animation_value->isChecked()) { ui.default_animation_value->setChecked(true); return; } QString old_default_animation_name = model->get_default_animation_name(); QString new_default_animation_name = model->get_selected_index().animation_name; if (new_default_animation_name == old_default_animation_name) { return; } try_command( new SetDefaultAnimationCommand(*this, new_default_animation_name)); }
/** * @brief Slot called when the user wants to change the direction size. */ void SpriteEditor::change_direction_size_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_direction_index()) { // No direction selected. return; } QSize old_size = model->get_direction_size(index); QSize size = ui.size_field->get_size(); if (size == old_size) { // No change. return; } try_command(new SetDirectionSizeCommand(*this, index, size)); }
/** * @brief Slot called when the user wants to change the direction position. */ void SpriteEditor::change_direction_position_requested( const QPoint& position) { SpriteModel::Index index = model->get_selected_index(); if (!index.is_direction_index()) { // No direction selected. return; } QPoint old_position = model->get_direction_position(index); if (position == old_position) { // No change. return; } try_command(new SetDirectionPositionCommand(*this, index, position)); }
/** * @brief Slot called when the user wants to change the direction origin. */ void SpriteEditor::change_direction_origin_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_direction_index()) { // No direction selected. return; } QPoint old_origin = model->get_direction_origin(index); QPoint origin = ui.origin_field->get_point(); if (origin == old_origin) { // No change. return; } try_command(new SetDirectionOriginCommand(*this, index, origin)); }
/** * @brief Slot called when the user wants to change the direction num columns. */ void SpriteEditor::change_direction_num_columns_requested() { SpriteModel::Index index = model->get_selected_index(); if (!index.is_direction_index()) { // No direction selected. return; } int old_num_columns = model->get_direction_num_columns(index); int num_columns = ui.num_columns_field->value(); if (num_columns == old_num_columns) { // No change. return; } try_command(new SetDirectionNumColumnsCommand(*this, index, num_columns)); }
/** * @brief Slot called when the user wants to create an animation. */ void SpriteEditor::create_animation_requested() { GetAnimationNameDialog dialog(*model, this); int result = dialog.exec(); if (result != QDialog::Accepted) { return; } // Try to guess to source image QString src_img = model->get_sprite_id() + ".png"; QFileInfo file_info(get_quest().get_sprite_image_path(src_img)); if (!file_info.exists()) { src_img = ""; } QString name = dialog.get_animation_name(); try_command(new CreateAnimationCommand(*this, name, src_img)); }