@@ -0,0 +1,42 @@ | |||
vstgui/ide/xcode4/build | |||
vstgui/ide/xcode4/DerivedData | |||
vstgui/ide/xcode4/vstgui.xcodeproj/xcuserdata | |||
vstgui/tests/uidescription vst3/mac/build | |||
vstgui/tests/uidescription vst3/mac/DerivedData | |||
vstgui/tests/uidescription vst3/mac/uidescription test.xcodeproj/xcuserdata | |||
vstgui/tests/unittest/lcov/out | |||
vstgui-coverage.info | |||
vstgui/tests/uidescription vst3/mac/uidescription test.xcodeproj/project.xcworkspace | |||
vstgui/tests/ios standalone/build | |||
vstgui/tests/ios standalone/DerivedData | |||
vstgui/tests/ios standalone/iOS Standalone.xcodeproj/project.xcworkspace | |||
vstgui/tests/ios standalone/iOS Standalone.xcodeproj/xcuserdata | |||
vstgui/ide/visualstudio/vs2015/build | |||
*.VC.opendb | |||
vstgui/tests/uidescription vst3/win/x64 | |||
vstgui/tests/uidescription vst3/win/Win32 | |||
vstgui/ide/xcode4/vstgui.xcodeproj/project.xcworkspace | |||
vstgui/ide/visualstudio/vs2013/build | |||
vstgui.opensdf | |||
vstgui/tests/standalone/mac/build | |||
vstgui/tests/standalone/mac/DerivedData | |||
vstgui/tests/standalone/mac/VSTGUIStandalone.xcodeproj/project.xcworkspace | |||
vstgui/tests/standalone/mac/VSTGUIStandalone.xcodeproj/xcuserdata | |||
vstgui/tests/standalone/win/vs2015/x64 | |||
*.vcxproj.user | |||
vstgui/tests/standalone/win/vs2015/.vs | |||
vstgui/CMakeFiles | |||
CMakeCache.txt | |||
compile_commands.json | |||
vstgui.sdf | |||
vstgui.v12.suo | |||
vstgui/ide/visualstudio/vs2015/.vs | |||
vstgui/build | |||
vstgui/tests/uidescription vst3/win/.vs | |||
vstgui/Documentation/html | |||
/vstgui/uidescription/editing/editoruidesc.h | |||
CMakeLists.txt.user | |||
build | |||
vstgui/gdk | |||
vstgui/gdkmm | |||
vstgui/gtk |
@@ -0,0 +1,49 @@ | |||
language: cpp | |||
matrix: | |||
include: | |||
# macOS | |||
- os: osx | |||
osx_image: xcode7.3 | |||
compiler: clang | |||
env: CPPCOMPILER='clang++' CCOMPILER='clang' BUILD_TYPE='Debug' | |||
- os: osx | |||
osx_image: xcode9.4 | |||
compiler: clang | |||
env: CPPCOMPILER='clang++' CCOMPILER='clang' BUILD_TYPE='Debug' | |||
# linux | |||
- os: linux | |||
compiler: gcc | |||
addons: &gcc7 | |||
apt: | |||
sources: ['ubuntu-toolchain-r-test'] | |||
packages: [ | |||
'g++-7', | |||
'libxcb-util0-dev', | |||
'libxcb-xkb-dev', | |||
'libgtkmm-3.0-dev', | |||
'libxcb-cursor-dev', | |||
'libxkbcommon-dev', | |||
'libxkbcommon-x11-dev', | |||
'libxcb-keysyms1-dev' | |||
] | |||
env: CPPCOMPILER='g++-7' CCOMPILER='gcc-7' BUILD_TYPE='Debug' | |||
install: | |||
true | |||
script: | |||
- export CXX=${CPPCOMPILER} | |||
- export CC=${CCOMPILER} | |||
- mkdir -p build | |||
- cd build | |||
- | | |||
if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then | |||
cmake -GXcode -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ../vstgui/ | |||
elif [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then | |||
cmake -DVSTGUI_STANDALONE=OFF -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ../vstgui/ | |||
fi | |||
- cmake --build . | |||
@@ -0,0 +1,27 @@ | |||
//----------------------------------------------------------------------------- | |||
// VSTGUI LICENSE | |||
// (c) 2018, Steinberg Media Technologies, All Rights Reserved | |||
//----------------------------------------------------------------------------- | |||
// Redistribution and use in source and binary forms, with or without modification, | |||
// are permitted provided that the following conditions are met: | |||
// | |||
// * Redistributions of source code must retain the above copyright notice, | |||
// this list of conditions and the following disclaimer. | |||
// * Redistributions in binary form must reproduce the above copyright notice, | |||
// this list of conditions and the following disclaimer in the documentation | |||
// and/or other materials provided with the distribution. | |||
// * Neither the name of the Steinberg Media Technologies nor the names of its | |||
// contributors may be used to endorse or promote products derived from this | |||
// software without specific prior written permission. | |||
// | |||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |||
// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | |||
// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||
// OF THE POSSIBILITY OF SUCH DAMAGE. | |||
//----------------------------------------------------------------------------- |
@@ -0,0 +1,52 @@ | |||
# VSTGUI | |||
[![Build Status](https://travis-ci.com/scheffle/vstgui.svg?branch=master)](https://travis-ci.com/scheffle/vstgui) | |||
VSTGUI is a user interface toolkit mainly for audio plug-ins (VST, AAX, AudioUnit, etc...) | |||
and it is designed for working well with VST3 plug-ins. | |||
## History | |||
- First developed inhouse of Steinberg Media Technologies (around 1998) for their first VST plug-ins. | |||
- Later added as binary libraries to the official VST SDK. | |||
- Since May 2003 VSTGUI is open source. | |||
## System requirements | |||
Supported OS: | |||
- Microsoft Windows 7-10 | |||
- Apple OSX 10.9-10.13 | |||
- Apple iOS 8-11 | |||
- Linux (Preview) | |||
Supported IDE: | |||
- Visual Studio 2015/2017 | |||
- minimum Xcode 8 | |||
- Qt Creator | |||
## License | |||
BSD style | |||
VSTGUI LICENSE | |||
(c) Steinberg Media Technologies, All Rights Reserved | |||
Redistribution and use in source and binary forms, with or without modification, | |||
are permitted provided that the following conditions are met: | |||
* Redistributions of source code must retain the above copyright notice, | |||
this list of conditions and the following disclaimer. | |||
* Redistributions in binary form must reproduce the above copyright notice, | |||
this list of conditions and the following disclaimer in the documentation | |||
and/or other materials provided with the distribution. | |||
* Neither the name of the Steinberg Media Technologies nor the names of its | |||
contributors may be used to endorse or promote products derived from this | |||
software without specific prior written permission. | |||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |||
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, | |||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |||
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | |||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | |||
OF THE POSSIBILITY OF SUCH DAMAGE. |
@@ -0,0 +1,24 @@ | |||
{ | |||
"configurations": [ | |||
{ | |||
"name": "Linux", | |||
"browse": { | |||
"path": [ | |||
"${workspaceFolder}" | |||
], | |||
"limitSymbolsToIncludedHeaders": true | |||
}, | |||
"includePath": [ | |||
"${workspaceFolder}" | |||
], | |||
"defines": [], | |||
"compilerPath": "/usr/bin/clang", | |||
"cStandard": "c11", | |||
"cppStandard": "c++17", | |||
"compileCommands": "build/compile_commands.json", | |||
"intelliSenseMode": "clang-x64", | |||
"configurationProvider": "vector-of-bool.cmake-tools" | |||
} | |||
], | |||
"version": 4 | |||
} |
@@ -0,0 +1,36 @@ | |||
{ | |||
// Use IntelliSense to learn about possible attributes. | |||
// Hover to view descriptions of existing attributes. | |||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 | |||
"version": "0.2.0", | |||
"configurations": [ | |||
{ | |||
"name": "(gdb) standalone", | |||
"type": "cppdbg", | |||
"request": "launch", | |||
"program": "${workspaceFolder}/build/Debug/standalone/standalone", | |||
"args": [], | |||
"stopAtEntry": false, | |||
"cwd": "${workspaceFolder}/build/Debug/", | |||
"environment": [ | |||
{ | |||
"name": "LD_LIBRARY_PATH", | |||
"value": "/home/scheffle/tmp/gtk+3.0-3.22.11/debian/build/shared/gdk/.libs;/home/scheffle/tmp/gtkmm3.0-3.22.0/gdk/gdkmm/.libs;/home/scheffle/tmp/cairomm-1.12.0/debian/libcairomm-1.0-1v5/usr/lib/x86_64-linux-gnu" | |||
}, | |||
// { | |||
// "name": "DISPLAY", | |||
// "value": ":9" | |||
// } | |||
], | |||
"externalConsole": true, | |||
"MIMode": "gdb", | |||
"setupCommands": [ | |||
{ | |||
"description": "Enable pretty-printing for gdb", | |||
"text": "-enable-pretty-printing", | |||
"ignoreFailures": true | |||
} | |||
] | |||
} | |||
] | |||
} |
@@ -0,0 +1,51 @@ | |||
{ | |||
"files.associations": { | |||
"deque": "cpp", | |||
"vector": "cpp", | |||
"*.tcc": "cpp", | |||
"fstream": "cpp", | |||
"valarray": "cpp", | |||
"array": "cpp", | |||
"chrono": "cpp", | |||
"functional": "cpp", | |||
"ratio": "cpp", | |||
"type_traits": "cpp", | |||
"tuple": "cpp", | |||
"utility": "cpp", | |||
"atomic": "cpp", | |||
"bitset": "cpp", | |||
"cctype": "cpp", | |||
"clocale": "cpp", | |||
"cmath": "cpp", | |||
"complex": "cpp", | |||
"condition_variable": "cpp", | |||
"cstdarg": "cpp", | |||
"cstddef": "cpp", | |||
"cstdint": "cpp", | |||
"cstdio": "cpp", | |||
"cstdlib": "cpp", | |||
"cstring": "cpp", | |||
"ctime": "cpp", | |||
"cwchar": "cpp", | |||
"cwctype": "cpp", | |||
"list": "cpp", | |||
"unordered_map": "cpp", | |||
"exception": "cpp", | |||
"initializer_list": "cpp", | |||
"iosfwd": "cpp", | |||
"iostream": "cpp", | |||
"istream": "cpp", | |||
"limits": "cpp", | |||
"memory": "cpp", | |||
"mutex": "cpp", | |||
"new": "cpp", | |||
"ostream": "cpp", | |||
"sstream": "cpp", | |||
"stdexcept": "cpp", | |||
"streambuf": "cpp", | |||
"system_error": "cpp", | |||
"thread": "cpp", | |||
"typeinfo": "cpp" | |||
}, | |||
"cmake.configureOnOpen": true, | |||
} |
@@ -0,0 +1,188 @@ | |||
########################################################################################## | |||
cmake_minimum_required(VERSION 3.5) | |||
if(NOT PROJECT_NAME) | |||
project(vstgui) | |||
set(VSTGUI_MAIN_PROJECT_BUILD 1) | |||
endif() | |||
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9) | |||
if (UNIX AND NOT CMAKE_HOST_APPLE) | |||
set(LINUX TRUE) | |||
endif() | |||
########################################################################################## | |||
function(vstgui_set_cxx_version target version) | |||
set_property(TARGET ${target} PROPERTY CXX_STANDARD ${version}) | |||
set_property(TARGET ${target} PROPERTY CXX_STANDARD_REQUIRED ON) | |||
set_property(TARGET ${target} PROPERTY CMAKE_CXX_STANDARD_REQUIRED ON) | |||
if(APPLE) | |||
target_compile_options(${target} PUBLIC "-stdlib=libc++") | |||
endif() | |||
endfunction(vstgui_set_cxx_version target version) | |||
########################################################################################## | |||
function(vstgui_source_group_by_folder target) | |||
if(CMAKE_CONFIGURATION_TYPES) | |||
set(SOURCE_GROUP_DELIMITER "/") | |||
set(last_dir "") | |||
set(files "") | |||
foreach(file ${${target}_sources}) | |||
get_filename_component(dir "${file}" DIRECTORY) | |||
string(FIND "${dir}" ${target} isTargetFolder) | |||
if (${isTargetFolder} EQUAL 0) | |||
string(LENGTH ${target} offset) | |||
string(SUBSTRING "${dir}" ${offset} -1 dir) | |||
endif(${isTargetFolder} EQUAL 0) | |||
if (NOT "${dir}" STREQUAL "${last_dir}") | |||
if (files) | |||
source_group("${last_dir}" FILES ${files}) | |||
endif (files) | |||
set(files "") | |||
endif (NOT "${dir}" STREQUAL "${last_dir}") | |||
set(files ${files} ${file}) | |||
set(last_dir "${dir}") | |||
endforeach(file) | |||
if (files) | |||
source_group("${last_dir}" FILES ${files}) | |||
endif (files) | |||
endif(CMAKE_CONFIGURATION_TYPES) | |||
endfunction(vstgui_source_group_by_folder) | |||
########################################################################################## | |||
if(CMAKE_CONFIGURATION_TYPES) | |||
set(CMAKE_CONFIGURATION_TYPES Debug Release ReleaseLTO) | |||
set_property(GLOBAL PROPERTY USE_FOLDERS ON) | |||
endif() | |||
########################################################################################## | |||
set(VSTGUI_COMPILE_DEFINITIONS_DEBUG "VSTGUI_LIVE_EDITING;DEBUG") | |||
set(VSTGUI_COMPILE_DEFINITIONS_RELEASE "NDEBUG;RELEASE") | |||
if(CMAKE_HOST_APPLE) | |||
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER 7) | |||
set(VSTGUI_LTO_COMPILER_FLAGS "-O3 -flto=thin") | |||
else() | |||
set(VSTGUI_LTO_COMPILER_FLAGS "-O3 -flto") | |||
endif() | |||
set(VSTGUI_LTO_LINKER_FLAGS "") | |||
endif() | |||
if(LINUX) | |||
set(VSTGUI_LTO_COMPILER_FLAGS "-O3 -flto") | |||
set(VSTGUI_LTO_LINKER_FLAGS "") | |||
find_package(X11 REQUIRED) | |||
find_package(Freetype REQUIRED) | |||
find_package(PkgConfig REQUIRED) | |||
pkg_check_modules(LIBXCB REQUIRED xcb) | |||
pkg_check_modules(LIBXCB_UTIL REQUIRED xcb-util) | |||
pkg_check_modules(LIBXCB_CURSOR REQUIRED xcb-cursor) | |||
pkg_check_modules(LIBXCB_KEYSYMS REQUIRED xcb-keysyms) | |||
pkg_check_modules(LIBXCB_XKB REQUIRED xcb-xkb) | |||
pkg_check_modules(LIBXKB_COMMON REQUIRED xkbcommon) | |||
pkg_check_modules(LIBXKB_COMMON_X11 REQUIRED xkbcommon-x11) | |||
set(LINUX_LIBRARIES | |||
${X11_LIBRARIES} | |||
${FREETYPE_LIBRARIES} | |||
${LIBXCB_LIBRARIES} | |||
${LIBXCB_UTIL_LIBRARIES} | |||
${LIBXCB_CURSOR_LIBRARIES} | |||
${LIBXCB_KEYSYMS_LIBRARIES} | |||
${LIBXCB_XKB_LIBRARIES} | |||
${LIBXKB_COMMON_LIBRARIES} | |||
${LIBXKB_COMMON_X11_LIBRARIES} | |||
cairo | |||
fontconfig | |||
dl | |||
) | |||
if(VSTGUI_WARN_EVERYTHING) | |||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") | |||
endif() | |||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-multichar") | |||
endif() | |||
if(MSVC) | |||
set(VSTGUI_COMPILE_DEFINITIONS_DEBUG "${VSTGUI_COMPILE_DEFINITIONS_DEBUG};_CRT_SECURE_NO_WARNINGS") | |||
set(VSTGUI_COMPILE_DEFINITIONS_RELEASE "${VSTGUI_COMPILE_DEFINITIONS_RELEASE};_CRT_SECURE_NO_WARNINGS") | |||
set(VSTGUI_LTO_COMPILER_FLAGS "/GL /MP") | |||
set(VSTGUI_LTO_LINKER_FLAGS "/LTCG") | |||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") | |||
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221") | |||
endif() | |||
set(VSTGUI_COMPILE_DEFINITIONS PRIVATE | |||
$<$<CONFIG:Debug>:${VSTGUI_COMPILE_DEFINITIONS_DEBUG}> | |||
$<$<CONFIG:Release>:${VSTGUI_COMPILE_DEFINITIONS_RELEASE}> | |||
$<$<CONFIG:ReleaseLTO>:${VSTGUI_COMPILE_DEFINITIONS_RELEASE}> | |||
) | |||
set(CMAKE_CXX_FLAGS_RELEASELTO | |||
"${CMAKE_CXX_FLAGS_RELEASE} ${VSTGUI_LTO_COMPILER_FLAGS}" | |||
) | |||
set(CMAKE_EXE_LINKER_FLAGS_RELEASELTO | |||
"${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${VSTGUI_LTO_LINKER_FLAGS}" | |||
) | |||
set(CMAKE_STATIC_LINKER_FLAGS_RELEASELTO | |||
"${CMAKE_STATIC_LINKER_FLAGS_RELEASE} ${VSTGUI_LTO_LINKER_FLAGS}" | |||
) | |||
########################################################################################## | |||
if(NOT CMAKE_CONFIGURATION_TYPES) | |||
if(NOT CMAKE_BUILD_TYPE) | |||
set(CMAKE_BUILD_TYPE Debug) | |||
endif() | |||
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") | |||
endif() | |||
if(VSTGUI_MAIN_PROJECT_BUILD) | |||
message("Building only vstgui") | |||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY | |||
$<$<CONFIG:Debug>:${CMAKE_BINARY_DIR}/Debug/>$<$<CONFIG:Release>:${CMAKE_BINARY_DIR}/Release/>$<$<CONFIG:ReleaseLTO>:${CMAKE_BINARY_DIR}/ReleaseLTO/> | |||
) | |||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY | |||
$<$<CONFIG:Debug>:${CMAKE_BINARY_DIR}/Debug/libs/>$<$<CONFIG:Release>:${CMAKE_BINARY_DIR}/Release/libs/>$<$<CONFIG:ReleaseLTO>:${CMAKE_BINARY_DIR}/ReleaseLTO/libs/> | |||
) | |||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY | |||
$<$<CONFIG:Debug>:${CMAKE_BINARY_DIR}/Debug/libs>$<$<CONFIG:Release>:${CMAKE_BINARY_DIR}/Release/libs>$<$<CONFIG:ReleaseLTO>:${CMAKE_BINARY_DIR}/ReleaseLTO/libs> | |||
) | |||
endif() | |||
########################################################################################## | |||
add_subdirectory(lib) | |||
add_subdirectory(uidescription) | |||
if(LINUX) | |||
set(VSTGUI_DISABLE_UNITTESTS 1) | |||
endif() | |||
if(NOT DEFINED VSTGUI_STANDALONE) | |||
option(VSTGUI_STANDALONE "VSTGUI Standalone library" ON) | |||
if(NOT DEFINED VSTGUI_STANDALONE_EXAMPLES) | |||
option(VSTGUI_STANDALONE_EXAMPLES "VSTGUI Standalone examples" ON) | |||
endif() | |||
endif() | |||
if(NOT VSTGUI_STANDALONE AND VSTGUI_STANDALONE_EXAMPLES) | |||
set(VSTGUI_STANDALONE_EXAMPLES OFF) | |||
endif() | |||
option(VSTGUI_TOOLS "VSTGUI Tools" ON) | |||
if(VSTGUI_STANDALONE) | |||
add_subdirectory(standalone) | |||
if(NOT VSTGUI_DISABLE_UNITTESTS) | |||
add_subdirectory(tests/gfxtest) | |||
add_subdirectory(tests/base64codecspeed) | |||
endif() | |||
endif() | |||
if(NOT VSTGUI_DISABLE_UNITTESTS) | |||
add_subdirectory(tests) | |||
endif() | |||
if(VSTGUI_TOOLS) | |||
add_subdirectory(tools) | |||
endif() | |||
get_directory_property(hasParent PARENT_DIRECTORY) | |||
if(hasParent) | |||
set(VSTGUI_COMPILE_DEFINITIONS ${VSTGUI_COMPILE_DEFINITIONS} PARENT_SCOPE) | |||
set(VSTGUI_LTO_COMPILER_FLAGS ${VSTGUI_LTO_COMPILER_FLAGS} PARENT_SCOPE) | |||
endif() |
@@ -0,0 +1,73 @@ | |||
{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf100 | |||
{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} | |||
{\colortbl;\red255\green255\blue255;\red255\green0\blue24;} | |||
\paperw11900\paperh16840\margl1440\margr1440\vieww21420\viewh15340\viewkind0 | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural | |||
\f0\b\fs38 \cf0 \ul \ulc0 Migrating from VSTGUI 2.3 to VSTGUI 3.0\ | |||
\f1\b0\fs22 \ulnone \ | |||
\f0\b\fs26 \ul Things you need to change in your code:\ | |||
\f1\b0\fs22 \ulnone \ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li560\fi-560\ql\qnatural | |||
\fs24 \cf0 - CFrame::removeView (CView *pView, const bool &withForget = true) The second parameter (withForget) has changed its default parameter.\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural | |||
\cf0 \ | |||
- CDrawContext::getMouseLocation (CPoint &point)\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li560\fi-560\ql\qnatural | |||
\cf0 This call will always report the global frame coordinate of the mouse. If you need the mouse coordinates relative to a view, use view->getMouseLocation (context, point)\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural | |||
\cf0 \ | |||
- The following CView methods are deprecated :\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li560\fi-560\ql\qnatural | |||
\cf0 virtual void setParentView (CView *pParentView);\ | |||
virtual void setFrame (CFrame *pParent);\ | |||
virtual void getFrameTopLeftPos (CPoint& topLeft) const;\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural | |||
\cf0 \ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li140\fi-140\ql\qnatural | |||
\cf0 - Don't call frame->beginEdit(..) and frame->endEdit(..) in your subclassed controls. Use the CControl methods beginEdit, endEdit.\ | |||
\ | |||
- Nearly all getter methods have changed to be const. Check all your subclasses, so that your methods don't hide the inherited virtual functions.\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li140\fi20\ql\qnatural | |||
\cf0 This may be the most important methods from CView and CControl\ | |||
- CView::checkUpdate ()\ | |||
- CView::isDirty ()\ | |||
- CControl::getValue ()\ | |||
- CControl::getMin ()\ | |||
- CControl::getMax ()\ | |||
- CControl::getOldValue ()\ | |||
- CControl::getDefaultValue ()\ | |||
- CControl::getTag ()\ | |||
- CControl::getWheelInc ()\ | |||
- CControl::getListener ()\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\li140\fi-140\ql\qnatural | |||
\cf0 \ | |||
- Don't call CControl::update (..) anymore to force an control to redraw. Just call CControl::setDirty (true);\ | |||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural | |||
\cf0 \ | |||
\pard\tx565\tx1133\tx1700\tx2266\tx2833\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\ql\qnatural | |||
\f0\b\fs26 \cf0 \ul How to use PNG Images on Windows:\ | |||
\ | |||
\pard\tx565\tx1133\tx1700\tx2266\tx2833\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\ql\qnatural | |||
\f1\b0\fs24 \cf0 \ulnone - Download libpng and zlib ({\field{\*\fldinst{HYPERLINK "http://libpng.sourceforge.net/"}}{\fldrslt \cf2 http://libpng.sourceforge.net/}}\cf2 , {\field{\*\fldinst{HYPERLINK "http://www.zlib.net/"}}{\fldrslt http://www.zlib.net/}}\cf0 )\ | |||
- Add their sources to your project\ | |||
- Define the preprocessor macro: USE_LIBPNG=1\ | |||
- add your png images to your rc file like this: \ | |||
128 PNG bmp00128.png\ | |||
- rebuild ;-)\ | |||
\ | |||
\pard\tx565\tx1133\tx1700\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\ql\qnatural | |||
\f0\b\fs26 \cf0 \ul Transparent Bitmaps with QUARTZ on Mac OS X:\ | |||
\ | |||
\pard\tx565\tx1133\tx1700\tx2266\tx2832\tx3401\tx3967\tx4535\tx5102\tx5669\tx6235\tx6802\ql\qnatural | |||
\f1\b0\fs24 \cf0 \ulnone Per default on Mac OS X if you need transparent bitmaps, you should use the alpha channel of a PNG Image. If you need the old behaviour and want to set bitmap->setTransparentColor (someColor) you need to call bitmap->setNoAlpha (true); (This actually is only necessary for PNG images, all other images will get the noAlpha state per default)\ | |||
\ | |||
} |
@@ -0,0 +1,11 @@ | |||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | |||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |||
<html xmlns="http://www.w3.org/1999/xhtml"> | |||
<head> | |||
<title>VSTGUI</title> | |||
<meta http-equiv="refresh" content="0; URL=html/index.html" /> | |||
</head> | |||
<body> | |||
</body> | |||
</html> |
@@ -0,0 +1,106 @@ | |||
Language: Cpp | |||
AccessModifierOffset: -4 | |||
AlignAfterOpenBracket: Align | |||
AlignConsecutiveAssignments: false | |||
AlignConsecutiveDeclarations: false | |||
AlignEscapedNewlines: Right | |||
AlignOperands: true | |||
AlignTrailingComments: true | |||
AllowAllParametersOfDeclarationOnNextLine: true | |||
AllowShortBlocksOnASingleLine: false | |||
AllowShortCaseLabelsOnASingleLine: false | |||
AllowShortFunctionsOnASingleLine: Inline | |||
AllowShortIfStatementsOnASingleLine: false | |||
AllowShortLoopsOnASingleLine: false | |||
# AlwaysBreakAfterDefinitionReturnType: None | |||
AlwaysBreakAfterReturnType: None | |||
AlwaysBreakBeforeMultilineStrings: false | |||
AlwaysBreakTemplateDeclarations: true | |||
BinPackArguments: true | |||
BinPackParameters: false | |||
BreakBeforeBraces: Custom | |||
BraceWrapping: | |||
AfterClass: true | |||
AfterControlStatement: true | |||
AfterEnum: true | |||
AfterFunction: true | |||
AfterNamespace: false | |||
AfterObjCDeclaration: true | |||
AfterStruct: true | |||
AfterUnion: true | |||
AfterExternBlock: true | |||
BeforeCatch: true | |||
BeforeElse: true | |||
IndentBraces: false | |||
SplitEmptyFunction: true | |||
SplitEmptyRecord: true | |||
SplitEmptyNamespace: true | |||
BreakBeforeBinaryOperators: None | |||
BreakBeforeInheritanceComma: true | |||
BreakBeforeTernaryOperators: true | |||
BreakConstructorInitializers: BeforeComma | |||
BreakAfterJavaFieldAnnotations: false | |||
BreakStringLiterals: true | |||
ColumnLimit: 100 | |||
# CommentPragmas: '^ IWYU pragma:' | |||
CompactNamespaces: false | |||
ConstructorInitializerAllOnOneLineOrOnePerLine: true | |||
ConstructorInitializerIndentWidth: 4 | |||
ContinuationIndentWidth: 4 | |||
Cpp11BracedListStyle: true | |||
DerivePointerAlignment: false | |||
DisableFormat: false | |||
ExperimentalAutoDetectBinPacking: false | |||
FixNamespaceComments: false | |||
# ForEachMacros: | |||
# - foreach | |||
# - Q_FOREACH | |||
# - BOOST_FOREACH | |||
IncludeBlocks: Preserve | |||
# IncludeCategories: | |||
# - Regex: '^"(llvm|llvm-c|clang|clang-c)/' | |||
# Priority: 2 | |||
# - Regex: '^(<|"(gtest|gmock|isl|json)/)' | |||
# Priority: 3 | |||
# - Regex: '.*' | |||
# Priority: 1 | |||
# IncludeIsMainRegex: '(Test)?$' | |||
IndentCaseLabels: true | |||
IndentPPDirectives: AfterHash | |||
IndentWidth: 4 | |||
IndentWrappedFunctionNames: false | |||
JavaScriptQuotes: Leave | |||
JavaScriptWrapImports: true | |||
KeepEmptyLinesAtTheStartOfBlocks: true | |||
MacroBlockBegin: '' | |||
MacroBlockEnd: '' | |||
MaxEmptyLinesToKeep: 1 | |||
NamespaceIndentation: None | |||
ObjCBlockIndentWidth: 4 | |||
ObjCSpaceAfterProperty: false | |||
ObjCSpaceBeforeProtocolList: false | |||
PenaltyBreakAssignment: 2 | |||
PenaltyBreakBeforeFirstCallParameter: 19 | |||
PenaltyBreakComment: 300 | |||
PenaltyBreakFirstLessLess: 120 | |||
PenaltyBreakString: 1000 | |||
PenaltyExcessCharacter: 1000000 | |||
PenaltyReturnTypeOnItsOwnLine: 80 | |||
PointerAlignment: Left | |||
ReflowComments: true | |||
SortIncludes: false | |||
SortUsingDeclarations: false | |||
SpaceAfterCStyleCast: false | |||
SpaceAfterTemplateKeyword: false | |||
SpaceBeforeAssignmentOperators: true | |||
SpaceBeforeParens: Always | |||
SpaceInEmptyParentheses: false | |||
SpacesBeforeTrailingComments: 1 | |||
SpacesInAngles: false | |||
SpacesInContainerLiterals: false | |||
SpacesInCStyleCastParentheses: false | |||
SpacesInParentheses: false | |||
SpacesInSquareBrackets: false | |||
Standard: Cpp11 | |||
TabWidth: 4 | |||
UseTab: Always |
@@ -0,0 +1,26 @@ | |||
// This file is part of VSTGUI. It is subject to the license terms | |||
// in the LICENSE file found in the top-level directory of this | |||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE | |||
#pragma once | |||
#include "../lib/cbitmapfilter.h" | |||
//------------------------------------------------------------------------ | |||
namespace VSTGUI { | |||
namespace BitmapFilter { | |||
//------------------------------------------------------------------------ | |||
class CIBoxBlurFilter : public BitmapFilter::FilterBase | |||
{ | |||
public: | |||
CIBoxBlurFilter (); | |||
bool run (bool replace) override; | |||
static IFilter* CreateFunction (IdStringPtr _name) { return new CIBoxBlurFilter (); } | |||
}; | |||
//------------------------------------------------------------------------ | |||
} // BitmapFilter | |||
} // VSTGUI |
@@ -0,0 +1,81 @@ | |||
// This file is part of VSTGUI. It is subject to the license terms | |||
// in the LICENSE file found in the top-level directory of this | |||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE | |||
#import "ciboxblurfilter.h" | |||
#import "../lib/platform/mac/cgbitmap.h" | |||
#import "../lib/cbitmap.h" | |||
#import <QuartzCore/QuartzCore.h> | |||
namespace VSTGUI { | |||
namespace BitmapFilter { | |||
//------------------------------------------------------------------------ | |||
__attribute__((__constructor__)) static void registerFilter () | |||
{ | |||
Factory::getInstance ().registerFilter (Standard::kBoxBlur, CIBoxBlurFilter::CreateFunction); | |||
} | |||
//------------------------------------------------------------------------ | |||
CIBoxBlurFilter::CIBoxBlurFilter () : FilterBase ("A Box Blur Filter using CoreImage") | |||
{ | |||
registerProperty (Standard::Property::kInputBitmap, | |||
BitmapFilter::Property (BitmapFilter::Property::kObject)); | |||
registerProperty (Standard::Property::kRadius, | |||
BitmapFilter::Property (static_cast<int32_t> (2))); | |||
} | |||
//------------------------------------------------------------------------ | |||
bool CIBoxBlurFilter::run (bool replace) | |||
{ | |||
CBitmap* inputBitmap = getInputBitmap (); | |||
int32_t radius = static_cast<int32_t> ( | |||
static_cast<double> (getProperty (Standard::Property::kRadius).getInteger ()) * | |||
inputBitmap->getPlatformBitmap ()->getScaleFactor ()); | |||
if (inputBitmap == nullptr) | |||
return false; | |||
CGBitmap* cgBitmap = dynamic_cast<CGBitmap*> (inputBitmap->getPlatformBitmap ()); | |||
if (cgBitmap == nullptr) | |||
return false; | |||
CIImage* inputImage = [[[CIImage alloc] initWithCGImage:cgBitmap->getCGImage ()] autorelease]; | |||
if (inputImage == nil) | |||
return false; | |||
CIFilter* filter = [CIFilter filterWithName:@"CIBoxBlur"]; | |||
NSMutableDictionary* values = [[NSMutableDictionary new] autorelease]; | |||
[values setObject:@(radius) forKey:@"inputRadius"]; | |||
[values setObject:inputImage forKey:@"inputImage"]; | |||
[filter setValuesForKeysWithDictionary:values]; | |||
CIImage* outputImage = [filter valueForKey:@"outputImage"]; | |||
if (outputImage == nil) | |||
return false; | |||
SharedPointer<CGBitmap> outputBitmap = owned (new CGBitmap (cgBitmap->getSize ())); | |||
CGContextRef cgContext = outputBitmap->createCGContext (); | |||
if (cgContext == nullptr) | |||
return false; | |||
CGContextScaleCTM (cgContext, 1, -1); | |||
CIContext* context = [CIContext contextWithCGContext:cgContext options:nil]; | |||
if (context == nil) | |||
return false; | |||
[context drawImage:outputImage | |||
atPoint:CGPointMake (0, -cgBitmap->getSize ().y) | |||
fromRect:CGRectMake (0, 0, cgBitmap->getSize ().x, cgBitmap->getSize ().y)]; | |||
CFRelease (cgContext); | |||
outputBitmap->setScaleFactor (cgBitmap->getScaleFactor ()); | |||
if (replace) | |||
{ | |||
inputBitmap->setPlatformBitmap (outputBitmap); | |||
return true; | |||
} | |||
return registerProperty (Standard::Property::kOutputBitmap, | |||
BitmapFilter::Property (owned (new CBitmap (outputBitmap)))); | |||
} | |||
//------------------------------------------------------------------------ | |||
} // BitmapFilter | |||
} // VSTGUI |
@@ -0,0 +1,269 @@ | |||
//------------------------------------------------------------------------ | |||
// This file is part of VSTGUI. It is subject to the license terms | |||
// in the LICENSE file found in the top-level directory of this | |||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE | |||
// Flags : clang-format SMTGSequencer | |||
#pragma once | |||
#include "vstgui/lib/vstguifwd.h" | |||
#include "vstgui/lib/ccolor.h" | |||
#include "vstgui/lib/cview.h" | |||
#include "vstgui/lib/dispatchlist.h" | |||
#include "vstgui/lib/itouchevent.h" | |||
#include <array> | |||
#include <bitset> | |||
#include <map> | |||
namespace VSTGUI { | |||
//------------------------------------------------------------------------ | |||
class KeyboardViewBase : public CView | |||
{ | |||
public: | |||
using NoteIndex = int16_t; | |||
using NumNotes = uint8_t; | |||
static constexpr NumNotes MaxNotes = 128; | |||
enum class BitmapID | |||
{ | |||
WhiteKeyPressed = 0, | |||
WhiteKeyUnpressed, | |||
BlackKeyPressed, | |||
BlackKeyUnpressed, | |||
WhiteKeyShadowLeft, | |||
WhiteKeyShadowRight, | |||
NumBitmaps | |||
}; | |||
KeyboardViewBase (); | |||
void setKeyPressed (NoteIndex note, bool state); | |||
virtual void setKeyRange (NoteIndex startNote, NumNotes numKeys); | |||
NoteIndex getKeyRangeStart () const { return startNote; } | |||
NumNotes getNumKeys () const { return numKeys; } | |||
NumNotes getNumWhiteKeys () const; | |||
void setWhiteKeyWidth (CCoord width); | |||
void setBlackKeyWidth (CCoord width); | |||
void setBlackKeyHeight (CCoord height); | |||
void setLineWidth (CCoord width); | |||
CCoord getWhiteKeyWidth () const { return whiteKeyWidth; } | |||
CCoord getBlackKeyWidth () const { return blackKeyWidth; } | |||
CCoord getBlackKeyHeight () const { return blackKeyHeight; } | |||
CCoord getLineWidth () const { return lineWidth; } | |||
void setFrameColor (CColor color); | |||
void setFontColor (CColor color); | |||
void setWhiteKeyColor (CColor color); | |||
void setWhiteKeyPressedColor (CColor color); | |||
void setBlackKeyColor (CColor color); | |||
void setBlackKeyPressedColor (CColor color); | |||
CColor getFrameColor () const { return frameColor; } | |||
CColor getFontColor () const { return fontColor; } | |||
CColor getWhiteKeyColor () const { return whiteKeyColor; } | |||
CColor getWhiteKeyPressedColor () const { return whiteKeyPressedColor; } | |||
CColor getBlackKeyColor () const { return blackKeyColor; } | |||
CColor getBlackKeyPressedColor () const { return blackKeyPressedColor; } | |||
void setNoteNameFont (CFontDesc* font); | |||
CFontDesc* getNoteNameFont () const { return noteNameFont; } | |||
void setDrawNoteText (bool state); | |||
bool getDrawNoteText () const { return drawNoteText; } | |||
void setBitmap (BitmapID bID, CBitmap* bitmap); | |||
CBitmap* getBitmap (BitmapID bID) const; | |||
void setWhiteKeyBitmapInset (const CRect& inset); // TODO: uidesc | |||
void setBlackKeyBitmapInset (const CRect& inset); // TODO: uidesc | |||
const CRect& getNoteRect (NoteIndex note) const { return noteRectCache[note]; } | |||
bool isWhiteKey (NoteIndex note) const; | |||
void drawRect (CDrawContext* context, const CRect& dirtyRect) override; | |||
void setViewSize (const CRect& rect, bool invalid = true) override; | |||
bool sizeToFit () override; | |||
//------------------------------------------------------------------------ | |||
protected: | |||
using NoteRectCache = std::array<CRect, MaxNotes>; | |||
void invalidNote (NoteIndex note); | |||
NoteIndex pointToNote (const CPoint& p, bool ignoreY) const; | |||
const NoteRectCache& getNoteRectCache () const { return noteRectCache; } | |||
private: | |||
void drawNote (CDrawContext* context, CRect& rect, NoteIndex note, bool isWhite) const; | |||
CRect calcNoteRect (NoteIndex note) const; | |||
void updateNoteRectCache () const; | |||
void createBitmapCache (); | |||
using BitmapArray = | |||
std::array<SharedPointer<CBitmap>, static_cast<size_t> (BitmapID::NumBitmaps)>; | |||
BitmapArray bitmaps; | |||
SharedPointer<CBitmap> whiteKeyBitmapCache; | |||
SharedPointer<CBitmap> blackKeyBitmapCache; | |||
SharedPointer<CFontDesc> noteNameFont; | |||
CRect whiteKeyBitmapInset; | |||
CRect blackKeyBitmapInset; | |||
CCoord whiteKeyWidth {30}; | |||
CCoord blackKeyWidth {20}; | |||
CCoord blackKeyHeight {20}; | |||
CCoord lineWidth {1.}; | |||
CColor frameColor {kBlackCColor}; | |||
CColor fontColor {kBlackCColor}; | |||
CColor whiteKeyColor {kWhiteCColor}; | |||
CColor whiteKeyPressedColor {kGreyCColor}; | |||
CColor blackKeyColor {kBlackCColor}; | |||
CColor blackKeyPressedColor {kGreyCColor}; | |||
NumNotes numKeys {88}; | |||
NoteIndex startNote {21}; | |||
bool drawNoteText {false}; | |||
mutable bool noteRectCacheInvalid {true}; | |||
mutable NoteRectCache noteRectCache; | |||
std::bitset<MaxNotes> keyPressed {}; | |||
}; | |||
class KeyboardViewRangeSelector; | |||
//------------------------------------------------------------------------ | |||
struct IKeyboardViewKeyRangeChangedListener | |||
{ | |||
virtual void onKeyRangeChanged (KeyboardViewRangeSelector*) = 0; | |||
virtual ~IKeyboardViewKeyRangeChangedListener () noexcept = default; | |||
}; | |||
//------------------------------------------------------------------------ | |||
class KeyboardViewRangeSelector : public KeyboardViewBase | |||
{ | |||
public: | |||
struct Range | |||
{ | |||
NoteIndex position; | |||
NumNotes length; | |||
Range (NoteIndex position = 0, NumNotes length = 0) : position (position), length (length) | |||
{ | |||
} | |||
bool operator!= (const Range& r) const | |||
{ | |||
return position != r.position || length != r.length; | |||
} | |||
}; | |||
KeyboardViewRangeSelector () = default; | |||
void drawRect (CDrawContext* context, const CRect& dirtyRect) override; | |||
void setKeyRange (NoteIndex startNote, NumNotes numKeys) override; | |||
void setSelectionRange (const Range& range); | |||
void setSelectionMinMax (NumNotes minRange, NumNotes maxRange); | |||
const Range& getSelectionRange () const { return selectionRange; } | |||
NumNotes getSelectionMin () const { return rangeMin; } | |||
NumNotes getSelectionMax () const { return rangeMax; } | |||
NumNotes getNumWhiteKeysSelected () const; | |||
void registerKeyRangeChangedListener (IKeyboardViewKeyRangeChangedListener* listener); | |||
void unregisterKeyRangeChangedListener (IKeyboardViewKeyRangeChangedListener* listener); | |||
//------------------------------------------------------------------------ | |||
private: | |||
DispatchList<IKeyboardViewKeyRangeChangedListener*> listeners; | |||
Range selectionRange {0, 12}; | |||
NumNotes rangeMin {12}; | |||
NumNotes rangeMax {24}; | |||
#if VSTGUI_TOUCH_EVENT_HANDLING | |||
void onTouchEvent (ITouchEvent& event) override; | |||
bool wantsMultiTouchEvents () const override; | |||
void onTouchBegin (const ITouchEvent::TouchPair& touch, ITouchEvent& event); | |||
void onTouchMove (const ITouchEvent::TouchPair& touch, ITouchEvent& event); | |||
enum TouchMode {kUnknown, kMoveRange, kChangeRangeFront, kChangeRangeBack}; | |||
Range selectionRangeOnTouchStart; | |||
int32_t touchIds[2] {-1}; | |||
TouchMode touchMode {kUnknown}; | |||
NoteIndex touchStartNote[2]; | |||
#else | |||
CMouseEventResult onMouseDown (CPoint& where, const CButtonState& buttons) override; | |||
CMouseEventResult onMouseMoved (CPoint& where, const CButtonState& buttons) override; | |||
CMouseEventResult onMouseUp (CPoint& where, const CButtonState& buttons) override; | |||
CMouseEventResult onMouseCancel () override; | |||
Range moveStartRange; | |||
NoteIndex moveStartNote {-1}; | |||
#endif | |||
}; | |||
//------------------------------------------------------------------------ | |||
struct IKeyboardViewPlayerDelegate | |||
{ | |||
using NoteIndex = KeyboardViewBase::NoteIndex; | |||
virtual int32_t onNoteOn (NoteIndex note, double xPos, double yPos) = 0; | |||
virtual void onNoteOff (NoteIndex note, int32_t noteID) = 0; | |||
virtual void onNoteModulation (int32_t noteID, double xPos, double yPos) = 0; | |||
virtual ~IKeyboardViewPlayerDelegate () noexcept = default; | |||
}; | |||
//------------------------------------------------------------------------ | |||
struct KeyboardViewPlayerDelegate : public IKeyboardViewPlayerDelegate | |||
{ | |||
int32_t onNoteOn (NoteIndex note, double xPos, double yPos) override { return -1; } | |||
void onNoteOff (NoteIndex note, int32_t noteID) override {} | |||
void onNoteModulation (int32_t noteID, double xPos, double yPos) override {} | |||
}; | |||
//------------------------------------------------------------------------ | |||
class KeyboardView : public KeyboardViewBase | |||
{ | |||
public: | |||
KeyboardView (); | |||
void setDelegate (IKeyboardViewPlayerDelegate* delegate) { this->delegate = delegate; } | |||
private: | |||
double calcYParameter (NoteIndex note, CCoord y) const; | |||
double calcXParameter (NoteIndex note, CCoord x) const; | |||
#if VSTGUI_TOUCH_EVENT_HANDLING | |||
bool wantsMultiTouchEvents () const override { return true; } | |||
void onTouchEvent (ITouchEvent& event) override; | |||
void onTouchBegin (const ITouchEvent::TouchPair& touch, ITouchEvent& event); | |||
void onTouchMove (const ITouchEvent::TouchPair& touch, ITouchEvent& event); | |||
void onTouchEnd (const ITouchEvent::TouchPair& touch, ITouchEvent& event); | |||
struct NoteTouch | |||
{ | |||
NoteIndex note; | |||
int32_t noteID; | |||
NoteTouch (NoteIndex note) : note (note), noteID (-1) {} | |||
}; | |||
std::map<int32_t, NoteTouch> noteTouches; | |||
#else | |||
void doNoteOff (); | |||
void doNoteOn (NoteIndex note, double yPos, double xPos); | |||
CMouseEventResult onMouseDown (CPoint& where, const CButtonState& buttons) override; | |||
CMouseEventResult onMouseMoved (CPoint& where, const CButtonState& buttons) override; | |||
CMouseEventResult onMouseUp (CPoint& where, const CButtonState& buttons) override; | |||
CMouseEventResult onMouseCancel () override; | |||
NoteIndex pressedNote {-1}; | |||
int32_t noteID {-1}; | |||
#endif | |||
IKeyboardViewPlayerDelegate* delegate {nullptr}; | |||
}; | |||
//------------------------------------------------------------------------ | |||
} // VSTGUI |
@@ -0,0 +1,85 @@ | |||
// This file is part of VSTGUI. It is subject to the license terms | |||
// in the LICENSE file found in the top-level directory of this | |||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE | |||
/** | |||
@mainpage | |||
Welcome to VSTGUI | |||
- @ref intro @n | |||
- @ref page_news_and_changes @n | |||
- @ref page_vst3_inline_editing @n | |||
- @ref page_vst2_tutorial @n | |||
- @ref page_changelog @n | |||
- @ref page_license @n | |||
@section intro Introduction | |||
\par VSTGUI | |||
VSTGUI is a User Interface Toolkit mainly for Audio Plug-Ins (VST, AudioUnit, etc). | |||
\par History | |||
First developed inhouse of Steinberg Media Technologies (around 1998) for their first VST Plug-Ins. | |||
Later added as binary libraries to the official VST SDK. | |||
Since May 2003 VSTGUI is open source, was hosted at sourceforge and now at GitHub https://github.com/steinbergmedia/vstgui. | |||
Currently VSTGUI compiles on | |||
\par Microsoft Windows (with Visual Studio and Windows 7 Platform SDK) | |||
- 7 (32 and 64 bit) | |||
- 8 (32 and 64 bit) | |||
- 10 (32 and 64 bit) | |||
\par Apple Mac OS X (with gcc 4.0/4.2 or Clang 2.0) | |||
- 10.8 - 10.14 (32 and 64 bit) | |||
\par Apple iOS | |||
- 7.0 - 12.0 (32 and 64 bit) | |||
\par Linux (with gcc >= 5.4 or clang >= 3.8) | |||
- Ubuntu 2016.04 or newer | |||
\sa | |||
<a href="https://github.com/steinbergmedia/vstgui target=_blank> VSTGUI @ GitHub </a> | |||
@page page_setup Setup | |||
\par To include VSTGUI in your projects you only have to add | |||
- vstgui_win32.cpp (for Windows) | |||
- vstgui_linux.cpp (for Linux) | |||
- vstgui_mac.mm (for macOS) | |||
- vstgui_ios.mm (for iOS) | |||
to your IDE project and add a search path to the parent of the root folder of vstgui. | |||
\par On macOS, you need to link to the following Frameworks: | |||
- Accelerate | |||
- Carbon | |||
- Cocoa | |||
- OpenGL | |||
- QuartzCore | |||
\par On iOS, you need to link to the following Frameworks: | |||
- UIKit | |||
- CoreGraphics | |||
- ImageIO | |||
- CoreText | |||
- GLKit | |||
- Accelerate | |||
- QuartzCore | |||
\par On Linux you have to install xcb, freetype, fontconfig and cairo | |||
Debian/Ubuntu based distribution: | |||
- libx11-xcb-dev | |||
- libxcb-util-dev | |||
- libxcb-cursor-dev | |||
- libxcb-keysyms1-dev | |||
- libxcb-xkb-dev | |||
- libxkbcommon-dev | |||
- libxkbcommon-x11-dev | |||
- libfontconfig1-dev | |||
- libcairo2-dev | |||
*/ |
@@ -0,0 +1,836 @@ | |||
/* The standard CSS for doxygen */ | |||
body, table, div, p, dl { | |||
font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; | |||
font-size: 12px; | |||
} | |||
/* @group Heading Levels */ | |||
h1 { | |||
font-size: 150%; | |||
} | |||
.title { | |||
font-size: 150%; | |||
font-weight: bold; | |||
margin: 10px 2px; | |||
} | |||
h2 { | |||
font-size: 120%; | |||
} | |||
h3 { | |||
font-size: 100%; | |||
} | |||
dt { | |||
font-weight: bold; | |||
} | |||
div.multicol { | |||
-moz-column-gap: 1em; | |||
-webkit-column-gap: 1em; | |||
-moz-column-count: 3; | |||
-webkit-column-count: 3; | |||
} | |||
p.startli, p.startdd, p.starttd { | |||
margin-top: 2px; | |||
} | |||
p.endli { | |||
margin-bottom: 0px; | |||
} | |||
p.enddd { | |||
margin-bottom: 4px; | |||
} | |||
p.endtd { | |||
margin-bottom: 2px; | |||
} | |||
/* @end */ | |||
caption { | |||
font-weight: bold; | |||
} | |||
span.legend { | |||
font-size: 70%; | |||
text-align: center; | |||
} | |||
h3.version { | |||
font-size: 90%; | |||
text-align: center; | |||
} | |||
div.qindex, div.navtab{ | |||
background-color: #E7EEF4; | |||
border: 1px solid #91B0CE; | |||
text-align: center; | |||
margin: 2px; | |||
padding: 2px; | |||
} | |||
div.qindex, div.navpath { | |||
width: 100%; | |||
line-height: 140%; | |||
} | |||
div.navtab { | |||
margin-right: 15px; | |||
} | |||
/* @group Link Styling */ | |||
a { | |||
color: #30506F; | |||
font-weight: normal; | |||
text-decoration: none; | |||
} | |||
.contents a:visited { | |||
color: #3A6085; | |||
} | |||
a:hover { | |||
text-decoration: underline; | |||
} | |||
a.qindex { | |||
font-weight: bold; | |||
} | |||
a.qindexHL { | |||
font-weight: bold; | |||
background-color: #88AACB; | |||
color: #ffffff; | |||
border: 1px double #6F98C0; | |||
} | |||
.contents a.qindexHL:visited { | |||
color: #ffffff; | |||
} | |||
a.el { | |||
font-weight: bold; | |||
} | |||
a.elRef { | |||
} | |||
a.code { | |||
color: #3A6085; | |||
} | |||
a.codeRef { | |||
color: #3A6085; | |||
} | |||
/* @end */ | |||
dl.el { | |||
margin-left: -1cm; | |||
} | |||
.fragment { | |||
font-family: monospace, fixed; | |||
font-size: 105%; | |||
} | |||
pre.fragment { | |||
border: 1px solid #B8CCE0; | |||
background-color: #FAFCFD; | |||
padding: 4px 6px; | |||
margin: 4px 8px 4px 2px; | |||
overflow: auto; | |||
word-wrap: break-word; | |||
font-size: 9pt; | |||
line-height: 125%; | |||
} | |||
div.ah { | |||
background-color: black; | |||
font-weight: bold; | |||
color: #ffffff; | |||
margin-bottom: 3px; | |||
margin-top: 3px; | |||
padding: 0.2em; | |||
border: solid thin #333; | |||
border-radius: 0.5em; | |||
-webkit-border-radius: .5em; | |||
-moz-border-radius: .5em; | |||
box-shadow: 2px 2px 3px #999; | |||
-webkit-box-shadow: 2px 2px 3px #999; | |||
-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; | |||
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); | |||
background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); | |||
} | |||
div.groupHeader { | |||
margin-left: 16px; | |||
margin-top: 12px; | |||
font-weight: bold; | |||
} | |||
div.groupText { | |||
margin-left: 16px; | |||
font-style: italic; | |||
} | |||
body { | |||
background: white; | |||
color: black; | |||
margin: 0; | |||
} | |||
div.contents { | |||
margin-top: 10px; | |||
margin-left: 10px; | |||
margin-right: 5px; | |||
} | |||
td.indexkey { | |||
background-color: #E7EEF4; | |||
font-weight: bold; | |||
border: 1px solid #B8CCE0; | |||
margin: 2px 0px 2px 0; | |||
padding: 2px 10px; | |||
} | |||
td.indexvalue { | |||
background-color: #E7EEF4; | |||
border: 1px solid #B8CCE0; | |||
padding: 2px 10px; | |||
margin: 2px 0px; | |||
} | |||
tr.memlist { | |||
background-color: #EAF0F5; | |||
} | |||
p.formulaDsp { | |||
text-align: center; | |||
} | |||
img.formulaDsp { | |||
} | |||
img.formulaInl { | |||
vertical-align: middle; | |||
} | |||
div.center { | |||
text-align: center; | |||
margin-top: 0px; | |||
margin-bottom: 0px; | |||
padding: 0px; | |||
} | |||
div.center img { | |||
border: 0px; | |||
} | |||
address.footer { | |||
text-align: right; | |||
padding-right: 12px; | |||
} | |||
img.footer { | |||
border: 0px; | |||
vertical-align: middle; | |||
} | |||
/* @group Code Colorization */ | |||
span.keyword { | |||
color: #008000 | |||
} | |||
span.keywordtype { | |||
color: #604020 | |||
} | |||
span.keywordflow { | |||
color: #e08000 | |||
} | |||
span.comment { | |||
color: #800000 | |||
} | |||
span.preprocessor { | |||
color: #806020 | |||
} | |||
span.stringliteral { | |||
color: #002080 | |||
} | |||
span.charliteral { | |||
color: #008080 | |||
} | |||
span.vhdldigit { | |||
color: #ff00ff | |||
} | |||
span.vhdlchar { | |||
color: #000000 | |||
} | |||
span.vhdlkeyword { | |||
color: #700070 | |||
} | |||
span.vhdllogic { | |||
color: #ff0000 | |||
} | |||
/* @end */ | |||
/* | |||
.search { | |||
color: #003399; | |||
font-weight: bold; | |||
} | |||
form.search { | |||
margin-bottom: 0px; | |||
margin-top: 0px; | |||
} | |||
input.search { | |||
font-size: 75%; | |||
color: #000080; | |||
font-weight: normal; | |||
background-color: #e8eef2; | |||
} | |||
*/ | |||
td.tiny { | |||
font-size: 75%; | |||
} | |||
.dirtab { | |||
padding: 4px; | |||
border-collapse: collapse; | |||
border: 1px solid #91B0CE; | |||
} | |||
th.dirtab { | |||
background: #E7EEF4; | |||
font-weight: bold; | |||
} | |||
hr { | |||
height: 0px; | |||
border: none; | |||
border-top: 1px solid #3E668E; | |||
} | |||
hr.footer { | |||
height: 1px; | |||
} | |||
/* @group Member Descriptions */ | |||
table.memberdecls { | |||
border-spacing: 0px; | |||
padding: 0px; | |||
} | |||
.mdescLeft, .mdescRight, | |||
.memItemLeft, .memItemRight, | |||
.memTemplItemLeft, .memTemplItemRight, .memTemplParams { | |||
background-color: #F8FAFB; | |||
border: none; | |||
margin: 4px; | |||
padding: 1px 0 0 8px; | |||
} | |||
.mdescLeft, .mdescRight { | |||
padding: 0px 8px 4px 8px; | |||
color: #555; | |||
} | |||
.memItemLeft, .memItemRight, .memTemplParams { | |||
border-top: 1px solid #B8CCE0; | |||
} | |||
.memItemLeft, .memTemplItemLeft { | |||
white-space: nowrap; | |||
} | |||
.memItemRight { | |||
width: 100%; | |||
} | |||
.memTemplParams { | |||
color: #3A6085; | |||
white-space: nowrap; | |||
} | |||
/* @end */ | |||
/* @group Member Details */ | |||
/* Styles for detailed member documentation */ | |||
.memtemplate { | |||
font-size: 80%; | |||
color: #3A6085; | |||
font-weight: normal; | |||
margin-left: 9px; | |||
} | |||
.memnav { | |||
background-color: #E7EEF4; | |||
border: 1px solid #91B0CE; | |||
text-align: center; | |||
margin: 2px; | |||
margin-right: 15px; | |||
padding: 2px; | |||
} | |||
.mempage { | |||
width: 100%; | |||
} | |||
.memitem { | |||
padding: 0; | |||
margin-bottom: 10px; | |||
margin-right: 5px; | |||
} | |||
.memname { | |||
white-space: nowrap; | |||
font-weight: bold; | |||
margin-left: 6px; | |||
} | |||
.memproto { | |||
border-top: 1px solid #96B4D1; | |||
border-left: 1px solid #96B4D1; | |||
border-right: 1px solid #96B4D1; | |||
padding: 6px 0px 6px 0px; | |||
color: #1A2B3B; | |||
font-weight: bold; | |||
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); | |||
/* opera specific markup */ | |||
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); | |||
border-top-right-radius: 8px; | |||
border-top-left-radius: 8px; | |||
/* firefox specific markup */ | |||
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; | |||
-moz-border-radius-topright: 8px; | |||
-moz-border-radius-topleft: 8px; | |||
/* webkit specific markup */ | |||
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); | |||
-webkit-border-top-right-radius: 8px; | |||
-webkit-border-top-left-radius: 8px; | |||
background-image:url('nav_f.png'); | |||
background-repeat:repeat-x; | |||
background-color: #DCE6EF; | |||
} | |||
.memdoc { | |||
border-bottom: 1px solid #96B4D1; | |||
border-left: 1px solid #96B4D1; | |||
border-right: 1px solid #96B4D1; | |||
padding: 2px 5px; | |||
background-color: #FAFCFD; | |||
border-top-width: 0; | |||
/* opera specific markup */ | |||
border-bottom-left-radius: 8px; | |||
border-bottom-right-radius: 8px; | |||
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); | |||
/* firefox specific markup */ | |||
-moz-border-radius-bottomleft: 8px; | |||
-moz-border-radius-bottomright: 8px; | |||
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; | |||
background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F5F8FA 95%, #EAF0F5); | |||
/* webkit specific markup */ | |||
-webkit-border-bottom-left-radius: 8px; | |||
-webkit-border-bottom-right-radius: 8px; | |||
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); | |||
background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F5F8FA), to(#EAF0F5)); | |||
} | |||
.paramkey { | |||
text-align: right; | |||
} | |||
.paramtype { | |||
white-space: nowrap; | |||
} | |||
.paramname { | |||
color: #602020; | |||
white-space: nowrap; | |||
} | |||
.paramname em { | |||
font-style: normal; | |||
} | |||
.params, .retval, .exception, .tparams { | |||
border-spacing: 6px 2px; | |||
} | |||
.params .paramname, .retval .paramname { | |||
font-weight: bold; | |||
vertical-align: top; | |||
} | |||
.params .paramtype { | |||
font-style: italic; | |||
vertical-align: top; | |||
} | |||
.params .paramdir { | |||
font-family: "courier new",courier,monospace; | |||
vertical-align: top; | |||
} | |||
/* @end */ | |||
/* @group Directory (tree) */ | |||
/* for the tree view */ | |||
.ftvtree { | |||
font-family: sans-serif; | |||
margin: 0px; | |||
} | |||
/* these are for tree view when used as main index */ | |||
.directory { | |||
font-size: 9pt; | |||
font-weight: bold; | |||
margin: 5px; | |||
} | |||
.directory h3 { | |||
margin: 0px; | |||
margin-top: 1em; | |||
font-size: 11pt; | |||
} | |||
/* | |||
The following two styles can be used to replace the root node title | |||
with an image of your choice. Simply uncomment the next two styles, | |||
specify the name of your image and be sure to set 'height' to the | |||
proper pixel height of your image. | |||
*/ | |||
/* | |||
.directory h3.swap { | |||
height: 61px; | |||
background-repeat: no-repeat; | |||
background-image: url("yourimage.gif"); | |||
} | |||
.directory h3.swap span { | |||
display: none; | |||
} | |||
*/ | |||
.directory > h3 { | |||
margin-top: 0; | |||
} | |||
.directory p { | |||
margin: 0px; | |||
white-space: nowrap; | |||
} | |||
.directory div { | |||
display: none; | |||
margin: 0px; | |||
} | |||
.directory img { | |||
vertical-align: -30%; | |||
} | |||
/* these are for tree view when not used as main index */ | |||
.directory-alt { | |||
font-size: 100%; | |||
font-weight: bold; | |||
} | |||
.directory-alt h3 { | |||
margin: 0px; | |||
margin-top: 1em; | |||
font-size: 11pt; | |||
} | |||
.directory-alt > h3 { | |||
margin-top: 0; | |||
} | |||
.directory-alt p { | |||
margin: 0px; | |||
white-space: nowrap; | |||
} | |||
.directory-alt div { | |||
display: none; | |||
margin: 0px; | |||
} | |||
.directory-alt img { | |||
vertical-align: -30%; | |||
} | |||
/* @end */ | |||
div.dynheader { | |||
margin-top: 8px; | |||
} | |||
address { | |||
font-style: normal; | |||
color: #1F3347; | |||
} | |||
table.doxtable { | |||
border-collapse:collapse; | |||
} | |||
table.doxtable td, table.doxtable th { | |||
border: 1px solid #21374C; | |||
padding: 3px 7px 2px; | |||
} | |||
table.doxtable th { | |||
background-color: #2B4762; | |||
color: #FFFFFF; | |||
font-size: 110%; | |||
padding-bottom: 4px; | |||
padding-top: 5px; | |||
text-align:left; | |||
} | |||
.tabsearch { | |||
top: 0px; | |||
left: 10px; | |||
height: 36px; | |||
background-image: url('tab_b.png'); | |||
z-index: 101; | |||
overflow: hidden; | |||
font-size: 13px; | |||
} | |||
.navpath ul | |||
{ | |||
font-size: 11px; | |||
background-image:url('tab_b.png'); | |||
background-repeat:repeat-x; | |||
height:30px; | |||
line-height:30px; | |||
color:#739BC2; | |||
border:solid 1px #B5CADE; | |||
overflow:hidden; | |||
margin:0px; | |||
padding:0px; | |||
} | |||
.navpath li | |||
{ | |||
list-style-type:none; | |||
float:left; | |||
padding-left:10px; | |||
padding-right:15px; | |||
background-image:url('bc_s.png'); | |||
background-repeat:no-repeat; | |||
background-position:right; | |||
color:#294560; | |||
} | |||
.navpath li.navelem a | |||
{ | |||
height:32px; | |||
display:block; | |||
text-decoration: none; | |||
outline: none; | |||
} | |||
.navpath li.navelem a:hover | |||
{ | |||
color:#4E80B1; | |||
} | |||
.navpath li.footer | |||
{ | |||
list-style-type:none; | |||
float:right; | |||
padding-left:10px; | |||
padding-right:15px; | |||
background-image:none; | |||
background-repeat:no-repeat; | |||
background-position:right; | |||
color:#294560; | |||
font-size: 8pt; | |||
} | |||
div.summary | |||
{ | |||
float: right; | |||
font-size: 8pt; | |||
padding-right: 5px; | |||
width: 50%; | |||
text-align: right; | |||
} | |||
div.summary a | |||
{ | |||
white-space: nowrap; | |||
} | |||
div.ingroups | |||
{ | |||
font-size: 8pt; | |||
padding-left: 5px; | |||
width: 50%; | |||
text-align: left; | |||
} | |||
div.ingroups a | |||
{ | |||
white-space: nowrap; | |||
} | |||
div.header | |||
{ | |||
background-image:url('nav_h.png'); | |||
background-repeat:repeat-x; | |||
background-color: #F8FAFB; | |||
margin: 0px; | |||
border-bottom: 1px solid #B8CCE0; | |||
} | |||
div.headertitle | |||
{ | |||
padding: 5px 5px 5px 10px; | |||
} | |||
dl | |||
{ | |||
padding: 0 0 0 10px; | |||
} | |||
dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug | |||
{ | |||
border-left:4px solid; | |||
padding: 0 0 0 6px; | |||
} | |||
dl.note | |||
{ | |||
border-color: #D0C000; | |||
} | |||
dl.warning, dl.attention | |||
{ | |||
border-color: #FF0000; | |||
} | |||
dl.pre, dl.post, dl.invariant | |||
{ | |||
border-color: #00D000; | |||
} | |||
dl.deprecated | |||
{ | |||
border-color: #505050; | |||
} | |||
dl.todo | |||
{ | |||
border-color: #00C0E0; | |||
} | |||
dl.test | |||
{ | |||
border-color: #3030E0; | |||
} | |||
dl.bug | |||
{ | |||
border-color: #C08050; | |||
} | |||
#projectlogo | |||
{ | |||
text-align: center; | |||
vertical-align: bottom; | |||
border-collapse: separate; | |||
} | |||
#projectlogo img | |||
{ | |||
border: 0px none; | |||
} | |||
#projectname | |||
{ | |||
font: 250% Tahoma, Arial,sans-serif; | |||
margin: 0px; | |||
padding: 0px; | |||
} | |||
#projectbrief | |||
{ | |||
font: 80% Tahoma, Arial,sans-serif; | |||
margin: 0px; | |||
margin-bottom: 3px; | |||
padding: 0px; | |||
} | |||
#projectnumber | |||
{ | |||
font: 50% Tahoma, Arial,sans-serif; | |||
margin: 0px; | |||
padding: 0px; | |||
} | |||
#titlearea | |||
{ | |||
padding: 0px; | |||
margin: 0px; | |||
width: 100%; | |||
border-bottom: 1px solid #44709B; | |||
} | |||
.image | |||
{ | |||
text-align: center; | |||
} | |||
.dotgraph | |||
{ | |||
text-align: center; | |||
} | |||
.mscgraph | |||
{ | |||
text-align: center; | |||
} | |||
.caption | |||
{ | |||
font-weight: bold; | |||
} | |||
@@ -0,0 +1,12 @@ | |||
// This file is part of VSTGUI. It is subject to the license terms | |||
// in the LICENSE file found in the top-level directory of this | |||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE | |||
/** | |||
@page page_changelog Changelog | |||
For newer changes please see the git log. | |||
@include Changelog | |||
*/ |
@@ -0,0 +1,298 @@ | |||
// This file is part of VSTGUI. It is subject to the license terms | |||
// in the LICENSE file found in the top-level directory of this | |||
// distribution and at http://github.com/steinbergmedia/vstgui/LICENSE | |||
/** | |||
@page page_news_and_changes New stuff in VSTGUI 4 | |||
- @ref version4_introduction @n | |||
- @ref new_stuff @n | |||
- @ref code_changes @n | |||
- @ref hidpi_support @n | |||
- @ref cocoa_support @n | |||
- @ref ios_support @n | |||
- @subpage page_previous_new_stuff | |||
@section version4_introduction Introduction | |||
Version 4 of VSTGUI is a new milestone release with a restructured code base with the focus of code conformity and easier future enhancements. | |||
The result is that code written for any earlier version of VSTGUI is not always compatible. | |||
It's recommended to start new projects with version 4 while old projects should stay with version 3.6. | |||
@section new_stuff New Stuff | |||
@subsection version4_7 Version 4.7 | |||
- redesigned drag'n drop | |||
- drags with bitmaps are now supported on Windows | |||
- standalone library support for Windows 7 | |||
- new ImageStitcher tool | |||
- the GDI+ draw backend was removed, the Direct2D backend is the replacement | |||
@subsection version4_6 Version 4.6 | |||
- new Control: keyboardView | |||
- cmake cleanup | |||
- fix static object initialization order | |||
- fix build warnings/errors depending on macOS SDK use | |||
- remove warnings | |||
@subsection version4_5 Version 4.5 | |||
- cmake build system | |||
- preview of @ref standalone_library @n | |||
- new Controls: VSTGUI::CMultiLineTextLabel, VSTGUI::CSearchTextEdit | |||
- adopt many c++11 language features | |||
@subsection version4_4 Version 4.4 | |||
- preview Linux version | |||
- support for Windows XP, Mac OS X 10.6 and non c++11 mode will be removed with version 4.5 | |||
@subsection version4_3 Version 4.3 | |||
- last version to support Windows XP, Mac OS X 10.6 and non c++11 mode | |||
- HiDPI support (aka Retina support) for Quartz2D and Direct2D backends | |||
- support for creating a graphics path from a string | |||
- new Control : VSTGUI::CSegmentButton | |||
- add support for adding a custom view to the split view separator | |||
- transformation matrix support in VSTGUI::CDrawContext | |||
- alternative c++11 callback functions for VSTGUI::CFileSelector::run(), VSTGUI::CVSTGUITimer, VSTGUI::CParamDisplay::setValueToStringFunction, VSTGUI::CTextEdit::setStringToValueFunction and VSTGUI::CCommandMenuItem::setActions | |||
Note: All current deprecated methods will be removed in the next version. So make sure that your code compiles with VSTGUI_ENABLE_DEPRECATED_METHODS=0 | |||
@subsection version4_2 Version 4.2 | |||
- iOS Support with Multi Touch handling. See @ref ios_support | |||
- support drawing an icon on a VSTGUI::CTextButton | |||
- VSTGUI::CGradientView | |||
- VSTGUI::CDataBrowser now supports multi row selections | |||
- support compiling in c++11 mode with clang and visual studio | |||
- VSTGUI_OVERRIDE_VMETHOD is now used throughout the vstgui sources to indicate methods which are expecting to override a virtual method of its base classes. (c++11 only) | |||
@subsection version4_1 Version 4.1 | |||
- @ref page_uidescription_editor @n | |||
- VSTGUI::COpenGLView (only Windows & Mac Cocoa) | |||
- VSTGUI::CRowColumnView | |||
- VSTGUI::CShadowViewContainer | |||
- VSTGUI::BitmapFilter | |||