From d9b91338ea96c3658669bdb175164bc0d6e33b6b Mon Sep 17 00:00:00 2001 From: Hyunjin Song Date: Tue, 13 Nov 2018 19:30:59 +0900 Subject: [PATCH 1/8] Fix finding pkg-config on cross compile Switch back to `ENV{PKG_CONFIG}` to ensure that FindPkgConfig doesn't overwrite `PKG_CONFIG_EXECUTABLE`. Since CMake 3.3 supports the environment variable, it's safe to use that. --- cmake/toolchains/common/Ubuntu-MinGW-W64.cmake | 2 +- cmake/toolchains/common/Ubuntu-MinGW-X-Trusty.cmake | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake b/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake index acb2cbf9123..2f78a441e7a 100644 --- a/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake +++ b/cmake/toolchains/common/Ubuntu-MinGW-W64.cmake @@ -6,7 +6,7 @@ set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++) set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres) set(CMAKE_FIND_ROOT_PATH /usr/${TOOLCHAIN_PREFIX}) -SET(PKG_CONFIG_EXECUTABLE /usr/bin/${TOOLCHAIN_PREFIX}-pkg-config) +SET(ENV{PKG_CONFIG} /usr/bin/${TOOLCHAIN_PREFIX}-pkg-config) IF(WIN64) SET(TOOLCHAIN_PREFIX32 ${CMAKE_SYSTEM_PROCESSOR32}-w64-mingw32) diff --git a/cmake/toolchains/common/Ubuntu-MinGW-X-Trusty.cmake b/cmake/toolchains/common/Ubuntu-MinGW-X-Trusty.cmake index 1dabc355541..686f4497f47 100644 --- a/cmake/toolchains/common/Ubuntu-MinGW-X-Trusty.cmake +++ b/cmake/toolchains/common/Ubuntu-MinGW-X-Trusty.cmake @@ -19,7 +19,7 @@ SET(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres) # Mingw tools SET(STRIP ${MINGW_TOOL_PREFIX}strip) -SET(PKG_CONFIG_EXECUTABLE ${MINGW_TOOL_PREFIX}pkg-config) +SET(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config) # For 32-bit vst support IF(WIN64) @@ -45,7 +45,7 @@ IF(NOT DEFINED ENV{MINGW_DEBUG_INFO}) MESSAGE("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}") MESSAGE("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}") MESSAGE("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}") - MESSAGE("* PKG_CONFIG_EXECUTABLE : ${PKG_CONFIG_EXECUTABLE}") + MESSAGE("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}") MESSAGE("* MINGW_TOOL_PREFIX32 : ${MINGW_TOOL_PREFIX32}") MESSAGE("* CMAKE_C_COMPILER32 : ${CMAKE_C_COMPILER32}") MESSAGE("* CMAKE_CXX_COMPILER32 : ${CMAKE_CXX_COMPILER32}") From 244b70b4c8bce27bfb3b5185759e6ab6d9b8bec5 Mon Sep 17 00:00:00 2001 From: Hyunjin Song Date: Tue, 13 Nov 2018 19:33:28 +0900 Subject: [PATCH 2/8] Fix building unit tests targetting windows Fixes MSVC's LNK4217 warnings and MinGW errors. --- .circleci/config.yml | 6 ++++++ .travis/script.sh | 4 +--- src/CMakeLists.txt | 9 ++++++--- tests/CMakeLists.txt | 3 +++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 95b98c59559..54301863dcf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -54,6 +54,9 @@ jobs: ../cmake/build_win32.sh make lmms make + - run: + name: Build tests + command: cd build && make tests - *ccache_stats - *save_cache mingw64: @@ -71,6 +74,9 @@ jobs: mkdir build && cd build ../cmake/build_win64.sh make + - run: + name: Build tests + command: cd build && make tests - *ccache_stats - *save_cache linux.gcc: diff --git a/.travis/script.sh b/.travis/script.sh index 9f7e1081fa6..27e9ec7fbb7 100755 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -24,12 +24,10 @@ else "$TRAVIS_BUILD_DIR/.travis/$TRAVIS_OS_NAME.$TARGET_OS.script.sh" make -j4 + make tests if [[ $TARGET_OS != win* ]]; then - - make tests tests/tests - fi # Package and upload non-tagged builds diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd40ad747e5..37da8f414f9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -116,12 +116,15 @@ TARGET_INCLUDE_DIRECTORIES(lmms PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ) -# GENERATE_EXPORT_HEADER doesn't do this automatically for OBJECT libraries +# CMake doesn't define target_EXPORTS for OBJECT libraries. +# See the documentation of DEFINE_SYMBOL for details. +# Also add LMMS_STATIC_DEFINE for targets linking against it. TARGET_COMPILE_DEFINITIONS(lmmsobjs PRIVATE -Dlmmsobjs_EXPORTS + INTERFACE -DLMMS_STATIC_DEFINE ) TARGET_COMPILE_DEFINITIONS(lmms - PRIVATE -Dlmmsobjs_EXPORTS + PRIVATE $ ) # Set Visual Studio startup project to lmms @@ -389,4 +392,4 @@ ELSE(NOT MSVC) # "${VCPKG_ROOT}/bin/libsoundio.dll" # DESTINATION .) #ENDIF() -ENDIF(NOT MSVC) \ No newline at end of file +ENDIF(NOT MSVC) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 249e381912a..c39f8e56ed9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -19,5 +19,8 @@ ADD_EXECUTABLE(tests src/tracks/AutomationTrackTest.cpp ) +TARGET_COMPILE_DEFINITIONS(tests + PRIVATE $ +) TARGET_LINK_LIBRARIES(tests ${QT_LIBRARIES} ${QT_QTTEST_LIBRARY}) TARGET_LINK_LIBRARIES(tests ${LMMS_REQUIRED_LIBS}) From 187fbf419167c2e7998c1dea183c8564c4d4a39e Mon Sep 17 00:00:00 2001 From: Hyunjin Song Date: Wed, 21 Nov 2018 17:39:40 +0900 Subject: [PATCH 3/8] AppVeyor: don't specify any patch version of Qt Fixes broken build due to the upgraded Qt version in the AppVeyor image. --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 350e4351fb3..3cb5d9a9399 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -16,7 +16,7 @@ build_script: - cd build - ps: $env:CMAKE_PLATFORM="$(if ($env:PLATFORM -eq 'x64') { 'x64' } else { '' })" - ps: $env:QT_SUFFIX="$(if ($env:PLATFORM -eq 'x64') { '_64' } else { '' })" - - cmake -DUSE_COMPILE_CACHE=ON -DCACHE_TOOL=%APPVEYOR_BUILD_FOLDER%/clcache.4.1.0/clcache-4.1.0/clcache.exe -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_PREFIX_PATH=c:/Qt/5.9.5/msvc2015%QT_SUFFIX%;c:/tools/vcpkg/installed/%PLATFORM%-windows -DCMAKE_GENERATOR_PLATFORM="%CMAKE_PLATFORM%" .. + - cmake -DUSE_COMPILE_CACHE=ON -DCACHE_TOOL=%APPVEYOR_BUILD_FOLDER%/clcache.4.1.0/clcache-4.1.0/clcache.exe -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_PREFIX_PATH=c:/Qt/5.9/msvc2015%QT_SUFFIX%;c:/tools/vcpkg/installed/%PLATFORM%-windows -DCMAKE_GENERATOR_PLATFORM="%CMAKE_PLATFORM%" .. - cmake --build . -- /maxcpucount:4 - cmake --build . --target tests cache: From 3922d25b5022b36feb4a6f8697659090370d7dc0 Mon Sep 17 00:00:00 2001 From: Hyunjin Song Date: Wed, 21 Nov 2018 17:45:20 +0900 Subject: [PATCH 4/8] Fix CircleCI builds I don't know why, but it fails to fetch submodules... --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 54301863dcf..4174ba1effb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -28,6 +28,8 @@ shared: name: Initialize command: | mkdir -p /tmp/artifacts + # Workaround for failing submodule fetching + git config --global --unset url."ssh://git@github.com".insteadOf || true # Commmon environment variables common_environment: &common_environment From cf3d7950b10975d41998db29f9a9aac441fd95ef Mon Sep 17 00:00:00 2001 From: Johannes Lorenz Date: Sat, 1 Dec 2018 10:16:25 +0100 Subject: [PATCH 5/8] Refactor SetupDialog --- src/gui/SetupDialog.cpp | 434 ++++++++++------------------------------ 1 file changed, 110 insertions(+), 324 deletions(-) diff --git a/src/gui/SetupDialog.cpp b/src/gui/SetupDialog.cpp index 857261eb19b..13392439fd8 100644 --- a/src/gui/SetupDialog.cpp +++ b/src/gui/SetupDialog.cpp @@ -203,126 +203,45 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : const int HeaderSize = 30; int labelNumber = 0; - - LedCheckBox * enable_tooltips = new LedCheckBox( - tr( "Enable tooltips" ), - misc_tw ); - labelNumber++; - enable_tooltips->move( XDelta, YDelta*labelNumber ); - enable_tooltips->setChecked( m_toolTips ); - connect( enable_tooltips, SIGNAL( toggled( bool ) ), - this, SLOT( toggleToolTips( bool ) ) ); - - - LedCheckBox * restart_msg = new LedCheckBox( - tr( "Show restart warning after changing settings" ), - misc_tw ); - labelNumber++; - restart_msg->move( XDelta, YDelta*labelNumber ); - restart_msg->setChecked( m_warnAfterSetup ); - connect( restart_msg, SIGNAL( toggled( bool ) ), - this, SLOT( toggleWarnAfterSetup( bool ) ) ); - - - LedCheckBox * dbfs = new LedCheckBox( tr( "Display volume as dBFS " ), - misc_tw ); - labelNumber++; - dbfs->move( XDelta, YDelta*labelNumber ); - dbfs->setChecked( m_displaydBFS ); - connect( dbfs, SIGNAL( toggled( bool ) ), - this, SLOT( toggleDisplaydBFS( bool ) ) ); - - - LedCheckBox * mmpz = new LedCheckBox( - tr( "Compress project files per default" ), - misc_tw ); - labelNumber++; - mmpz->move( XDelta, YDelta*labelNumber ); - mmpz->setChecked( m_MMPZ ); - connect( mmpz, SIGNAL( toggled( bool ) ), - this, SLOT( toggleMMPZ( bool ) ) ); - - LedCheckBox * oneitw = new LedCheckBox( - tr( "One instrument track window mode" ), - misc_tw ); - labelNumber++; - oneitw->move( XDelta, YDelta*labelNumber ); - oneitw->setChecked( m_oneInstrumentTrackWindow ); - connect( oneitw, SIGNAL( toggled( bool ) ), - this, SLOT( toggleOneInstrumentTrackWindow( bool ) ) ); - - LedCheckBox * hqaudio = new LedCheckBox( - tr( "HQ-mode for output audio-device" ), - misc_tw ); - labelNumber++; - hqaudio->move( XDelta, YDelta*labelNumber ); - hqaudio->setChecked( m_hqAudioDev ); - connect( hqaudio, SIGNAL( toggled( bool ) ), - this, SLOT( toggleHQAudioDev( bool ) ) ); - - LedCheckBox * compacttracks = new LedCheckBox( - tr( "Compact track buttons" ), - misc_tw ); - labelNumber++; - compacttracks->move( XDelta, YDelta*labelNumber ); - compacttracks->setChecked( m_compactTrackButtons ); - connect( compacttracks, SIGNAL( toggled( bool ) ), - this, SLOT( toggleCompactTrackButtons( bool ) ) ); - - - LedCheckBox * syncVST = new LedCheckBox( - tr( "Sync VST plugins to host playback" ), - misc_tw ); - labelNumber++; - syncVST->move( XDelta, YDelta*labelNumber ); - syncVST->setChecked( m_syncVSTPlugins ); - connect( syncVST, SIGNAL( toggled( bool ) ), - this, SLOT( toggleSyncVSTPlugins( bool ) ) ); - - LedCheckBox * noteLabels = new LedCheckBox( - tr( "Enable note labels in piano roll" ), - misc_tw ); - labelNumber++; - noteLabels->move( XDelta, YDelta*labelNumber ); - noteLabels->setChecked( m_printNoteLabels ); - connect( noteLabels, SIGNAL( toggled( bool ) ), - this, SLOT( toggleNoteLabels( bool ) ) ); - - LedCheckBox * displayWaveform = new LedCheckBox( - tr( "Enable waveform display by default" ), - misc_tw ); - labelNumber++; - displayWaveform->move( XDelta, YDelta*labelNumber ); - displayWaveform->setChecked( m_displayWaveform ); - connect( displayWaveform, SIGNAL( toggled( bool ) ), - this, SLOT( toggleDisplayWaveform( bool ) ) ); - - LedCheckBox * disableAutoquit = new LedCheckBox( - tr( "Keep effects running even without input" ), - misc_tw ); - labelNumber++; - disableAutoquit->move( XDelta, YDelta*labelNumber ); - disableAutoquit->setChecked( m_disableAutoQuit ); - connect( disableAutoquit, SIGNAL( toggled( bool ) ), - this, SLOT( toggleDisableAutoquit( bool ) ) ); - - LedCheckBox * disableBackup = new LedCheckBox( - tr( "Create backup file when saving a project" ), - misc_tw ); - labelNumber++; - disableBackup->move( XDelta, YDelta*labelNumber ); - disableBackup->setChecked( m_disableBackup ); - connect( disableBackup, SIGNAL( toggled( bool ) ), - this, SLOT( toggleDisableBackup( bool ) ) ); - - LedCheckBox * openLastProject = new LedCheckBox( - tr( "Reopen last project on start" ), - misc_tw ); - labelNumber++; - openLastProject->move( XDelta, YDelta*labelNumber ); - openLastProject->setChecked( m_openLastProject ); - connect( openLastProject, SIGNAL( toggled( bool ) ), - this, SLOT( toggleOpenLastProject( bool ) ) ); + auto addLedCheckBox = [&misc_tw, &labelNumber, this]( + const char* ledText, + bool initialState, + const char* toggledSlot + ){ + LedCheckBox * checkBox = new LedCheckBox(tr(ledText), misc_tw); + labelNumber++; + checkBox->move(XDelta, YDelta*labelNumber); + checkBox->setChecked(initialState); + connect(checkBox, SIGNAL(toggled(bool)), this, toggledSlot); + }; + + addLedCheckBox("Enable tooltips", + m_toolTips, SLOT(toggleToolTips(bool))); + addLedCheckBox("Show restart warning after changing settings", + m_warnAfterSetup, SLOT(toggleWarnAfterSetup(bool))); + addLedCheckBox("Display volume as dBFS ", + m_displaydBFS, SLOT(toggleDisplaydBFS(bool))); + addLedCheckBox("Compress project files per default", + m_MMPZ, SLOT(toggleMMPZ(bool))); + addLedCheckBox("One instrument track window mode", + m_oneInstrumentTrackWindow, + SLOT(toggleOneInstrumentTrackWindow(bool))); + addLedCheckBox("HQ-mode for output audio-device", + m_hqAudioDev, SLOT(toggleHQAudioDev(bool))); + addLedCheckBox("Compact track buttons", + m_compactTrackButtons, SLOT(toggleCompactTrackButtons(bool))); + addLedCheckBox("Sync VST plugins to host playback", + m_syncVSTPlugins, SLOT(toggleSyncVSTPlugins(bool))); + addLedCheckBox("Enable note labels in piano roll", + m_printNoteLabels, SLOT(toggleNoteLabels(bool))); + addLedCheckBox("Enable waveform display by default", + m_displayWaveform, SLOT(toggleDisplayWaveform(bool))); + addLedCheckBox("Keep effects running even without input", + m_disableAutoQuit, SLOT(toggleDisableAutoquit(bool))); + addLedCheckBox("Create backup file when saving a project", + m_disableBackup, SLOT(toggleDisableBackup(bool))); + addLedCheckBox("Reopen last project on start", + m_openLastProject, SLOT(toggleOpenLastProject(bool))); misc_tw->setFixedHeight( YDelta*labelNumber + HeaderSize ); @@ -432,216 +351,83 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : const int btnStart = 297; - // working-dir - TabWidget * lmms_wd_tw = new TabWidget( tr( - "LMMS working directory" ).toUpper(), - pathSelectors ); - lmms_wd_tw->setFixedHeight( 48 ); - - m_wdLineEdit = new QLineEdit( m_workingDir, lmms_wd_tw ); - m_wdLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_wdLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setWorkingDir( const QString & ) ) ); - - QPushButton * workingdir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", lmms_wd_tw ); - workingdir_select_btn->setFixedSize( 24, 24 ); - workingdir_select_btn->move( btnStart, 16 ); - connect( workingdir_select_btn, SIGNAL( clicked() ), this, - SLOT( openWorkingDir() ) ); - - - // artwork-dir - TabWidget * artwork_tw = new TabWidget( tr( - "Themes directory" ).toUpper(), - pathSelectors ); - artwork_tw->setFixedHeight( 48 ); - - m_adLineEdit = new QLineEdit( m_artworkDir, artwork_tw ); - m_adLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_adLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setArtworkDir( const QString & ) ) ); - - QPushButton * artworkdir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", artwork_tw ); - artworkdir_select_btn->setFixedSize( 24, 24 ); - artworkdir_select_btn->move( btnStart, 16 ); - connect( artworkdir_select_btn, SIGNAL( clicked() ), this, - SLOT( openArtworkDir() ) ); - - - - // background artwork file - TabWidget * backgroundArtwork_tw = new TabWidget( tr( - "Background artwork" ).toUpper(), paths ); - backgroundArtwork_tw->setFixedHeight( 48 ); - - m_baLineEdit = new QLineEdit( m_backgroundArtwork, - backgroundArtwork_tw ); - m_baLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_baLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setBackgroundArtwork( const QString & ) ) ); - - QPushButton * backgroundartworkdir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", backgroundArtwork_tw ); - backgroundartworkdir_select_btn->setFixedSize( 24, 24 ); - backgroundartworkdir_select_btn->move( btnStart, 16 ); - connect( backgroundartworkdir_select_btn, SIGNAL( clicked() ), this, - SLOT( openBackgroundArtwork() ) ); - - // vst-dir - TabWidget * vst_tw = new TabWidget( tr( - "VST-plugin directory" ).toUpper(), - pathSelectors ); - vst_tw->setFixedHeight( 48 ); - - m_vdLineEdit = new QLineEdit( m_vstDir, vst_tw ); - m_vdLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_vdLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setVSTDir( const QString & ) ) ); - - QPushButton * vstdir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", vst_tw ); - vstdir_select_btn->setFixedSize( 24, 24 ); - vstdir_select_btn->move( btnStart, 16 ); - connect( vstdir_select_btn, SIGNAL( clicked() ), this, - SLOT( openVSTDir() ) ); - - // gig-dir - TabWidget * gig_tw = new TabWidget( tr( - "GIG directory" ).toUpper(), - pathSelectors ); - gig_tw->setFixedHeight( 48 ); - - m_gigLineEdit = new QLineEdit( m_gigDir, gig_tw ); - m_gigLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_gigLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setGIGDir( const QString & ) ) ); - - QPushButton * gigdir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", gig_tw ); - gigdir_select_btn->setFixedSize( 24, 24 ); - gigdir_select_btn->move( btnStart, 16 ); - connect( gigdir_select_btn, SIGNAL( clicked() ), this, - SLOT( openGIGDir() ) ); - - // sf2-dir - TabWidget * sf2_tw = new TabWidget( tr( - "SF2 directory" ).toUpper(), - pathSelectors ); - sf2_tw->setFixedHeight( 48 ); - - m_sf2LineEdit = new QLineEdit( m_sf2Dir, sf2_tw ); - m_sf2LineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_sf2LineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setSF2Dir( const QString & ) ) ); - - QPushButton * sf2dir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", sf2_tw ); - sf2dir_select_btn->setFixedSize( 24, 24 ); - sf2dir_select_btn->move( btnStart, 16 ); - connect( sf2dir_select_btn, SIGNAL( clicked() ), this, - SLOT( openSF2Dir() ) ); - - - - // LADSPA-dir - TabWidget * lad_tw = new TabWidget( tr( - "LADSPA plugin directories" ).toUpper(), - paths ); - lad_tw->setFixedHeight( 48 ); - - m_ladLineEdit = new QLineEdit( m_ladDir, lad_tw ); - m_ladLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_ladLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setLADSPADir( const QString & ) ) ); - - QPushButton * laddir_select_btn = new QPushButton( - embed::getIconPixmap( "add_folder", 16, 16 ), - "", lad_tw ); - laddir_select_btn->setFixedSize( 24, 24 ); - laddir_select_btn->move( btnStart, 16 ); - connect( laddir_select_btn, SIGNAL( clicked() ), this, - SLOT( openLADSPADir() ) ); - - + auto addPathEntry = [&](const char* caption, + const QString& content, + const char* setSlot, + const char* openSlot, + QLineEdit*& lineEdit, + QWidget* twParent, + const char* pixmap = "project_open") + { + TabWidget * newTw = new TabWidget(tr(caption).toUpper(), + twParent); + newTw->setFixedHeight(48); + + lineEdit = new QLineEdit(content, newTw); + lineEdit->setGeometry(10, 20, txtLength, 16); + connect(lineEdit, SIGNAL(textChanged(const QString &)), + this, setSlot); + + QPushButton * selectBtn = new QPushButton( + embed::getIconPixmap(pixmap, 16, 16), + "", newTw); + selectBtn->setFixedSize(24, 24); + selectBtn->move(btnStart, 16); + connect(selectBtn, SIGNAL(clicked()), this, openSlot); + + pathSelectorLayout->addWidget(newTw); + pathSelectorLayout->addSpacing(10); + }; + + addPathEntry("LMMS working directory", m_workingDir, + SLOT(setWorkingDir(const QString &)), + SLOT(openWorkingDir()), + m_wdLineEdit, pathSelectors); + addPathEntry("GIG directory", m_gigDir, + SLOT(setGIGDir(const QString &)), + SLOT(openGIGDir()), + m_gigLineEdit, pathSelectors); + addPathEntry("SF2 directory", m_sf2Dir, + SLOT(setSF2Dir(const QString &)), + SLOT(openSF2Dir()), + m_sf2LineEdit, pathSelectors); + addPathEntry("VST-plugin directory", m_vstDir, + SLOT(setVSTDir(const QString &)), + SLOT(openVSTDir()), + m_vdLineEdit, pathSelectors); + addPathEntry("LADSPA plugin directories", m_ladDir, + SLOT(setLADSPADir(const QString &)), + SLOT(openLADSPADir()), + m_ladLineEdit, paths, + "add_folder"); #ifdef LMMS_HAVE_STK - // STK-dir - TabWidget * stk_tw = new TabWidget( tr( - "STK rawwave directory" ).toUpper(), - paths ); - stk_tw->setFixedHeight( 48 ); - - m_stkLineEdit = new QLineEdit( m_stkDir, stk_tw ); - m_stkLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_stkLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setSTKDir( const QString & ) ) ); - - QPushButton * stkdir_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", stk_tw ); - stkdir_select_btn->setFixedSize( 24, 24 ); - stkdir_select_btn->move( btnStart, 16 ); - connect( stkdir_select_btn, SIGNAL( clicked() ), this, - SLOT( openSTKDir() ) ); + addPathEntry("STK rawwave directory", m_stkDir, + SLOT(setSTKDir(const QString &)), + SLOT(openSTKDir()), + m_stkLineEdit, paths); #endif - #ifdef LMMS_HAVE_FLUIDSYNTH - // Soundfont - TabWidget * sf_tw = new TabWidget( tr( - "Default Soundfont File" ).toUpper(), paths ); - sf_tw->setFixedHeight( 48 ); - - m_sfLineEdit = new QLineEdit( m_defaultSoundfont, sf_tw ); - m_sfLineEdit->setGeometry( 10, 20, txtLength, 16 ); - connect( m_sfLineEdit, SIGNAL( textChanged( const QString & ) ), this, - SLOT( setDefaultSoundfont( const QString & ) ) ); - - QPushButton * sf_select_btn = new QPushButton( - embed::getIconPixmap( "project_open", 16, 16 ), - "", sf_tw ); - sf_select_btn->setFixedSize( 24, 24 ); - sf_select_btn->move( btnStart, 16 ); - connect( sf_select_btn, SIGNAL( clicked() ), this, - SLOT( openDefaultSoundfont() ) ); -#endif - - pathSelectors->setLayout( pathSelectorLayout ); - - pathSelectorLayout->addWidget( lmms_wd_tw ); - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( gig_tw ); - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( sf2_tw ); - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( vst_tw ); - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( lad_tw ); -#ifdef LMMS_HAVE_STK - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( stk_tw ); -#endif -#ifdef LMMS_HAVE_FLUIDSYNTH - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( sf_tw ); -#endif - pathSelectorLayout->addSpacing( 10 ); - pathSelectorLayout->addWidget( artwork_tw ); - pathSelectorLayout->addSpacing( 10 ); + addPathEntry("Default Soundfont File", m_defaultSoundfont, + SLOT(setDefaultSoundfont(const QString &)), + SLOT(openDefaultSoundfont()), + m_sfLineEdit, paths); +#endif + addPathEntry("Themes directory", m_artworkDir, + SLOT(setArtworkDir(const QString &)), + SLOT(openArtwortDir()), + m_adLineEdit, pathSelectors); pathSelectorLayout->addStretch(); - pathSelectorLayout->addWidget( backgroundArtwork_tw ); - pathSelectorLayout->addSpacing( 10 ); + addPathEntry("Background artwork", m_backgroundArtwork, + SLOT(setBackgroundArtwork(const QString &)), + SLOT(openBackgroundArtwork()), + m_baLineEdit, paths); + pathSelectors->setLayout(pathSelectorLayout); + - dir_layout->addWidget( pathSelectors ); + dir_layout->addWidget(pathSelectors); - pathScroll->setWidget( pathSelectors ); - pathScroll->setWidgetResizable( true ); + pathScroll->setWidget(pathSelectors); + pathScroll->setWidgetResizable(true); From 05128b9a334ad88155f6f72d14e1807874a65415 Mon Sep 17 00:00:00 2001 From: Johannes Lorenz Date: Wed, 12 Dec 2018 17:10:54 +0100 Subject: [PATCH 6/8] Fix error in SetupDialog This adds constants into a lambda capture list. Unnecessary, says the C++14 standard, but this fixes the MSVC C++11 error. --- src/gui/SetupDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/SetupDialog.cpp b/src/gui/SetupDialog.cpp index 13392439fd8..678f5bff9f4 100644 --- a/src/gui/SetupDialog.cpp +++ b/src/gui/SetupDialog.cpp @@ -203,7 +203,7 @@ SetupDialog::SetupDialog( ConfigTabs _tab_to_open ) : const int HeaderSize = 30; int labelNumber = 0; - auto addLedCheckBox = [&misc_tw, &labelNumber, this]( + auto addLedCheckBox = [&XDelta, &YDelta, &misc_tw, &labelNumber, this]( const char* ledText, bool initialState, const char* toggledSlot From aa0ce7fc545bbf2f63cb4df8853c1de474faba0d Mon Sep 17 00:00:00 2001 From: Johannes Lorenz Date: Fri, 28 Dec 2018 16:02:40 +0100 Subject: [PATCH 7/8] Improve CALF's CMakelists Let CALF's CMakelists apply the name filter only on the basenames of the files, but not on their directories. This prevents errors if the LMMS folder is under a directory which contains, e.g., "lv2". --- plugins/LadspaEffect/calf/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/LadspaEffect/calf/CMakeLists.txt b/plugins/LadspaEffect/calf/CMakeLists.txt index 776752bc5e6..4924169e410 100644 --- a/plugins/LadspaEffect/calf/CMakeLists.txt +++ b/plugins/LadspaEffect/calf/CMakeLists.txt @@ -16,8 +16,9 @@ LIST(SORT SOURCES) # Skip files matching pattern SET(FILE_PATTERNS "ctl;gui;gtk;session;connector;jack;rdf;draw;fluid;preset;lv2;benchmark;win;plugin.cpp") FOREACH(_item ${SOURCES}) + GET_FILENAME_COMPONENT(m_basename ${_item} NAME) FOREACH(_pattern ${FILE_PATTERNS}) - IF(${_item} MATCHES ${_pattern}) + IF(${m_basename} MATCHES ${_pattern}) LIST(REMOVE_ITEM SOURCES ${_item}) ENDIF() ENDFOREACH() From ee05523319dbc137c1e39cae484590fd832ecc69 Mon Sep 17 00:00:00 2001 From: Johannes Lorenz Date: Tue, 1 Jan 2019 20:58:16 +0100 Subject: [PATCH 8/8] Extend quoting for AutomatableModels This now also quotes, if required: - non automated models - models controlled by controller --- include/AutomatableModel.h | 2 ++ src/core/AutomatableModel.cpp | 44 +++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/include/AutomatableModel.h b/include/AutomatableModel.h index 8dbe80efddc..78f4882b423 100644 --- a/include/AutomatableModel.h +++ b/include/AutomatableModel.h @@ -283,6 +283,8 @@ public slots: private: + static bool mustQuoteName(const QString &name); + virtual void saveSettings( QDomDocument& doc, QDomElement& element ) { saveSettings( doc, element, "value" ); diff --git a/src/core/AutomatableModel.cpp b/src/core/AutomatableModel.cpp index cb8aa704682..62b783da4fd 100644 --- a/src/core/AutomatableModel.cpp +++ b/src/core/AutomatableModel.cpp @@ -89,16 +89,23 @@ bool AutomatableModel::isAutomated() const } + +bool AutomatableModel::mustQuoteName(const QString& name) +{ + QRegExp reg("^[A-Za-z0-9._-]+$"); + return !reg.exactMatch(name); +} + void AutomatableModel::saveSettings( QDomDocument& doc, QDomElement& element, const QString& name ) { + bool mustQuote = mustQuoteName(name); + if( isAutomated() || m_scaleType != Linear ) { // automation needs tuple of data (name, id, value) // scale type also needs an extra value // => it must be appended as a node - QRegExp reg("^[A-Za-z0-9._-]+$"); - bool mustQuote = !reg.exactMatch(name); QDomElement me = doc.createElement( mustQuote ? QString("automatablemodel") : name ); me.setAttribute( "id", ProjectJournal::idToSave( id() ) ); me.setAttribute( "value", m_value ); @@ -110,8 +117,18 @@ void AutomatableModel::saveSettings( QDomDocument& doc, QDomElement& element, co } else { - // non automation, linear scale (default), can be saved as attribute - element.setAttribute( name, m_value ); + if(mustQuote) + { + QDomElement me = doc.createElement( "automatablemodel" ); + me.setAttribute( "nodename", name ); + me.setAttribute( "value", m_value ); + element.appendChild( me ); + } + else + { + // non automation, linear scale (default), can be saved as attribute + element.setAttribute( name, m_value ); + } } if( m_controllerConnection && m_controllerConnection->getController()->type() @@ -131,7 +148,13 @@ void AutomatableModel::saveSettings( QDomDocument& doc, QDomElement& element, co element.appendChild( controllerElement ); } - QDomElement element = doc.createElement( name ); + bool mustQuote = mustQuoteName(name); + QString elementName = mustQuote ? "controllerconnection" + : name; + + QDomElement element = doc.createElement( elementName ); + if(mustQuote) + element.setAttribute( "nodename", name ); m_controllerConnection->saveSettings( doc, element ); controllerElement.appendChild( element ); @@ -170,6 +193,17 @@ void AutomatableModel::loadSettings( const QDomElement& element, const QString& if( connectionNode.isElement() ) { QDomNode thisConnection = connectionNode.toElement().namedItem( name ); + if( !thisConnection.isElement() ) + { + thisConnection = connectionNode.toElement().namedItem( "controllerconnection" ); + QDomElement tcElement = thisConnection.toElement(); + // sanity check + if( tcElement.isNull() || tcElement.attribute( "nodename" ) != name ) + { + // no, that wasn't it, act as if we never found one + thisConnection.clear(); + } + } if( thisConnection.isElement() ) { setControllerConnection( new ControllerConnection( (Controller*)NULL ) );