mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-25 16:43:33 +00:00
Merge branch 'master' into pathgrid-edit
Conflicts: apps/opencs/view/render/cell.cpp
This commit is contained in:
commit
03578129c7
10
.travis.yml
10
.travis.yml
@ -21,6 +21,14 @@ addons:
|
|||||||
build_command_prepend: "cmake ."
|
build_command_prepend: "cmake ."
|
||||||
build_command: "make -j3"
|
build_command: "make -j3"
|
||||||
branch_pattern: coverity_scan
|
branch_pattern: coverity_scan
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- os: linux
|
||||||
|
env:
|
||||||
|
ANALYZE="scan-build-3.6 --use-cc clang-3.6 --use-c++ clang++-3.6 "
|
||||||
|
compiler: clang
|
||||||
|
allow_failures:
|
||||||
|
- env: ANALYZE="scan-build-3.6 --use-cc clang-3.6 --use-c++ clang++-3.6 "
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./CI/before_install.linux.sh; fi
|
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./CI/before_install.linux.sh; fi
|
||||||
@ -30,7 +38,7 @@ before_script:
|
|||||||
- if [ "${TRAVIS_OS_NAME}" = "osx" ]; then ./CI/before_script.osx.sh; fi
|
- if [ "${TRAVIS_OS_NAME}" = "osx" ]; then ./CI/before_script.osx.sh; fi
|
||||||
script:
|
script:
|
||||||
- cd ./build
|
- cd ./build
|
||||||
- if [ "$COVERITY_SCAN_BRANCH" != 1 ]; then make -j4; fi
|
- if [ "$COVERITY_SCAN_BRANCH" != 1 ]; then ${ANALYZE}make -j4; fi
|
||||||
- if [ "$COVERITY_SCAN_BRANCH" != 1 ] && [ "${TRAVIS_OS_NAME}" = "osx" ]; then make package; fi
|
- if [ "$COVERITY_SCAN_BRANCH" != 1 ] && [ "${TRAVIS_OS_NAME}" = "osx" ]; then make package; fi
|
||||||
after_script:
|
after_script:
|
||||||
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./openmw_test_suite; fi
|
- if [ "${TRAVIS_OS_NAME}" = "linux" ]; then ./openmw_test_suite; fi
|
||||||
|
@ -39,6 +39,7 @@ Programmers
|
|||||||
Eli2
|
Eli2
|
||||||
Emanuel Guével (potatoesmaster)
|
Emanuel Guével (potatoesmaster)
|
||||||
eroen
|
eroen
|
||||||
|
escondida
|
||||||
Evgeniy Mineev (sandstranger)
|
Evgeniy Mineev (sandstranger)
|
||||||
Fil Krynicki (filkry)
|
Fil Krynicki (filkry)
|
||||||
Gašper Sedej
|
Gašper Sedej
|
||||||
|
39
CHANGELOG.md
39
CHANGELOG.md
@ -1,3 +1,42 @@
|
|||||||
|
0.35.1
|
||||||
|
------
|
||||||
|
|
||||||
|
Bug #781: incorrect trajectory of the sun
|
||||||
|
Bug #1079: Wrong starting position in "Character Stuff Wonderland"
|
||||||
|
Bug #1443: Repetitive taking of a stolen object is repetitively considered as a crime
|
||||||
|
Bug #1533: Divine Intervention goes to the wrong place.
|
||||||
|
Bug #1714: No visual indicator for time passed during training
|
||||||
|
Bug #1916: Telekinesis does not allow safe opening of traps
|
||||||
|
Bug #2227: Editor: addon file name inconsistency
|
||||||
|
Bug #2271: Player can melee enemies from water with impunity
|
||||||
|
Bug #2275: Objects with bigger scale move further using Move script
|
||||||
|
Bug #2285: Aryon's Dominator enchantment does not work properly
|
||||||
|
Bug #2290: No punishment for stealing gold from owned containers
|
||||||
|
Bug #2328: Launcher does not respond to Ctrl+C
|
||||||
|
Bug #2334: Drag-and-drop on a content file in the launcher creates duplicate items
|
||||||
|
Bug #2338: Arrows reclaimed from corpses do not stack sometimes
|
||||||
|
Bug #2344: Launcher - Settings importer running correctly?
|
||||||
|
Bug #2346: Launcher - Importing plugins into content list screws up the load order
|
||||||
|
Bug #2348: Mod: H.E.L.L.U.V.A. Handy Holdables does not appear in the content list
|
||||||
|
Bug #2353: Detect Animal detects dead creatures
|
||||||
|
Bug #2354: Cmake does not respect LIB_SUFFIX
|
||||||
|
Bug #2356: Active magic set inactive when switching magic items
|
||||||
|
Bug #2361: ERROR: ESM Error: Previous record contains unread bytes
|
||||||
|
Bug #2382: Switching spells with "next spell" or "previous spell" while holding shift promps delete spell dialog
|
||||||
|
Bug #2388: Regression: Can't toggle map on/off
|
||||||
|
Bug #2392: MOD Shrines - Restore Health and Cancel Options adds 100 health points
|
||||||
|
Bug #2394: List of Data Files tab in openmw-laucher needs to show all content files.
|
||||||
|
Bug #2402: Editor: skills saved incorrectly
|
||||||
|
Bug #2408: Equipping a constant effect Restore Health/Magicka/Fatigue item will permanently boost the stat it's restoring
|
||||||
|
Bug #2415: It is now possible to fall off the prison ship into the water when starting a new game
|
||||||
|
Bug #2419: MOD MCA crash to desktop
|
||||||
|
Bug #2420: Game crashes when character enters a certain area
|
||||||
|
Bug #2421: infinite loop when using cycle weapon without having a weapon
|
||||||
|
Feature #2221: Cannot dress dead NPCs
|
||||||
|
Feature #2349: Check CMake sets correct MSVC compiler settings for release build.
|
||||||
|
Feature #2397: Set default values for global mandatory records.
|
||||||
|
Feature #2412: Basic joystick support
|
||||||
|
|
||||||
0.35.0
|
0.35.0
|
||||||
------
|
------
|
||||||
|
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
export CXX=g++
|
if [ "${ANALYZE}" ]; then
|
||||||
export CC=gcc
|
if [ $(lsb_release -sc) = "precise" ]; then
|
||||||
|
echo "yes" | sudo apt-add-repository ppa:ubuntu-toolchain-r/test
|
||||||
|
fi
|
||||||
|
echo "yes" | sudo add-apt-repository "deb http://llvm.org/apt/`lsb_release -sc`/ llvm-toolchain-`lsb_release -sc`-3.6 main"
|
||||||
|
wget -O - http://llvm.org/apt/llvm-snapshot.gpg.key|sudo apt-key add -
|
||||||
|
fi
|
||||||
|
|
||||||
echo "yes" | sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse"
|
echo "yes" | sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse"
|
||||||
echo "yes" | sudo apt-add-repository ppa:openmw/openmw
|
echo "yes" | sudo apt-add-repository ppa:openmw/openmw
|
||||||
@ -10,6 +15,7 @@ sudo apt-get install -qq libgtest-dev google-mock
|
|||||||
sudo apt-get install -qq libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-thread-dev libboost-wave-dev
|
sudo apt-get install -qq libboost-filesystem-dev libboost-program-options-dev libboost-system-dev libboost-thread-dev libboost-wave-dev
|
||||||
sudo apt-get install -qq libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev
|
sudo apt-get install -qq libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev
|
||||||
sudo apt-get install -qq libbullet-dev libogre-1.9-dev libmygui-dev libsdl2-dev libunshield-dev libtinyxml-dev libopenal-dev libqt4-dev
|
sudo apt-get install -qq libbullet-dev libogre-1.9-dev libmygui-dev libsdl2-dev libunshield-dev libtinyxml-dev libopenal-dev libqt4-dev
|
||||||
|
if [ "${ANALYZE}" ]; then sudo apt-get install -qq clang-3.6; fi
|
||||||
sudo mkdir /usr/src/gtest/build
|
sudo mkdir /usr/src/gtest/build
|
||||||
cd /usr/src/gtest/build
|
cd /usr/src/gtest/build
|
||||||
sudo cmake .. -DBUILD_SHARED_LIBS=1
|
sudo cmake .. -DBUILD_SHARED_LIBS=1
|
||||||
|
@ -2,4 +2,6 @@
|
|||||||
|
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake .. -DBUILD_WITH_CODE_COVERAGE=1 -DBUILD_UNITTESTS=1 -DCMAKE_INSTALL_PREFIX=/usr -DBINDIR=/usr/games -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DUSE_SYSTEM_TINYXML=TRUE
|
export CODE_COVERAGE=1
|
||||||
|
if [ "${CC}" = "clang" ]; then export CODE_COVERAGE=0; fi
|
||||||
|
${ANALYZE}cmake .. -DBUILD_WITH_CODE_COVERAGE=${CODE_COVERAGE} -DBUILD_UNITTESTS=1 -DCMAKE_INSTALL_PREFIX=/usr -DBINDIR=/usr/games -DCMAKE_BUILD_TYPE="RelWithDebInfo" -DUSE_SYSTEM_TINYXML=TRUE
|
||||||
|
123
CMakeLists.txt
123
CMakeLists.txt
@ -20,7 +20,7 @@ message(STATUS "Configuring OpenMW...")
|
|||||||
|
|
||||||
set(OPENMW_VERSION_MAJOR 0)
|
set(OPENMW_VERSION_MAJOR 0)
|
||||||
set(OPENMW_VERSION_MINOR 35)
|
set(OPENMW_VERSION_MINOR 35)
|
||||||
set(OPENMW_VERSION_RELEASE 0)
|
set(OPENMW_VERSION_RELEASE 1)
|
||||||
|
|
||||||
set(OPENMW_VERSION_COMMITHASH "")
|
set(OPENMW_VERSION_COMMITHASH "")
|
||||||
set(OPENMW_VERSION_TAGHASH "")
|
set(OPENMW_VERSION_TAGHASH "")
|
||||||
@ -97,43 +97,6 @@ endif()
|
|||||||
# We probably support older versions than this.
|
# We probably support older versions than this.
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
|
|
||||||
# source directory: libs
|
|
||||||
|
|
||||||
set(LIBS_DIR ${CMAKE_SOURCE_DIR}/libs)
|
|
||||||
|
|
||||||
set(OENGINE_OGRE
|
|
||||||
${LIBS_DIR}/openengine/ogre/renderer.cpp
|
|
||||||
${LIBS_DIR}/openengine/ogre/lights.cpp
|
|
||||||
${LIBS_DIR}/openengine/ogre/selectionbuffer.cpp
|
|
||||||
${LIBS_DIR}/openengine/ogre/imagerotate.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(OENGINE_GUI
|
|
||||||
${LIBS_DIR}/openengine/gui/loglistener.cpp
|
|
||||||
${LIBS_DIR}/openengine/gui/manager.cpp
|
|
||||||
${LIBS_DIR}/openengine/gui/layout.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
set(OENGINE_BULLET
|
|
||||||
${LIBS_DIR}/openengine/bullet/BtOgre.cpp
|
|
||||||
${LIBS_DIR}/openengine/bullet/BtOgreExtras.h
|
|
||||||
${LIBS_DIR}/openengine/bullet/BtOgreGP.h
|
|
||||||
${LIBS_DIR}/openengine/bullet/BtOgrePG.h
|
|
||||||
${LIBS_DIR}/openengine/bullet/physic.cpp
|
|
||||||
${LIBS_DIR}/openengine/bullet/physic.hpp
|
|
||||||
${LIBS_DIR}/openengine/bullet/BulletShapeLoader.cpp
|
|
||||||
${LIBS_DIR}/openengine/bullet/BulletShapeLoader.h
|
|
||||||
${LIBS_DIR}/openengine/bullet/trace.cpp
|
|
||||||
${LIBS_DIR}/openengine/bullet/trace.h
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
set(OENGINE_ALL ${OENGINE_OGRE} ${OENGINE_GUI} ${OENGINE_BULLET})
|
|
||||||
source_group(libs\\openengine FILES ${OENGINE_ALL})
|
|
||||||
|
|
||||||
set(OPENMW_LIBS ${OENGINE_ALL})
|
|
||||||
set(OPENMW_LIBS_HEADER)
|
|
||||||
|
|
||||||
# Sound setup
|
# Sound setup
|
||||||
set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE SWRESAMPLE AVRESAMPLE)
|
set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE SWRESAMPLE AVRESAMPLE)
|
||||||
unset(FFMPEG_LIBRARIES CACHE)
|
unset(FFMPEG_LIBRARIES CACHE)
|
||||||
@ -266,7 +229,8 @@ endif ()
|
|||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
endif(OGRE_STATIC)
|
endif(OGRE_STATIC)
|
||||||
|
|
||||||
include_directories("."
|
include_directories("." ${LIBS_DIR}
|
||||||
|
SYSTEM
|
||||||
${OGRE_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}/Ogre ${OGRE_INCLUDE_DIR}/OGRE ${OGRE_INCLUDE_DIRS} ${OGRE_PLUGIN_INCLUDE_DIRS}
|
${OGRE_INCLUDE_DIR} ${OGRE_INCLUDE_DIR}/Ogre ${OGRE_INCLUDE_DIR}/OGRE ${OGRE_INCLUDE_DIRS} ${OGRE_PLUGIN_INCLUDE_DIRS}
|
||||||
${OGRE_INCLUDE_DIR}/Overlay ${OGRE_Overlay_INCLUDE_DIR}
|
${OGRE_INCLUDE_DIR}/Overlay ${OGRE_Overlay_INCLUDE_DIR}
|
||||||
${SDL2_INCLUDE_DIR}
|
${SDL2_INCLUDE_DIR}
|
||||||
@ -275,7 +239,7 @@ include_directories("."
|
|||||||
${MYGUI_INCLUDE_DIRS}
|
${MYGUI_INCLUDE_DIRS}
|
||||||
${MYGUI_PLATFORM_INCLUDE_DIRS}
|
${MYGUI_PLATFORM_INCLUDE_DIRS}
|
||||||
${OPENAL_INCLUDE_DIR}
|
${OPENAL_INCLUDE_DIR}
|
||||||
${LIBS_DIR}
|
${BULLET_INCLUDE_DIRS}
|
||||||
)
|
)
|
||||||
|
|
||||||
link_directories(${SDL2_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS} ${OGRE_LIB_DIR} ${MYGUI_LIB_DIR})
|
link_directories(${SDL2_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS} ${OGRE_LIB_DIR} ${MYGUI_LIB_DIR})
|
||||||
@ -375,6 +339,9 @@ configure_file(${OpenMW_SOURCE_DIR}/files/opencs.ini
|
|||||||
configure_file(${OpenMW_SOURCE_DIR}/files/opencs/defaultfilters
|
configure_file(${OpenMW_SOURCE_DIR}/files/opencs/defaultfilters
|
||||||
"${OpenMW_BINARY_DIR}/resources/defaultfilters" COPYONLY)
|
"${OpenMW_BINARY_DIR}/resources/defaultfilters" COPYONLY)
|
||||||
|
|
||||||
|
configure_file(${OpenMW_SOURCE_DIR}/files/gamecontrollerdb.txt
|
||||||
|
"${OpenMW_BINARY_DIR}/gamecontrollerdb.txt")
|
||||||
|
|
||||||
if (NOT WIN32 AND NOT APPLE)
|
if (NOT WIN32 AND NOT APPLE)
|
||||||
configure_file(${OpenMW_SOURCE_DIR}/files/openmw.desktop
|
configure_file(${OpenMW_SOURCE_DIR}/files/openmw.desktop
|
||||||
"${OpenMW_BINARY_DIR}/openmw.desktop")
|
"${OpenMW_BINARY_DIR}/openmw.desktop")
|
||||||
@ -382,22 +349,30 @@ if (NOT WIN32 AND NOT APPLE)
|
|||||||
"${OpenMW_BINARY_DIR}/openmw-cs.desktop")
|
"${OpenMW_BINARY_DIR}/openmw-cs.desktop")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Compiler settings
|
# CXX Compiler settings
|
||||||
if (CMAKE_COMPILER_IS_GNUCC)
|
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||||
SET(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused-parameter -Wno-reorder -std=c++98 -pedantic -Wno-long-long ${CMAKE_CXX_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter -Wno-reorder -std=c++98 -pedantic -Wno-long-long")
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID STREQUAL Clang AND NOT APPLE)
|
||||||
|
execute_process(COMMAND ${CMAKE_C_COMPILER} --version OUTPUT_VARIABLE CLANG_VERSION)
|
||||||
|
string(REGEX REPLACE ".*version ([0-9\\.]*).*" "\\1" CLANG_VERSION ${CLANG_VERSION})
|
||||||
|
if ("${CLANG_VERSION}" VERSION_GREATER 3.6 OR "${CLANG_VERSION}" VERSION_EQUAL 3.6)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-potentially-evaluated-expression")
|
||||||
|
endif ("${CLANG_VERSION}" VERSION_GREATER 3.6 OR "${CLANG_VERSION}" VERSION_EQUAL 3.6)
|
||||||
|
endif(CMAKE_CXX_COMPILER_ID STREQUAL Clang AND NOT APPLE)
|
||||||
|
|
||||||
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion
|
||||||
OUTPUT_VARIABLE GCC_VERSION)
|
OUTPUT_VARIABLE GCC_VERSION)
|
||||||
if ("${GCC_VERSION}" VERSION_GREATER 4.6 OR "${GCC_VERSION}" VERSION_EQUAL 4.6)
|
if (CMAKE_CXX_COMPILER_ID STREQUAL GNU AND "${GCC_VERSION}" VERSION_GREATER 4.6 OR "${GCC_VERSION}" VERSION_EQUAL 4.6)
|
||||||
SET(CMAKE_CXX_FLAGS "-Wno-unused-but-set-parameter ${CMAKE_CXX_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-but-set-parameter")
|
||||||
endif("${GCC_VERSION}" VERSION_GREATER 4.6 OR "${GCC_VERSION}" VERSION_EQUAL 4.6)
|
endif(CMAKE_CXX_COMPILER_ID STREQUAL GNU AND "${GCC_VERSION}" VERSION_GREATER 4.6 OR "${GCC_VERSION}" VERSION_EQUAL 4.6)
|
||||||
elseif (MSVC)
|
elseif (MSVC)
|
||||||
# Enable link-time code generation globally for all linking
|
# Enable link-time code generation globally for all linking
|
||||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL")
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
|
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG")
|
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG")
|
||||||
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
|
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
|
||||||
endif (CMAKE_COMPILER_IS_GNUCC)
|
endif (CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
||||||
|
|
||||||
IF(NOT WIN32 AND NOT APPLE)
|
IF(NOT WIN32 AND NOT APPLE)
|
||||||
# Linux building
|
# Linux building
|
||||||
@ -462,6 +437,8 @@ IF(NOT WIN32 AND NOT APPLE)
|
|||||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw")
|
INSTALL(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw")
|
||||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw")
|
INSTALL(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw")
|
||||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" DESTINATION "${SYSCONFDIR}" RENAME "openmw.cfg" COMPONENT "openmw")
|
INSTALL(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" DESTINATION "${SYSCONFDIR}" RENAME "openmw.cfg" COMPONENT "openmw")
|
||||||
|
INSTALL(FILES "${OpenMW_BINARY_DIR}/gamecontrollerdb.txt" DESTINATION "${SYSCONFDIR}" COMPONENT "openmw")
|
||||||
|
|
||||||
IF(BUILD_OPENCS)
|
IF(BUILD_OPENCS)
|
||||||
INSTALL(FILES "${OpenMW_BINARY_DIR}/opencs.ini" DESTINATION "${SYSCONFDIR}" COMPONENT "opencs")
|
INSTALL(FILES "${OpenMW_BINARY_DIR}/opencs.ini" DESTINATION "${SYSCONFDIR}" COMPONENT "opencs")
|
||||||
ENDIF(BUILD_OPENCS)
|
ENDIF(BUILD_OPENCS)
|
||||||
@ -482,6 +459,7 @@ if(WIN32)
|
|||||||
"${OpenMW_SOURCE_DIR}/Docs/license/DejaVu Font License.txt"
|
"${OpenMW_SOURCE_DIR}/Docs/license/DejaVu Font License.txt"
|
||||||
"${OpenMW_BINARY_DIR}/settings-default.cfg"
|
"${OpenMW_BINARY_DIR}/settings-default.cfg"
|
||||||
"${OpenMW_BINARY_DIR}/transparency-overrides.cfg"
|
"${OpenMW_BINARY_DIR}/transparency-overrides.cfg"
|
||||||
|
"${OpenMW_BINARY_DIR}/gamecontrollerdb.txt"
|
||||||
"${OpenMW_BINARY_DIR}/Release/openmw.exe"
|
"${OpenMW_BINARY_DIR}/Release/openmw.exe"
|
||||||
DESTINATION ".")
|
DESTINATION ".")
|
||||||
|
|
||||||
@ -566,6 +544,10 @@ if(WIN32)
|
|||||||
include(CPack)
|
include(CPack)
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
|
# Libs
|
||||||
|
include_directories(libs)
|
||||||
|
add_subdirectory(libs/openengine)
|
||||||
|
|
||||||
# Extern
|
# Extern
|
||||||
add_subdirectory (extern/shiny)
|
add_subdirectory (extern/shiny)
|
||||||
add_subdirectory (extern/ogre-ffmpeg-videoplayer)
|
add_subdirectory (extern/ogre-ffmpeg-videoplayer)
|
||||||
@ -699,61 +681,23 @@ if (WIN32)
|
|||||||
set(WARNINGS "${WARNINGS} /wd${d}")
|
set(WARNINGS "${WARNINGS} /wd${d}")
|
||||||
endforeach(d)
|
endforeach(d)
|
||||||
|
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNINGS} ${MT_BUILD}")
|
||||||
|
|
||||||
# boost::wave has a few issues with signed / unsigned conversions, so we suppress those here
|
# boost::wave has a few issues with signed / unsigned conversions, so we suppress those here
|
||||||
set(SHINY_WARNINGS "${WARNINGS} /wd4245")
|
set(SHINY_WARNINGS "${WARNINGS} /wd4245")
|
||||||
set_target_properties(shiny PROPERTIES COMPILE_FLAGS "${SHINY_WARNINGS} ${MT_BUILD}")
|
set_target_properties(shiny PROPERTIES COMPILE_FLAGS "${SHINY_WARNINGS} ${MT_BUILD}")
|
||||||
set_target_properties(shiny.OgrePlatform PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
set_target_properties(sdl4ogre PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
# oics uses tinyxml, which has an initialized but unused variable
|
# oics uses tinyxml, which has an initialized but unused variable
|
||||||
set(OICS_WARNINGS "${WARNINGS} /wd4189")
|
set(OICS_WARNINGS "${WARNINGS} /wd4189")
|
||||||
set_target_properties(oics PROPERTIES COMPILE_FLAGS "${OICS_WARNINGS} ${MT_BUILD}")
|
set_target_properties(oics PROPERTIES COMPILE_FLAGS "${OICS_WARNINGS} ${MT_BUILD}")
|
||||||
set_target_properties(components PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
set_target_properties(ogre-ffmpeg-videoplayer PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
if (BUILD_MYGUI_PLUGIN)
|
|
||||||
set_target_properties(Plugin_MyGUI_OpenMW_Resources PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
endif (BUILD_MYGUI_PLUGIN)
|
|
||||||
if (BUILD_LAUNCHER)
|
|
||||||
set_target_properties(openmw-launcher PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
endif (BUILD_LAUNCHER)
|
|
||||||
set_target_properties(openmw PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
if (BUILD_BSATOOL)
|
|
||||||
set_target_properties(bsatool PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
endif (BUILD_BSATOOL)
|
|
||||||
if (BUILD_ESMTOOL)
|
|
||||||
set_target_properties(esmtool PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
endif (BUILD_ESMTOOL)
|
|
||||||
if (BUILD_WIZARD)
|
|
||||||
set_target_properties(openmw-wizard PROPERTIES COMPILE_FLAGS ${WARNINGS})
|
|
||||||
endif (BUILD_WIZARD)
|
|
||||||
if (BUILD_OPENCS)
|
if (BUILD_OPENCS)
|
||||||
# QT triggers an informational warning that the object layout may differ when compiled with /vd2
|
# QT triggers an informational warning that the object layout may differ when compiled with /vd2
|
||||||
set(OPENCS_WARNINGS "${WARNINGS} ${MT_BUILD} /wd4435")
|
set(OPENCS_WARNINGS "${WARNINGS} ${MT_BUILD} /wd4435")
|
||||||
set_target_properties(openmw-cs PROPERTIES COMPILE_FLAGS ${OPENCS_WARNINGS})
|
set_target_properties(openmw-cs PROPERTIES COMPILE_FLAGS ${OPENCS_WARNINGS})
|
||||||
endif (BUILD_OPENCS)
|
endif (BUILD_OPENCS)
|
||||||
if (BUILD_ESSIMPORTER)
|
|
||||||
set_target_properties(openmw-essimporter PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
endif (BUILD_ESSIMPORTER)
|
|
||||||
if (BUILD_MWINIIMPORTER)
|
|
||||||
set_target_properties(openmw-iniimporter PROPERTIES COMPILE_FLAGS "${WARNINGS} ${MT_BUILD}")
|
|
||||||
endif (BUILD_MWINIIMPORTER)
|
|
||||||
endif(MSVC)
|
endif(MSVC)
|
||||||
|
|
||||||
# Same for MinGW
|
|
||||||
if (MINGW)
|
|
||||||
if (USE_DEBUG_CONSOLE)
|
|
||||||
set_target_properties(openmw PROPERTIES LINK_FLAGS_DEBUG "-Wl,-subsystem,console")
|
|
||||||
set_target_properties(openmw PROPERTIES LINK_FLAGS_RELWITHDEBINFO "-Wl,-subsystem,console")
|
|
||||||
set_target_properties(openmw PROPERTIES COMPILE_DEFINITIONS_DEBUG "_CONSOLE")
|
|
||||||
else(USE_DEBUG_CONSOLE)
|
|
||||||
set_target_properties(openmw PROPERTIES LINK_FLAGS_DEBUG "-Wl,-subsystem,windows")
|
|
||||||
set_target_properties(openmw PROPERTIES LINK_FLAGS_RELWITHDEBINFO "-Wl,-subsystem,windows")
|
|
||||||
endif(USE_DEBUG_CONSOLE)
|
|
||||||
|
|
||||||
set_target_properties(openmw PROPERTIES LINK_FLAGS_RELEASE "-Wl,-subsystem,console")
|
|
||||||
set_target_properties(openmw PROPERTIES LINK_FLAGS_MINSIZEREL "-Wl,-subsystem,console")
|
|
||||||
set_target_properties(openmw PROPERTIES COMPILE_DEFINITIONS_RELEASE "_CONSOLE")
|
|
||||||
endif(MINGW)
|
|
||||||
|
|
||||||
# TODO: At some point release builds should not use the console but rather write to a log file
|
# TODO: At some point release builds should not use the console but rather write to a log file
|
||||||
#set_target_properties(openmw PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS")
|
#set_target_properties(openmw PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS")
|
||||||
#set_target_properties(openmw PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS")
|
#set_target_properties(openmw PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:WINDOWS")
|
||||||
@ -767,6 +711,7 @@ if (APPLE)
|
|||||||
install(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
install(DIRECTORY "${OpenMW_BINARY_DIR}/resources" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
||||||
install(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" RENAME "openmw.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
install(FILES "${OpenMW_BINARY_DIR}/openmw.cfg.install" RENAME "openmw.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
||||||
install(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
install(FILES "${OpenMW_BINARY_DIR}/settings-default.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
||||||
|
install(FILES "${OpenMW_BINARY_DIR}/gamecontrollerdb.txt" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
||||||
install(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
install(FILES "${OpenMW_BINARY_DIR}/transparency-overrides.cfg" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
||||||
install(FILES "${OpenMW_BINARY_DIR}/opencs.ini" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
install(FILES "${OpenMW_BINARY_DIR}/opencs.ini" DESTINATION "${INSTALL_SUBDIR}" COMPONENT Runtime)
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ OpenMW
|
|||||||
OpenMW is an attempt at recreating the engine for the popular role-playing game
|
OpenMW is an attempt at recreating the engine for the popular role-playing game
|
||||||
Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work.
|
Morrowind by Bethesda Softworks. You need to own and install the original game for OpenMW to work.
|
||||||
|
|
||||||
* Version: 0.35.0
|
* Version: 0.35.1
|
||||||
* License: GPL (see docs/license/GPL3.txt for more information)
|
* License: GPL (see docs/license/GPL3.txt for more information)
|
||||||
* Website: http://www.openmw.org
|
* Website: http://www.openmw.org
|
||||||
* IRC: #openmw on irc.freenode.net
|
* IRC: #openmw on irc.freenode.net
|
||||||
@ -23,7 +23,7 @@ Getting Started
|
|||||||
* [Testing the game](https://wiki.openmw.org/index.php?title=Testing)
|
* [Testing the game](https://wiki.openmw.org/index.php?title=Testing)
|
||||||
* [How to contribute](https://wiki.openmw.org/index.php?title=Contribution_Wanted)
|
* [How to contribute](https://wiki.openmw.org/index.php?title=Contribution_Wanted)
|
||||||
* [Report a bug](http://bugs.openmw.org/projects/openmw) - read the [guidelines](https://wiki.openmw.org/index.php?title=Bug_Reporting_Guidelines) before submitting your first bug!
|
* [Report a bug](http://bugs.openmw.org/projects/openmw) - read the [guidelines](https://wiki.openmw.org/index.php?title=Bug_Reporting_Guidelines) before submitting your first bug!
|
||||||
* [Known issues] (http://bugs.openmw.org/projects/openmw/issues?utf8=%E2%9C%93&set_filter=1&f%5B%5D=status_id&op%5Bstatus_id%5D=%3D&v%5Bstatus_id%5D%5B%5D=7&f%5B%5D=tracker_id&op%5Btracker_id%5D=%3D&v%5Btracker_id%5D%5B%5D=1&f%5B%5D=&c%5B%5D=project&c%5B%5D=tracker&c%5B%5D=status&c%5B%5D=priority&c%5B%5D=subject&c%5B%5D=assigned_to&c%5B%5D=updated_on&group_by=tracker)
|
* [Known issues](http://bugs.openmw.org/projects/openmw/issues?utf8=%E2%9C%93&set_filter=1&f%5B%5D=status_id&op%5Bstatus_id%5D=%3D&v%5Bstatus_id%5D%5B%5D=7&f%5B%5D=tracker_id&op%5Btracker_id%5D=%3D&v%5Btracker_id%5D%5B%5D=1&f%5B%5D=&c%5B%5D=project&c%5B%5D=tracker&c%5B%5D=status&c%5B%5D=priority&c%5B%5D=subject&c%5B%5D=assigned_to&c%5B%5D=updated_on&group_by=tracker)
|
||||||
|
|
||||||
The data path
|
The data path
|
||||||
-------------
|
-------------
|
||||||
|
@ -460,7 +460,7 @@ int clone(Arguments& info)
|
|||||||
for (Stats::iterator it = stats.begin(); it != stats.end(); ++it)
|
for (Stats::iterator it = stats.begin(); it != stats.end(); ++it)
|
||||||
{
|
{
|
||||||
name.val = it->first;
|
name.val = it->first;
|
||||||
float amount = it->second;
|
int amount = it->second;
|
||||||
std::cout << std::setw(digitCount) << amount << " " << name.toString() << " ";
|
std::cout << std::setw(digitCount) << amount << " " << name.toString() << " ";
|
||||||
|
|
||||||
if (++i % 3 == 0)
|
if (++i % 3 == 0)
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
|
||||||
void printAIPackage(ESM::AIPackage p)
|
void printAIPackage(ESM::AIPackage p)
|
||||||
{
|
{
|
||||||
std::cout << " AI Type: " << aiTypeLabel(p.mType)
|
std::cout << " AI Type: " << aiTypeLabel(p.mType)
|
||||||
@ -16,7 +19,7 @@ void printAIPackage(ESM::AIPackage p)
|
|||||||
std::cout << " Duration: " << p.mWander.mDuration << std::endl;
|
std::cout << " Duration: " << p.mWander.mDuration << std::endl;
|
||||||
std::cout << " Time of Day: " << (int)p.mWander.mTimeOfDay << std::endl;
|
std::cout << " Time of Day: " << (int)p.mWander.mTimeOfDay << std::endl;
|
||||||
if (p.mWander.mShouldRepeat != 1)
|
if (p.mWander.mShouldRepeat != 1)
|
||||||
std::cout << " Should repeat: " << (bool)p.mWander.mShouldRepeat << std::endl;
|
std::cout << " Should repeat: " << (bool)(p.mWander.mShouldRepeat != 0) << std::endl;
|
||||||
|
|
||||||
std::cout << " Idle: ";
|
std::cout << " Idle: ";
|
||||||
for (int i = 0; i != 8; i++)
|
for (int i = 0; i != 8; i++)
|
||||||
@ -149,6 +152,26 @@ void printEffectList(ESM::EffectList effects)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printTransport(const std::vector<ESM::Transport::Dest>& transport)
|
||||||
|
{
|
||||||
|
std::vector<ESM::Transport::Dest>::const_iterator dit;
|
||||||
|
for (dit = transport.begin(); dit != transport.end(); ++dit)
|
||||||
|
{
|
||||||
|
std::cout << " Destination Position: "
|
||||||
|
<< boost::format("%12.3f") % dit->mPos.pos[0] << ","
|
||||||
|
<< boost::format("%12.3f") % dit->mPos.pos[1] << ","
|
||||||
|
<< boost::format("%12.3f") % dit->mPos.pos[2] << ")" << std::endl;
|
||||||
|
std::cout << " Destination Rotation: "
|
||||||
|
<< boost::format("%9.6f") % dit->mPos.rot[0] << ","
|
||||||
|
<< boost::format("%9.6f") % dit->mPos.rot[1] << ","
|
||||||
|
<< boost::format("%9.6f") % dit->mPos.rot[2] << ")" << std::endl;
|
||||||
|
if (dit->mCellName != "")
|
||||||
|
std::cout << " Destination Cell: " << dit->mCellName << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
namespace EsmTool {
|
namespace EsmTool {
|
||||||
|
|
||||||
RecordBase *
|
RecordBase *
|
||||||
@ -631,6 +654,8 @@ void Record<ESM::Creature>::print()
|
|||||||
for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); ++sit)
|
for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); ++sit)
|
||||||
std::cout << " Spell: " << *sit << std::endl;
|
std::cout << " Spell: " << *sit << std::endl;
|
||||||
|
|
||||||
|
printTransport(mData.getTransport());
|
||||||
|
|
||||||
std::cout << " Artifical Intelligence: " << mData.mHasAI << std::endl;
|
std::cout << " Artifical Intelligence: " << mData.mHasAI << std::endl;
|
||||||
std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl;
|
std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl;
|
||||||
std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl;
|
std::cout << " AI Fight:" << (int)mData.mAiData.mFight << std::endl;
|
||||||
@ -1042,20 +1067,7 @@ void Record<ESM::NPC>::print()
|
|||||||
for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); ++sit)
|
for (sit = mData.mSpells.mList.begin(); sit != mData.mSpells.mList.end(); ++sit)
|
||||||
std::cout << " Spell: " << *sit << std::endl;
|
std::cout << " Spell: " << *sit << std::endl;
|
||||||
|
|
||||||
std::vector<ESM::NPC::Dest>::iterator dit;
|
printTransport(mData.getTransport());
|
||||||
for (dit = mData.mTransport.begin(); dit != mData.mTransport.end(); ++dit)
|
|
||||||
{
|
|
||||||
std::cout << " Destination Position: "
|
|
||||||
<< boost::format("%12.3f") % dit->mPos.pos[0] << ","
|
|
||||||
<< boost::format("%12.3f") % dit->mPos.pos[1] << ","
|
|
||||||
<< boost::format("%12.3f") % dit->mPos.pos[2] << ")" << std::endl;
|
|
||||||
std::cout << " Destination Rotation: "
|
|
||||||
<< boost::format("%9.6f") % dit->mPos.rot[0] << ","
|
|
||||||
<< boost::format("%9.6f") % dit->mPos.rot[1] << ","
|
|
||||||
<< boost::format("%9.6f") % dit->mPos.rot[2] << ")" << std::endl;
|
|
||||||
if (dit->mCellName != "")
|
|
||||||
std::cout << " Destination Cell: " << dit->mCellName << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << " Artifical Intelligence: " << mData.mHasAI << std::endl;
|
std::cout << " Artifical Intelligence: " << mData.mHasAI << std::endl;
|
||||||
std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl;
|
std::cout << " AI Hello:" << (int)mData.mAiData.mHello << std::endl;
|
||||||
@ -1253,7 +1265,7 @@ void Record<ESM::Spell>::print()
|
|||||||
template<>
|
template<>
|
||||||
void Record<ESM::StartScript>::print()
|
void Record<ESM::StartScript>::print()
|
||||||
{
|
{
|
||||||
std::cout << "Start Script: " << mData.mScript << std::endl;
|
std::cout << "Start Script: " << mData.mId << std::endl;
|
||||||
std::cout << "Start Data: " << mData.mData << std::endl;
|
std::cout << "Start Data: " << mData.mData << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,18 +23,18 @@ namespace ESSImport
|
|||||||
}
|
}
|
||||||
for (int i=0; i<8; ++i)
|
for (int i=0; i<8; ++i)
|
||||||
{
|
{
|
||||||
cStats.mAttributes[i].mBase = acdt.mAttributes[i][1];
|
cStats.mAttributes[i].mBase = static_cast<int>(acdt.mAttributes[i][1]);
|
||||||
cStats.mAttributes[i].mMod = acdt.mAttributes[i][0];
|
cStats.mAttributes[i].mMod = static_cast<int>(acdt.mAttributes[i][0]);
|
||||||
cStats.mAttributes[i].mCurrent = acdt.mAttributes[i][0];
|
cStats.mAttributes[i].mCurrent = static_cast<int>(acdt.mAttributes[i][0]);
|
||||||
}
|
}
|
||||||
cStats.mGoldPool = acdt.mGoldPool;
|
cStats.mGoldPool = acdt.mGoldPool;
|
||||||
cStats.mTalkedTo = acdt.mFlags & TalkedToPlayer;
|
cStats.mTalkedTo = (acdt.mFlags & TalkedToPlayer) != 0;
|
||||||
cStats.mAttacked = acdt.mFlags & Attacked;
|
cStats.mAttacked = (acdt.mFlags & Attacked) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void convertACSC (const ACSC& acsc, ESM::CreatureStats& cStats)
|
void convertACSC (const ACSC& acsc, ESM::CreatureStats& cStats)
|
||||||
{
|
{
|
||||||
cStats.mDead = acsc.mFlags & Dead;
|
cStats.mDead = (acsc.mFlags & Dead) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void convertNpcData (const ActorData& actorData, ESM::NpcStats& npcStats)
|
void convertNpcData (const ActorData& actorData, ESM::NpcStats& npcStats)
|
||||||
|
@ -553,7 +553,7 @@ public:
|
|||||||
ESM::WeatherState weather;
|
ESM::WeatherState weather;
|
||||||
weather.mCurrentWeather = toString(mGame.mGMDT.mCurrentWeather);
|
weather.mCurrentWeather = toString(mGame.mGMDT.mCurrentWeather);
|
||||||
weather.mNextWeather = toString(mGame.mGMDT.mNextWeather);
|
weather.mNextWeather = toString(mGame.mGMDT.mNextWeather);
|
||||||
weather.mRemainingTransitionTime = mGame.mGMDT.mWeatherTransition/100.f*(0.015*24*3600);
|
weather.mRemainingTransitionTime = mGame.mGMDT.mWeatherTransition/100.f*(0.015f*24*3600);
|
||||||
weather.mHour = mContext->mHour;
|
weather.mHour = mContext->mHour;
|
||||||
weather.mWindSpeed = 0.f;
|
weather.mWindSpeed = 0.f;
|
||||||
weather.mTimePassed = 0.0;
|
weather.mTimePassed = 0.0;
|
||||||
|
@ -43,7 +43,7 @@ namespace ESSImport
|
|||||||
{
|
{
|
||||||
unsigned int deleted;
|
unsigned int deleted;
|
||||||
esm.getHT(deleted);
|
esm.getHT(deleted);
|
||||||
mDeleted = (deleted >> 24) & 0x2; // the other 3 bytes seem to be uninitialized garbage
|
mDeleted = ((deleted >> 24) & 0x2) != 0; // the other 3 bytes seem to be uninitialized garbage
|
||||||
}
|
}
|
||||||
|
|
||||||
if (esm.isNextSub("MVRF"))
|
if (esm.isNextSub("MVRF"))
|
||||||
|
@ -110,7 +110,7 @@ int wmain(int argc, wchar_t *wargv[]) {
|
|||||||
std::cerr << "cfg file does not exist" << std::endl;
|
std::cerr << "cfg file does not exist" << std::endl;
|
||||||
|
|
||||||
MwIniImporter importer;
|
MwIniImporter importer;
|
||||||
importer.setVerbose(vm.count("verbose"));
|
importer.setVerbose(vm.count("verbose") != 0);
|
||||||
|
|
||||||
// Font encoding settings
|
// Font encoding settings
|
||||||
std::string encoding(vm["encoding"].as<std::string>());
|
std::string encoding(vm["encoding"].as<std::string>());
|
||||||
|
@ -5,7 +5,7 @@ set (OPENCS_SRC main.cpp
|
|||||||
opencs_units (. editor)
|
opencs_units (. editor)
|
||||||
|
|
||||||
opencs_units (model/doc
|
opencs_units (model/doc
|
||||||
document operation saving documentmanager loader runner
|
document operation saving documentmanager loader runner operationholder
|
||||||
)
|
)
|
||||||
|
|
||||||
opencs_units_noqt (model/doc
|
opencs_units_noqt (model/doc
|
||||||
@ -40,6 +40,7 @@ opencs_units (model/tools
|
|||||||
opencs_units_noqt (model/tools
|
opencs_units_noqt (model/tools
|
||||||
mandatoryid skillcheck classcheck factioncheck racecheck soundcheck regioncheck
|
mandatoryid skillcheck classcheck factioncheck racecheck soundcheck regioncheck
|
||||||
birthsigncheck spellcheck referencecheck referenceablecheck scriptcheck bodypartcheck
|
birthsigncheck spellcheck referencecheck referenceablecheck scriptcheck bodypartcheck
|
||||||
|
startscriptcheck search searchoperation searchstage
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -91,7 +92,7 @@ opencs_hdrs_noqt (view/render
|
|||||||
|
|
||||||
|
|
||||||
opencs_units (view/tools
|
opencs_units (view/tools
|
||||||
reportsubview reporttable
|
reportsubview reporttable searchsubview searchbox
|
||||||
)
|
)
|
||||||
|
|
||||||
opencs_units_noqt (view/tools
|
opencs_units_noqt (view/tools
|
||||||
@ -165,7 +166,8 @@ qt4_wrap_ui(OPENCS_UI_HDR ${OPENCS_UI})
|
|||||||
qt4_wrap_cpp(OPENCS_MOC_SRC ${OPENCS_HDR_QT})
|
qt4_wrap_cpp(OPENCS_MOC_SRC ${OPENCS_HDR_QT})
|
||||||
qt4_add_resources(OPENCS_RES_SRC ${OPENCS_RES})
|
qt4_add_resources(OPENCS_RES_SRC ${OPENCS_RES})
|
||||||
|
|
||||||
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${BULLET_INCLUDE_DIRS})
|
# for compiled .ui files
|
||||||
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set (OPENCS_MAC_ICON ${CMAKE_SOURCE_DIR}/files/mac/openmw-cs.icns)
|
set (OPENCS_MAC_ICON ${CMAKE_SOURCE_DIR}/files/mac/openmw-cs.icns)
|
||||||
@ -175,7 +177,6 @@ endif(APPLE)
|
|||||||
|
|
||||||
add_executable(openmw-cs
|
add_executable(openmw-cs
|
||||||
MACOSX_BUNDLE
|
MACOSX_BUNDLE
|
||||||
${OENGINE_BULLET}
|
|
||||||
${OPENCS_SRC}
|
${OPENCS_SRC}
|
||||||
${OPENCS_UI_HDR}
|
${OPENCS_UI_HDR}
|
||||||
${OPENCS_MOC_SRC}
|
${OPENCS_MOC_SRC}
|
||||||
@ -199,6 +200,7 @@ if(APPLE)
|
|||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
|
|
||||||
target_link_libraries(openmw-cs
|
target_link_libraries(openmw-cs
|
||||||
|
${OENGINE_LIBRARY}
|
||||||
${OGRE_LIBRARIES}
|
${OGRE_LIBRARIES}
|
||||||
${OGRE_Overlay_LIBRARIES}
|
${OGRE_Overlay_LIBRARIES}
|
||||||
${OGRE_STATIC_PLUGINS}
|
${OGRE_STATIC_PLUGINS}
|
||||||
|
@ -2254,7 +2254,8 @@ CSMDoc::Document::Document (const Files::ConfigurationManager& configuration,
|
|||||||
mTools (*this), mResDir(resDir),
|
mTools (*this), mResDir(resDir),
|
||||||
mProjectPath ((configuration.getUserDataPath() / "projects") /
|
mProjectPath ((configuration.getUserDataPath() / "projects") /
|
||||||
(savePath.filename().string() + ".project")),
|
(savePath.filename().string() + ".project")),
|
||||||
mSaving (*this, mProjectPath, encoding),
|
mSavingOperation (*this, mProjectPath, encoding),
|
||||||
|
mSaving (&mSavingOperation),
|
||||||
mRunner (mProjectPath), mPhysics(boost::shared_ptr<CSVWorld::PhysicsSystem>())
|
mRunner (mProjectPath), mPhysics(boost::shared_ptr<CSVWorld::PhysicsSystem>())
|
||||||
{
|
{
|
||||||
if (mContentFiles.empty())
|
if (mContentFiles.empty())
|
||||||
@ -2373,6 +2374,17 @@ CSMWorld::UniversalId CSMDoc::Document::verify()
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CSMWorld::UniversalId CSMDoc::Document::newSearch()
|
||||||
|
{
|
||||||
|
return mTools.newSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::Document::runSearch (const CSMWorld::UniversalId& searchId, const CSMTools::Search& search)
|
||||||
|
{
|
||||||
|
return mTools.runSearch (searchId, search);
|
||||||
|
}
|
||||||
|
|
||||||
void CSMDoc::Document::abortOperation (int type)
|
void CSMDoc::Document::abortOperation (int type)
|
||||||
{
|
{
|
||||||
if (type==State_Saving)
|
if (type==State_Saving)
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "saving.hpp"
|
#include "saving.hpp"
|
||||||
#include "blacklist.hpp"
|
#include "blacklist.hpp"
|
||||||
#include "runner.hpp"
|
#include "runner.hpp"
|
||||||
|
#include "operationholder.hpp"
|
||||||
|
|
||||||
class QAbstractItemModel;
|
class QAbstractItemModel;
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ namespace ESM
|
|||||||
|
|
||||||
namespace Files
|
namespace Files
|
||||||
{
|
{
|
||||||
class ConfigurationManager;
|
struct ConfigurationManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
@ -59,7 +60,8 @@ namespace CSMDoc
|
|||||||
CSMWorld::Data mData;
|
CSMWorld::Data mData;
|
||||||
CSMTools::Tools mTools;
|
CSMTools::Tools mTools;
|
||||||
boost::filesystem::path mProjectPath;
|
boost::filesystem::path mProjectPath;
|
||||||
Saving mSaving;
|
Saving mSavingOperation;
|
||||||
|
OperationHolder mSaving;
|
||||||
boost::filesystem::path mResDir;
|
boost::filesystem::path mResDir;
|
||||||
Blacklist mBlacklist;
|
Blacklist mBlacklist;
|
||||||
Runner mRunner;
|
Runner mRunner;
|
||||||
@ -118,6 +120,10 @@ namespace CSMDoc
|
|||||||
|
|
||||||
CSMWorld::UniversalId verify();
|
CSMWorld::UniversalId verify();
|
||||||
|
|
||||||
|
CSMWorld::UniversalId newSearch();
|
||||||
|
|
||||||
|
void runSearch (const CSMWorld::UniversalId& searchId, const CSMTools::Search& search);
|
||||||
|
|
||||||
void abortOperation (int type);
|
void abortOperation (int type);
|
||||||
|
|
||||||
const CSMWorld::Data& getData() const;
|
const CSMWorld::Data& getData() const;
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
namespace Files
|
namespace Files
|
||||||
{
|
{
|
||||||
class ConfigurationManager;
|
struct ConfigurationManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CSMDoc
|
namespace CSMDoc
|
||||||
@ -50,7 +50,7 @@ namespace CSMDoc
|
|||||||
///< \param new_ Do not load the last content file in \a files and instead create in an
|
///< \param new_ Do not load the last content file in \a files and instead create in an
|
||||||
/// appropriate way.
|
/// appropriate way.
|
||||||
|
|
||||||
void setResourceDir (const boost::filesystem::path& parResDir);
|
void setResourceDir (const boost::filesystem::path& parResDir);
|
||||||
|
|
||||||
void setEncoding (ToUTF8::FromType encoding);
|
void setEncoding (ToUTF8::FromType encoding);
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ namespace CSMDoc
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
boost::filesystem::path mResDir;
|
boost::filesystem::path mResDir;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
|
@ -29,9 +29,9 @@ void CSMDoc::Operation::prepareStages()
|
|||||||
CSMDoc::Operation::Operation (int type, bool ordered, bool finalAlways)
|
CSMDoc::Operation::Operation (int type, bool ordered, bool finalAlways)
|
||||||
: mType (type), mStages(std::vector<std::pair<Stage *, int> >()), mCurrentStage(mStages.begin()),
|
: mType (type), mStages(std::vector<std::pair<Stage *, int> >()), mCurrentStage(mStages.begin()),
|
||||||
mCurrentStep(0), mCurrentStepTotal(0), mTotalSteps(0), mOrdered (ordered),
|
mCurrentStep(0), mCurrentStepTotal(0), mTotalSteps(0), mOrdered (ordered),
|
||||||
mFinalAlways (finalAlways), mError(false)
|
mFinalAlways (finalAlways), mError(false), mConnected (false)
|
||||||
{
|
{
|
||||||
connect (this, SIGNAL (finished()), this, SLOT (operationDone()));
|
mTimer = new QTimer (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
CSMDoc::Operation::~Operation()
|
CSMDoc::Operation::~Operation()
|
||||||
@ -42,15 +42,17 @@ CSMDoc::Operation::~Operation()
|
|||||||
|
|
||||||
void CSMDoc::Operation::run()
|
void CSMDoc::Operation::run()
|
||||||
{
|
{
|
||||||
|
mTimer->stop();
|
||||||
|
|
||||||
|
if (!mConnected)
|
||||||
|
{
|
||||||
|
connect (mTimer, SIGNAL (timeout()), this, SLOT (executeStage()));
|
||||||
|
mConnected = true;
|
||||||
|
}
|
||||||
|
|
||||||
prepareStages();
|
prepareStages();
|
||||||
|
|
||||||
QTimer timer;
|
mTimer->start (0);
|
||||||
|
|
||||||
timer.connect (&timer, SIGNAL (timeout()), this, SLOT (executeStage()));
|
|
||||||
|
|
||||||
timer.start (0);
|
|
||||||
|
|
||||||
exec();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSMDoc::Operation::appendStage (Stage *stage)
|
void CSMDoc::Operation::appendStage (Stage *stage)
|
||||||
@ -65,7 +67,7 @@ bool CSMDoc::Operation::hasError() const
|
|||||||
|
|
||||||
void CSMDoc::Operation::abort()
|
void CSMDoc::Operation::abort()
|
||||||
{
|
{
|
||||||
if (!isRunning())
|
if (!mTimer->isActive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mError = true;
|
mError = true;
|
||||||
@ -116,10 +118,11 @@ void CSMDoc::Operation::executeStage()
|
|||||||
emit reportMessage (iter->mId, iter->mMessage, iter->mHint, mType);
|
emit reportMessage (iter->mId, iter->mMessage, iter->mHint, mType);
|
||||||
|
|
||||||
if (mCurrentStage==mStages.end())
|
if (mCurrentStage==mStages.end())
|
||||||
exit();
|
operationDone();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSMDoc::Operation::operationDone()
|
void CSMDoc::Operation::operationDone()
|
||||||
{
|
{
|
||||||
|
mTimer->stop();
|
||||||
emit done (mType, mError);
|
emit done (mType, mError);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <QThread>
|
#include <QObject>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
@ -14,7 +15,7 @@ namespace CSMDoc
|
|||||||
{
|
{
|
||||||
class Stage;
|
class Stage;
|
||||||
|
|
||||||
class Operation : public QThread
|
class Operation : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -27,6 +28,8 @@ namespace CSMDoc
|
|||||||
int mOrdered;
|
int mOrdered;
|
||||||
bool mFinalAlways;
|
bool mFinalAlways;
|
||||||
bool mError;
|
bool mError;
|
||||||
|
bool mConnected;
|
||||||
|
QTimer *mTimer;
|
||||||
|
|
||||||
void prepareStages();
|
void prepareStages();
|
||||||
|
|
||||||
@ -38,8 +41,6 @@ namespace CSMDoc
|
|||||||
|
|
||||||
virtual ~Operation();
|
virtual ~Operation();
|
||||||
|
|
||||||
virtual void run();
|
|
||||||
|
|
||||||
void appendStage (Stage *stage);
|
void appendStage (Stage *stage);
|
||||||
///< The ownership of \a stage is transferred to *this.
|
///< The ownership of \a stage is transferred to *this.
|
||||||
///
|
///
|
||||||
@ -60,6 +61,8 @@ namespace CSMDoc
|
|||||||
|
|
||||||
void abort();
|
void abort();
|
||||||
|
|
||||||
|
void run();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void executeStage();
|
void executeStage();
|
||||||
|
65
apps/opencs/model/doc/operationholder.cpp
Normal file
65
apps/opencs/model/doc/operationholder.cpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
#include "operationholder.hpp"
|
||||||
|
|
||||||
|
#include "operation.hpp"
|
||||||
|
|
||||||
|
CSMDoc::OperationHolder::OperationHolder (Operation *operation) : mRunning (false)
|
||||||
|
{
|
||||||
|
if (operation)
|
||||||
|
setOperation (operation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::OperationHolder::setOperation (Operation *operation)
|
||||||
|
{
|
||||||
|
mOperation = operation;
|
||||||
|
mOperation->moveToThread (&mThread);
|
||||||
|
|
||||||
|
connect (
|
||||||
|
mOperation, SIGNAL (progress (int, int, int)),
|
||||||
|
this, SIGNAL (progress (int, int, int)));
|
||||||
|
|
||||||
|
connect (
|
||||||
|
mOperation, SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)),
|
||||||
|
this, SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)));
|
||||||
|
|
||||||
|
connect (
|
||||||
|
mOperation, SIGNAL (done (int, bool)),
|
||||||
|
this, SLOT (doneSlot (int, bool)));
|
||||||
|
|
||||||
|
connect (this, SIGNAL (abortSignal()), mOperation, SLOT (abort()));
|
||||||
|
|
||||||
|
connect (&mThread, SIGNAL (started()), mOperation, SLOT (run()));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSMDoc::OperationHolder::isRunning() const
|
||||||
|
{
|
||||||
|
return mRunning;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::OperationHolder::start()
|
||||||
|
{
|
||||||
|
mRunning = true;
|
||||||
|
mThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::OperationHolder::abort()
|
||||||
|
{
|
||||||
|
mRunning = false;
|
||||||
|
emit abortSignal();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::OperationHolder::abortAndWait()
|
||||||
|
{
|
||||||
|
if (mRunning)
|
||||||
|
{
|
||||||
|
mThread.quit();
|
||||||
|
mThread.wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::OperationHolder::doneSlot (int type, bool failed)
|
||||||
|
{
|
||||||
|
mRunning = false;
|
||||||
|
mThread.quit();
|
||||||
|
emit done (type, failed);
|
||||||
|
}
|
56
apps/opencs/model/doc/operationholder.hpp
Normal file
56
apps/opencs/model/doc/operationholder.hpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#ifndef CSM_DOC_OPERATIONHOLDER_H
|
||||||
|
#define CSM_DOC_OPERATIONHOLDER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
class UniversalId;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSMDoc
|
||||||
|
{
|
||||||
|
class Operation;
|
||||||
|
|
||||||
|
class OperationHolder : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
QThread mThread;
|
||||||
|
Operation *mOperation;
|
||||||
|
bool mRunning;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
OperationHolder (Operation *operation = 0);
|
||||||
|
|
||||||
|
void setOperation (Operation *operation);
|
||||||
|
|
||||||
|
bool isRunning() const;
|
||||||
|
|
||||||
|
void start();
|
||||||
|
|
||||||
|
void abort();
|
||||||
|
|
||||||
|
// Abort and wait until thread has finished.
|
||||||
|
void abortAndWait();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void doneSlot (int type, bool failed);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
|
||||||
|
void progress (int current, int max, int type);
|
||||||
|
|
||||||
|
void reportMessage (const CSMWorld::UniversalId& id, const std::string& message,
|
||||||
|
const std::string& hint, int type);
|
||||||
|
|
||||||
|
void done (int type, bool failed);
|
||||||
|
|
||||||
|
void abortSignal();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -6,7 +6,7 @@
|
|||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
|
|
||||||
#include "operation.hpp"
|
#include "operationholder.hpp"
|
||||||
|
|
||||||
CSMDoc::Runner::Runner (const boost::filesystem::path& projectPath)
|
CSMDoc::Runner::Runner (const boost::filesystem::path& projectPath)
|
||||||
: mRunning (false), mStartup (0), mProjectPath (projectPath)
|
: mRunning (false), mStartup (0), mProjectPath (projectPath)
|
||||||
@ -145,7 +145,7 @@ void CSMDoc::Runner::readyReadStandardOutput()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CSMDoc::SaveWatcher::SaveWatcher (Runner *runner, Operation *operation)
|
CSMDoc::SaveWatcher::SaveWatcher (Runner *runner, OperationHolder *operation)
|
||||||
: QObject (runner), mRunner (runner)
|
: QObject (runner), mRunner (runner)
|
||||||
{
|
{
|
||||||
connect (operation, SIGNAL (done (int, bool)), this, SLOT (saveDone (int, bool)));
|
connect (operation, SIGNAL (done (int, bool)), this, SLOT (saveDone (int, bool)));
|
||||||
|
@ -16,6 +16,8 @@ class QTemporaryFile;
|
|||||||
|
|
||||||
namespace CSMDoc
|
namespace CSMDoc
|
||||||
{
|
{
|
||||||
|
class OperationHolder;
|
||||||
|
|
||||||
class Runner : public QObject
|
class Runner : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -74,7 +76,7 @@ namespace CSMDoc
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
/// *this attaches itself to runner
|
/// *this attaches itself to runner
|
||||||
SaveWatcher (Runner *runner, Operation *operation);
|
SaveWatcher (Runner *runner, OperationHolder *operation);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
|
@ -78,6 +78,9 @@ CSMDoc::Saving::Saving (Document& document, const boost::filesystem::path& proje
|
|||||||
appendStage (new WriteCollectionStage<CSMWorld::IdCollection<ESM::MagicEffect> >
|
appendStage (new WriteCollectionStage<CSMWorld::IdCollection<ESM::MagicEffect> >
|
||||||
(mDocument.getData().getMagicEffects(), mState));
|
(mDocument.getData().getMagicEffects(), mState));
|
||||||
|
|
||||||
|
appendStage (new WriteCollectionStage<CSMWorld::IdCollection<ESM::StartScript> >
|
||||||
|
(mDocument.getData().getStartScripts(), mState));
|
||||||
|
|
||||||
appendStage (new WriteDialogueCollectionStage (mDocument, mState, false));
|
appendStage (new WriteDialogueCollectionStage (mDocument, mState, false));
|
||||||
|
|
||||||
appendStage (new WriteDialogueCollectionStage (mDocument, mState, true));
|
appendStage (new WriteDialogueCollectionStage (mDocument, mState, true));
|
||||||
@ -90,6 +93,10 @@ CSMDoc::Saving::Saving (Document& document, const boost::filesystem::path& proje
|
|||||||
|
|
||||||
appendStage (new WritePathgridCollectionStage (mDocument, mState));
|
appendStage (new WritePathgridCollectionStage (mDocument, mState));
|
||||||
|
|
||||||
|
appendStage (new WriteLandCollectionStage (mDocument, mState));
|
||||||
|
|
||||||
|
appendStage (new WriteLandTextureCollectionStage (mDocument, mState));
|
||||||
|
|
||||||
// close file and clean up
|
// close file and clean up
|
||||||
appendStage (new CloseSaveStage (mState));
|
appendStage (new CloseSaveStage (mState));
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ void CSMDoc::WriteHeaderStage::perform (int stage, Messages& messages)
|
|||||||
|
|
||||||
CSMDoc::WriteDialogueCollectionStage::WriteDialogueCollectionStage (Document& document,
|
CSMDoc::WriteDialogueCollectionStage::WriteDialogueCollectionStage (Document& document,
|
||||||
SavingState& state, bool journal)
|
SavingState& state, bool journal)
|
||||||
: mDocument (document), mState (state),
|
: mState (state),
|
||||||
mTopics (journal ? document.getData().getJournals() : document.getData().getTopics()),
|
mTopics (journal ? document.getData().getJournals() : document.getData().getTopics()),
|
||||||
mInfos (journal ? document.getData().getJournalInfos() : document.getData().getTopicInfos())
|
mInfos (journal ? document.getData().getJournalInfos() : document.getData().getTopicInfos())
|
||||||
{}
|
{}
|
||||||
@ -353,6 +353,74 @@ void CSMDoc::WritePathgridCollectionStage::perform (int stage, Messages& message
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CSMDoc::WriteLandCollectionStage::WriteLandCollectionStage (Document& document,
|
||||||
|
SavingState& state)
|
||||||
|
: mDocument (document), mState (state)
|
||||||
|
{}
|
||||||
|
|
||||||
|
int CSMDoc::WriteLandCollectionStage::setup()
|
||||||
|
{
|
||||||
|
return mDocument.getData().getLand().getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::WriteLandCollectionStage::perform (int stage, Messages& messages)
|
||||||
|
{
|
||||||
|
const CSMWorld::Record<CSMWorld::Land>& land =
|
||||||
|
mDocument.getData().getLand().getRecord (stage);
|
||||||
|
|
||||||
|
if (land.mState==CSMWorld::RecordBase::State_Modified ||
|
||||||
|
land.mState==CSMWorld::RecordBase::State_ModifiedOnly)
|
||||||
|
{
|
||||||
|
CSMWorld::Land record = land.get();
|
||||||
|
|
||||||
|
mState.getWriter().startRecord (record.mLand->sRecordId);
|
||||||
|
|
||||||
|
record.mLand->save (mState.getWriter());
|
||||||
|
if(record.mLand->mLandData)
|
||||||
|
record.mLand->mLandData->save (mState.getWriter());
|
||||||
|
|
||||||
|
mState.getWriter().endRecord (record.mLand->sRecordId);
|
||||||
|
}
|
||||||
|
else if (land.mState==CSMWorld::RecordBase::State_Deleted)
|
||||||
|
{
|
||||||
|
/// \todo write record with delete flag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CSMDoc::WriteLandTextureCollectionStage::WriteLandTextureCollectionStage (Document& document,
|
||||||
|
SavingState& state)
|
||||||
|
: mDocument (document), mState (state)
|
||||||
|
{}
|
||||||
|
|
||||||
|
int CSMDoc::WriteLandTextureCollectionStage::setup()
|
||||||
|
{
|
||||||
|
return mDocument.getData().getLandTextures().getSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMDoc::WriteLandTextureCollectionStage::perform (int stage, Messages& messages)
|
||||||
|
{
|
||||||
|
const CSMWorld::Record<CSMWorld::LandTexture>& landTexture =
|
||||||
|
mDocument.getData().getLandTextures().getRecord (stage);
|
||||||
|
|
||||||
|
if (landTexture.mState==CSMWorld::RecordBase::State_Modified ||
|
||||||
|
landTexture.mState==CSMWorld::RecordBase::State_ModifiedOnly)
|
||||||
|
{
|
||||||
|
CSMWorld::LandTexture record = landTexture.get();
|
||||||
|
|
||||||
|
mState.getWriter().startRecord (record.sRecordId);
|
||||||
|
|
||||||
|
record.save (mState.getWriter());
|
||||||
|
|
||||||
|
mState.getWriter().endRecord (record.sRecordId);
|
||||||
|
}
|
||||||
|
else if (landTexture.mState==CSMWorld::RecordBase::State_Deleted)
|
||||||
|
{
|
||||||
|
/// \todo write record with delete flag
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CSMDoc::CloseSaveStage::CloseSaveStage (SavingState& state)
|
CSMDoc::CloseSaveStage::CloseSaveStage (SavingState& state)
|
||||||
: mState (state)
|
: mState (state)
|
||||||
{}
|
{}
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
#include "../world/idcollection.hpp"
|
#include "../world/idcollection.hpp"
|
||||||
#include "../world/scope.hpp"
|
#include "../world/scope.hpp"
|
||||||
|
|
||||||
|
#include <components/esm/defs.hpp>
|
||||||
|
|
||||||
#include "savingstate.hpp"
|
#include "savingstate.hpp"
|
||||||
|
|
||||||
namespace ESM
|
namespace ESM
|
||||||
@ -103,8 +105,15 @@ namespace CSMDoc
|
|||||||
if (state==CSMWorld::RecordBase::State_Modified ||
|
if (state==CSMWorld::RecordBase::State_Modified ||
|
||||||
state==CSMWorld::RecordBase::State_ModifiedOnly)
|
state==CSMWorld::RecordBase::State_ModifiedOnly)
|
||||||
{
|
{
|
||||||
mState.getWriter().startRecord (mCollection.getRecord (stage).mModified.sRecordId);
|
// FIXME: A quick Workaround to support records which should not write
|
||||||
mState.getWriter().writeHNCString ("NAME", mCollection.getId (stage));
|
// NAME, including SKIL, MGEF and SCPT. If there are many more
|
||||||
|
// idcollection records that doesn't use NAME then a more generic
|
||||||
|
// solution may be required.
|
||||||
|
uint32_t name = mCollection.getRecord (stage).mModified.sRecordId;
|
||||||
|
mState.getWriter().startRecord (name);
|
||||||
|
|
||||||
|
if(name != ESM::REC_SKIL && name != ESM::REC_MGEF && name != ESM::REC_SCPT)
|
||||||
|
mState.getWriter().writeHNCString ("NAME", mCollection.getId (stage));
|
||||||
mCollection.getRecord (stage).mModified.save (mState.getWriter());
|
mCollection.getRecord (stage).mModified.save (mState.getWriter());
|
||||||
mState.getWriter().endRecord (mCollection.getRecord (stage).mModified.sRecordId);
|
mState.getWriter().endRecord (mCollection.getRecord (stage).mModified.sRecordId);
|
||||||
}
|
}
|
||||||
@ -117,7 +126,6 @@ namespace CSMDoc
|
|||||||
|
|
||||||
class WriteDialogueCollectionStage : public Stage
|
class WriteDialogueCollectionStage : public Stage
|
||||||
{
|
{
|
||||||
Document& mDocument;
|
|
||||||
SavingState& mState;
|
SavingState& mState;
|
||||||
const CSMWorld::IdCollection<ESM::Dialogue>& mTopics;
|
const CSMWorld::IdCollection<ESM::Dialogue>& mTopics;
|
||||||
CSMWorld::InfoCollection& mInfos;
|
CSMWorld::InfoCollection& mInfos;
|
||||||
@ -200,6 +208,40 @@ namespace CSMDoc
|
|||||||
///< Messages resulting from this stage will be appended to \a messages.
|
///< Messages resulting from this stage will be appended to \a messages.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class WriteLandCollectionStage : public Stage
|
||||||
|
{
|
||||||
|
Document& mDocument;
|
||||||
|
SavingState& mState;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
WriteLandCollectionStage (Document& document, SavingState& state);
|
||||||
|
|
||||||
|
virtual int setup();
|
||||||
|
///< \return number of steps
|
||||||
|
|
||||||
|
virtual void perform (int stage, Messages& messages);
|
||||||
|
///< Messages resulting from this stage will be appended to \a messages.
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class WriteLandTextureCollectionStage : public Stage
|
||||||
|
{
|
||||||
|
Document& mDocument;
|
||||||
|
SavingState& mState;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
WriteLandTextureCollectionStage (Document& document, SavingState& state);
|
||||||
|
|
||||||
|
virtual int setup();
|
||||||
|
///< \return number of steps
|
||||||
|
|
||||||
|
virtual void perform (int stage, Messages& messages);
|
||||||
|
///< Messages resulting from this stage will be appended to \a messages.
|
||||||
|
};
|
||||||
|
|
||||||
class CloseSaveStage : public Stage
|
class CloseSaveStage : public Stage
|
||||||
{
|
{
|
||||||
SavingState& mState;
|
SavingState& mState;
|
||||||
|
@ -13,7 +13,7 @@ namespace CSMDoc
|
|||||||
State_Saving = 16,
|
State_Saving = 16,
|
||||||
State_Verifying = 32,
|
State_Verifying = 32,
|
||||||
State_Compiling = 64, // not implemented yet
|
State_Compiling = 64, // not implemented yet
|
||||||
State_Searching = 128, // not implemented yet
|
State_Searching = 128,
|
||||||
State_Loading = 256 // pseudo-state; can not be encountered in a loaded document
|
State_Loading = 256 // pseudo-state; can not be encountered in a loaded document
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -208,6 +208,21 @@ void CSMSettings::UserSettings::buildSettingModelDefaults()
|
|||||||
shiftCtrlDoubleClick->setToolTip ("Action on shift control double click in table:<p>" + toolTip);
|
shiftCtrlDoubleClick->setToolTip ("Action on shift control double click in table:<p>" + toolTip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declareSection ("search", "Search & Replace");
|
||||||
|
{
|
||||||
|
Setting *before = createSetting (Type_SpinBox, "char-before",
|
||||||
|
"Characters before search string");
|
||||||
|
before->setDefaultValue (10);
|
||||||
|
before->setRange (0, 1000);
|
||||||
|
before->setToolTip ("Maximum number of character to display in search result before the searched text");
|
||||||
|
|
||||||
|
Setting *after = createSetting (Type_SpinBox, "char-after",
|
||||||
|
"Characters after search string");
|
||||||
|
after->setDefaultValue (10);
|
||||||
|
after->setRange (0, 1000);
|
||||||
|
after->setToolTip ("Maximum number of character to display in search result after the searched text");
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* There are three types of values:
|
* There are three types of values:
|
||||||
|
@ -48,10 +48,6 @@ void CSMTools::ReferenceCheckStage::perform(int stage, CSMDoc::Messages &message
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if referenced object is in valid cell
|
|
||||||
if (mCells.searchId(cellRef.mCell) == -1)
|
|
||||||
messages.push_back(std::make_pair(id, " is referencing object from non existing cell " + cellRef.mCell));
|
|
||||||
|
|
||||||
// If object have owner, check if that owner reference is valid
|
// If object have owner, check if that owner reference is valid
|
||||||
if (!cellRef.mOwner.empty() && mReferencables.searchId(cellRef.mOwner) == -1)
|
if (!cellRef.mOwner.empty() && mReferencables.searchId(cellRef.mOwner) == -1)
|
||||||
messages.push_back(std::make_pair(id, " has non existing owner " + cellRef.mOwner));
|
messages.push_back(std::make_pair(id, " has non existing owner " + cellRef.mOwner));
|
||||||
@ -70,9 +66,9 @@ void CSMTools::ReferenceCheckStage::perform(int stage, CSMDoc::Messages &message
|
|||||||
|
|
||||||
// Check item's faction rank
|
// Check item's faction rank
|
||||||
if (hasFaction && cellRef.mFactionRank < -1)
|
if (hasFaction && cellRef.mFactionRank < -1)
|
||||||
messages.push_back(std::make_pair(id, " has faction set but has invalid faction rank " + cellRef.mFactionRank));
|
messages.push_back(std::make_pair(id, " has faction set but has invalid faction rank " + boost::lexical_cast<std::string>(cellRef.mFactionRank)));
|
||||||
else if (!hasFaction && cellRef.mFactionRank != -2)
|
else if (!hasFaction && cellRef.mFactionRank != -2)
|
||||||
messages.push_back(std::make_pair(id, " has invalid faction rank " + cellRef.mFactionRank));
|
messages.push_back(std::make_pair(id, " has invalid faction rank " + boost::lexical_cast<std::string>(cellRef.mFactionRank)));
|
||||||
|
|
||||||
// If door have destination cell, check if that reference is valid
|
// If door have destination cell, check if that reference is valid
|
||||||
if (!cellRef.mDestCell.empty())
|
if (!cellRef.mDestCell.empty())
|
||||||
|
@ -2,6 +2,29 @@
|
|||||||
#include "reportmodel.hpp"
|
#include "reportmodel.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "../world/columns.hpp"
|
||||||
|
|
||||||
|
CSMTools::ReportModel::Line::Line (const CSMWorld::UniversalId& id, const std::string& message,
|
||||||
|
const std::string& hint)
|
||||||
|
: mId (id), mMessage (message), mHint (hint)
|
||||||
|
{}
|
||||||
|
|
||||||
|
CSMTools::ReportModel::ReportModel (bool fieldColumn)
|
||||||
|
{
|
||||||
|
if (fieldColumn)
|
||||||
|
{
|
||||||
|
mColumnField = 3;
|
||||||
|
mColumnDescription = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mColumnDescription = 3;
|
||||||
|
|
||||||
|
mColumnField = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int CSMTools::ReportModel::rowCount (const QModelIndex & parent) const
|
int CSMTools::ReportModel::rowCount (const QModelIndex & parent) const
|
||||||
{
|
{
|
||||||
@ -16,7 +39,7 @@ int CSMTools::ReportModel::columnCount (const QModelIndex & parent) const
|
|||||||
if (parent.isValid())
|
if (parent.isValid())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return 3;
|
return mColumnDescription+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant CSMTools::ReportModel::data (const QModelIndex & index, int role) const
|
QVariant CSMTools::ReportModel::data (const QModelIndex & index, int role) const
|
||||||
@ -24,13 +47,49 @@ QVariant CSMTools::ReportModel::data (const QModelIndex & index, int role) const
|
|||||||
if (role!=Qt::DisplayRole)
|
if (role!=Qt::DisplayRole)
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
if (index.column()==0)
|
switch (index.column())
|
||||||
return static_cast<int> (mRows.at (index.row()).first.getType());
|
{
|
||||||
|
case Column_Type:
|
||||||
|
|
||||||
if (index.column()==1)
|
return static_cast<int> (mRows.at (index.row()).mId.getType());
|
||||||
return QString::fromUtf8 (mRows.at (index.row()).second.first.c_str());
|
|
||||||
|
|
||||||
return QString::fromUtf8 (mRows.at (index.row()).second.second.c_str());
|
case Column_Id:
|
||||||
|
{
|
||||||
|
CSMWorld::UniversalId id = mRows.at (index.row()).mId;
|
||||||
|
|
||||||
|
if (id.getArgumentType()==CSMWorld::UniversalId::ArgumentType_Id)
|
||||||
|
return QString::fromUtf8 (id.getId().c_str());
|
||||||
|
|
||||||
|
return QString ("-");
|
||||||
|
}
|
||||||
|
|
||||||
|
case Column_Hint:
|
||||||
|
|
||||||
|
return QString::fromUtf8 (mRows.at (index.row()).mHint.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index.column()==mColumnDescription)
|
||||||
|
return QString::fromUtf8 (mRows.at (index.row()).mMessage.c_str());
|
||||||
|
|
||||||
|
if (index.column()==mColumnField)
|
||||||
|
{
|
||||||
|
std::string field;
|
||||||
|
|
||||||
|
std::istringstream stream (mRows.at (index.row()).mHint);
|
||||||
|
|
||||||
|
char type, ignore;
|
||||||
|
int fieldIndex;
|
||||||
|
|
||||||
|
if ((stream >> type >> ignore >> fieldIndex) && (type=='r' || type=='R'))
|
||||||
|
{
|
||||||
|
field = CSMWorld::Columns::getName (
|
||||||
|
static_cast<CSMWorld::Columns::ColumnId> (fieldIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
return QString::fromUtf8 (field.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariant CSMTools::ReportModel::headerData (int section, Qt::Orientation orientation, int role) const
|
QVariant CSMTools::ReportModel::headerData (int section, Qt::Orientation orientation, int role) const
|
||||||
@ -41,13 +100,19 @@ QVariant CSMTools::ReportModel::headerData (int section, Qt::Orientation orienta
|
|||||||
if (orientation==Qt::Vertical)
|
if (orientation==Qt::Vertical)
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
if (section==0)
|
switch (section)
|
||||||
return "Type";
|
{
|
||||||
|
case Column_Type: return "Type";
|
||||||
|
case Column_Id: return "ID";
|
||||||
|
}
|
||||||
|
|
||||||
if (section==1)
|
if (section==mColumnDescription)
|
||||||
return "Description";
|
return "Description";
|
||||||
|
|
||||||
return "Hint";
|
if (section==mColumnField)
|
||||||
|
return "Field";
|
||||||
|
|
||||||
|
return "-";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CSMTools::ReportModel::removeRows (int row, int count, const QModelIndex& parent)
|
bool CSMTools::ReportModel::removeRows (int row, int count, const QModelIndex& parent)
|
||||||
@ -65,17 +130,42 @@ void CSMTools::ReportModel::add (const CSMWorld::UniversalId& id, const std::str
|
|||||||
{
|
{
|
||||||
beginInsertRows (QModelIndex(), mRows.size(), mRows.size());
|
beginInsertRows (QModelIndex(), mRows.size(), mRows.size());
|
||||||
|
|
||||||
mRows.push_back (std::make_pair (id, std::make_pair (message, hint)));
|
mRows.push_back (Line (id, message, hint));
|
||||||
|
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSMTools::ReportModel::flagAsReplaced (int index)
|
||||||
|
{
|
||||||
|
Line& line = mRows.at (index);
|
||||||
|
std::string hint = line.mHint;
|
||||||
|
|
||||||
|
if (hint.empty() || hint[0]!='R')
|
||||||
|
throw std::logic_error ("trying to flag message as replaced that is not replaceable");
|
||||||
|
|
||||||
|
hint[0] = 'r';
|
||||||
|
|
||||||
|
line.mHint = hint;
|
||||||
|
|
||||||
|
emit dataChanged (this->index (index, 0), this->index (index, columnCount()));
|
||||||
|
}
|
||||||
|
|
||||||
const CSMWorld::UniversalId& CSMTools::ReportModel::getUniversalId (int row) const
|
const CSMWorld::UniversalId& CSMTools::ReportModel::getUniversalId (int row) const
|
||||||
{
|
{
|
||||||
return mRows.at (row).first;
|
return mRows.at (row).mId;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CSMTools::ReportModel::getHint (int row) const
|
std::string CSMTools::ReportModel::getHint (int row) const
|
||||||
{
|
{
|
||||||
return mRows.at (row).second.second;
|
return mRows.at (row).mHint;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::ReportModel::clear()
|
||||||
|
{
|
||||||
|
if (!mRows.empty())
|
||||||
|
{
|
||||||
|
beginRemoveRows (QModelIndex(), 0, mRows.size()-1);
|
||||||
|
mRows.clear();
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
||||||
}
|
}
|
@ -14,10 +14,32 @@ namespace CSMTools
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
std::vector<std::pair<CSMWorld::UniversalId, std::pair<std::string, std::string> > > mRows;
|
struct Line
|
||||||
|
{
|
||||||
|
Line (const CSMWorld::UniversalId& id, const std::string& message,
|
||||||
|
const std::string& hint);
|
||||||
|
|
||||||
|
CSMWorld::UniversalId mId;
|
||||||
|
std::string mMessage;
|
||||||
|
std::string mHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Line> mRows;
|
||||||
|
|
||||||
|
// Fixed columns
|
||||||
|
enum Columns
|
||||||
|
{
|
||||||
|
Column_Type = 0, Column_Id = 1, Column_Hint = 2
|
||||||
|
};
|
||||||
|
|
||||||
|
// Configurable columns
|
||||||
|
int mColumnDescription;
|
||||||
|
int mColumnField;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
ReportModel (bool fieldColumn = false);
|
||||||
|
|
||||||
virtual int rowCount (const QModelIndex & parent = QModelIndex()) const;
|
virtual int rowCount (const QModelIndex & parent = QModelIndex()) const;
|
||||||
|
|
||||||
virtual int columnCount (const QModelIndex & parent = QModelIndex()) const;
|
virtual int columnCount (const QModelIndex & parent = QModelIndex()) const;
|
||||||
@ -31,9 +53,13 @@ namespace CSMTools
|
|||||||
void add (const CSMWorld::UniversalId& id, const std::string& message,
|
void add (const CSMWorld::UniversalId& id, const std::string& message,
|
||||||
const std::string& hint = "");
|
const std::string& hint = "");
|
||||||
|
|
||||||
|
void flagAsReplaced (int index);
|
||||||
|
|
||||||
const CSMWorld::UniversalId& getUniversalId (int row) const;
|
const CSMWorld::UniversalId& getUniversalId (int row) const;
|
||||||
|
|
||||||
std::string getHint (int row) const;
|
std::string getHint (int row) const;
|
||||||
|
|
||||||
|
void clear();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
279
apps/opencs/model/tools/search.cpp
Normal file
279
apps/opencs/model/tools/search.cpp
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
|
||||||
|
#include "search.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "../doc/messages.hpp"
|
||||||
|
#include "../doc/document.hpp"
|
||||||
|
|
||||||
|
#include "../world/idtablebase.hpp"
|
||||||
|
#include "../world/columnbase.hpp"
|
||||||
|
#include "../world/universalid.hpp"
|
||||||
|
#include "../world/commands.hpp"
|
||||||
|
|
||||||
|
void CSMTools::Search::searchTextCell (const CSMWorld::IdTableBase *model,
|
||||||
|
const QModelIndex& index, const CSMWorld::UniversalId& id, bool writable,
|
||||||
|
CSMDoc::Messages& messages) const
|
||||||
|
{
|
||||||
|
// using QString here for easier handling of case folding.
|
||||||
|
|
||||||
|
QString search = QString::fromUtf8 (mText.c_str());
|
||||||
|
QString text = model->data (index).toString();
|
||||||
|
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
while ((pos = text.indexOf (search, pos, Qt::CaseInsensitive))!=-1)
|
||||||
|
{
|
||||||
|
std::ostringstream hint;
|
||||||
|
hint
|
||||||
|
<< (writable ? 'R' : 'r')
|
||||||
|
<<": "
|
||||||
|
<< model->getColumnId (index.column())
|
||||||
|
<< " " << pos
|
||||||
|
<< " " << search.length();
|
||||||
|
|
||||||
|
messages.add (id, formatDescription (text, pos, search.length()).toUtf8().data(), hint.str());
|
||||||
|
|
||||||
|
pos += search.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Search::searchRegExCell (const CSMWorld::IdTableBase *model,
|
||||||
|
const QModelIndex& index, const CSMWorld::UniversalId& id, bool writable,
|
||||||
|
CSMDoc::Messages& messages) const
|
||||||
|
{
|
||||||
|
QString text = model->data (index).toString();
|
||||||
|
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
while ((pos = mRegExp.indexIn (text, pos))!=-1)
|
||||||
|
{
|
||||||
|
int length = mRegExp.matchedLength();
|
||||||
|
|
||||||
|
std::ostringstream hint;
|
||||||
|
hint
|
||||||
|
<< (writable ? 'R' : 'r')
|
||||||
|
<<": "
|
||||||
|
<< model->getColumnId (index.column())
|
||||||
|
<< " " << pos
|
||||||
|
<< " " << length;
|
||||||
|
|
||||||
|
messages.add (id, formatDescription (text, pos, length).toUtf8().data(), hint.str());
|
||||||
|
|
||||||
|
pos += length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Search::searchRecordStateCell (const CSMWorld::IdTableBase *model,
|
||||||
|
const QModelIndex& index, const CSMWorld::UniversalId& id, bool writable, CSMDoc::Messages& messages) const
|
||||||
|
{
|
||||||
|
if (writable)
|
||||||
|
throw std::logic_error ("Record state can not be modified by search and replace");
|
||||||
|
|
||||||
|
int data = model->data (index).toInt();
|
||||||
|
|
||||||
|
if (data==mValue)
|
||||||
|
{
|
||||||
|
std::vector<std::string> states =
|
||||||
|
CSMWorld::Columns::getEnums (CSMWorld::Columns::ColumnId_Modification);
|
||||||
|
|
||||||
|
std::ostringstream message;
|
||||||
|
message << states.at (data);
|
||||||
|
|
||||||
|
std::ostringstream hint;
|
||||||
|
hint << "r: " << model->getColumnId (index.column());
|
||||||
|
|
||||||
|
messages.add (id, message.str(), hint.str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CSMTools::Search::formatDescription (const QString& description, int pos, int length) const
|
||||||
|
{
|
||||||
|
QString text (description);
|
||||||
|
|
||||||
|
// split
|
||||||
|
QString highlight = flatten (text.mid (pos, length));
|
||||||
|
QString before = flatten (mPaddingBefore>=pos ?
|
||||||
|
text.mid (0, pos) : text.mid (pos-mPaddingBefore, mPaddingBefore));
|
||||||
|
QString after = flatten (text.mid (pos+length, mPaddingAfter));
|
||||||
|
|
||||||
|
// compensate for Windows nonsense
|
||||||
|
text.remove ('\r');
|
||||||
|
|
||||||
|
// join
|
||||||
|
text = before + "<b>" + highlight + "</b>" + after;
|
||||||
|
|
||||||
|
// improve layout for single line display
|
||||||
|
text.replace ("\n", "<CR>");
|
||||||
|
text.replace ('\t', ' ');
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CSMTools::Search::flatten (const QString& text) const
|
||||||
|
{
|
||||||
|
QString flat (text);
|
||||||
|
|
||||||
|
flat.replace ("&", "&");
|
||||||
|
flat.replace ("<", "<");
|
||||||
|
|
||||||
|
return flat;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMTools::Search::Search() : mType (Type_None), mPaddingBefore (10), mPaddingAfter (10) {}
|
||||||
|
|
||||||
|
CSMTools::Search::Search (Type type, const std::string& value)
|
||||||
|
: mType (type), mText (value), mPaddingBefore (10), mPaddingAfter (10)
|
||||||
|
{
|
||||||
|
if (type!=Type_Text && type!=Type_Id)
|
||||||
|
throw std::logic_error ("Invalid search parameter (string)");
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMTools::Search::Search (Type type, const QRegExp& value)
|
||||||
|
: mType (type), mRegExp (value), mPaddingBefore (10), mPaddingAfter (10)
|
||||||
|
{
|
||||||
|
if (type!=Type_TextRegEx && type!=Type_IdRegEx)
|
||||||
|
throw std::logic_error ("Invalid search parameter (RegExp)");
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMTools::Search::Search (Type type, int value)
|
||||||
|
: mType (type), mValue (value), mPaddingBefore (10), mPaddingAfter (10)
|
||||||
|
{
|
||||||
|
if (type!=Type_RecordState)
|
||||||
|
throw std::logic_error ("invalid search parameter (int)");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Search::configure (const CSMWorld::IdTableBase *model)
|
||||||
|
{
|
||||||
|
mColumns.clear();
|
||||||
|
|
||||||
|
int columns = model->columnCount();
|
||||||
|
|
||||||
|
for (int i=0; i<columns; ++i)
|
||||||
|
{
|
||||||
|
CSMWorld::ColumnBase::Display display = static_cast<CSMWorld::ColumnBase::Display> (
|
||||||
|
model->headerData (
|
||||||
|
i, Qt::Horizontal, static_cast<int> (CSMWorld::ColumnBase::Role_Display)).toInt());
|
||||||
|
|
||||||
|
bool consider = false;
|
||||||
|
|
||||||
|
switch (mType)
|
||||||
|
{
|
||||||
|
case Type_Text:
|
||||||
|
case Type_TextRegEx:
|
||||||
|
|
||||||
|
if (CSMWorld::ColumnBase::isText (display) ||
|
||||||
|
CSMWorld::ColumnBase::isScript (display))
|
||||||
|
{
|
||||||
|
consider = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type_Id:
|
||||||
|
case Type_IdRegEx:
|
||||||
|
|
||||||
|
if (CSMWorld::ColumnBase::isId (display) ||
|
||||||
|
CSMWorld::ColumnBase::isScript (display))
|
||||||
|
{
|
||||||
|
consider = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type_RecordState:
|
||||||
|
|
||||||
|
if (display==CSMWorld::ColumnBase::Display_RecordState)
|
||||||
|
consider = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type_None:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (consider)
|
||||||
|
mColumns.insert (i);
|
||||||
|
}
|
||||||
|
|
||||||
|
mIdColumn = model->findColumnIndex (CSMWorld::Columns::ColumnId_Id);
|
||||||
|
mTypeColumn = model->findColumnIndex (CSMWorld::Columns::ColumnId_RecordType);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Search::searchRow (const CSMWorld::IdTableBase *model, int row,
|
||||||
|
CSMDoc::Messages& messages) const
|
||||||
|
{
|
||||||
|
for (std::set<int>::const_iterator iter (mColumns.begin()); iter!=mColumns.end(); ++iter)
|
||||||
|
{
|
||||||
|
QModelIndex index = model->index (row, *iter);
|
||||||
|
|
||||||
|
CSMWorld::UniversalId::Type type = static_cast<CSMWorld::UniversalId::Type> (
|
||||||
|
model->data (model->index (row, mTypeColumn)).toInt());
|
||||||
|
|
||||||
|
CSMWorld::UniversalId id (
|
||||||
|
type, model->data (model->index (row, mIdColumn)).toString().toUtf8().data());
|
||||||
|
|
||||||
|
bool writable = model->flags (index) & Qt::ItemIsEditable;
|
||||||
|
|
||||||
|
switch (mType)
|
||||||
|
{
|
||||||
|
case Type_Text:
|
||||||
|
case Type_Id:
|
||||||
|
|
||||||
|
searchTextCell (model, index, id, writable, messages);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type_TextRegEx:
|
||||||
|
case Type_IdRegEx:
|
||||||
|
|
||||||
|
searchRegExCell (model, index, id, writable, messages);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type_RecordState:
|
||||||
|
|
||||||
|
searchRecordStateCell (model, index, id, writable, messages);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Type_None:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Search::setPadding (int before, int after)
|
||||||
|
{
|
||||||
|
mPaddingBefore = before;
|
||||||
|
mPaddingAfter = after;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Search::replace (CSMDoc::Document& document, CSMWorld::IdTableBase *model,
|
||||||
|
const CSMWorld::UniversalId& id, const std::string& messageHint,
|
||||||
|
const std::string& replaceText) const
|
||||||
|
{
|
||||||
|
std::istringstream stream (messageHint.c_str());
|
||||||
|
|
||||||
|
char hint, ignore;
|
||||||
|
int columnId, pos, length;
|
||||||
|
|
||||||
|
if (stream >> hint >> ignore >> columnId >> pos >> length)
|
||||||
|
{
|
||||||
|
int column =
|
||||||
|
model->findColumnIndex (static_cast<CSMWorld::Columns::ColumnId> (columnId));
|
||||||
|
|
||||||
|
QModelIndex index = model->getModelIndex (id.getId(), column);
|
||||||
|
|
||||||
|
std::string text = model->data (index).toString().toUtf8().constData();
|
||||||
|
|
||||||
|
std::string before = text.substr (0, pos);
|
||||||
|
std::string after = text.substr (pos+length);
|
||||||
|
|
||||||
|
std::string newText = before + replaceText + after;
|
||||||
|
|
||||||
|
document.getUndoStack().push (
|
||||||
|
new CSMWorld::ModifyCommand (*model, index, QString::fromUtf8 (newText.c_str())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
96
apps/opencs/model/tools/search.hpp
Normal file
96
apps/opencs/model/tools/search.hpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#ifndef CSM_TOOLS_SEARCH_H
|
||||||
|
#define CSM_TOOLS_SEARCH_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
#include <QRegExp>
|
||||||
|
#include <QMetaType>
|
||||||
|
|
||||||
|
class QModelIndex;
|
||||||
|
|
||||||
|
namespace CSMDoc
|
||||||
|
{
|
||||||
|
class Messages;
|
||||||
|
class Document;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
class IdTableBase;
|
||||||
|
class UniversalId;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSMTools
|
||||||
|
{
|
||||||
|
class Search
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
enum Type
|
||||||
|
{
|
||||||
|
Type_Text = 0,
|
||||||
|
Type_TextRegEx = 1,
|
||||||
|
Type_Id = 2,
|
||||||
|
Type_IdRegEx = 3,
|
||||||
|
Type_RecordState = 4,
|
||||||
|
Type_None
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Type mType;
|
||||||
|
std::string mText;
|
||||||
|
QRegExp mRegExp;
|
||||||
|
int mValue;
|
||||||
|
std::set<int> mColumns;
|
||||||
|
int mIdColumn;
|
||||||
|
int mTypeColumn;
|
||||||
|
int mPaddingBefore;
|
||||||
|
int mPaddingAfter;
|
||||||
|
|
||||||
|
void searchTextCell (const CSMWorld::IdTableBase *model, const QModelIndex& index,
|
||||||
|
const CSMWorld::UniversalId& id, bool writable, CSMDoc::Messages& messages) const;
|
||||||
|
|
||||||
|
void searchRegExCell (const CSMWorld::IdTableBase *model, const QModelIndex& index,
|
||||||
|
const CSMWorld::UniversalId& id, bool writable, CSMDoc::Messages& messages) const;
|
||||||
|
|
||||||
|
void searchRecordStateCell (const CSMWorld::IdTableBase *model,
|
||||||
|
const QModelIndex& index, const CSMWorld::UniversalId& id, bool writable,
|
||||||
|
CSMDoc::Messages& messages) const;
|
||||||
|
|
||||||
|
QString formatDescription (const QString& description, int pos, int length) const;
|
||||||
|
|
||||||
|
QString flatten (const QString& text) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Search();
|
||||||
|
|
||||||
|
Search (Type type, const std::string& value);
|
||||||
|
|
||||||
|
Search (Type type, const QRegExp& value);
|
||||||
|
|
||||||
|
Search (Type type, int value);
|
||||||
|
|
||||||
|
// Configure search for the specified model.
|
||||||
|
void configure (const CSMWorld::IdTableBase *model);
|
||||||
|
|
||||||
|
// Search row in \a model and store results in \a messages.
|
||||||
|
//
|
||||||
|
// \attention *this needs to be configured for \a model.
|
||||||
|
void searchRow (const CSMWorld::IdTableBase *model, int row,
|
||||||
|
CSMDoc::Messages& messages) const;
|
||||||
|
|
||||||
|
void setPadding (int before, int after);
|
||||||
|
|
||||||
|
// Configuring *this for the model is not necessary when calling this function.
|
||||||
|
void replace (CSMDoc::Document& document, CSMWorld::IdTableBase *model,
|
||||||
|
const CSMWorld::UniversalId& id, const std::string& messageHint,
|
||||||
|
const std::string& replaceText) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_DECLARE_METATYPE (CSMTools::Search)
|
||||||
|
|
||||||
|
#endif
|
40
apps/opencs/model/tools/searchoperation.cpp
Normal file
40
apps/opencs/model/tools/searchoperation.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
#include "searchoperation.hpp"
|
||||||
|
|
||||||
|
#include "../doc/state.hpp"
|
||||||
|
#include "../doc/document.hpp"
|
||||||
|
|
||||||
|
#include "../world/data.hpp"
|
||||||
|
#include "../world/idtablebase.hpp"
|
||||||
|
|
||||||
|
#include "searchstage.hpp"
|
||||||
|
|
||||||
|
CSMTools::SearchOperation::SearchOperation (CSMDoc::Document& document)
|
||||||
|
: CSMDoc::Operation (CSMDoc::State_Searching, false)
|
||||||
|
{
|
||||||
|
std::vector<CSMWorld::UniversalId::Type> types = CSMWorld::UniversalId::listTypes (
|
||||||
|
CSMWorld::UniversalId::Class_RecordList |
|
||||||
|
CSMWorld::UniversalId::Class_ResourceList
|
||||||
|
);
|
||||||
|
|
||||||
|
for (std::vector<CSMWorld::UniversalId::Type>::const_iterator iter (types.begin());
|
||||||
|
iter!=types.end(); ++iter)
|
||||||
|
appendStage (new SearchStage (&dynamic_cast<CSMWorld::IdTableBase&> (
|
||||||
|
*document.getData().getTableModel (*iter))));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::SearchOperation::configure (const Search& search)
|
||||||
|
{
|
||||||
|
mSearch = search;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::SearchOperation::appendStage (SearchStage *stage)
|
||||||
|
{
|
||||||
|
CSMDoc::Operation::appendStage (stage);
|
||||||
|
stage->setOperation (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
const CSMTools::Search& CSMTools::SearchOperation::getSearch() const
|
||||||
|
{
|
||||||
|
return mSearch;
|
||||||
|
}
|
38
apps/opencs/model/tools/searchoperation.hpp
Normal file
38
apps/opencs/model/tools/searchoperation.hpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef CSM_TOOLS_SEARCHOPERATION_H
|
||||||
|
#define CSM_TOOLS_SEARCHOPERATION_H
|
||||||
|
|
||||||
|
#include "../doc/operation.hpp"
|
||||||
|
|
||||||
|
#include "search.hpp"
|
||||||
|
|
||||||
|
namespace CSMDoc
|
||||||
|
{
|
||||||
|
class Document;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSMTools
|
||||||
|
{
|
||||||
|
class SearchStage;
|
||||||
|
|
||||||
|
class SearchOperation : public CSMDoc::Operation
|
||||||
|
{
|
||||||
|
Search mSearch;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SearchOperation (CSMDoc::Document& document);
|
||||||
|
|
||||||
|
/// \attention Do not call this function while a search is running.
|
||||||
|
void configure (const Search& search);
|
||||||
|
|
||||||
|
void appendStage (SearchStage *stage);
|
||||||
|
///< The ownership of \a stage is transferred to *this.
|
||||||
|
///
|
||||||
|
/// \attention Do no call this function while this Operation is running.
|
||||||
|
|
||||||
|
const Search& getSearch() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
30
apps/opencs/model/tools/searchstage.cpp
Normal file
30
apps/opencs/model/tools/searchstage.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
#include "searchstage.hpp"
|
||||||
|
|
||||||
|
#include "../world/idtablebase.hpp"
|
||||||
|
|
||||||
|
#include "searchoperation.hpp"
|
||||||
|
|
||||||
|
CSMTools::SearchStage::SearchStage (const CSMWorld::IdTableBase *model)
|
||||||
|
: mModel (model), mOperation (0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
int CSMTools::SearchStage::setup()
|
||||||
|
{
|
||||||
|
if (mOperation)
|
||||||
|
mSearch = mOperation->getSearch();
|
||||||
|
|
||||||
|
mSearch.configure (mModel);
|
||||||
|
|
||||||
|
return mModel->rowCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::SearchStage::perform (int stage, CSMDoc::Messages& messages)
|
||||||
|
{
|
||||||
|
mSearch.searchRow (mModel, stage, messages);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::SearchStage::setOperation (const SearchOperation *operation)
|
||||||
|
{
|
||||||
|
mOperation = operation;
|
||||||
|
}
|
37
apps/opencs/model/tools/searchstage.hpp
Normal file
37
apps/opencs/model/tools/searchstage.hpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#ifndef CSM_TOOLS_SEARCHSTAGE_H
|
||||||
|
#define CSM_TOOLS_SEARCHSTAGE_H
|
||||||
|
|
||||||
|
#include "../doc/stage.hpp"
|
||||||
|
|
||||||
|
#include "search.hpp"
|
||||||
|
|
||||||
|
namespace CSMWorld
|
||||||
|
{
|
||||||
|
class IdTableBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSMTools
|
||||||
|
{
|
||||||
|
class SearchOperation;
|
||||||
|
|
||||||
|
class SearchStage : public CSMDoc::Stage
|
||||||
|
{
|
||||||
|
const CSMWorld::IdTableBase *mModel;
|
||||||
|
Search mSearch;
|
||||||
|
const SearchOperation *mOperation;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SearchStage (const CSMWorld::IdTableBase *model);
|
||||||
|
|
||||||
|
virtual int setup();
|
||||||
|
///< \return number of steps
|
||||||
|
|
||||||
|
virtual void perform (int stage, CSMDoc::Messages& messages);
|
||||||
|
///< Messages resulting from this stage will be appended to \a messages.
|
||||||
|
|
||||||
|
void setOperation (const SearchOperation *operation);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
31
apps/opencs/model/tools/startscriptcheck.cpp
Normal file
31
apps/opencs/model/tools/startscriptcheck.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
|
||||||
|
#include "startscriptcheck.hpp"
|
||||||
|
|
||||||
|
#include <components/misc/stringops.hpp>
|
||||||
|
|
||||||
|
CSMTools::StartScriptCheckStage::StartScriptCheckStage (
|
||||||
|
const CSMWorld::IdCollection<ESM::StartScript>& startScripts,
|
||||||
|
const CSMWorld::IdCollection<ESM::Script>& scripts)
|
||||||
|
: mStartScripts (startScripts), mScripts (scripts)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CSMTools::StartScriptCheckStage::perform(int stage, CSMDoc::Messages& messages)
|
||||||
|
{
|
||||||
|
const CSMWorld::Record<ESM::StartScript>& record = mStartScripts.getRecord (stage);
|
||||||
|
|
||||||
|
if (record.isDeleted())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string scriptId = record.get().mId;
|
||||||
|
|
||||||
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_StartScript, scriptId);
|
||||||
|
|
||||||
|
if (mScripts.searchId (Misc::StringUtils::lowerCase (scriptId))==-1)
|
||||||
|
messages.push_back (
|
||||||
|
std::make_pair (id, "Start script " + scriptId + " does not exist"));
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSMTools::StartScriptCheckStage::setup()
|
||||||
|
{
|
||||||
|
return mStartScripts.getSize();
|
||||||
|
}
|
28
apps/opencs/model/tools/startscriptcheck.hpp
Normal file
28
apps/opencs/model/tools/startscriptcheck.hpp
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef CSM_TOOLS_STARTSCRIPTCHECK_H
|
||||||
|
#define CSM_TOOLS_STARTSCRIPTCHECK_H
|
||||||
|
|
||||||
|
#include <components/esm/loadsscr.hpp>
|
||||||
|
#include <components/esm/loadscpt.hpp>
|
||||||
|
|
||||||
|
#include "../doc/stage.hpp"
|
||||||
|
|
||||||
|
#include "../world/idcollection.hpp"
|
||||||
|
|
||||||
|
namespace CSMTools
|
||||||
|
{
|
||||||
|
class StartScriptCheckStage : public CSMDoc::Stage
|
||||||
|
{
|
||||||
|
const CSMWorld::IdCollection<ESM::StartScript>& mStartScripts;
|
||||||
|
const CSMWorld::IdCollection<ESM::Script>& mScripts;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
StartScriptCheckStage (const CSMWorld::IdCollection<ESM::StartScript>& startScripts,
|
||||||
|
const CSMWorld::IdCollection<ESM::Script>& scripts);
|
||||||
|
|
||||||
|
virtual void perform(int stage, CSMDoc::Messages& messages);
|
||||||
|
virtual int setup();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -24,31 +24,34 @@
|
|||||||
#include "scriptcheck.hpp"
|
#include "scriptcheck.hpp"
|
||||||
#include "bodypartcheck.hpp"
|
#include "bodypartcheck.hpp"
|
||||||
#include "referencecheck.hpp"
|
#include "referencecheck.hpp"
|
||||||
|
#include "startscriptcheck.hpp"
|
||||||
|
#include "searchoperation.hpp"
|
||||||
|
|
||||||
CSMDoc::Operation *CSMTools::Tools::get (int type)
|
CSMDoc::OperationHolder *CSMTools::Tools::get (int type)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case CSMDoc::State_Verifying: return mVerifier;
|
case CSMDoc::State_Verifying: return &mVerifier;
|
||||||
|
case CSMDoc::State_Searching: return &mSearch;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const CSMDoc::Operation *CSMTools::Tools::get (int type) const
|
const CSMDoc::OperationHolder *CSMTools::Tools::get (int type) const
|
||||||
{
|
{
|
||||||
return const_cast<Tools *> (this)->get (type);
|
return const_cast<Tools *> (this)->get (type);
|
||||||
}
|
}
|
||||||
|
|
||||||
CSMDoc::Operation *CSMTools::Tools::getVerifier()
|
CSMDoc::OperationHolder *CSMTools::Tools::getVerifier()
|
||||||
{
|
{
|
||||||
if (!mVerifier)
|
if (!mVerifierOperation)
|
||||||
{
|
{
|
||||||
mVerifier = new CSMDoc::Operation (CSMDoc::State_Verifying, false);
|
mVerifierOperation = new CSMDoc::Operation (CSMDoc::State_Verifying, false);
|
||||||
|
|
||||||
connect (mVerifier, SIGNAL (progress (int, int, int)), this, SIGNAL (progress (int, int, int)));
|
connect (&mVerifier, SIGNAL (progress (int, int, int)), this, SIGNAL (progress (int, int, int)));
|
||||||
connect (mVerifier, SIGNAL (done (int, bool)), this, SIGNAL (done (int, bool)));
|
connect (&mVerifier, SIGNAL (done (int, bool)), this, SIGNAL (done (int, bool)));
|
||||||
connect (mVerifier,
|
connect (&mVerifier,
|
||||||
SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)),
|
SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)),
|
||||||
this, SLOT (verifierMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)));
|
this, SLOT (verifierMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)));
|
||||||
|
|
||||||
@ -59,53 +62,74 @@ CSMDoc::Operation *CSMTools::Tools::getVerifier()
|
|||||||
mandatoryIds.push_back ("Month");
|
mandatoryIds.push_back ("Month");
|
||||||
mandatoryIds.push_back ("PCRace");
|
mandatoryIds.push_back ("PCRace");
|
||||||
|
|
||||||
mVerifier->appendStage (new MandatoryIdStage (mData.getGlobals(),
|
mVerifierOperation->appendStage (new MandatoryIdStage (mData.getGlobals(),
|
||||||
CSMWorld::UniversalId (CSMWorld::UniversalId::Type_Globals), mandatoryIds));
|
CSMWorld::UniversalId (CSMWorld::UniversalId::Type_Globals), mandatoryIds));
|
||||||
|
|
||||||
mVerifier->appendStage (new SkillCheckStage (mData.getSkills()));
|
mVerifierOperation->appendStage (new SkillCheckStage (mData.getSkills()));
|
||||||
|
|
||||||
mVerifier->appendStage (new ClassCheckStage (mData.getClasses()));
|
mVerifierOperation->appendStage (new ClassCheckStage (mData.getClasses()));
|
||||||
|
|
||||||
mVerifier->appendStage (new FactionCheckStage (mData.getFactions()));
|
mVerifierOperation->appendStage (new FactionCheckStage (mData.getFactions()));
|
||||||
|
|
||||||
mVerifier->appendStage (new RaceCheckStage (mData.getRaces()));
|
mVerifierOperation->appendStage (new RaceCheckStage (mData.getRaces()));
|
||||||
|
|
||||||
mVerifier->appendStage (new SoundCheckStage (mData.getSounds()));
|
mVerifierOperation->appendStage (new SoundCheckStage (mData.getSounds()));
|
||||||
|
|
||||||
mVerifier->appendStage (new RegionCheckStage (mData.getRegions()));
|
mVerifierOperation->appendStage (new RegionCheckStage (mData.getRegions()));
|
||||||
|
|
||||||
mVerifier->appendStage (new BirthsignCheckStage (mData.getBirthsigns()));
|
mVerifierOperation->appendStage (new BirthsignCheckStage (mData.getBirthsigns()));
|
||||||
|
|
||||||
mVerifier->appendStage (new SpellCheckStage (mData.getSpells()));
|
mVerifierOperation->appendStage (new SpellCheckStage (mData.getSpells()));
|
||||||
|
|
||||||
mVerifier->appendStage (new ReferenceableCheckStage (mData.getReferenceables().getDataSet(), mData.getRaces(), mData.getClasses(), mData.getFactions()));
|
mVerifierOperation->appendStage (new ReferenceableCheckStage (mData.getReferenceables().getDataSet(), mData.getRaces(), mData.getClasses(), mData.getFactions()));
|
||||||
|
|
||||||
mVerifier->appendStage (new ReferenceCheckStage(mData.getReferences(), mData.getReferenceables(), mData.getCells(), mData.getFactions()));
|
mVerifierOperation->appendStage (new ReferenceCheckStage(mData.getReferences(), mData.getReferenceables(), mData.getCells(), mData.getFactions()));
|
||||||
|
|
||||||
mVerifier->appendStage (new ScriptCheckStage (mDocument));
|
mVerifierOperation->appendStage (new ScriptCheckStage (mDocument));
|
||||||
|
|
||||||
mVerifier->appendStage(
|
mVerifierOperation->appendStage (new StartScriptCheckStage (mData.getStartScripts(), mData.getScripts()));
|
||||||
|
|
||||||
|
mVerifierOperation->appendStage(
|
||||||
new BodyPartCheckStage(
|
new BodyPartCheckStage(
|
||||||
mData.getBodyParts(),
|
mData.getBodyParts(),
|
||||||
mData.getResources(
|
mData.getResources(
|
||||||
CSMWorld::UniversalId( CSMWorld::UniversalId::Type_Meshes )),
|
CSMWorld::UniversalId( CSMWorld::UniversalId::Type_Meshes )),
|
||||||
mData.getRaces() ));
|
mData.getRaces() ));
|
||||||
|
|
||||||
|
mVerifier.setOperation (mVerifierOperation);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mVerifier;
|
return &mVerifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSMTools::Tools::Tools (CSMDoc::Document& document)
|
CSMTools::Tools::Tools (CSMDoc::Document& document)
|
||||||
: mDocument (document), mData (document.getData()), mVerifier (0), mNextReportNumber (0)
|
: mDocument (document), mData (document.getData()), mVerifierOperation (0), mNextReportNumber (0),
|
||||||
|
mSearchOperation (0)
|
||||||
{
|
{
|
||||||
// index 0: load error log
|
// index 0: load error log
|
||||||
mReports.insert (std::make_pair (mNextReportNumber++, new ReportModel));
|
mReports.insert (std::make_pair (mNextReportNumber++, new ReportModel));
|
||||||
mActiveReports.insert (std::make_pair (CSMDoc::State_Loading, 0));
|
mActiveReports.insert (std::make_pair (CSMDoc::State_Loading, 0));
|
||||||
|
|
||||||
|
connect (&mSearch, SIGNAL (progress (int, int, int)), this, SIGNAL (progress (int, int, int)));
|
||||||
|
connect (&mSearch, SIGNAL (done (int, bool)), this, SIGNAL (done (int, bool)));
|
||||||
|
connect (&mSearch,
|
||||||
|
SIGNAL (reportMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)),
|
||||||
|
this, SLOT (verifierMessage (const CSMWorld::UniversalId&, const std::string&, const std::string&, int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
CSMTools::Tools::~Tools()
|
CSMTools::Tools::~Tools()
|
||||||
{
|
{
|
||||||
delete mVerifier;
|
if (mVerifierOperation)
|
||||||
|
{
|
||||||
|
mVerifier.abortAndWait();
|
||||||
|
delete mVerifierOperation;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mSearchOperation)
|
||||||
|
{
|
||||||
|
mSearch.abortAndWait();
|
||||||
|
delete mSearchOperation;
|
||||||
|
}
|
||||||
|
|
||||||
for (std::map<int, ReportModel *>::iterator iter (mReports.begin()); iter!=mReports.end(); ++iter)
|
for (std::map<int, ReportModel *>::iterator iter (mReports.begin()); iter!=mReports.end(); ++iter)
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
@ -121,9 +145,31 @@ CSMWorld::UniversalId CSMTools::Tools::runVerifier()
|
|||||||
return CSMWorld::UniversalId (CSMWorld::UniversalId::Type_VerificationResults, mNextReportNumber-1);
|
return CSMWorld::UniversalId (CSMWorld::UniversalId::Type_VerificationResults, mNextReportNumber-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CSMWorld::UniversalId CSMTools::Tools::newSearch()
|
||||||
|
{
|
||||||
|
mReports.insert (std::make_pair (mNextReportNumber++, new ReportModel (true)));
|
||||||
|
|
||||||
|
return CSMWorld::UniversalId (CSMWorld::UniversalId::Type_Search, mNextReportNumber-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSMTools::Tools::runSearch (const CSMWorld::UniversalId& searchId, const Search& search)
|
||||||
|
{
|
||||||
|
mActiveReports[CSMDoc::State_Searching] = searchId.getIndex();
|
||||||
|
|
||||||
|
if (!mSearchOperation)
|
||||||
|
{
|
||||||
|
mSearchOperation = new SearchOperation (mDocument);
|
||||||
|
mSearch.setOperation (mSearchOperation);
|
||||||
|
}
|
||||||
|
|
||||||
|
mSearchOperation->configure (search);
|
||||||
|
|
||||||
|
mSearch.start();
|
||||||
|
}
|
||||||
|
|
||||||
void CSMTools::Tools::abortOperation (int type)
|
void CSMTools::Tools::abortOperation (int type)
|
||||||
{
|
{
|
||||||
if (CSMDoc::Operation *operation = get (type))
|
if (CSMDoc::OperationHolder *operation = get (type))
|
||||||
operation->abort();
|
operation->abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,13 +178,14 @@ int CSMTools::Tools::getRunningOperations() const
|
|||||||
static const int sOperations[] =
|
static const int sOperations[] =
|
||||||
{
|
{
|
||||||
CSMDoc::State_Verifying,
|
CSMDoc::State_Verifying,
|
||||||
|
CSMDoc::State_Searching,
|
||||||
-1
|
-1
|
||||||
};
|
};
|
||||||
|
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
for (int i=0; sOperations[i]!=-1; ++i)
|
for (int i=0; sOperations[i]!=-1; ++i)
|
||||||
if (const CSMDoc::Operation *operation = get (sOperations[i]))
|
if (const CSMDoc::OperationHolder *operation = get (sOperations[i]))
|
||||||
if (operation->isRunning())
|
if (operation->isRunning())
|
||||||
result |= sOperations[i];
|
result |= sOperations[i];
|
||||||
|
|
||||||
@ -148,7 +195,8 @@ int CSMTools::Tools::getRunningOperations() const
|
|||||||
CSMTools::ReportModel *CSMTools::Tools::getReport (const CSMWorld::UniversalId& id)
|
CSMTools::ReportModel *CSMTools::Tools::getReport (const CSMWorld::UniversalId& id)
|
||||||
{
|
{
|
||||||
if (id.getType()!=CSMWorld::UniversalId::Type_VerificationResults &&
|
if (id.getType()!=CSMWorld::UniversalId::Type_VerificationResults &&
|
||||||
id.getType()!=CSMWorld::UniversalId::Type_LoadErrorLog)
|
id.getType()!=CSMWorld::UniversalId::Type_LoadErrorLog &&
|
||||||
|
id.getType()!=CSMWorld::UniversalId::Type_Search)
|
||||||
throw std::logic_error ("invalid request for report model: " + id.toString());
|
throw std::logic_error ("invalid request for report model: " + id.toString());
|
||||||
|
|
||||||
return mReports.at (id.getIndex());
|
return mReports.at (id.getIndex());
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include "../doc/operationholder.hpp"
|
||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
class Data;
|
class Data;
|
||||||
@ -20,6 +22,8 @@ namespace CSMDoc
|
|||||||
namespace CSMTools
|
namespace CSMTools
|
||||||
{
|
{
|
||||||
class ReportModel;
|
class ReportModel;
|
||||||
|
class Search;
|
||||||
|
class SearchOperation;
|
||||||
|
|
||||||
class Tools : public QObject
|
class Tools : public QObject
|
||||||
{
|
{
|
||||||
@ -27,7 +31,10 @@ namespace CSMTools
|
|||||||
|
|
||||||
CSMDoc::Document& mDocument;
|
CSMDoc::Document& mDocument;
|
||||||
CSMWorld::Data& mData;
|
CSMWorld::Data& mData;
|
||||||
CSMDoc::Operation *mVerifier;
|
CSMDoc::Operation *mVerifierOperation;
|
||||||
|
CSMDoc::OperationHolder mVerifier;
|
||||||
|
SearchOperation *mSearchOperation;
|
||||||
|
CSMDoc::OperationHolder mSearch;
|
||||||
std::map<int, ReportModel *> mReports;
|
std::map<int, ReportModel *> mReports;
|
||||||
int mNextReportNumber;
|
int mNextReportNumber;
|
||||||
std::map<int, int> mActiveReports; // type, report number
|
std::map<int, int> mActiveReports; // type, report number
|
||||||
@ -36,12 +43,12 @@ namespace CSMTools
|
|||||||
Tools (const Tools&);
|
Tools (const Tools&);
|
||||||
Tools& operator= (const Tools&);
|
Tools& operator= (const Tools&);
|
||||||
|
|
||||||
CSMDoc::Operation *getVerifier();
|
CSMDoc::OperationHolder *getVerifier();
|
||||||
|
|
||||||
CSMDoc::Operation *get (int type);
|
CSMDoc::OperationHolder *get (int type);
|
||||||
///< Returns a 0-pointer, if operation hasn't been used yet.
|
///< Returns a 0-pointer, if operation hasn't been used yet.
|
||||||
|
|
||||||
const CSMDoc::Operation *get (int type) const;
|
const CSMDoc::OperationHolder *get (int type) const;
|
||||||
///< Returns a 0-pointer, if operation hasn't been used yet.
|
///< Returns a 0-pointer, if operation hasn't been used yet.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -53,6 +60,11 @@ namespace CSMTools
|
|||||||
CSMWorld::UniversalId runVerifier();
|
CSMWorld::UniversalId runVerifier();
|
||||||
///< \return ID of the report for this verification run
|
///< \return ID of the report for this verification run
|
||||||
|
|
||||||
|
/// Return ID of the report for this search.
|
||||||
|
CSMWorld::UniversalId newSearch();
|
||||||
|
|
||||||
|
void runSearch (const CSMWorld::UniversalId& searchId, const Search& search);
|
||||||
|
|
||||||
void abortOperation (int type);
|
void abortOperation (int type);
|
||||||
///< \attention The operation is not aborted immediately.
|
///< \attention The operation is not aborted immediately.
|
||||||
|
|
||||||
|
@ -19,7 +19,80 @@ std::string CSMWorld::ColumnBase::getTitle() const
|
|||||||
return Columns::getName (static_cast<Columns::ColumnId> (mColumnId));
|
return Columns::getName (static_cast<Columns::ColumnId> (mColumnId));
|
||||||
}
|
}
|
||||||
|
|
||||||
int CSMWorld::ColumnBase::getId() const
|
int CSMWorld::ColumnBase::getId() const
|
||||||
{
|
{
|
||||||
return mColumnId;
|
return mColumnId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CSMWorld::ColumnBase::isId (Display display)
|
||||||
|
{
|
||||||
|
static const Display ids[] =
|
||||||
|
{
|
||||||
|
Display_Skill,
|
||||||
|
Display_Class,
|
||||||
|
Display_Faction,
|
||||||
|
Display_Race,
|
||||||
|
Display_Sound,
|
||||||
|
Display_Region,
|
||||||
|
Display_Birthsign,
|
||||||
|
Display_Spell,
|
||||||
|
Display_Cell,
|
||||||
|
Display_Referenceable,
|
||||||
|
Display_Activator,
|
||||||
|
Display_Potion,
|
||||||
|
Display_Apparatus,
|
||||||
|
Display_Armor,
|
||||||
|
Display_Book,
|
||||||
|
Display_Clothing,
|
||||||
|
Display_Container,
|
||||||
|
Display_Creature,
|
||||||
|
Display_Door,
|
||||||
|
Display_Ingredient,
|
||||||
|
Display_CreatureLevelledList,
|
||||||
|
Display_ItemLevelledList,
|
||||||
|
Display_Light,
|
||||||
|
Display_Lockpick,
|
||||||
|
Display_Miscellaneous,
|
||||||
|
Display_Npc,
|
||||||
|
Display_Probe,
|
||||||
|
Display_Repair,
|
||||||
|
Display_Static,
|
||||||
|
Display_Weapon,
|
||||||
|
Display_Reference,
|
||||||
|
Display_Filter,
|
||||||
|
Display_Topic,
|
||||||
|
Display_Journal,
|
||||||
|
Display_TopicInfo,
|
||||||
|
Display_JournalInfo,
|
||||||
|
Display_Scene,
|
||||||
|
Display_GlobalVariable,
|
||||||
|
Display_Script,
|
||||||
|
|
||||||
|
Display_Mesh,
|
||||||
|
Display_Icon,
|
||||||
|
Display_Music,
|
||||||
|
Display_SoundRes,
|
||||||
|
Display_Texture,
|
||||||
|
Display_Video,
|
||||||
|
|
||||||
|
Display_Id,
|
||||||
|
|
||||||
|
Display_None
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i=0; ids[i]!=Display_None; ++i)
|
||||||
|
if (ids[i]==display)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSMWorld::ColumnBase::isText (Display display)
|
||||||
|
{
|
||||||
|
return display==Display_String || display==Display_LongString;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSMWorld::ColumnBase::isScript (Display display)
|
||||||
|
{
|
||||||
|
return display==Display_ScriptFile || display==Display_ScriptLines;
|
||||||
|
}
|
||||||
|
@ -101,9 +101,11 @@ namespace CSMWorld
|
|||||||
Display_Texture,
|
Display_Texture,
|
||||||
Display_Video,
|
Display_Video,
|
||||||
Display_Colour,
|
Display_Colour,
|
||||||
|
Display_ScriptFile,
|
||||||
Display_ScriptLines, // console context
|
Display_ScriptLines, // console context
|
||||||
Display_SoundGeneratorType,
|
Display_SoundGeneratorType,
|
||||||
Display_School
|
Display_School,
|
||||||
|
Display_Id
|
||||||
};
|
};
|
||||||
|
|
||||||
int mColumnId;
|
int mColumnId;
|
||||||
@ -122,6 +124,12 @@ namespace CSMWorld
|
|||||||
virtual std::string getTitle() const;
|
virtual std::string getTitle() const;
|
||||||
|
|
||||||
virtual int getId() const;
|
virtual int getId() const;
|
||||||
|
|
||||||
|
static bool isId (Display display);
|
||||||
|
|
||||||
|
static bool isText (Display display);
|
||||||
|
|
||||||
|
static bool isScript (Display display);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename ESXRecordT>
|
template<typename ESXRecordT>
|
||||||
|
@ -43,7 +43,7 @@ namespace CSMWorld
|
|||||||
struct StringIdColumn : public Column<ESXRecordT>
|
struct StringIdColumn : public Column<ESXRecordT>
|
||||||
{
|
{
|
||||||
StringIdColumn (bool hidden = false)
|
StringIdColumn (bool hidden = false)
|
||||||
: Column<ESXRecordT> (Columns::ColumnId_Id, ColumnBase::Display_String,
|
: Column<ESXRecordT> (Columns::ColumnId_Id, ColumnBase::Display_Id,
|
||||||
hidden ? 0 : ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue)
|
hidden ? 0 : ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -818,7 +818,7 @@ namespace CSMWorld
|
|||||||
|
|
||||||
ScriptColumn (Type type)
|
ScriptColumn (Type type)
|
||||||
: Column<ESXRecordT> (Columns::ColumnId_ScriptText,
|
: Column<ESXRecordT> (Columns::ColumnId_ScriptText,
|
||||||
type==Type_File ? ColumnBase::Display_Script : ColumnBase::Display_ScriptLines,
|
type==Type_File ? ColumnBase::Display_ScriptFile : ColumnBase::Display_ScriptLines,
|
||||||
type==Type_File ? 0 : ColumnBase::Flag_Dialogue)
|
type==Type_File ? 0 : ColumnBase::Flag_Dialogue)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ namespace CSMWorld
|
|||||||
{
|
{
|
||||||
class IdTable;
|
class IdTable;
|
||||||
class IdTable;
|
class IdTable;
|
||||||
class RecordBase;
|
struct RecordBase;
|
||||||
|
|
||||||
class ModifyCommand : public QUndoCommand
|
class ModifyCommand : public QUndoCommand
|
||||||
{
|
{
|
||||||
|
@ -254,6 +254,10 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
mPathgrids.addColumn (new RecordStateColumn<Pathgrid>);
|
mPathgrids.addColumn (new RecordStateColumn<Pathgrid>);
|
||||||
mPathgrids.addColumn (new FixedRecordTypeColumn<Pathgrid> (UniversalId::Type_Pathgrid));
|
mPathgrids.addColumn (new FixedRecordTypeColumn<Pathgrid> (UniversalId::Type_Pathgrid));
|
||||||
|
|
||||||
|
mStartScripts.addColumn (new StringIdColumn<ESM::StartScript>);
|
||||||
|
mStartScripts.addColumn (new RecordStateColumn<ESM::StartScript>);
|
||||||
|
mStartScripts.addColumn (new FixedRecordTypeColumn<ESM::StartScript> (UniversalId::Type_StartScript));
|
||||||
|
|
||||||
mRefs.addColumn (new StringIdColumn<CellRef> (true));
|
mRefs.addColumn (new StringIdColumn<CellRef> (true));
|
||||||
mRefs.addColumn (new RecordStateColumn<CellRef>);
|
mRefs.addColumn (new RecordStateColumn<CellRef>);
|
||||||
mRefs.addColumn (new FixedRecordTypeColumn<CellRef> (UniversalId::Type_Reference));
|
mRefs.addColumn (new FixedRecordTypeColumn<CellRef> (UniversalId::Type_Reference));
|
||||||
@ -327,6 +331,7 @@ CSMWorld::Data::Data (ToUTF8::FromType encoding, const ResourcesManager& resourc
|
|||||||
addModel (new IdTable (&mSoundGens), UniversalId::Type_SoundGen);
|
addModel (new IdTable (&mSoundGens), UniversalId::Type_SoundGen);
|
||||||
addModel (new IdTable (&mMagicEffects), UniversalId::Type_MagicEffect);
|
addModel (new IdTable (&mMagicEffects), UniversalId::Type_MagicEffect);
|
||||||
addModel (new IdTable (&mPathgrids), UniversalId::Type_Pathgrid);
|
addModel (new IdTable (&mPathgrids), UniversalId::Type_Pathgrid);
|
||||||
|
addModel (new IdTable (&mStartScripts), UniversalId::Type_StartScript);
|
||||||
addModel (new IdTable (&mReferenceables, IdTable::Feature_Preview),
|
addModel (new IdTable (&mReferenceables, IdTable::Feature_Preview),
|
||||||
UniversalId::Type_Referenceable);
|
UniversalId::Type_Referenceable);
|
||||||
addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference);
|
addModel (new IdTable (&mRefs, IdTable::Feature_ViewCell | IdTable::Feature_Preview), UniversalId::Type_Reference);
|
||||||
@ -615,6 +620,16 @@ CSMWorld::SubCellCollection<CSMWorld::Pathgrid>& CSMWorld::Data::getPathgrids()
|
|||||||
return mPathgrids;
|
return mPathgrids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CSMWorld::IdCollection<ESM::StartScript>& CSMWorld::Data::getStartScripts() const
|
||||||
|
{
|
||||||
|
return mStartScripts;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMWorld::IdCollection<ESM::StartScript>& CSMWorld::Data::getStartScripts()
|
||||||
|
{
|
||||||
|
return mStartScripts;
|
||||||
|
}
|
||||||
|
|
||||||
const CSMWorld::Resources& CSMWorld::Data::getResources (const UniversalId& id) const
|
const CSMWorld::Resources& CSMWorld::Data::getResources (const UniversalId& id) const
|
||||||
{
|
{
|
||||||
return mResourcesManager.get (id.getType());
|
return mResourcesManager.get (id.getType());
|
||||||
@ -719,6 +734,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
|||||||
case ESM::REC_SNDG: mSoundGens.load (*mReader, mBase); break;
|
case ESM::REC_SNDG: mSoundGens.load (*mReader, mBase); break;
|
||||||
case ESM::REC_MGEF: mMagicEffects.load (*mReader, mBase); break;
|
case ESM::REC_MGEF: mMagicEffects.load (*mReader, mBase); break;
|
||||||
case ESM::REC_PGRD: mPathgrids.load (*mReader, mBase); break;
|
case ESM::REC_PGRD: mPathgrids.load (*mReader, mBase); break;
|
||||||
|
case ESM::REC_SSCR: mStartScripts.load (*mReader, mBase); break;
|
||||||
|
|
||||||
case ESM::REC_LTEX: mLandTextures.load (*mReader, mBase); break;
|
case ESM::REC_LTEX: mLandTextures.load (*mReader, mBase); break;
|
||||||
|
|
||||||
@ -729,7 +745,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages)
|
|||||||
if (index!=-1 && !mBase)
|
if (index!=-1 && !mBase)
|
||||||
mLand.getRecord (index).mModified.mLand->loadData (
|
mLand.getRecord (index).mModified.mLand->loadData (
|
||||||
ESM::Land::DATA_VHGT | ESM::Land::DATA_VNML | ESM::Land::DATA_VCLR |
|
ESM::Land::DATA_VHGT | ESM::Land::DATA_VNML | ESM::Land::DATA_VCLR |
|
||||||
ESM::Land::DATA_VTEX);
|
ESM::Land::DATA_VTEX | ESM::Land::DATA_WNAM);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <components/esm/loadbody.hpp>
|
#include <components/esm/loadbody.hpp>
|
||||||
#include <components/esm/loadsndg.hpp>
|
#include <components/esm/loadsndg.hpp>
|
||||||
#include <components/esm/loadmgef.hpp>
|
#include <components/esm/loadmgef.hpp>
|
||||||
|
#include <components/esm/loadsscr.hpp>
|
||||||
#include <components/esm/debugprofile.hpp>
|
#include <components/esm/debugprofile.hpp>
|
||||||
#include <components/esm/filter.hpp>
|
#include <components/esm/filter.hpp>
|
||||||
|
|
||||||
@ -80,6 +81,7 @@ namespace CSMWorld
|
|||||||
SubCellCollection<Pathgrid> mPathgrids;
|
SubCellCollection<Pathgrid> mPathgrids;
|
||||||
IdCollection<ESM::DebugProfile> mDebugProfiles;
|
IdCollection<ESM::DebugProfile> mDebugProfiles;
|
||||||
IdCollection<ESM::SoundGenerator> mSoundGens;
|
IdCollection<ESM::SoundGenerator> mSoundGens;
|
||||||
|
IdCollection<ESM::StartScript> mStartScripts;
|
||||||
InfoCollection mTopicInfos;
|
InfoCollection mTopicInfos;
|
||||||
InfoCollection mJournalInfos;
|
InfoCollection mJournalInfos;
|
||||||
IdCollection<Cell> mCells;
|
IdCollection<Cell> mCells;
|
||||||
@ -225,6 +227,10 @@ namespace CSMWorld
|
|||||||
|
|
||||||
SubCellCollection<Pathgrid>& getPathgrids();
|
SubCellCollection<Pathgrid>& getPathgrids();
|
||||||
|
|
||||||
|
const IdCollection<ESM::StartScript>& getStartScripts() const;
|
||||||
|
|
||||||
|
IdCollection<ESM::StartScript>& getStartScripts();
|
||||||
|
|
||||||
/// Throws an exception, if \a id does not match a resources list.
|
/// Throws an exception, if \a id does not match a resources list.
|
||||||
const Resources& getResources (const UniversalId& id) const;
|
const Resources& getResources (const UniversalId& id) const;
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
class CollectionBase;
|
class CollectionBase;
|
||||||
class RecordBase;
|
struct RecordBase;
|
||||||
|
|
||||||
class IdTable : public IdTableBase
|
class IdTable : public IdTableBase
|
||||||
{
|
{
|
||||||
@ -82,7 +82,7 @@ namespace CSMWorld
|
|||||||
/// Is \a id flagged as deleted?
|
/// Is \a id flagged as deleted?
|
||||||
virtual bool isDeleted (const std::string& id) const;
|
virtual bool isDeleted (const std::string& id) const;
|
||||||
|
|
||||||
int getColumnId(int column) const;
|
virtual int getColumnId(int column) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,6 +60,8 @@ namespace CSMWorld
|
|||||||
/// Is \a id flagged as deleted?
|
/// Is \a id flagged as deleted?
|
||||||
virtual bool isDeleted (const std::string& id) const = 0;
|
virtual bool isDeleted (const std::string& id) const = 0;
|
||||||
|
|
||||||
|
virtual int getColumnId (int column) const = 0;
|
||||||
|
|
||||||
unsigned int getFeatures() const;
|
unsigned int getFeatures() const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ void CSMWorld::InfoCollection::load (const Info& record, bool base)
|
|||||||
|
|
||||||
if (!record2.get().mPrev.empty())
|
if (!record2.get().mPrev.empty())
|
||||||
{
|
{
|
||||||
index = getIndex (record2.get().mPrev, topic);
|
index = getInfoIndex (record2.get().mPrev, topic);
|
||||||
|
|
||||||
if (index!=-1)
|
if (index!=-1)
|
||||||
++index;
|
++index;
|
||||||
@ -34,7 +34,7 @@ void CSMWorld::InfoCollection::load (const Info& record, bool base)
|
|||||||
|
|
||||||
if (index==-1 && !record2.get().mNext.empty())
|
if (index==-1 && !record2.get().mNext.empty())
|
||||||
{
|
{
|
||||||
index = getIndex (record2.get().mNext, topic);
|
index = getInfoIndex (record2.get().mNext, topic);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (index==-1)
|
if (index==-1)
|
||||||
@ -60,7 +60,7 @@ void CSMWorld::InfoCollection::load (const Info& record, bool base)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int CSMWorld::InfoCollection::getIndex (const std::string& id, const std::string& topic) const
|
int CSMWorld::InfoCollection::getInfoIndex (const std::string& id, const std::string& topic) const
|
||||||
{
|
{
|
||||||
std::string fullId = Misc::StringUtils::lowerCase (topic) + "#" + id;
|
std::string fullId = Misc::StringUtils::lowerCase (topic) + "#" + id;
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace ESM
|
namespace ESM
|
||||||
{
|
{
|
||||||
class Dialogue;
|
struct Dialogue;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
@ -22,7 +22,7 @@ namespace CSMWorld
|
|||||||
|
|
||||||
void load (const Info& record, bool base);
|
void load (const Info& record, bool base);
|
||||||
|
|
||||||
int getIndex (const std::string& id, const std::string& topic) const;
|
int getInfoIndex (const std::string& id, const std::string& topic) const;
|
||||||
///< Return index for record \a id or -1 (if not present; deleted records are considered)
|
///< Return index for record \a id or -1 (if not present; deleted records are considered)
|
||||||
///
|
///
|
||||||
/// \param id info ID without topic prefix
|
/// \param id info ID without topic prefix
|
||||||
|
@ -22,6 +22,8 @@ namespace CSMWorld
|
|||||||
|
|
||||||
virtual RecordBase *clone() const = 0;
|
virtual RecordBase *clone() const = 0;
|
||||||
|
|
||||||
|
virtual RecordBase *modifiedCopy() const = 0;
|
||||||
|
|
||||||
virtual void assign (const RecordBase& record) = 0;
|
virtual void assign (const RecordBase& record) = 0;
|
||||||
///< Will throw an exception if the types don't match.
|
///< Will throw an exception if the types don't match.
|
||||||
|
|
||||||
@ -38,8 +40,15 @@ namespace CSMWorld
|
|||||||
ESXRecordT mBase;
|
ESXRecordT mBase;
|
||||||
ESXRecordT mModified;
|
ESXRecordT mModified;
|
||||||
|
|
||||||
|
Record();
|
||||||
|
|
||||||
|
Record(State state,
|
||||||
|
const ESXRecordT *base = 0, const ESXRecordT *modified = 0);
|
||||||
|
|
||||||
virtual RecordBase *clone() const;
|
virtual RecordBase *clone() const;
|
||||||
|
|
||||||
|
virtual RecordBase *modifiedCopy() const;
|
||||||
|
|
||||||
virtual void assign (const RecordBase& record);
|
virtual void assign (const RecordBase& record);
|
||||||
|
|
||||||
const ESXRecordT& get() const;
|
const ESXRecordT& get() const;
|
||||||
@ -58,6 +67,29 @@ namespace CSMWorld
|
|||||||
///< Merge modified into base.
|
///< Merge modified into base.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename ESXRecordT>
|
||||||
|
Record<ESXRecordT>::Record()
|
||||||
|
: mBase(), mModified()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
template <typename ESXRecordT>
|
||||||
|
Record<ESXRecordT>::Record(State state, const ESXRecordT *base, const ESXRecordT *modified)
|
||||||
|
{
|
||||||
|
if(base)
|
||||||
|
mBase = *base;
|
||||||
|
|
||||||
|
if(modified)
|
||||||
|
mModified = *modified;
|
||||||
|
|
||||||
|
this->mState = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename ESXRecordT>
|
||||||
|
RecordBase *Record<ESXRecordT>::modifiedCopy() const
|
||||||
|
{
|
||||||
|
return new Record<ESXRecordT> (State_ModifiedOnly, 0, &(this->get()));
|
||||||
|
}
|
||||||
|
|
||||||
template <typename ESXRecordT>
|
template <typename ESXRecordT>
|
||||||
RecordBase *Record<ESXRecordT>::clone() const
|
RecordBase *Record<ESXRecordT>::clone() const
|
||||||
{
|
{
|
||||||
|
@ -5,8 +5,6 @@
|
|||||||
|
|
||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
class Cell;
|
|
||||||
|
|
||||||
/// \brief Wrapper for CellRef sub record
|
/// \brief Wrapper for CellRef sub record
|
||||||
struct CellRef : public ESM::CellRef
|
struct CellRef : public ESM::CellRef
|
||||||
{
|
{
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
struct Cell;
|
struct Cell;
|
||||||
struct UniversalId;
|
class UniversalId;
|
||||||
|
|
||||||
/// \brief References in cells
|
/// \brief References in cells
|
||||||
class RefCollection : public Collection<CellRef>
|
class RefCollection : public Collection<CellRef>
|
||||||
|
@ -9,7 +9,7 @@ namespace CSMWorld
|
|||||||
{
|
{
|
||||||
class RefIdColumn;
|
class RefIdColumn;
|
||||||
class RefIdData;
|
class RefIdData;
|
||||||
class RecordBase;
|
struct RecordBase;
|
||||||
|
|
||||||
class RefIdAdapter
|
class RefIdAdapter
|
||||||
{
|
{
|
||||||
|
@ -156,10 +156,16 @@ namespace CSMWorld
|
|||||||
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
||||||
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
||||||
|
|
||||||
|
RecordT record2 = record.get();
|
||||||
if (column==mModel.mModel)
|
if (column==mModel.mModel)
|
||||||
record.get().mModel = value.toString().toUtf8().constData();
|
record2.mModel = value.toString().toUtf8().constData();
|
||||||
else
|
else
|
||||||
|
{
|
||||||
BaseRefIdAdapter<RecordT>::setData (column, data, index, value);
|
BaseRefIdAdapter<RecordT>::setData (column, data, index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified(record2);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NameColumns : public ModelColumns
|
struct NameColumns : public ModelColumns
|
||||||
@ -216,12 +222,18 @@ namespace CSMWorld
|
|||||||
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
||||||
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
||||||
|
|
||||||
|
RecordT record2 = record.get();
|
||||||
if (column==mName.mName)
|
if (column==mName.mName)
|
||||||
record.get().mName = value.toString().toUtf8().constData();
|
record2.mName = value.toString().toUtf8().constData();
|
||||||
else if (column==mName.mScript)
|
else if (column==mName.mScript)
|
||||||
record.get().mScript = value.toString().toUtf8().constData();
|
record2.mScript = value.toString().toUtf8().constData();
|
||||||
else
|
else
|
||||||
|
{
|
||||||
ModelRefIdAdapter<RecordT>::setData (column, data, index, value);
|
ModelRefIdAdapter<RecordT>::setData (column, data, index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified(record2);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InventoryColumns : public NameColumns
|
struct InventoryColumns : public NameColumns
|
||||||
@ -283,14 +295,20 @@ namespace CSMWorld
|
|||||||
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
||||||
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
||||||
|
|
||||||
|
RecordT record2 = record.get();
|
||||||
if (column==mInventory.mIcon)
|
if (column==mInventory.mIcon)
|
||||||
record.get().mIcon = value.toString().toUtf8().constData();
|
record2.mIcon = value.toString().toUtf8().constData();
|
||||||
else if (column==mInventory.mWeight)
|
else if (column==mInventory.mWeight)
|
||||||
record.get().mData.mWeight = value.toFloat();
|
record2.mData.mWeight = value.toFloat();
|
||||||
else if (column==mInventory.mValue)
|
else if (column==mInventory.mValue)
|
||||||
record.get().mData.mValue = value.toInt();
|
record2.mData.mValue = value.toInt();
|
||||||
else
|
else
|
||||||
|
{
|
||||||
NameRefIdAdapter<RecordT>::setData (column, data, index, value);
|
NameRefIdAdapter<RecordT>::setData (column, data, index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified(record2);
|
||||||
}
|
}
|
||||||
|
|
||||||
class PotionRefIdAdapter : public InventoryRefIdAdapter<ESM::Potion>
|
class PotionRefIdAdapter : public InventoryRefIdAdapter<ESM::Potion>
|
||||||
@ -364,12 +382,18 @@ namespace CSMWorld
|
|||||||
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
||||||
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
||||||
|
|
||||||
|
RecordT record2 = record.get();
|
||||||
if (column==mEnchantable.mEnchantment)
|
if (column==mEnchantable.mEnchantment)
|
||||||
record.get().mEnchant = value.toString().toUtf8().constData();
|
record2.mEnchant = value.toString().toUtf8().constData();
|
||||||
else if (column==mEnchantable.mEnchantmentPoints)
|
else if (column==mEnchantable.mEnchantmentPoints)
|
||||||
record.get().mData.mEnchant = value.toInt();
|
record2.mData.mEnchant = value.toInt();
|
||||||
else
|
else
|
||||||
|
{
|
||||||
InventoryRefIdAdapter<RecordT>::setData (column, data, index, value);
|
InventoryRefIdAdapter<RecordT>::setData (column, data, index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified(record2);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ToolColumns : public InventoryColumns
|
struct ToolColumns : public InventoryColumns
|
||||||
@ -426,12 +450,18 @@ namespace CSMWorld
|
|||||||
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
||||||
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
||||||
|
|
||||||
|
RecordT record2 = record.get();
|
||||||
if (column==mTools.mQuality)
|
if (column==mTools.mQuality)
|
||||||
record.get().mData.mQuality = value.toFloat();
|
record2.mData.mQuality = value.toFloat();
|
||||||
else if (column==mTools.mUses)
|
else if (column==mTools.mUses)
|
||||||
record.get().mData.mUses = value.toInt();
|
record2.mData.mUses = value.toInt();
|
||||||
else
|
else
|
||||||
|
{
|
||||||
InventoryRefIdAdapter<RecordT>::setData (column, data, index, value);
|
InventoryRefIdAdapter<RecordT>::setData (column, data, index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
record.setModified(record2);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ActorColumns : public NameColumns
|
struct ActorColumns : public NameColumns
|
||||||
@ -508,16 +538,17 @@ namespace CSMWorld
|
|||||||
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
Record<RecordT>& record = static_cast<Record<RecordT>&> (
|
||||||
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
data.getRecord (RefIdData::LocalIndex (index, BaseRefIdAdapter<RecordT>::getType())));
|
||||||
|
|
||||||
|
RecordT record2 = record.get();
|
||||||
if (column==mActors.mHasAi)
|
if (column==mActors.mHasAi)
|
||||||
record.get().mHasAI = value.toInt();
|
record2.mHasAI = value.toInt();
|
||||||
else if (column==mActors.mHello)
|
else if (column==mActors.mHello)
|
||||||
record.get().mAiData.mHello = value.toInt();
|
record2.mAiData.mHello = value.toInt();
|
||||||
else if (column==mActors.mFlee)
|
else if (column==mActors.mFlee)
|
||||||
record.get().mAiData.mFlee = value.toInt();
|
record2.mAiData.mFlee = value.toInt();
|
||||||
else if (column==mActors.mFight)
|
else if (column==mActors.mFight)
|
||||||
record.get().mAiData.mFight = value.toInt();
|
record2.mAiData.mFight = value.toInt();
|
||||||
else if (column==mActors.mAlarm)
|
else if (column==mActors.mAlarm)
|
||||||
record.get().mAiData.mAlarm = value.toInt();
|
record2.mAiData.mAlarm = value.toInt();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
typename std::map<const RefIdColumn *, unsigned int>::const_iterator iter =
|
typename std::map<const RefIdColumn *, unsigned int>::const_iterator iter =
|
||||||
@ -525,13 +556,18 @@ namespace CSMWorld
|
|||||||
if (iter!=mActors.mServices.end())
|
if (iter!=mActors.mServices.end())
|
||||||
{
|
{
|
||||||
if (value.toInt()!=0)
|
if (value.toInt()!=0)
|
||||||
record.get().mAiData.mServices |= iter->second;
|
record2.mAiData.mServices |= iter->second;
|
||||||
else
|
else
|
||||||
record.get().mAiData.mServices &= ~iter->second;
|
record2.mAiData.mServices &= ~iter->second;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
NameRefIdAdapter<RecordT>::setData (column, data, index, value);
|
NameRefIdAdapter<RecordT>::setData (column, data, index, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
record.setModified(record2);
|
||||||
}
|
}
|
||||||
|
|
||||||
class ApparatusRefIdAdapter : public InventoryRefIdAdapter<ESM::Apparatus>
|
class ApparatusRefIdAdapter : public InventoryRefIdAdapter<ESM::Apparatus>
|
||||||
|
@ -40,7 +40,7 @@ CSMWorld::RefIdCollection::RefIdCollection()
|
|||||||
{
|
{
|
||||||
BaseColumns baseColumns;
|
BaseColumns baseColumns;
|
||||||
|
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Id, ColumnBase::Display_String,
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_Id, ColumnBase::Display_Id,
|
||||||
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue, false, false));
|
ColumnBase::Flag_Table | ColumnBase::Flag_Dialogue, false, false));
|
||||||
baseColumns.mId = &mColumns.back();
|
baseColumns.mId = &mColumns.back();
|
||||||
mColumns.push_back (RefIdColumn (Columns::ColumnId_Modification, ColumnBase::Display_RecordState,
|
mColumns.push_back (RefIdColumn (Columns::ColumnId_Modification, ColumnBase::Display_RecordState,
|
||||||
@ -470,8 +470,7 @@ void CSMWorld::RefIdCollection::cloneRecord(const std::string& origin,
|
|||||||
const std::string& destination,
|
const std::string& destination,
|
||||||
const CSMWorld::UniversalId::Type type)
|
const CSMWorld::UniversalId::Type type)
|
||||||
{
|
{
|
||||||
std::auto_ptr<RecordBase> newRecord(mData.getRecord(mData.searchId(origin)).clone());
|
std::auto_ptr<RecordBase> newRecord(mData.getRecord(mData.searchId(origin)).modifiedCopy());
|
||||||
newRecord->mState = RecordBase::State_ModifiedOnly;
|
|
||||||
mAdapters.find(type)->second->setId(*newRecord, destination);
|
mAdapters.find(type)->second->setId(*newRecord, destination);
|
||||||
mData.insertRecord(*newRecord, type, destination);
|
mData.insertRecord(*newRecord, type, destination);
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ QVariant CSMWorld::ResourceTable::headerData (int section, Qt::Orientation orien
|
|||||||
return Columns::getName (Columns::ColumnId_Id).c_str();
|
return Columns::getName (Columns::ColumnId_Id).c_str();
|
||||||
|
|
||||||
if (role==ColumnBase::Role_Display)
|
if (role==ColumnBase::Role_Display)
|
||||||
return ColumnBase::Display_String;
|
return ColumnBase::Display_Id;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -144,3 +144,14 @@ bool CSMWorld::ResourceTable::isDeleted (const std::string& id) const
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CSMWorld::ResourceTable::getColumnId (int column) const
|
||||||
|
{
|
||||||
|
switch (column)
|
||||||
|
{
|
||||||
|
case 0: return Columns::ColumnId_Id;
|
||||||
|
case 1: return Columns::ColumnId_RecordType;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@ -51,6 +51,8 @@ namespace CSMWorld
|
|||||||
|
|
||||||
/// Is \a id flagged as deleted?
|
/// Is \a id flagged as deleted?
|
||||||
virtual bool isDeleted (const std::string& id) const;
|
virtual bool isDeleted (const std::string& id) const;
|
||||||
|
|
||||||
|
virtual int getColumnId (int column) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ namespace
|
|||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_SoundGens, "Sound Generators", 0 },
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_SoundGens, "Sound Generators", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_MagicEffects, "Magic Effects", 0 },
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_MagicEffects, "Magic Effects", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Pathgrids, "Pathgrids", 0 },
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_Pathgrids, "Pathgrids", 0 },
|
||||||
|
{ CSMWorld::UniversalId::Class_RecordList, CSMWorld::UniversalId::Type_StartScripts, "Start Scripts", 0 },
|
||||||
|
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
||||||
};
|
};
|
||||||
@ -118,6 +119,7 @@ namespace
|
|||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_SoundGen, "Sound Generator", 0 },
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_SoundGen, "Sound Generator", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_MagicEffect, "Magic Effect", 0 },
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_MagicEffect, "Magic Effect", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Pathgrid, "Pathgrid", 0 },
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_Pathgrid, "Pathgrid", 0 },
|
||||||
|
{ CSMWorld::UniversalId::Class_Record, CSMWorld::UniversalId::Type_StartScript, "Start Script", 0 },
|
||||||
|
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
||||||
};
|
};
|
||||||
@ -126,6 +128,7 @@ namespace
|
|||||||
{
|
{
|
||||||
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_VerificationResults, "Verification Results", 0 },
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_VerificationResults, "Verification Results", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_LoadErrorLog, "Load Error Log", 0 },
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_LoadErrorLog, "Load Error Log", 0 },
|
||||||
|
{ CSMWorld::UniversalId::Class_Transient, CSMWorld::UniversalId::Type_Search, "Global Search", 0 },
|
||||||
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
{ CSMWorld::UniversalId::Class_None, CSMWorld::UniversalId::Type_None, 0, 0 } // end marker
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -345,6 +348,25 @@ std::vector<CSMWorld::UniversalId::Type> CSMWorld::UniversalId::listReferenceabl
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<CSMWorld::UniversalId::Type> CSMWorld::UniversalId::listTypes (int classes)
|
||||||
|
{
|
||||||
|
std::vector<CSMWorld::UniversalId::Type> list;
|
||||||
|
|
||||||
|
for (int i=0; sNoArg[i].mName; ++i)
|
||||||
|
if (sNoArg[i].mClass & classes)
|
||||||
|
list.push_back (sNoArg[i].mType);
|
||||||
|
|
||||||
|
for (int i=0; sIdArg[i].mName; ++i)
|
||||||
|
if (sIdArg[i].mClass & classes)
|
||||||
|
list.push_back (sIdArg[i].mType);
|
||||||
|
|
||||||
|
for (int i=0; sIndexArg[i].mName; ++i)
|
||||||
|
if (sIndexArg[i].mClass & classes)
|
||||||
|
list.push_back (sIndexArg[i].mType);
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
CSMWorld::UniversalId::Type CSMWorld::UniversalId::getParentType (Type type)
|
CSMWorld::UniversalId::Type CSMWorld::UniversalId::getParentType (Type type)
|
||||||
{
|
{
|
||||||
for (int i=0; sIdArg[i].mType; ++i)
|
for (int i=0; sIdArg[i].mType; ++i)
|
||||||
|
@ -16,16 +16,16 @@ namespace CSMWorld
|
|||||||
enum Class
|
enum Class
|
||||||
{
|
{
|
||||||
Class_None = 0,
|
Class_None = 0,
|
||||||
Class_Record,
|
Class_Record = 1,
|
||||||
Class_RefRecord, // referenceable record
|
Class_RefRecord = 2, // referenceable record
|
||||||
Class_SubRecord,
|
Class_SubRecord = 4,
|
||||||
Class_RecordList,
|
Class_RecordList = 8,
|
||||||
Class_Collection, // multiple types of records combined
|
Class_Collection = 16, // multiple types of records combined
|
||||||
Class_Transient, // not part of the world data or the project data
|
Class_Transient = 32, // not part of the world data or the project data
|
||||||
Class_NonRecord, // record like data that is not part of the world
|
Class_NonRecord = 64, // record like data that is not part of the world
|
||||||
Class_Resource, ///< \attention Resource IDs are unique only within the
|
Class_Resource = 128, ///< \attention Resource IDs are unique only within the
|
||||||
/// respective collection
|
/// respective collection
|
||||||
Class_ResourceList
|
Class_ResourceList = 256
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ArgumentType
|
enum ArgumentType
|
||||||
@ -128,6 +128,9 @@ namespace CSMWorld
|
|||||||
Type_MagicEffect,
|
Type_MagicEffect,
|
||||||
Type_Pathgrids,
|
Type_Pathgrids,
|
||||||
Type_Pathgrid,
|
Type_Pathgrid,
|
||||||
|
Type_StartScripts,
|
||||||
|
Type_StartScript,
|
||||||
|
Type_Search,
|
||||||
Type_RunLog
|
Type_RunLog
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -178,6 +181,8 @@ namespace CSMWorld
|
|||||||
|
|
||||||
static std::vector<Type> listReferenceableTypes();
|
static std::vector<Type> listReferenceableTypes();
|
||||||
|
|
||||||
|
static std::vector<Type> listTypes (int classes);
|
||||||
|
|
||||||
/// If \a type is a SubRecord, RefRecord or Record type return the type of the table
|
/// If \a type is a SubRecord, RefRecord or Record type return the type of the table
|
||||||
/// that contains records of type \a type.
|
/// that contains records of type \a type.
|
||||||
/// Otherwise return Type_None.
|
/// Otherwise return Type_None.
|
||||||
|
@ -147,17 +147,19 @@ void CSVDoc::FileDialog::slotUpdateAcceptButton(int)
|
|||||||
|
|
||||||
void CSVDoc::FileDialog::slotUpdateAcceptButton(const QString &name, bool)
|
void CSVDoc::FileDialog::slotUpdateAcceptButton(const QString &name, bool)
|
||||||
{
|
{
|
||||||
bool success = (mSelector->selectedFiles().size() > 0);
|
bool success = !mSelector->selectedFiles().empty();
|
||||||
|
|
||||||
bool isNew = (mAction == ContentAction_New);
|
bool isNew = (mAction == ContentAction_New);
|
||||||
|
|
||||||
if (isNew)
|
if (isNew)
|
||||||
success = success && !(name.isEmpty());
|
success = success && !(name.isEmpty());
|
||||||
else
|
else if (success)
|
||||||
{
|
{
|
||||||
ContentSelectorModel::EsmFile *file = mSelector->selectedFiles().back();
|
ContentSelectorModel::EsmFile *file = mSelector->selectedFiles().back();
|
||||||
mAdjusterWidget->setName (file->filePath(), !file->isGameFile());
|
mAdjusterWidget->setName (file->filePath(), !file->isGameFile());
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
mAdjusterWidget->setName ("", true);
|
||||||
|
|
||||||
ui.projectButtonBox->button (QDialogButtonBox::Ok)->setEnabled (success);
|
ui.projectButtonBox->button (QDialogButtonBox::Ok)->setEnabled (success);
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ void CSVDoc::LoadingDocument::closeEvent (QCloseEvent *event)
|
|||||||
CSVDoc::LoadingDocument::LoadingDocument (CSMDoc::Document *document)
|
CSVDoc::LoadingDocument::LoadingDocument (CSMDoc::Document *document)
|
||||||
: mDocument (document), mAborted (false), mMessages (0), mTotalRecords (0)
|
: mDocument (document), mAborted (false), mMessages (0), mTotalRecords (0)
|
||||||
{
|
{
|
||||||
setWindowTitle (("Opening " + document->getSavePath().filename().string()).c_str());
|
setWindowTitle (QString::fromUtf8((std::string("Opening ") + document->getSavePath().filename().string()).c_str()));
|
||||||
|
|
||||||
setMinimumWidth (400);
|
setMinimumWidth (400);
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ void CSVDoc::Operation::updateLabel (int threads)
|
|||||||
{
|
{
|
||||||
case CSMDoc::State_Saving: name = "saving"; break;
|
case CSMDoc::State_Saving: name = "saving"; break;
|
||||||
case CSMDoc::State_Verifying: name = "verifying"; break;
|
case CSMDoc::State_Verifying: name = "verifying"; break;
|
||||||
|
case CSMDoc::State_Searching: name = "searching"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
|
@ -26,7 +26,7 @@ void CSVDoc::SubView::updateUserSetting (const QString &, const QStringList &)
|
|||||||
void CSVDoc::SubView::setUniversalId (const CSMWorld::UniversalId& id)
|
void CSVDoc::SubView::setUniversalId (const CSMWorld::UniversalId& id)
|
||||||
{
|
{
|
||||||
mUniversalId = id;
|
mUniversalId = id;
|
||||||
setWindowTitle (mUniversalId.toString().c_str());
|
setWindowTitle (QString::fromUtf8(mUniversalId.toString().c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVDoc::SubView::closeEvent (QCloseEvent *event)
|
void CSVDoc::SubView::closeEvent (QCloseEvent *event)
|
||||||
|
@ -91,6 +91,10 @@ void CSVDoc::View::setupEditMenu()
|
|||||||
QAction *userSettings = new QAction (tr ("&Preferences"), this);
|
QAction *userSettings = new QAction (tr ("&Preferences"), this);
|
||||||
connect (userSettings, SIGNAL (triggered()), this, SIGNAL (editSettingsRequest()));
|
connect (userSettings, SIGNAL (triggered()), this, SIGNAL (editSettingsRequest()));
|
||||||
edit->addAction (userSettings);
|
edit->addAction (userSettings);
|
||||||
|
|
||||||
|
QAction *search = new QAction (tr ("Search"), this);
|
||||||
|
connect (search, SIGNAL (triggered()), this, SLOT (addSearchSubView()));
|
||||||
|
edit->addAction (search);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVDoc::View::setupViewMenu()
|
void CSVDoc::View::setupViewMenu()
|
||||||
@ -173,6 +177,10 @@ void CSVDoc::View::setupMechanicsMenu()
|
|||||||
QAction *effects = new QAction (tr ("Magic Effects"), this);
|
QAction *effects = new QAction (tr ("Magic Effects"), this);
|
||||||
connect (effects, SIGNAL (triggered()), this, SLOT (addMagicEffectsSubView()));
|
connect (effects, SIGNAL (triggered()), this, SLOT (addMagicEffectsSubView()));
|
||||||
mechanics->addAction (effects);
|
mechanics->addAction (effects);
|
||||||
|
|
||||||
|
QAction *startScripts = new QAction (tr ("Start Scripts"), this);
|
||||||
|
connect (startScripts, SIGNAL (triggered()), this, SLOT (addStartScriptsSubView()));
|
||||||
|
mechanics->addAction (startScripts);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVDoc::View::setupCharacterMenu()
|
void CSVDoc::View::setupCharacterMenu()
|
||||||
@ -320,7 +328,7 @@ void CSVDoc::View::updateTitle()
|
|||||||
if (hideTitle)
|
if (hideTitle)
|
||||||
stream << " - " << mSubViews.at (0)->getTitle();
|
stream << " - " << mSubViews.at (0)->getTitle();
|
||||||
|
|
||||||
setWindowTitle (stream.str().c_str());
|
setWindowTitle (QString::fromUtf8(stream.str().c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVDoc::View::updateSubViewIndicies(SubView *view)
|
void CSVDoc::View::updateSubViewIndicies(SubView *view)
|
||||||
@ -439,7 +447,7 @@ void CSVDoc::View::updateDocumentState()
|
|||||||
|
|
||||||
static const int operations[] =
|
static const int operations[] =
|
||||||
{
|
{
|
||||||
CSMDoc::State_Saving, CSMDoc::State_Verifying,
|
CSMDoc::State_Saving, CSMDoc::State_Verifying, CSMDoc::State_Searching,
|
||||||
-1 // end marker
|
-1 // end marker
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -481,6 +489,8 @@ void CSVDoc::View::addSubView (const CSMWorld::UniversalId& id, const std::strin
|
|||||||
(!isReferenceable && id == sb->getUniversalId()))
|
(!isReferenceable && id == sb->getUniversalId()))
|
||||||
{
|
{
|
||||||
sb->setFocus();
|
sb->setFocus();
|
||||||
|
if (!hint.empty())
|
||||||
|
sb->useHint (hint);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -511,8 +521,6 @@ void CSVDoc::View::addSubView (const CSMWorld::UniversalId& id, const std::strin
|
|||||||
assert(view);
|
assert(view);
|
||||||
view->setParent(this);
|
view->setParent(this);
|
||||||
mSubViews.append(view); // only after assert
|
mSubViews.append(view); // only after assert
|
||||||
if (!hint.empty())
|
|
||||||
view->useHint (hint);
|
|
||||||
|
|
||||||
int minWidth = userSettings.setting ("window/minimum-width", QString("325")).toInt();
|
int minWidth = userSettings.setting ("window/minimum-width", QString("325")).toInt();
|
||||||
view->setMinimumWidth(minWidth);
|
view->setMinimumWidth(minWidth);
|
||||||
@ -534,6 +542,9 @@ void CSVDoc::View::addSubView (const CSMWorld::UniversalId& id, const std::strin
|
|||||||
this, SLOT (updateSubViewIndicies (SubView *)));
|
this, SLOT (updateSubViewIndicies (SubView *)));
|
||||||
|
|
||||||
view->show();
|
view->show();
|
||||||
|
|
||||||
|
if (!hint.empty())
|
||||||
|
view->useHint (hint);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVDoc::View::newView()
|
void CSVDoc::View::newView()
|
||||||
@ -716,6 +727,16 @@ void CSVDoc::View::addPathgridSubView()
|
|||||||
addSubView (CSMWorld::UniversalId::Type_Pathgrids);
|
addSubView (CSMWorld::UniversalId::Type_Pathgrids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVDoc::View::addStartScriptsSubView()
|
||||||
|
{
|
||||||
|
addSubView (CSMWorld::UniversalId::Type_StartScripts);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVDoc::View::addSearchSubView()
|
||||||
|
{
|
||||||
|
addSubView (mDocument->newSearch());
|
||||||
|
}
|
||||||
|
|
||||||
void CSVDoc::View::abortOperation (int type)
|
void CSVDoc::View::abortOperation (int type)
|
||||||
{
|
{
|
||||||
mDocument->abortOperation (type);
|
mDocument->abortOperation (type);
|
||||||
|
@ -215,6 +215,10 @@ namespace CSVDoc
|
|||||||
|
|
||||||
void addPathgridSubView();
|
void addPathgridSubView();
|
||||||
|
|
||||||
|
void addStartScriptsSubView();
|
||||||
|
|
||||||
|
void addSearchSubView();
|
||||||
|
|
||||||
void toggleShowStatusBar (bool show);
|
void toggleShowStatusBar (bool show);
|
||||||
|
|
||||||
void loadErrorLog();
|
void loadErrorLog();
|
||||||
|
@ -248,7 +248,7 @@ bool CSVDoc::ViewManager::showModifiedDocumentMessageBox (CSVDoc::View *view)
|
|||||||
QMessageBox messageBox(view);
|
QMessageBox messageBox(view);
|
||||||
CSMDoc::Document *document = view->getDocument();
|
CSMDoc::Document *document = view->getDocument();
|
||||||
|
|
||||||
messageBox.setWindowTitle (document->getSavePath().filename().string().c_str());
|
messageBox.setWindowTitle (QString::fromUtf8(document->getSavePath().filename().string().c_str()));
|
||||||
messageBox.setText ("The document has been modified.");
|
messageBox.setText ("The document has been modified.");
|
||||||
messageBox.setInformativeText ("Do you want to save your changes?");
|
messageBox.setInformativeText ("Do you want to save your changes?");
|
||||||
messageBox.setStandardButtons (QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
|
messageBox.setStandardButtons (QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include "../../model/world/idtable.hpp"
|
#include "../../model/world/idtable.hpp"
|
||||||
#include "../../model/world/columns.hpp"
|
#include "../../model/world/columns.hpp"
|
||||||
#include "../../model/world/data.hpp"
|
#include "../../model/world/data.hpp"
|
||||||
|
#include "../../model/world/refcollection.hpp"
|
||||||
#include "../../model/world/pathgrid.hpp"
|
#include "../../model/world/pathgrid.hpp"
|
||||||
#include "../world/physicssystem.hpp"
|
#include "../world/physicssystem.hpp"
|
||||||
|
|
||||||
@ -89,26 +90,19 @@ bool CSVRender::Cell::removeObject (const std::string& id)
|
|||||||
|
|
||||||
bool CSVRender::Cell::addObjects (int start, int end)
|
bool CSVRender::Cell::addObjects (int start, int end)
|
||||||
{
|
{
|
||||||
CSMWorld::IdTable& references = dynamic_cast<CSMWorld::IdTable&> (
|
|
||||||
*mData.getTableModel (CSMWorld::UniversalId::Type_References));
|
|
||||||
|
|
||||||
int idColumn = references.findColumnIndex (CSMWorld::Columns::ColumnId_Id);
|
|
||||||
int cellColumn = references.findColumnIndex (CSMWorld::Columns::ColumnId_Cell);
|
|
||||||
int stateColumn = references.findColumnIndex (CSMWorld::Columns::ColumnId_Modification);
|
|
||||||
|
|
||||||
bool modified = false;
|
bool modified = false;
|
||||||
|
|
||||||
|
const CSMWorld::RefCollection& collection = mData.getReferences();
|
||||||
|
|
||||||
for (int i=start; i<=end; ++i)
|
for (int i=start; i<=end; ++i)
|
||||||
{
|
{
|
||||||
std::string cell = Misc::StringUtils::lowerCase (references.data (
|
std::string cell = Misc::StringUtils::lowerCase (collection.getRecord (i).get().mCell);
|
||||||
references.index (i, cellColumn)).toString().toUtf8().constData());
|
|
||||||
|
|
||||||
int state = references.data (references.index (i, stateColumn)).toInt();
|
CSMWorld::RecordBase::State state = collection.getRecord (i).mState;
|
||||||
|
|
||||||
if (cell==mId && state!=CSMWorld::RecordBase::State_Deleted)
|
if (cell==mId && state!=CSMWorld::RecordBase::State_Deleted)
|
||||||
{
|
{
|
||||||
std::string id = Misc::StringUtils::lowerCase (references.data (
|
std::string id = Misc::StringUtils::lowerCase (collection.getRecord (i).get().mId);
|
||||||
references.index (i, idColumn)).toString().toUtf8().constData());
|
|
||||||
|
|
||||||
mObjects.insert (std::make_pair (id, new Object (mData, mCellNode, id, false, mPhysics)));
|
mObjects.insert (std::make_pair (id, new Object (mData, mCellNode, id, false, mPhysics)));
|
||||||
modified = true;
|
modified = true;
|
||||||
@ -138,7 +132,7 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager,
|
|||||||
if (landIndex != -1)
|
if (landIndex != -1)
|
||||||
{
|
{
|
||||||
const ESM::Land* esmLand = land.getRecord(mId).get().mLand.get();
|
const ESM::Land* esmLand = land.getRecord(mId).get().mLand.get();
|
||||||
if(esmLand)
|
if(esmLand && esmLand->mDataTypes&ESM::Land::DATA_VHGT)
|
||||||
{
|
{
|
||||||
mTerrain.reset(new Terrain::TerrainGrid(sceneManager, new TerrainStorage(mData), Element_Terrain, true,
|
mTerrain.reset(new Terrain::TerrainGrid(sceneManager, new TerrainStorage(mData), Element_Terrain, true,
|
||||||
Terrain::Align_XY));
|
Terrain::Align_XY));
|
||||||
@ -159,7 +153,6 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager,
|
|||||||
|
|
||||||
CSVRender::Cell::~Cell()
|
CSVRender::Cell::~Cell()
|
||||||
{
|
{
|
||||||
<<<<<<< .mine
|
|
||||||
// destroy manual objects
|
// destroy manual objects
|
||||||
for(std::map<std::pair<int, int>, std::string>::iterator iter = mPgEdges.begin();
|
for(std::map<std::pair<int, int>, std::string>::iterator iter = mPgEdges.begin();
|
||||||
iter != mPgEdges.end(); ++iter)
|
iter != mPgEdges.end(); ++iter)
|
||||||
@ -181,32 +174,10 @@ CSVRender::Cell::~Cell()
|
|||||||
delete iter->second;
|
delete iter->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
mPhysics->removeHeightField(mSceneMgr, mX, mY);
|
|
||||||
=======
|
|
||||||
if (mTerrain.get())
|
if (mTerrain.get())
|
||||||
mPhysics->removeHeightField(mSceneMgr, mX, mY);
|
mPhysics->removeHeightField(mSceneMgr, mX, mY);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
>>>>>>> .theirs
|
|
||||||
|
|
||||||
for (std::map<std::string, Object *>::iterator iter (mObjects.begin());
|
for (std::map<std::string, Object *>::iterator iter (mObjects.begin());
|
||||||
iter!=mObjects.end(); ++iter)
|
iter!=mObjects.end(); ++iter)
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
|
@ -17,7 +17,7 @@ namespace Ogre
|
|||||||
namespace CSMWorld
|
namespace CSMWorld
|
||||||
{
|
{
|
||||||
class Data;
|
class Data;
|
||||||
class CellRef;
|
struct CellRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CSVWorld
|
namespace CSVWorld
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
CSVTools::ReportSubView::ReportSubView (const CSMWorld::UniversalId& id, CSMDoc::Document& document)
|
CSVTools::ReportSubView::ReportSubView (const CSMWorld::UniversalId& id, CSMDoc::Document& document)
|
||||||
: CSVDoc::SubView (id)
|
: CSVDoc::SubView (id)
|
||||||
{
|
{
|
||||||
setWidget (mTable = new ReportTable (document, id, this));
|
setWidget (mTable = new ReportTable (document, id, false, this));
|
||||||
|
|
||||||
connect (mTable, SIGNAL (editRequest (const CSMWorld::UniversalId&, const std::string&)),
|
connect (mTable, SIGNAL (editRequest (const CSMWorld::UniversalId&, const std::string&)),
|
||||||
SIGNAL (focusId (const CSMWorld::UniversalId&, const std::string&)));
|
SIGNAL (focusId (const CSMWorld::UniversalId&, const std::string&)));
|
||||||
|
@ -6,11 +6,45 @@
|
|||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
#include <QTextDocument>
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
#include "../../model/tools/reportmodel.hpp"
|
#include "../../model/tools/reportmodel.hpp"
|
||||||
|
|
||||||
#include "../../view/world/idtypedelegate.hpp"
|
#include "../../view/world/idtypedelegate.hpp"
|
||||||
|
|
||||||
|
namespace CSVTools
|
||||||
|
{
|
||||||
|
class RichTextDelegate : public QStyledItemDelegate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
RichTextDelegate (QObject *parent = 0);
|
||||||
|
|
||||||
|
virtual void paint(QPainter *painter, const QStyleOptionViewItem& option,
|
||||||
|
const QModelIndex& index) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVTools::RichTextDelegate::RichTextDelegate (QObject *parent) : QStyledItemDelegate (parent)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void CSVTools::RichTextDelegate::paint(QPainter *painter, const QStyleOptionViewItem& option,
|
||||||
|
const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
QTextDocument document;
|
||||||
|
QVariant value = index.data (Qt::DisplayRole);
|
||||||
|
if (value.isValid() && !value.isNull())
|
||||||
|
{
|
||||||
|
document.setHtml (value.toString());
|
||||||
|
painter->translate (option.rect.topLeft());
|
||||||
|
document.drawContents (painter);
|
||||||
|
painter->translate (-option.rect.topLeft());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CSVTools::ReportTable::contextMenuEvent (QContextMenuEvent *event)
|
void CSVTools::ReportTable::contextMenuEvent (QContextMenuEvent *event)
|
||||||
{
|
{
|
||||||
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
||||||
@ -22,6 +56,23 @@ void CSVTools::ReportTable::contextMenuEvent (QContextMenuEvent *event)
|
|||||||
{
|
{
|
||||||
menu.addAction (mShowAction);
|
menu.addAction (mShowAction);
|
||||||
menu.addAction (mRemoveAction);
|
menu.addAction (mRemoveAction);
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
for (QModelIndexList::const_iterator iter (selectedRows.begin());
|
||||||
|
iter!=selectedRows.end(); ++iter)
|
||||||
|
{
|
||||||
|
QString hint = mModel->data (mModel->index (iter->row(), 2)).toString();
|
||||||
|
|
||||||
|
if (!hint.isEmpty() && hint[0]=='R')
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found)
|
||||||
|
menu.addAction (mReplaceAction);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.exec (event->globalPos());
|
menu.exec (event->globalPos());
|
||||||
@ -30,7 +81,7 @@ void CSVTools::ReportTable::contextMenuEvent (QContextMenuEvent *event)
|
|||||||
void CSVTools::ReportTable::mouseMoveEvent (QMouseEvent *event)
|
void CSVTools::ReportTable::mouseMoveEvent (QMouseEvent *event)
|
||||||
{
|
{
|
||||||
if (event->buttons() & Qt::LeftButton)
|
if (event->buttons() & Qt::LeftButton)
|
||||||
startDrag (*this);
|
startDragFromTable (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVTools::ReportTable::mouseDoubleClickEvent (QMouseEvent *event)
|
void CSVTools::ReportTable::mouseDoubleClickEvent (QMouseEvent *event)
|
||||||
@ -67,10 +118,11 @@ void CSVTools::ReportTable::mouseDoubleClickEvent (QMouseEvent *event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CSVTools::ReportTable::ReportTable (CSMDoc::Document& document,
|
CSVTools::ReportTable::ReportTable (CSMDoc::Document& document,
|
||||||
const CSMWorld::UniversalId& id, QWidget *parent)
|
const CSMWorld::UniversalId& id, bool richTextDescription, QWidget *parent)
|
||||||
: CSVWorld::DragRecordTable (document, parent), mModel (document.getReport (id))
|
: CSVWorld::DragRecordTable (document, parent), mModel (document.getReport (id))
|
||||||
{
|
{
|
||||||
horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
horizontalHeader()->setResizeMode (QHeaderView::Interactive);
|
||||||
|
horizontalHeader()->setStretchLastSection (true);
|
||||||
verticalHeader()->hide();
|
verticalHeader()->hide();
|
||||||
setSortingEnabled (true);
|
setSortingEnabled (true);
|
||||||
setSelectionBehavior (QAbstractItemView::SelectRows);
|
setSelectionBehavior (QAbstractItemView::SelectRows);
|
||||||
@ -84,6 +136,9 @@ CSVTools::ReportTable::ReportTable (CSMDoc::Document& document,
|
|||||||
|
|
||||||
setItemDelegateForColumn (0, mIdTypeDelegate);
|
setItemDelegateForColumn (0, mIdTypeDelegate);
|
||||||
|
|
||||||
|
if (richTextDescription)
|
||||||
|
setItemDelegateForColumn (mModel->columnCount()-1, new RichTextDelegate (this));
|
||||||
|
|
||||||
mShowAction = new QAction (tr ("Show"), this);
|
mShowAction = new QAction (tr ("Show"), this);
|
||||||
connect (mShowAction, SIGNAL (triggered()), this, SLOT (showSelection()));
|
connect (mShowAction, SIGNAL (triggered()), this, SLOT (showSelection()));
|
||||||
addAction (mShowAction);
|
addAction (mShowAction);
|
||||||
@ -91,6 +146,10 @@ CSVTools::ReportTable::ReportTable (CSMDoc::Document& document,
|
|||||||
mRemoveAction = new QAction (tr ("Remove from list"), this);
|
mRemoveAction = new QAction (tr ("Remove from list"), this);
|
||||||
connect (mRemoveAction, SIGNAL (triggered()), this, SLOT (removeSelection()));
|
connect (mRemoveAction, SIGNAL (triggered()), this, SLOT (removeSelection()));
|
||||||
addAction (mRemoveAction);
|
addAction (mRemoveAction);
|
||||||
|
|
||||||
|
mReplaceAction = new QAction (tr ("Replace"), this);
|
||||||
|
connect (mReplaceAction, SIGNAL (triggered()), this, SIGNAL (replaceRequest()));
|
||||||
|
addAction (mReplaceAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<CSMWorld::UniversalId> CSVTools::ReportTable::getDraggedRecords() const
|
std::vector<CSMWorld::UniversalId> CSVTools::ReportTable::getDraggedRecords() const
|
||||||
@ -113,6 +172,42 @@ void CSVTools::ReportTable::updateUserSetting (const QString& name, const QStrin
|
|||||||
mIdTypeDelegate->updateUserSetting (name, list);
|
mIdTypeDelegate->updateUserSetting (name, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<int> CSVTools::ReportTable::getReplaceIndices (bool selection) const
|
||||||
|
{
|
||||||
|
std::vector<int> indices;
|
||||||
|
|
||||||
|
if (selection)
|
||||||
|
{
|
||||||
|
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
||||||
|
|
||||||
|
for (QModelIndexList::const_iterator iter (selectedRows.begin()); iter!=selectedRows.end();
|
||||||
|
++iter)
|
||||||
|
{
|
||||||
|
QString hint = mModel->data (mModel->index (iter->row(), 2)).toString();
|
||||||
|
|
||||||
|
if (!hint.isEmpty() && hint[0]=='R')
|
||||||
|
indices.push_back (iter->row());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i=0; i<mModel->rowCount(); ++i)
|
||||||
|
{
|
||||||
|
QString hint = mModel->data (mModel->index (i, 2)).toString();
|
||||||
|
|
||||||
|
if (!hint.isEmpty() && hint[0]=='R')
|
||||||
|
indices.push_back (i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return indices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::ReportTable::flagAsReplaced (int index)
|
||||||
|
{
|
||||||
|
mModel->flagAsReplaced (index);
|
||||||
|
}
|
||||||
|
|
||||||
void CSVTools::ReportTable::showSelection()
|
void CSVTools::ReportTable::showSelection()
|
||||||
{
|
{
|
||||||
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
QModelIndexList selectedRows = selectionModel()->selectedRows();
|
||||||
@ -134,3 +229,8 @@ void CSVTools::ReportTable::removeSelection()
|
|||||||
|
|
||||||
selectionModel()->clear();
|
selectionModel()->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVTools::ReportTable::clear()
|
||||||
|
{
|
||||||
|
mModel->clear();
|
||||||
|
}
|
||||||
|
@ -25,6 +25,7 @@ namespace CSVTools
|
|||||||
CSVWorld::CommandDelegate *mIdTypeDelegate;
|
CSVWorld::CommandDelegate *mIdTypeDelegate;
|
||||||
QAction *mShowAction;
|
QAction *mShowAction;
|
||||||
QAction *mRemoveAction;
|
QAction *mRemoveAction;
|
||||||
|
QAction *mReplaceAction;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -36,13 +37,23 @@ namespace CSVTools
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/// \param richTextDescription Use rich text in the description column.
|
||||||
ReportTable (CSMDoc::Document& document, const CSMWorld::UniversalId& id,
|
ReportTable (CSMDoc::Document& document, const CSMWorld::UniversalId& id,
|
||||||
QWidget *parent = 0);
|
bool richTextDescription, QWidget *parent = 0);
|
||||||
|
|
||||||
virtual std::vector<CSMWorld::UniversalId> getDraggedRecords() const;
|
virtual std::vector<CSMWorld::UniversalId> getDraggedRecords() const;
|
||||||
|
|
||||||
void updateUserSetting (const QString& name, const QStringList& list);
|
void updateUserSetting (const QString& name, const QStringList& list);
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
// Return indices of rows that are suitable for replacement.
|
||||||
|
//
|
||||||
|
// \param selection Only list selected rows.
|
||||||
|
std::vector<int> getReplaceIndices (bool selection) const;
|
||||||
|
|
||||||
|
void flagAsReplaced (int index);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void showSelection();
|
void showSelection();
|
||||||
@ -52,6 +63,8 @@ namespace CSVTools
|
|||||||
signals:
|
signals:
|
||||||
|
|
||||||
void editRequest (const CSMWorld::UniversalId& id, const std::string& hint);
|
void editRequest (const CSMWorld::UniversalId& id, const std::string& hint);
|
||||||
|
|
||||||
|
void replaceRequest();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
192
apps/opencs/view/tools/searchbox.cpp
Normal file
192
apps/opencs/view/tools/searchbox.cpp
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
|
||||||
|
#include "searchbox.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
#include "../../model/world/columns.hpp"
|
||||||
|
|
||||||
|
#include "../../model/tools/search.hpp"
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::updateSearchButton()
|
||||||
|
{
|
||||||
|
if (!mSearchEnabled)
|
||||||
|
mSearch.setEnabled (false);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (mMode.currentIndex())
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
|
||||||
|
mSearch.setEnabled (!mText.text().isEmpty());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
|
||||||
|
mSearch.setEnabled (true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVTools::SearchBox::SearchBox (QWidget *parent)
|
||||||
|
: QWidget (parent), mSearch ("Search"), mSearchEnabled (false), mReplace ("Replace All")
|
||||||
|
{
|
||||||
|
mLayout = new QGridLayout (this);
|
||||||
|
|
||||||
|
// search panel
|
||||||
|
std::vector<std::string> states =
|
||||||
|
CSMWorld::Columns::getEnums (CSMWorld::Columns::ColumnId_Modification);
|
||||||
|
states.resize (states.size()-1); // ignore erased state
|
||||||
|
|
||||||
|
for (std::vector<std::string>::const_iterator iter (states.begin()); iter!=states.end();
|
||||||
|
++iter)
|
||||||
|
mRecordState.addItem (QString::fromUtf8 (iter->c_str()));
|
||||||
|
|
||||||
|
mMode.addItem ("Text");
|
||||||
|
mMode.addItem ("Text (RegEx)");
|
||||||
|
mMode.addItem ("ID");
|
||||||
|
mMode.addItem ("ID (RegEx)");
|
||||||
|
mMode.addItem ("Record State");
|
||||||
|
|
||||||
|
mLayout->addWidget (&mMode, 0, 0);
|
||||||
|
|
||||||
|
mLayout->addWidget (&mSearch, 0, 3);
|
||||||
|
|
||||||
|
mInput.insertWidget (0, &mText);
|
||||||
|
mInput.insertWidget (1, &mRecordState);
|
||||||
|
|
||||||
|
mLayout->addWidget (&mInput, 0, 1);
|
||||||
|
|
||||||
|
connect (&mMode, SIGNAL (activated (int)), this, SLOT (modeSelected (int)));
|
||||||
|
|
||||||
|
connect (&mText, SIGNAL (textChanged (const QString&)),
|
||||||
|
this, SLOT (textChanged (const QString&)));
|
||||||
|
|
||||||
|
connect (&mSearch, SIGNAL (clicked (bool)), this, SLOT (startSearch (bool)));
|
||||||
|
|
||||||
|
connect (&mText, SIGNAL (returnPressed()), this, SLOT (startSearch()));
|
||||||
|
|
||||||
|
// replace panel
|
||||||
|
mReplaceInput.insertWidget (0, &mReplaceText);
|
||||||
|
mReplaceInput.insertWidget (1, &mReplacePlaceholder);
|
||||||
|
|
||||||
|
mLayout->addWidget (&mReplaceInput, 1, 1);
|
||||||
|
|
||||||
|
mLayout->addWidget (&mReplace, 1, 3);
|
||||||
|
|
||||||
|
// layout adjustments
|
||||||
|
mLayout->setColumnMinimumWidth (2, 50);
|
||||||
|
mLayout->setColumnStretch (1, 1);
|
||||||
|
|
||||||
|
mLayout->setContentsMargins (0, 0, 0, 0);
|
||||||
|
|
||||||
|
connect (&mReplace, (SIGNAL (clicked (bool))), this, SLOT (replaceAll (bool)));
|
||||||
|
|
||||||
|
// update
|
||||||
|
modeSelected (0);
|
||||||
|
|
||||||
|
updateSearchButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::setSearchMode (bool enabled)
|
||||||
|
{
|
||||||
|
mSearchEnabled = enabled;
|
||||||
|
updateSearchButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
CSMTools::Search CSVTools::SearchBox::getSearch() const
|
||||||
|
{
|
||||||
|
CSMTools::Search::Type type = static_cast<CSMTools::Search::Type> (mMode.currentIndex());
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case CSMTools::Search::Type_Text:
|
||||||
|
case CSMTools::Search::Type_Id:
|
||||||
|
|
||||||
|
return CSMTools::Search (type, std::string (mText.text().toUtf8().data()));
|
||||||
|
|
||||||
|
case CSMTools::Search::Type_TextRegEx:
|
||||||
|
case CSMTools::Search::Type_IdRegEx:
|
||||||
|
|
||||||
|
return CSMTools::Search (type, QRegExp (mText.text().toUtf8().data(), Qt::CaseInsensitive));
|
||||||
|
|
||||||
|
case CSMTools::Search::Type_RecordState:
|
||||||
|
|
||||||
|
return CSMTools::Search (type, mRecordState.currentIndex());
|
||||||
|
|
||||||
|
case CSMTools::Search::Type_None:
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw std::logic_error ("invalid search mode index");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CSVTools::SearchBox::getReplaceText() const
|
||||||
|
{
|
||||||
|
CSMTools::Search::Type type = static_cast<CSMTools::Search::Type> (mMode.currentIndex());
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case CSMTools::Search::Type_Text:
|
||||||
|
case CSMTools::Search::Type_TextRegEx:
|
||||||
|
case CSMTools::Search::Type_Id:
|
||||||
|
case CSMTools::Search::Type_IdRegEx:
|
||||||
|
|
||||||
|
return mReplaceText.text().toUtf8().data();
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
throw std::logic_error ("Invalid search mode for replace");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::setEditLock (bool locked)
|
||||||
|
{
|
||||||
|
mReplace.setEnabled (!locked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::modeSelected (int index)
|
||||||
|
{
|
||||||
|
switch (index)
|
||||||
|
{
|
||||||
|
case CSMTools::Search::Type_Text:
|
||||||
|
case CSMTools::Search::Type_TextRegEx:
|
||||||
|
case CSMTools::Search::Type_Id:
|
||||||
|
case CSMTools::Search::Type_IdRegEx:
|
||||||
|
|
||||||
|
mInput.setCurrentIndex (0);
|
||||||
|
mReplaceInput.setCurrentIndex (0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CSMTools::Search::Type_RecordState:
|
||||||
|
mInput.setCurrentIndex (1);
|
||||||
|
mReplaceInput.setCurrentIndex (1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSearchButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::textChanged (const QString& text)
|
||||||
|
{
|
||||||
|
updateSearchButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::startSearch (bool checked)
|
||||||
|
{
|
||||||
|
if (mSearch.isEnabled())
|
||||||
|
emit startSearch (getSearch());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchBox::replaceAll (bool checked)
|
||||||
|
{
|
||||||
|
emit replaceAll();
|
||||||
|
}
|
70
apps/opencs/view/tools/searchbox.hpp
Normal file
70
apps/opencs/view/tools/searchbox.hpp
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
#ifndef CSV_TOOLS_SEARCHBOX_H
|
||||||
|
#define CSV_TOOLS_SEARCHBOX_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QStackedWidget>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
class QGridLayout;
|
||||||
|
|
||||||
|
namespace CSMTools
|
||||||
|
{
|
||||||
|
class Search;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSVTools
|
||||||
|
{
|
||||||
|
class SearchBox : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
QStackedWidget mInput;
|
||||||
|
QLineEdit mText;
|
||||||
|
QComboBox mRecordState;
|
||||||
|
QPushButton mSearch;
|
||||||
|
QGridLayout *mLayout;
|
||||||
|
QComboBox mMode;
|
||||||
|
bool mSearchEnabled;
|
||||||
|
QStackedWidget mReplaceInput;
|
||||||
|
QLineEdit mReplaceText;
|
||||||
|
QLabel mReplacePlaceholder;
|
||||||
|
QPushButton mReplace;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void updateSearchButton();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SearchBox (QWidget *parent = 0);
|
||||||
|
|
||||||
|
void setSearchMode (bool enabled);
|
||||||
|
|
||||||
|
CSMTools::Search getSearch() const;
|
||||||
|
|
||||||
|
std::string getReplaceText() const;
|
||||||
|
|
||||||
|
void setEditLock (bool locked);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void modeSelected (int index);
|
||||||
|
|
||||||
|
void textChanged (const QString& text);
|
||||||
|
|
||||||
|
void startSearch (bool checked = true);
|
||||||
|
|
||||||
|
void replaceAll (bool checked);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
|
||||||
|
void startSearch (const CSMTools::Search& search);
|
||||||
|
|
||||||
|
void replaceAll();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
119
apps/opencs/view/tools/searchsubview.cpp
Normal file
119
apps/opencs/view/tools/searchsubview.cpp
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
|
||||||
|
#include "searchsubview.hpp"
|
||||||
|
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
#include "../../model/doc/document.hpp"
|
||||||
|
#include "../../model/tools/search.hpp"
|
||||||
|
#include "../../model/tools/reportmodel.hpp"
|
||||||
|
#include "../../model/world/idtablebase.hpp"
|
||||||
|
|
||||||
|
#include "reporttable.hpp"
|
||||||
|
#include "searchbox.hpp"
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::replace (bool selection)
|
||||||
|
{
|
||||||
|
if (mLocked)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::vector<int> indices = mTable->getReplaceIndices (selection);
|
||||||
|
|
||||||
|
std::string replace = mSearchBox.getReplaceText();
|
||||||
|
|
||||||
|
const CSMTools::ReportModel& model =
|
||||||
|
dynamic_cast<const CSMTools::ReportModel&> (*mTable->model());
|
||||||
|
|
||||||
|
// We are running through the indices in reverse order to avoid messing up multiple results
|
||||||
|
// in a single string.
|
||||||
|
for (std::vector<int>::const_reverse_iterator iter (indices.rbegin()); iter!=indices.rend(); ++iter)
|
||||||
|
{
|
||||||
|
CSMWorld::UniversalId id = model.getUniversalId (*iter);
|
||||||
|
|
||||||
|
CSMWorld::UniversalId::Type type = CSMWorld::UniversalId::getParentType (id.getType());
|
||||||
|
|
||||||
|
CSMWorld::IdTableBase *table = &dynamic_cast<CSMWorld::IdTableBase&> (
|
||||||
|
*mDocument.getData().getTableModel (type));
|
||||||
|
|
||||||
|
std::string hint = model.getHint (*iter);
|
||||||
|
|
||||||
|
mSearch.replace (mDocument, table, id, hint, replace);
|
||||||
|
mTable->flagAsReplaced (*iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CSVTools::SearchSubView::SearchSubView (const CSMWorld::UniversalId& id, CSMDoc::Document& document)
|
||||||
|
: CSVDoc::SubView (id), mDocument (document), mPaddingBefore (10), mPaddingAfter (10),
|
||||||
|
mLocked (false)
|
||||||
|
{
|
||||||
|
QVBoxLayout *layout = new QVBoxLayout;
|
||||||
|
|
||||||
|
layout->setContentsMargins (QMargins (0, 0, 0, 0));
|
||||||
|
|
||||||
|
layout->addWidget (&mSearchBox);
|
||||||
|
|
||||||
|
layout->addWidget (mTable = new ReportTable (document, id, true), 2);
|
||||||
|
|
||||||
|
QWidget *widget = new QWidget;
|
||||||
|
|
||||||
|
widget->setLayout (layout);
|
||||||
|
|
||||||
|
setWidget (widget);
|
||||||
|
|
||||||
|
stateChanged (document.getState(), &document);
|
||||||
|
|
||||||
|
connect (mTable, SIGNAL (editRequest (const CSMWorld::UniversalId&, const std::string&)),
|
||||||
|
SIGNAL (focusId (const CSMWorld::UniversalId&, const std::string&)));
|
||||||
|
|
||||||
|
connect (mTable, SIGNAL (replaceRequest()), this, SLOT (replaceRequest()));
|
||||||
|
|
||||||
|
connect (&document, SIGNAL (stateChanged (int, CSMDoc::Document *)),
|
||||||
|
this, SLOT (stateChanged (int, CSMDoc::Document *)));
|
||||||
|
|
||||||
|
connect (&mSearchBox, SIGNAL (startSearch (const CSMTools::Search&)),
|
||||||
|
this, SLOT (startSearch (const CSMTools::Search&)));
|
||||||
|
|
||||||
|
connect (&mSearchBox, SIGNAL (replaceAll()), this, SLOT (replaceAllRequest()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::setEditLock (bool locked)
|
||||||
|
{
|
||||||
|
mLocked = locked;
|
||||||
|
mSearchBox.setEditLock (locked);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::updateUserSetting (const QString &name, const QStringList &list)
|
||||||
|
{
|
||||||
|
mTable->updateUserSetting (name, list);
|
||||||
|
|
||||||
|
if (!list.empty())
|
||||||
|
{
|
||||||
|
if (name=="search/char-before")
|
||||||
|
mPaddingBefore = list.at (0).toInt();
|
||||||
|
else if (name=="search/char-after")
|
||||||
|
mPaddingAfter = list.at (0).toInt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::stateChanged (int state, CSMDoc::Document *document)
|
||||||
|
{
|
||||||
|
mSearchBox.setSearchMode (!(state & CSMDoc::State_Searching));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::startSearch (const CSMTools::Search& search)
|
||||||
|
{
|
||||||
|
mSearch = search;
|
||||||
|
mSearch.setPadding (mPaddingBefore, mPaddingAfter);
|
||||||
|
|
||||||
|
mTable->clear();
|
||||||
|
mDocument.runSearch (getUniversalId(), mSearch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::replaceRequest()
|
||||||
|
{
|
||||||
|
replace (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVTools::SearchSubView::replaceAllRequest()
|
||||||
|
{
|
||||||
|
replace (false);
|
||||||
|
}
|
58
apps/opencs/view/tools/searchsubview.hpp
Normal file
58
apps/opencs/view/tools/searchsubview.hpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#ifndef CSV_TOOLS_SEARCHSUBVIEW_H
|
||||||
|
#define CSV_TOOLS_SEARCHSUBVIEW_H
|
||||||
|
|
||||||
|
#include "../../model/tools/search.hpp"
|
||||||
|
|
||||||
|
#include "../doc/subview.hpp"
|
||||||
|
|
||||||
|
#include "searchbox.hpp"
|
||||||
|
|
||||||
|
class QTableView;
|
||||||
|
class QModelIndex;
|
||||||
|
|
||||||
|
namespace CSMDoc
|
||||||
|
{
|
||||||
|
class Document;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CSVTools
|
||||||
|
{
|
||||||
|
class ReportTable;
|
||||||
|
|
||||||
|
class SearchSubView : public CSVDoc::SubView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
ReportTable *mTable;
|
||||||
|
SearchBox mSearchBox;
|
||||||
|
CSMDoc::Document& mDocument;
|
||||||
|
int mPaddingBefore;
|
||||||
|
int mPaddingAfter;
|
||||||
|
CSMTools::Search mSearch;
|
||||||
|
bool mLocked;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void replace (bool selection);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SearchSubView (const CSMWorld::UniversalId& id, CSMDoc::Document& document);
|
||||||
|
|
||||||
|
virtual void setEditLock (bool locked);
|
||||||
|
|
||||||
|
virtual void updateUserSetting (const QString &, const QStringList &);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void stateChanged (int state, CSMDoc::Document *document);
|
||||||
|
|
||||||
|
void startSearch (const CSMTools::Search& search);
|
||||||
|
|
||||||
|
void replaceRequest();
|
||||||
|
|
||||||
|
void replaceAllRequest();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -4,6 +4,7 @@
|
|||||||
#include "../doc/subviewfactoryimp.hpp"
|
#include "../doc/subviewfactoryimp.hpp"
|
||||||
|
|
||||||
#include "reportsubview.hpp"
|
#include "reportsubview.hpp"
|
||||||
|
#include "searchsubview.hpp"
|
||||||
|
|
||||||
void CSVTools::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
void CSVTools::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
||||||
{
|
{
|
||||||
@ -11,4 +12,6 @@ void CSVTools::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
|||||||
new CSVDoc::SubViewFactory<ReportSubView>);
|
new CSVDoc::SubViewFactory<ReportSubView>);
|
||||||
manager.add (CSMWorld::UniversalId::Type_LoadErrorLog,
|
manager.add (CSMWorld::UniversalId::Type_LoadErrorLog,
|
||||||
new CSVDoc::SubViewFactory<ReportSubView>);
|
new CSVDoc::SubViewFactory<ReportSubView>);
|
||||||
|
manager.add (CSMWorld::UniversalId::Type_Search,
|
||||||
|
new CSVDoc::SubViewFactory<SearchSubView>);
|
||||||
}
|
}
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
@ -39,8 +40,12 @@ QAbstractItemDelegate(parent),
|
|||||||
mTable(table)
|
mTable(table)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void CSVWorld::NotEditableSubDelegate::setEditorData (QLabel* editor, const QModelIndex& index) const
|
void CSVWorld::NotEditableSubDelegate::setEditorData (QWidget* editor, const QModelIndex& index) const
|
||||||
{
|
{
|
||||||
|
QLabel* label = qobject_cast<QLabel*>(editor);
|
||||||
|
if(!label)
|
||||||
|
return;
|
||||||
|
|
||||||
QVariant v = index.data(Qt::EditRole);
|
QVariant v = index.data(Qt::EditRole);
|
||||||
if (!v.isValid())
|
if (!v.isValid())
|
||||||
{
|
{
|
||||||
@ -53,16 +58,17 @@ void CSVWorld::NotEditableSubDelegate::setEditorData (QLabel* editor, const QMod
|
|||||||
|
|
||||||
if (QVariant::String == v.type())
|
if (QVariant::String == v.type())
|
||||||
{
|
{
|
||||||
editor->setText(v.toString());
|
label->setText(v.toString());
|
||||||
} else //else we are facing enums
|
}
|
||||||
|
else //else we are facing enums
|
||||||
{
|
{
|
||||||
int data = v.toInt();
|
int data = v.toInt();
|
||||||
std::vector<std::string> enumNames (CSMWorld::Columns::getEnums (static_cast<CSMWorld::Columns::ColumnId> (mTable->getColumnId (index.column()))));
|
std::vector<std::string> enumNames (CSMWorld::Columns::getEnums (static_cast<CSMWorld::Columns::ColumnId> (mTable->getColumnId (index.column()))));
|
||||||
editor->setText(QString::fromUtf8(enumNames.at(data).c_str()));
|
label->setText(QString::fromUtf8(enumNames.at(data).c_str()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVWorld::NotEditableSubDelegate::setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const
|
void CSVWorld::NotEditableSubDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
|
||||||
{
|
{
|
||||||
//not editable widgets will not save model data
|
//not editable widgets will not save model data
|
||||||
}
|
}
|
||||||
@ -79,8 +85,7 @@ QSize CSVWorld::NotEditableSubDelegate::sizeHint (const QStyleOptionViewItem& op
|
|||||||
|
|
||||||
QWidget* CSVWorld::NotEditableSubDelegate::createEditor (QWidget *parent,
|
QWidget* CSVWorld::NotEditableSubDelegate::createEditor (QWidget *parent,
|
||||||
const QStyleOptionViewItem& option,
|
const QStyleOptionViewItem& option,
|
||||||
const QModelIndex& index,
|
const QModelIndex& index) const
|
||||||
CSMWorld::ColumnBase::Display display) const
|
|
||||||
{
|
{
|
||||||
return new QLabel(parent);
|
return new QLabel(parent);
|
||||||
}
|
}
|
||||||
@ -223,6 +228,11 @@ void CSVWorld::DialogueDelegateDispatcher::setEditorData (QWidget* editor, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVWorld::DialogueDelegateDispatcher::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
setModelData(editor, model, index, CSMWorld::ColumnBase::Display_None);
|
||||||
|
}
|
||||||
|
|
||||||
void CSVWorld::DialogueDelegateDispatcher::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const
|
void CSVWorld::DialogueDelegateDispatcher::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const
|
||||||
{
|
{
|
||||||
std::map<int, CommandDelegate*>::const_iterator delegateIt(mDelegates.find(display));
|
std::map<int, CommandDelegate*>::const_iterator delegateIt(mDelegates.find(display));
|
||||||
@ -257,7 +267,7 @@ QWidget* CSVWorld::DialogueDelegateDispatcher::makeEditor(CSMWorld::ColumnBase::
|
|||||||
QWidget* editor = NULL;
|
QWidget* editor = NULL;
|
||||||
if (! (mTable->flags (index) & Qt::ItemIsEditable))
|
if (! (mTable->flags (index) & Qt::ItemIsEditable))
|
||||||
{
|
{
|
||||||
return mNotEditableDelegate.createEditor(qobject_cast<QWidget*>(mParent), QStyleOptionViewItem(), index, display);
|
return mNotEditableDelegate.createEditor(qobject_cast<QWidget*>(mParent), QStyleOptionViewItem(), index);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<int, CommandDelegate*>::iterator delegateIt(mDelegates.find(display));
|
std::map<int, CommandDelegate*>::iterator delegateIt(mDelegates.find(display));
|
||||||
@ -266,6 +276,8 @@ QWidget* CSVWorld::DialogueDelegateDispatcher::makeEditor(CSMWorld::ColumnBase::
|
|||||||
editor = delegateIt->second->createEditor(qobject_cast<QWidget*>(mParent), QStyleOptionViewItem(), index, display);
|
editor = delegateIt->second->createEditor(qobject_cast<QWidget*>(mParent), QStyleOptionViewItem(), index, display);
|
||||||
DialogueDelegateDispatcherProxy* proxy = new DialogueDelegateDispatcherProxy(editor, display);
|
DialogueDelegateDispatcherProxy* proxy = new DialogueDelegateDispatcherProxy(editor, display);
|
||||||
|
|
||||||
|
// NOTE: For each entry in CSVWorld::CommandDelegate::createEditor() a corresponding entry
|
||||||
|
// is required here
|
||||||
if (qobject_cast<DropLineEdit*>(editor))
|
if (qobject_cast<DropLineEdit*>(editor))
|
||||||
{
|
{
|
||||||
connect(editor, SIGNAL(editingFinished()), proxy, SLOT(editorDataCommited()));
|
connect(editor, SIGNAL(editingFinished()), proxy, SLOT(editorDataCommited()));
|
||||||
@ -286,10 +298,12 @@ QWidget* CSVWorld::DialogueDelegateDispatcher::makeEditor(CSMWorld::ColumnBase::
|
|||||||
{
|
{
|
||||||
connect(editor, SIGNAL(currentIndexChanged (int)), proxy, SLOT(editorDataCommited()));
|
connect(editor, SIGNAL(currentIndexChanged (int)), proxy, SLOT(editorDataCommited()));
|
||||||
}
|
}
|
||||||
else if (qobject_cast<QAbstractSpinBox*>(editor))
|
else if (qobject_cast<QAbstractSpinBox*>(editor) || qobject_cast<QLineEdit*>(editor))
|
||||||
{
|
{
|
||||||
connect(editor, SIGNAL(editingFinished()), proxy, SLOT(editorDataCommited()));
|
connect(editor, SIGNAL(editingFinished()), proxy, SLOT(editorDataCommited()));
|
||||||
}
|
}
|
||||||
|
else // throw an exception because this is a coding error
|
||||||
|
throw std::logic_error ("Dialogue editor type missing");
|
||||||
|
|
||||||
connect(proxy, SIGNAL(editorDataCommited(QWidget*, const QModelIndex&, CSMWorld::ColumnBase::Display)), this, SLOT(editorDataCommited(QWidget*, const QModelIndex&, CSMWorld::ColumnBase::Display)));
|
connect(proxy, SIGNAL(editorDataCommited(QWidget*, const QModelIndex&, CSMWorld::ColumnBase::Display)), this, SLOT(editorDataCommited(QWidget*, const QModelIndex&, CSMWorld::ColumnBase::Display)));
|
||||||
mProxys.push_back(proxy); //deleted in the destructor
|
mProxys.push_back(proxy); //deleted in the destructor
|
||||||
|
@ -40,9 +40,9 @@ namespace CSVWorld
|
|||||||
public:
|
public:
|
||||||
NotEditableSubDelegate(const CSMWorld::IdTable* table, QObject * parent = 0);
|
NotEditableSubDelegate(const CSMWorld::IdTable* table, QObject * parent = 0);
|
||||||
|
|
||||||
virtual void setEditorData (QLabel* editor, const QModelIndex& index) const;
|
virtual void setEditorData (QWidget* editor, const QModelIndex& index) const;
|
||||||
|
|
||||||
virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const;
|
virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;
|
||||||
|
|
||||||
virtual void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
virtual void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
||||||
///< does nothing
|
///< does nothing
|
||||||
@ -52,8 +52,7 @@ namespace CSVWorld
|
|||||||
|
|
||||||
virtual QWidget *createEditor (QWidget *parent,
|
virtual QWidget *createEditor (QWidget *parent,
|
||||||
const QStyleOptionViewItem& option,
|
const QStyleOptionViewItem& option,
|
||||||
const QModelIndex& index,
|
const QModelIndex& index) const;
|
||||||
CSMWorld::ColumnBase::Display display = CSMWorld::ColumnBase::Display_None) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//this can't be nested into the DialogueDelegateDispatcher, because it needs to emit signals
|
//this can't be nested into the DialogueDelegateDispatcher, because it needs to emit signals
|
||||||
@ -119,6 +118,8 @@ namespace CSVWorld
|
|||||||
|
|
||||||
virtual void setEditorData (QWidget* editor, const QModelIndex& index) const;
|
virtual void setEditorData (QWidget* editor, const QModelIndex& index) const;
|
||||||
|
|
||||||
|
virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const;
|
||||||
|
|
||||||
virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const;
|
virtual void setModelData (QWidget* editor, QAbstractItemModel* model, const QModelIndex& index, CSMWorld::ColumnBase::Display display) const;
|
||||||
|
|
||||||
virtual void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
virtual void paint (QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include "../../model/world/tablemimedata.hpp"
|
#include "../../model/world/tablemimedata.hpp"
|
||||||
#include "dragrecordtable.hpp"
|
#include "dragrecordtable.hpp"
|
||||||
|
|
||||||
void CSVWorld::DragRecordTable::startDrag (const CSVWorld::DragRecordTable& table)
|
void CSVWorld::DragRecordTable::startDragFromTable (const CSVWorld::DragRecordTable& table)
|
||||||
{
|
{
|
||||||
CSMWorld::TableMimeData* mime = new CSMWorld::TableMimeData (table.getDraggedRecords(), mDocument);
|
CSMWorld::TableMimeData* mime = new CSMWorld::TableMimeData (table.getDraggedRecords(), mDocument);
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ namespace CSVWorld
|
|||||||
void setEditLock(bool locked);
|
void setEditLock(bool locked);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void startDrag(const DragRecordTable& table);
|
void startDragFromTable(const DragRecordTable& table);
|
||||||
|
|
||||||
void dragEnterEvent(QDragEnterEvent *event);
|
void dragEnterEvent(QDragEnterEvent *event);
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ QWidget *CSVWorld::EnumDelegate::createEditor(QWidget *parent,
|
|||||||
const QModelIndex& index) const
|
const QModelIndex& index) const
|
||||||
{
|
{
|
||||||
return createEditor(parent, option, index, CSMWorld::ColumnBase::Display_None);
|
return createEditor(parent, option, index, CSMWorld::ColumnBase::Display_None);
|
||||||
//overloading virtual functions is HARD
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget *CSVWorld::EnumDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option,
|
QWidget *CSVWorld::EnumDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option,
|
||||||
|
@ -345,7 +345,7 @@ void CSVWorld::RegionMap::viewInTable()
|
|||||||
|
|
||||||
void CSVWorld::RegionMap::mouseMoveEvent (QMouseEvent* event)
|
void CSVWorld::RegionMap::mouseMoveEvent (QMouseEvent* event)
|
||||||
{
|
{
|
||||||
startDrag(*this);
|
startDragFromTable(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector< CSMWorld::UniversalId > CSVWorld::RegionMap::getDraggedRecords() const
|
std::vector< CSMWorld::UniversalId > CSVWorld::RegionMap::getDraggedRecords() const
|
||||||
|
@ -22,7 +22,7 @@ CSVWorld::ScriptSubView::ScriptSubView (const CSMWorld::UniversalId& id, CSMDoc:
|
|||||||
|
|
||||||
for (int i=0; i<mModel->columnCount(); ++i)
|
for (int i=0; i<mModel->columnCount(); ++i)
|
||||||
if (mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Display)==
|
if (mModel->headerData (i, Qt::Horizontal, CSMWorld::ColumnBase::Role_Display)==
|
||||||
CSMWorld::ColumnBase::Display_Script)
|
CSMWorld::ColumnBase::Display_ScriptFile)
|
||||||
{
|
{
|
||||||
mColumn = i;
|
mColumn = i;
|
||||||
break;
|
break;
|
||||||
@ -68,6 +68,7 @@ void CSVWorld::ScriptSubView::useHint (const std::string& hint)
|
|||||||
if (cursor.movePosition (QTextCursor::Down, QTextCursor::MoveAnchor, line))
|
if (cursor.movePosition (QTextCursor::Down, QTextCursor::MoveAnchor, line))
|
||||||
cursor.movePosition (QTextCursor::Right, QTextCursor::MoveAnchor, column);
|
cursor.movePosition (QTextCursor::Right, QTextCursor::MoveAnchor, column);
|
||||||
|
|
||||||
|
mEditor->setFocus();
|
||||||
mEditor->setTextCursor (cursor);
|
mEditor->setTextCursor (cursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,6 +43,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
|||||||
CSMWorld::UniversalId::Type_BodyParts,
|
CSMWorld::UniversalId::Type_BodyParts,
|
||||||
CSMWorld::UniversalId::Type_SoundGens,
|
CSMWorld::UniversalId::Type_SoundGens,
|
||||||
CSMWorld::UniversalId::Type_Pathgrids,
|
CSMWorld::UniversalId::Type_Pathgrids,
|
||||||
|
CSMWorld::UniversalId::Type_StartScripts,
|
||||||
|
|
||||||
CSMWorld::UniversalId::Type_None // end marker
|
CSMWorld::UniversalId::Type_None // end marker
|
||||||
};
|
};
|
||||||
@ -123,6 +124,7 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager)
|
|||||||
CSMWorld::UniversalId::Type_BodyPart,
|
CSMWorld::UniversalId::Type_BodyPart,
|
||||||
CSMWorld::UniversalId::Type_SoundGen,
|
CSMWorld::UniversalId::Type_SoundGen,
|
||||||
CSMWorld::UniversalId::Type_Pathgrid,
|
CSMWorld::UniversalId::Type_Pathgrid,
|
||||||
|
CSMWorld::UniversalId::Type_StartScript,
|
||||||
|
|
||||||
CSMWorld::UniversalId::Type_None // end marker
|
CSMWorld::UniversalId::Type_None // end marker
|
||||||
};
|
};
|
||||||
|
@ -635,7 +635,7 @@ void CSVWorld::Table::mouseMoveEvent (QMouseEvent* event)
|
|||||||
{
|
{
|
||||||
if (event->buttons() & Qt::LeftButton)
|
if (event->buttons() & Qt::LeftButton)
|
||||||
{
|
{
|
||||||
startDrag(*this);
|
startDragFromTable(*this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,6 +139,12 @@ void CSVWorld::CommandDelegate::setModelData (QWidget *editor, QAbstractItemMode
|
|||||||
///< \todo provide some kind of feedback to the user, indicating that editing is currently not possible.
|
///< \todo provide some kind of feedback to the user, indicating that editing is currently not possible.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleOptionViewItem& option,
|
||||||
|
const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
return createEditor (parent, option, index, CSMWorld::ColumnBase::Display_None);
|
||||||
|
}
|
||||||
|
|
||||||
QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleOptionViewItem& option,
|
QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleOptionViewItem& option,
|
||||||
const QModelIndex& index, CSMWorld::ColumnBase::Display display) const
|
const QModelIndex& index, CSMWorld::ColumnBase::Display display) const
|
||||||
{
|
{
|
||||||
@ -152,6 +158,8 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: for each editor type (e.g. QLineEdit) there needs to be a corresponding
|
||||||
|
// entry in CSVWorld::DialogueDelegateDispatcher::makeEditor()
|
||||||
switch (display)
|
switch (display)
|
||||||
{
|
{
|
||||||
case CSMWorld::ColumnBase::Display_Colour:
|
case CSMWorld::ColumnBase::Display_Colour:
|
||||||
@ -228,6 +236,11 @@ bool CSVWorld::CommandDelegate::isEditLocked() const
|
|||||||
return mEditLock;
|
return mEditLock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelIndex& index) const
|
||||||
|
{
|
||||||
|
setEditorData (editor, index, false);
|
||||||
|
}
|
||||||
|
|
||||||
void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay) const
|
void CSVWorld::CommandDelegate::setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay) const
|
||||||
{
|
{
|
||||||
QVariant v = index.data(Qt::EditRole);
|
QVariant v = index.data(Qt::EditRole);
|
||||||
|
@ -130,10 +130,14 @@ namespace CSVWorld
|
|||||||
virtual void setModelData (QWidget *editor, QAbstractItemModel *model,
|
virtual void setModelData (QWidget *editor, QAbstractItemModel *model,
|
||||||
const QModelIndex& index) const;
|
const QModelIndex& index) const;
|
||||||
|
|
||||||
|
virtual QWidget *createEditor (QWidget *parent,
|
||||||
|
const QStyleOptionViewItem& option,
|
||||||
|
const QModelIndex& index) const;
|
||||||
|
|
||||||
virtual QWidget *createEditor (QWidget *parent,
|
virtual QWidget *createEditor (QWidget *parent,
|
||||||
const QStyleOptionViewItem& option,
|
const QStyleOptionViewItem& option,
|
||||||
const QModelIndex& index,
|
const QModelIndex& index,
|
||||||
CSMWorld::ColumnBase::Display display = CSMWorld::ColumnBase::Display_None) const;
|
CSMWorld::ColumnBase::Display display) const;
|
||||||
|
|
||||||
void setEditLock (bool locked);
|
void setEditLock (bool locked);
|
||||||
|
|
||||||
@ -141,8 +145,9 @@ namespace CSVWorld
|
|||||||
|
|
||||||
///< \return Does column require update?
|
///< \return Does column require update?
|
||||||
|
|
||||||
virtual void setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay = false) const;
|
virtual void setEditorData (QWidget *editor, const QModelIndex& index) const;
|
||||||
|
|
||||||
|
virtual void setEditorData (QWidget *editor, const QModelIndex& index, bool tryDisplay) const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ set(GAME
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (ANDROID)
|
if (ANDROID)
|
||||||
|
set(GAME ${GAME} android_commandLine.cpp)
|
||||||
set(GAME ${GAME} android_main.c)
|
set(GAME ${GAME} android_main.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -104,7 +105,6 @@ find_package(Boost REQUIRED COMPONENTS ${BOOST_COMPONENTS})
|
|||||||
|
|
||||||
if (NOT ANDROID)
|
if (NOT ANDROID)
|
||||||
add_executable(openmw
|
add_executable(openmw
|
||||||
${OPENMW_LIBS} ${OPENMW_LIBS_HEADER}
|
|
||||||
${OPENMW_FILES}
|
${OPENMW_FILES}
|
||||||
${GAME} ${GAME_HEADER}
|
${GAME} ${GAME_HEADER}
|
||||||
${APPLE_BUNDLE_RESOURCES}
|
${APPLE_BUNDLE_RESOURCES}
|
||||||
@ -112,7 +112,6 @@ if (NOT ANDROID)
|
|||||||
else ()
|
else ()
|
||||||
add_library(openmw
|
add_library(openmw
|
||||||
SHARED
|
SHARED
|
||||||
${OPENMW_LIBS} ${OPENMW_LIBS_HEADER}
|
|
||||||
${OPENMW_FILES}
|
${OPENMW_FILES}
|
||||||
${GAME} ${GAME_HEADER}
|
${GAME} ${GAME_HEADER}
|
||||||
)
|
)
|
||||||
@ -120,9 +119,10 @@ endif ()
|
|||||||
|
|
||||||
# Sound stuff - here so CMake doesn't stupidly recompile EVERYTHING
|
# Sound stuff - here so CMake doesn't stupidly recompile EVERYTHING
|
||||||
# when we change the backend.
|
# when we change the backend.
|
||||||
include_directories(${SOUND_INPUT_INCLUDES} ${BULLET_INCLUDE_DIRS})
|
include_directories(${SOUND_INPUT_INCLUDES})
|
||||||
|
|
||||||
target_link_libraries(openmw
|
target_link_libraries(openmw
|
||||||
|
${OENGINE_LIBRARY}
|
||||||
${OGRE_LIBRARIES}
|
${OGRE_LIBRARIES}
|
||||||
${OGRE_STATIC_PLUGINS}
|
${OGRE_STATIC_PLUGINS}
|
||||||
${SHINY_LIBRARIES}
|
${SHINY_LIBRARIES}
|
||||||
|
27
apps/openmw/android_commandLine.cpp
Normal file
27
apps/openmw/android_commandLine.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include "android_commandLine.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
|
const char **argvData;
|
||||||
|
int argcData;
|
||||||
|
|
||||||
|
extern "C" void releaseArgv();
|
||||||
|
|
||||||
|
void releaseArgv() {
|
||||||
|
delete[] argvData;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_ui_activity_GameActivity_commandLine(JNIEnv *env,
|
||||||
|
jobject obj, jint argc, jobjectArray stringArray) {
|
||||||
|
jboolean iscopy;
|
||||||
|
argcData = (int) argc;
|
||||||
|
argvData = new const char *[argcData + 1];
|
||||||
|
argvData[0] = "openmw";
|
||||||
|
for (int i = 1; i < argcData + 1; i++) {
|
||||||
|
jstring string = (jstring) (env)->GetObjectArrayElement(stringArray,
|
||||||
|
i - 1);
|
||||||
|
argvData[i] = (env)->GetStringUTFChars(string, &iscopy);
|
||||||
|
(env)->DeleteLocalRef(string);
|
||||||
|
}
|
||||||
|
(env)->DeleteLocalRef(stringArray);
|
||||||
|
}
|
||||||
|
|
16
apps/openmw/android_commandLine.h
Normal file
16
apps/openmw/android_commandLine.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
#ifndef _Included_ui_activity_GameActivity_commandLine
|
||||||
|
#define _Included_ui_activity_GameActivity_commandLine
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_ui_activity_GameActivity_commandLine(JNIEnv *env, jobject obj,jint argcData, jobjectArray stringArray);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
@ -1,42 +1,37 @@
|
|||||||
|
|
||||||
#include "../../SDL_internal.h"
|
#include "../../SDL_internal.h"
|
||||||
|
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
#include "SDL_main.h"
|
#include "SDL_main.h"
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Functions called by JNI
|
Functions called by JNI
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
|
||||||
/* Called before to initialize JNI bindings */
|
/* Called before to initialize JNI bindings */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void SDL_Android_Init(JNIEnv* env, jclass cls);
|
extern void SDL_Android_Init(JNIEnv* env, jclass cls);
|
||||||
|
extern int argcData;
|
||||||
|
extern const char **argvData;
|
||||||
|
void releaseArgv();
|
||||||
|
|
||||||
|
int Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls,
|
||||||
|
jobject obj) {
|
||||||
|
|
||||||
int Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls, jobject obj)
|
SDL_Android_Init(env, cls);
|
||||||
{
|
|
||||||
|
|
||||||
SDL_Android_Init(env, cls);
|
SDL_SetMainReady();
|
||||||
|
|
||||||
SDL_SetMainReady();
|
/* Run the application code! */
|
||||||
|
|
||||||
|
int status;
|
||||||
|
|
||||||
/* Run the application code! */
|
status = main(argcData+1, argvData);
|
||||||
|
releaseArgv();
|
||||||
|
/* Do not issue an exit or the whole application will terminate instead of just the SDL thread */
|
||||||
|
/* exit(status); */
|
||||||
|
|
||||||
int status;
|
return status;
|
||||||
char *argv[2];
|
|
||||||
argv[0] = SDL_strdup("openmw");
|
|
||||||
argv[1] = NULL;
|
|
||||||
status = main(1, argv);
|
|
||||||
|
|
||||||
/* Do not issue an exit or the whole application will terminate instead of just the SDL thread */
|
|
||||||
/* exit(status); */
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __ANDROID__ */
|
#endif /* __ANDROID__ */
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
|
#include <openengine/misc/rng.hpp>
|
||||||
|
|
||||||
#include <components/compiler/extensions0.hpp>
|
#include <components/compiler/extensions0.hpp>
|
||||||
|
|
||||||
#include <components/bsa/resources.hpp>
|
#include <components/bsa/resources.hpp>
|
||||||
@ -191,15 +193,13 @@ OMW::Engine::Engine(Files::ConfigurationManager& configurationManager)
|
|||||||
, mExportFonts(false)
|
, mExportFonts(false)
|
||||||
, mNewGame (false)
|
, mNewGame (false)
|
||||||
{
|
{
|
||||||
std::srand ( std::time(NULL) );
|
OEngine::Misc::Rng::init();
|
||||||
|
std::srand ( static_cast<unsigned int>(std::time(NULL)) );
|
||||||
MWClass::registerClasses();
|
MWClass::registerClasses();
|
||||||
|
|
||||||
Uint32 flags = SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE;
|
Uint32 flags = SDL_INIT_VIDEO|SDL_INIT_NOPARACHUTE|SDL_INIT_GAMECONTROLLER|SDL_INIT_JOYSTICK;
|
||||||
if(SDL_WasInit(flags) == 0)
|
if(SDL_WasInit(flags) == 0)
|
||||||
{
|
{
|
||||||
//kindly ask SDL not to trash our OGL context
|
|
||||||
//might this be related to http://bugzilla.libsdl.org/show_bug.cgi?id=748 ?
|
|
||||||
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "software");
|
|
||||||
SDL_SetMainReady();
|
SDL_SetMainReady();
|
||||||
if(SDL_Init(flags) != 0)
|
if(SDL_Init(flags) != 0)
|
||||||
{
|
{
|
||||||
@ -368,9 +368,29 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
|
|||||||
// Create input and UI first to set up a bootstrapping environment for
|
// Create input and UI first to set up a bootstrapping environment for
|
||||||
// showing a loading screen and keeping the window responsive while doing so
|
// showing a loading screen and keeping the window responsive while doing so
|
||||||
|
|
||||||
std::string keybinderUser = (mCfgMgr.getUserConfigPath() / "input_v2.xml").string();
|
std::string keybinderUser = (mCfgMgr.getUserConfigPath() / "input_v3.xml").string();
|
||||||
bool keybinderUserExists = boost::filesystem::exists(keybinderUser);
|
bool keybinderUserExists = boost::filesystem::exists(keybinderUser);
|
||||||
MWInput::InputManager* input = new MWInput::InputManager (*mOgre, *this, keybinderUser, keybinderUserExists, mGrab);
|
if(!keybinderUserExists)
|
||||||
|
{
|
||||||
|
std::string input2 = (mCfgMgr.getUserConfigPath() / "input_v2.xml").string();
|
||||||
|
if(boost::filesystem::exists(input2)) {
|
||||||
|
boost::filesystem::copy_file(input2, keybinderUser);
|
||||||
|
keybinderUserExists = boost::filesystem::exists(keybinderUser);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// find correct path to the game controller bindings
|
||||||
|
const std::string localdefault = mCfgMgr.getLocalPath().string() + "/gamecontrollerdb.cfg";
|
||||||
|
const std::string globaldefault = mCfgMgr.getGlobalPath().string() + "/gamecontrollerdb.cfg";
|
||||||
|
std::string gameControllerdb;
|
||||||
|
if (boost::filesystem::exists(localdefault))
|
||||||
|
gameControllerdb = localdefault;
|
||||||
|
else if (boost::filesystem::exists(globaldefault))
|
||||||
|
gameControllerdb = globaldefault;
|
||||||
|
else
|
||||||
|
gameControllerdb = ""; //if it doesn't exist, pass in an empty string
|
||||||
|
|
||||||
|
MWInput::InputManager* input = new MWInput::InputManager (*mOgre, *this, keybinderUser, keybinderUserExists, gameControllerdb, mGrab);
|
||||||
mEnvironment.setInputManager (input);
|
mEnvironment.setInputManager (input);
|
||||||
|
|
||||||
MWGui::WindowManager* window = new MWGui::WindowManager(
|
MWGui::WindowManager* window = new MWGui::WindowManager(
|
||||||
|
@ -290,7 +290,7 @@ public:
|
|||||||
std::streamsize write(const char *str, std::streamsize size)
|
std::streamsize write(const char *str, std::streamsize size)
|
||||||
{
|
{
|
||||||
// Make a copy for null termination
|
// Make a copy for null termination
|
||||||
std::string tmp (str, size);
|
std::string tmp (str, static_cast<unsigned int>(size));
|
||||||
// Write string to Visual Studio Debug output
|
// Write string to Visual Studio Debug output
|
||||||
OutputDebugString (tmp.c_str ());
|
OutputDebugString (tmp.c_str ());
|
||||||
return size;
|
return size;
|
||||||
|
@ -37,11 +37,23 @@ namespace MWBase
|
|||||||
virtual bool getControlSwitch (const std::string& sw) = 0;
|
virtual bool getControlSwitch (const std::string& sw) = 0;
|
||||||
|
|
||||||
virtual std::string getActionDescription (int action) = 0;
|
virtual std::string getActionDescription (int action) = 0;
|
||||||
virtual std::string getActionBindingName (int action) = 0;
|
virtual std::string getActionKeyBindingName (int action) = 0;
|
||||||
virtual std::vector<int> getActionSorting () = 0;
|
virtual std::string getActionControllerBindingName (int action) = 0;
|
||||||
|
virtual std::string sdlControllerAxisToString(int axis) = 0;
|
||||||
|
virtual std::string sdlControllerButtonToString(int button) = 0;
|
||||||
|
///Actions available for binding to keyboard buttons
|
||||||
|
virtual std::vector<int> getActionKeySorting() = 0;
|
||||||
|
///Actions available for binding to controller buttons
|
||||||
|
virtual std::vector<int> getActionControllerSorting() = 0;
|
||||||
virtual int getNumActions() = 0;
|
virtual int getNumActions() = 0;
|
||||||
virtual void enableDetectingBindingMode (int action) = 0;
|
///If keyboard is true, only pay attention to keyboard events. If false, only pay attention to controller events (excluding esc)
|
||||||
virtual void resetToDefaultBindings() = 0;
|
virtual void enableDetectingBindingMode (int action, bool keyboard) = 0;
|
||||||
|
virtual void resetToDefaultKeyBindings() = 0;
|
||||||
|
virtual void resetToDefaultControllerBindings() = 0;
|
||||||
|
|
||||||
|
/// Returns if the last used input device was a joystick or a keyboard
|
||||||
|
/// @return true if joystick, false otherwise
|
||||||
|
virtual bool joystickLastUsed() = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ namespace MWWorld
|
|||||||
namespace MWSound
|
namespace MWSound
|
||||||
{
|
{
|
||||||
class Sound;
|
class Sound;
|
||||||
class Sound_Decoder;
|
struct Sound_Decoder;
|
||||||
typedef boost::shared_ptr<Sound_Decoder> DecoderPtr;
|
typedef boost::shared_ptr<Sound_Decoder> DecoderPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,17 +149,14 @@ namespace MWBase
|
|||||||
|
|
||||||
/// \todo investigate, if we really need to expose every single lousy UI element to the outside world
|
/// \todo investigate, if we really need to expose every single lousy UI element to the outside world
|
||||||
virtual MWGui::DialogueWindow* getDialogueWindow() = 0;
|
virtual MWGui::DialogueWindow* getDialogueWindow() = 0;
|
||||||
virtual MWGui::ContainerWindow* getContainerWindow() = 0;
|
|
||||||
virtual MWGui::InventoryWindow* getInventoryWindow() = 0;
|
virtual MWGui::InventoryWindow* getInventoryWindow() = 0;
|
||||||
virtual MWGui::BookWindow* getBookWindow() = 0;
|
|
||||||
virtual MWGui::ScrollWindow* getScrollWindow() = 0;
|
|
||||||
virtual MWGui::CountDialog* getCountDialog() = 0;
|
virtual MWGui::CountDialog* getCountDialog() = 0;
|
||||||
virtual MWGui::ConfirmationDialog* getConfirmationDialog() = 0;
|
virtual MWGui::ConfirmationDialog* getConfirmationDialog() = 0;
|
||||||
virtual MWGui::TradeWindow* getTradeWindow() = 0;
|
virtual MWGui::TradeWindow* getTradeWindow() = 0;
|
||||||
virtual MWGui::SpellBuyingWindow* getSpellBuyingWindow() = 0;
|
|
||||||
virtual MWGui::TravelWindow* getTravelWindow() = 0;
|
virtual void updateSpellWindow() = 0;
|
||||||
virtual MWGui::SpellWindow* getSpellWindow() = 0;
|
|
||||||
virtual MWGui::Console* getConsole() = 0;
|
virtual void setConsoleSelectedObject(const MWWorld::Ptr& object) = 0;
|
||||||
|
|
||||||
virtual void wmUpdateFps(float fps, unsigned int triangleCount, unsigned int batchCount) = 0;
|
virtual void wmUpdateFps(float fps, unsigned int triangleCount, unsigned int batchCount) = 0;
|
||||||
|
|
||||||
@ -181,12 +178,6 @@ namespace MWBase
|
|||||||
virtual void configureSkills (const SkillList& major, const SkillList& minor) = 0;
|
virtual void configureSkills (const SkillList& major, const SkillList& minor) = 0;
|
||||||
///< configure skill groups, each set contains the skill ID for that group.
|
///< configure skill groups, each set contains the skill ID for that group.
|
||||||
|
|
||||||
virtual void setReputation (int reputation) = 0;
|
|
||||||
///< set the current reputation value
|
|
||||||
|
|
||||||
virtual void setBounty (int bounty) = 0;
|
|
||||||
///< set the current bounty value
|
|
||||||
|
|
||||||
virtual void updateSkillArea() = 0;
|
virtual void updateSkillArea() = 0;
|
||||||
///< update display of skills, factions, birth sign, reputation and bounty
|
///< update display of skills, factions, birth sign, reputation and bounty
|
||||||
|
|
||||||
@ -303,6 +294,12 @@ namespace MWBase
|
|||||||
virtual void startTraining(MWWorld::Ptr actor) = 0;
|
virtual void startTraining(MWWorld::Ptr actor) = 0;
|
||||||
virtual void startRepair(MWWorld::Ptr actor) = 0;
|
virtual void startRepair(MWWorld::Ptr actor) = 0;
|
||||||
virtual void startRepairItem(MWWorld::Ptr item) = 0;
|
virtual void startRepairItem(MWWorld::Ptr item) = 0;
|
||||||
|
virtual void startTravel(const MWWorld::Ptr& actor) = 0;
|
||||||
|
virtual void startSpellBuying(const MWWorld::Ptr& actor) = 0;
|
||||||
|
virtual void startTrade(const MWWorld::Ptr& actor) = 0;
|
||||||
|
virtual void openContainer(const MWWorld::Ptr& container, bool loot) = 0;
|
||||||
|
virtual void showBook(const MWWorld::Ptr& item, bool showTakeButton) = 0;
|
||||||
|
virtual void showScroll(const MWWorld::Ptr& item, bool showTakeButton) = 0;
|
||||||
|
|
||||||
virtual void showSoulgemDialog (MWWorld::Ptr item) = 0;
|
virtual void showSoulgemDialog (MWWorld::Ptr item) = 0;
|
||||||
|
|
||||||
@ -332,9 +329,8 @@ namespace MWBase
|
|||||||
/// Does the current stack of GUI-windows permit saving?
|
/// Does the current stack of GUI-windows permit saving?
|
||||||
virtual bool isSavingAllowed() const = 0;
|
virtual bool isSavingAllowed() const = 0;
|
||||||
|
|
||||||
/// Returns the current Modal
|
/// Send exit command to active Modal window
|
||||||
/** Used to send exit command to active Modal when Esc is pressed **/
|
virtual void exitCurrentModal() = 0;
|
||||||
virtual MWGui::WindowModal* getCurrentModal() const = 0;
|
|
||||||
|
|
||||||
/// Sets the current Modal
|
/// Sets the current Modal
|
||||||
/** Used to send exit command to active Modal when Esc is pressed **/
|
/** Used to send exit command to active Modal when Esc is pressed **/
|
||||||
|
@ -49,7 +49,7 @@ namespace MWRender
|
|||||||
|
|
||||||
namespace MWMechanics
|
namespace MWMechanics
|
||||||
{
|
{
|
||||||
class Movement;
|
struct Movement;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
@ -205,10 +205,8 @@ namespace MWBase
|
|||||||
///< Return a pointer to a liveCellRef which contains \a ptr.
|
///< Return a pointer to a liveCellRef which contains \a ptr.
|
||||||
/// \note Search is limited to the active cells.
|
/// \note Search is limited to the active cells.
|
||||||
|
|
||||||
/// \todo enable reference in the OGRE scene
|
|
||||||
virtual void enable (const MWWorld::Ptr& ptr) = 0;
|
virtual void enable (const MWWorld::Ptr& ptr) = 0;
|
||||||
|
|
||||||
/// \todo disable reference in the OGRE scene
|
|
||||||
virtual void disable (const MWWorld::Ptr& ptr) = 0;
|
virtual void disable (const MWWorld::Ptr& ptr) = 0;
|
||||||
|
|
||||||
virtual void advanceTime (double hours) = 0;
|
virtual void advanceTime (double hours) = 0;
|
||||||
|
@ -155,7 +155,7 @@ namespace MWClass
|
|||||||
|
|
||||||
bool Apparatus::canSell (const MWWorld::Ptr& item, int npcServices) const
|
bool Apparatus::canSell (const MWWorld::Ptr& item, int npcServices) const
|
||||||
{
|
{
|
||||||
return npcServices & ESM::NPC::Apparatus;
|
return (npcServices & ESM::NPC::Apparatus) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
float Apparatus::getWeight(const MWWorld::Ptr &ptr) const
|
float Apparatus::getWeight(const MWWorld::Ptr &ptr) const
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user