Compare commits

...

408 Commits

Author SHA1 Message Date
RomanPudashkin 08c1e1c911
Merge pull request #18041 from RomanPudashkin/fix_draw_lines_when_exporting_svg_4.0.2
fix_draw_lines_when_exporting_svg_4.0.2
2023-06-19 19:03:05 +03:00
Roman Pudashkin 42c423479d fixed drawing lines when exporting an SVG file: use Qt::NoBrush for PolylineMode
(so don't inherit it between different elements)
2023-06-19 16:50:48 +03:00
Elnur Ismailzada c163f09bc2
Merge pull request #17211 from Eism/ci_backend_fix_4.0.2
CI. Updating backend build env to Ubuntu 20.04
2023-04-12 08:24:07 +02:00
Eism 129532220a Fixed compiling of video converter 2023-04-11 20:43:41 +03:00
Jerry James 981ac5d056 Update the video exporter for newer ffmpeg versions 2023-04-11 20:43:41 +03:00
Eism da03ffcd03 Updating backend build env to Ubuntu 20.04 2023-04-11 20:43:41 +03:00
Eism fccabd93cc Updated docker to ubuntu 20 2023-04-11 20:43:41 +03:00
Elnur Ismailzada 4a6ebfb787 Revert "Downgraded gcc version for backend"
This reverts commit 95c0469150.
2023-04-11 20:43:41 +03:00
Peter Jonas 8582f3a3be Create a different latest nightly symlink for each branch
Affects nightly builds uploaded to the OSUOSL server. Currently we
create a single 'latest' symlink on each platform, e.g. on macOS:

    MuseScoreNightly-latest-x86_64.dmg

Now we will create one for each branch:

    MuseScoreNightly-latest-master-x86_64.dmg
    MuseScoreNightly-latest-4.0.2-x86_64.dmg

This helps to avoid confusion, and also avoids the race condition where
the 'latest' symlink sometimes points to a master nightly and sometimes
to a 4.0.2 nightly depending on the time of day.

On Linux, for similar reasons, a separate zsync automatic updates file
will be created for each branch.

The current "branchless" symlink and zync files will remain unmodified
on the server until they are eventually deleted by the same code that
is used to delete old nightly files on each upload.
2023-04-04 18:10:50 +01:00
Elnur Ismailzada 22861e5652
Merge pull request #17122 from Eism/command_line_save_empty_file_4.0.2
Fix saving files on the command line. 4.0.2
2023-04-03 12:45:15 +03:00
Casper Jeukendrup 5cb63af3d1 Fix saving files on the command line
We were making mistakes with opening/closing IODevices
2023-04-03 12:42:12 +03:00
Elnur Ismailzada a45b9a5b30
Merge pull request #16857 from Eism/backend_reset_current_project_4.0.2
Backend. Process doesn't finish after converting. 4.0.2
2023-03-16 13:39:42 +02:00
Eism 8697dd52df Reset the current project in the global context 2023-03-16 12:29:14 +02:00
Eism 01137bd235 Fixed error: In the GNU C Library, "major" is defined by <sys/types.h> 2023-03-13 14:59:42 +02:00
RomanPudashkin dbe7c6de73
Merge pull request #16676 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-03-06 17:43:46 +02:00
Eism 15d2c68458 If the current project is valid then we should resetup the playback 2023-03-06 17:09:28 +02:00
Eism 0c7774e7b3 Do not reset value when saving score 2023-03-06 17:09:20 +02:00
Eism 0e4e9d0b84 Corrected the logic of the variable 2023-03-06 17:09:08 +02:00
Roman Pudashkin 2a8a5f7999 fixed displaying the offset property 2023-03-06 17:06:16 +02:00
Roman Pudashkin 31988c9ede the "cue size" option will always affect the entire chord 2023-03-06 17:06:08 +02:00
Eism 6d615feacb Work only with Page mode 2023-03-06 17:05:49 +02:00
Eism 6ec7e4d7a7 Excerpts also should be in page mode 2023-03-06 17:05:37 +02:00
Eism 8b3556c0c9 Regression, print the main score also 2023-03-06 17:05:28 +02:00
RomanPudashkin 769b3af53c
Merge pull request #16652 from cbjeukendrup/4.0.2_corruption_details_translations
[4.0.2] Fix untranslatable strings in the corruption details dialog
2023-03-03 22:32:41 +02:00
Casper Jeukendrup 93b4ef1b1d
Fix untranslatable strings in corruption details dialog
`lupdate` doesn't understand strings with `u""` of course. Also, it is *better* to pass just `const char*` here rather than `String`, because when you pass `String` it has to be converted back to `const char*` because `QCoreApplication::translate` needs `const char*`.
2023-03-03 19:40:11 +01:00
RomanPudashkin 48ac167c5e
Merge pull request #16603 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-03-01 14:04:12 +02:00
Grzegorz Pruchniakowski 0c43d96314 Update CMakeLists.txt 2023-03-01 13:26:57 +02:00
Grzegorz Pruchniakowski 59f839cc1e Update AboutDialog.qml 2023-03-01 13:26:48 +02:00
Grzegorz Pruchniakowski d10ba047fd Update LICENSE.rtf 2023-03-01 13:26:40 +02:00
Grzegorz Pruchniakowski 93c8e8931b Updating copyright to 2023 2023-03-01 13:26:30 +02:00
Roman Pudashkin a7ff5635f1 fix #16593 2023-03-01 13:26:07 +02:00
RomanPudashkin 3c1418f2f4
Merge pull request #16581 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-28 12:08:17 +02:00
Casper Jeukendrup 376f6b902d Make code for adding/removing parentheses from notes more solid
Fix crash when doing add parentheses -> undo -> re-add parentheses
2023-02-28 10:39:09 +02:00
Casper Jeukendrup d94b907e4e Fix crash when duplicating open part
When an excerpt is copied, it calls `Score::clone()`. That contains some strange-looking logic about creating yet another excerpt and abusing that to properly clone the excerpt score from the master score etc. I'm sure we can do better, but let's save that for later. The problem is that this strange logic calls Excerpt::setTracksMapping on the fake excerpt, which assumes that the fake excerpt already has an `excerptScore()`. Let's just be careful about that assumption :)
2023-02-28 10:39:09 +02:00
RomanPudashkin d23f054c58
Merge pull request #16531 from RomanPudashkin/load_musesamplerlib_fix_4.0.2
load_musesamplerlib_fix_4.0.2
2023-02-24 17:13:37 +02:00
Roman Pudashkin 1a5280e453 fix #16528: Absolute MuseSampler's path for mac os (same fix as in PR #13386) 2023-02-24 16:19:10 +02:00
RomanPudashkin 530011bc8d
Merge pull request #16526 from RomanPudashkin/resetted_excerpt_open_when_reopen_file_4.0.2
resetted_excerpt_open_when_reopen_file_4.0.2
2023-02-24 12:54:32 +02:00
Casper Jeukendrup 4781b1aff7 Fix that previously resetted excerpts are not reopened after reopening the file 2023-02-24 11:52:39 +02:00
RomanPudashkin 172fa52282
Merge pull request #16510 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-23 20:50:49 +02:00
Michele Spagnolo b59aaaeb5b Improve code readability 2023-02-23 19:17:35 +02:00
Michele Spagnolo 60e5441858 Correct MMRest breaking (spanners can also start mid-measure!!)
Correct MM-rest breaking
2023-02-23 19:17:24 +02:00
Michele Spagnolo d8b1b6433c Fix disappearing mid-measure tempo changes in parts 2023-02-23 19:17:15 +02:00
Michele Spagnolo 5c8b529870 Fix wrong track on copy paste
correction
2023-02-23 19:17:05 +02:00
Casper Jeukendrup 0a9eacb461 Try what happens if we replace just the Excerpt without replacing the ExcerptNotation 2023-02-23 19:16:36 +02:00
Casper Jeukendrup 92c611bb94 Leave excerpt open when resetting it
Currently, we need to re-init it immediately anyway, so there is no point in closing it
2023-02-23 19:16:20 +02:00
Casper Jeukendrup dc655e146c Add "Reset" for all parts; "Delete" only for custom parts 2023-02-23 19:16:10 +02:00
Casper Jeukendrup 63dae6cea3 Allow deleting auto-created parts 2023-02-23 19:16:01 +02:00
RomanPudashkin 792e7d2383
Merge pull request #16474 from RomanPudashkin/score_corruption_fix_4.0.2
score_corruption_fix_4.0.2
2023-02-23 19:06:50 +02:00
RomanPudashkin 62b2edd717
Merge pull request #16501 from mike-spa/portingIgnoreGapRestsForSpacing
Porting #16419: Ignore gap rests for spacing calculations
2023-02-23 15:50:46 +02:00
Michele Spagnolo ce15209cea Fix utests 2023-02-23 14:15:37 +01:00
Michele Spagnolo c9dfa559d5 Ignore gap rests for spacing calculations 2023-02-23 14:15:37 +01:00
RomanPudashkin 28da3b1617
Merge pull request #16499 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-23 15:06:55 +02:00
Roman Pudashkin 6895140416 fixed more cases of corruption: the algorithm inside MapExcerptTracks (and Score::mapExcerptTracks) could mess up m_tracksMapping. From now on we will always use Excerpt::updateTracksMapping() to update the mapping since it is more reliable
See: https://github.com/musescore/MuseScore/pull/16474#issuecomment-1441578857
2023-02-23 14:35:00 +02:00
Eism 85c62be17a Version type 2023-02-23 11:16:47 +02:00
Michele Spagnolo 29540b8fbf Align line to text, not text to line 2023-02-23 11:10:12 +02:00
Matthew Tesch 6027eb35f4 Update MuseSampler API wrapper for v0.4 support
- New functions in v0.4 fix issue for long scores
- Also uses specific events from v0.3 that support "per-note-tuning", and appropriately calls these functions (note -- still a musesampler bug in playback in v0.3; works when dragging a note but not completely in ordinary playback)
- Moves version checking logic into the libhandler, and adds per-version behavior here for new API functions
2023-02-23 11:10:08 +02:00
Aaron Sattely 81486860c0 Maintain stem direction for created tuplets 2023-02-23 10:21:57 +02:00
Aaron Sattely 78c459cda9 make sure new computeUp functionality produces the correct beam dir 2023-02-23 10:21:42 +02:00
Aaron Sattely 1667eb079f Account for beams with neither a start or end chord
i.e. beam both starts and ends with rest
2023-02-23 10:21:33 +02:00
Aaron Sattely 3b0ba1daf7 Make beams respect explicit stem direction 2023-02-23 10:21:06 +02:00
Aaron Sattely 050d913758 only use custom stem directions when stem is unbeamed 2023-02-23 10:20:57 +02:00
RomanPudashkin 78ab24f6fb
Merge pull request #16488 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-22 18:30:54 +02:00
Eism f7cc15a55b Continue if user agrees to save project with errors 2023-02-22 17:39:40 +02:00
Eism 19bea344b8 fixed #16449: Allow to save score corrupted upon opening 2023-02-22 17:39:29 +02:00
Eism b905ff6498 fixed #16477: Non-multithreaded COM initialization 2023-02-22 17:39:09 +02:00
Roman Pudashkin f40f68a902 fix #16457: removed redundant cache that prevents tracks from updating 2023-02-22 17:12:14 +02:00
RomanPudashkin e2412a09ea
Merge pull request #16465 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-22 10:13:14 +02:00
Igor Korsukov 98f6c2fa84 fixed crash on deinit 2023-02-21 19:43:44 +02:00
Roman Pudashkin d42b7ca639 fix #16415: ignore grace notes when hiding/showing a chord 2023-02-21 19:43:16 +02:00
Marc Sabatella fd9d2a8672 show selected element 2023-02-21 19:42:52 +02:00
Eism 3dee9987fd Fixed calculation of anchor item height
DesktopAvailableHeight contains the available height of the collection of screens which make up the virtual desktop. We need the height only of the current screen
2023-02-21 14:10:50 +02:00
Eism 055a0c2727 WASAPI: use closest supported format only if an error occurred while connecting with default format 2023-02-21 14:10:28 +02:00
Casper Jeukendrup a26240527a WASAPI: use closest supported format if our favourite is not supported 2023-02-21 14:10:20 +02:00
Casper Jeukendrup 86cf9225fa WASAPI: add proper logging of error codes 2023-02-21 14:10:13 +02:00
Michele Spagnolo 47bbb39826 Avoid multiple copies on staff with linked cloned 2023-02-21 14:09:57 +02:00
Michele Spagnolo b5be30e94f Don't set feathering mode if property value is invalid 2023-02-21 14:09:31 +02:00
Roman Pudashkin 9ea29a65ef fixed a crash when closing the application with active VST plugins using the Quit button from the main menu
Since VST plugins must be destroyed in the main thread, we postpone their destruction using Async::call. This will be done through QMetaObject::invokeMethod, which moves our call into the queue. If the user closes the app fast enough (using the Quit button), the app doesn't have enough time to invoke the queued call and this causes the crash. That's why it's important to call all queued calls when the application is closed
2023-02-21 13:46:16 +02:00
Roman Pudashkin 12ea5716c2 fix #16231: fixed a crash when unloading some VST plugins 2023-02-21 13:46:16 +02:00
Roman Pudashkin 209f5b5f98 fix #15074: unload VST plugins in the main thread only 2023-02-21 13:46:16 +02:00
Roman Pudashkin af30f64044 fix #10930: fixed numerous problems with memory management after using Steinberg::Vst::PlugProvider::getComponent/getController
1. avoid using Steinberg::Vst::PlugProvider::getComponent/getController. They do not just return raw FUnknown*, they also call addRef(), so we must call release() every time after using these methods

2. avoid multiple conversions from FUnknown* to IPtr<FUnknown>. Steinberg::Vst::PlugProvider already stores the required smart pointers, so we will use them directly to ensure a more reliable order of addRef/release calls
2023-02-21 13:46:16 +02:00
Elnur Ismailzada fa46d7fa90
Merge pull request #16438 from Eism/wasapi_default_device_connection_4.0.2
fixed #15029: Crash when disconnecting headphones on Windows. 4.0.2
2023-02-20 09:54:42 +02:00
Eism 38c800b780 fixed #15029: Reconnect to the default device after changing the default device in the system 2023-02-20 08:46:32 +02:00
RomanPudashkin 8c85e6cdd7
Merge pull request #16422 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-18 10:45:10 +02:00
Casper Jeukendrup 80450a55c0 Fix macOS CI
Apparently pkg-config now needs to be installed
2023-02-17 23:39:04 +02:00
Casper Jeukendrup e0c6a37c40 Update MACOSX_DEPLOYMENT_TARGET in setup.sh
to match what we have in CMake
2023-02-17 23:38:09 +02:00
Matthew Tesch 811bced015 Fix code style 2023-02-17 20:03:13 +02:00
Matthew Tesch accffcf84e Add "user dir" default paths for sampler
(preferred non-admin install location for future Muse Hub releases)
2023-02-17 20:03:06 +02:00
hirnaymay cbb2530824 Fix #16141: Add 'Text Line Spacing' option in the Text properties panel
Text line spacing can now be customized using a spinbox just like in MS3.

Text properties > more > line spacing
2023-02-17 20:01:42 +02:00
Eism 2a00fed52b DockTitleBar navigation fix 2023-02-17 20:00:25 +02:00
Casper Jeukendrup 2b80d36a7c Fix keyboard navigation for DockTitleBar 2023-02-17 20:00:17 +02:00
Michele Spagnolo 6d0c41ee3d Improved management of system objects upon deleting/reinserting staves
- Keep Score::systemObjectStaves updated when adding/removing system object staves
- Preserve the systemObject property of a staff upon deleting/reinserting
- Correct many (many...) small bugs about system objects when doing operations like add/remove staff or reordering them
Removed unnecessary getSysteObjectStaves method


Moved isSystemObjectStaff into Score


Moved definitions to score.cpp


Remove systemObject flag from insertStaff


Move methods from EngravingItem class to utils.cpp


Code improvements
2023-02-17 19:59:48 +02:00
Michele Spagnolo 1467387776 Revert "Fix crash on deleting "system object" staff"
This reverts commit 919262c50d.
2023-02-17 19:59:36 +02:00
Casper Jeukendrup c3095b1f23 Add horizontal scrollbar in ErrorDetailsView 2023-02-17 19:59:17 +02:00
Casper Jeukendrup 9d98e3a489 Fix QML error reg. accessibility in ErrorDetailsView.qml 2023-02-17 19:59:09 +02:00
Casper Jeukendrup 14add38bef Score sanity check: also check part scores 2023-02-17 19:59:01 +02:00
Roman Pudashkin 5f6f693790 added the ability to manually corrupt the open score (for testing purposes) 2023-02-17 19:58:41 +02:00
Roman Pudashkin 6b44aa9969 fix #16206 2023-02-17 19:58:29 +02:00
Roman Pudashkin e5c7b4e2a3 fix #12150 2023-02-17 19:58:21 +02:00
Roman Pudashkin 741ea815d0 reverted PR #12152 2023-02-17 19:58:10 +02:00
Casper Jeukendrup d680590986 Elide text at the borders of FlatButton 2023-02-17 19:57:45 +02:00
Casper Jeukendrup 2a6d94c71c Fix width of checkboxes in New Workspace dialog 2023-02-17 19:57:36 +02:00
Casper Jeukendrup 0cb32468f6 Fix vertical spacing in Score Upload Success dialog 2023-02-17 19:57:29 +02:00
Casper Jeukendrup 561d7a855e Fix text wrap in Score Upload Success dialog 2023-02-17 19:57:20 +02:00
Casper Jeukendrup 706617a109 Fix QML warning in "How would you like to save?" dialog
parent is null for some reason
2023-02-17 19:57:05 +02:00
Eism a408c1ae42 Error about not being able to upload newly created score 2023-02-17 19:56:50 +02:00
Eism fdb939d0f3 Fixed the body for newly created score 2023-02-17 19:56:42 +02:00
RomanPudashkin a36e59872d
Merge pull request #16311 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-10 22:10:44 +02:00
Eism 630261fa7a fixed #16042: Show corrupted message before saving 2023-02-10 20:05:52 +02:00
softcat477 1762fdadfd Fix #12934 Delete images inside a frame
- Select images by adding a special case to the z-order.
2023-02-10 19:21:33 +02:00
Eism 55872600b5 fixed #16028 and #15992: Cherry-pick the changes from kdab library 2023-02-10 19:21:12 +02:00
Michele Spagnolo 2f95fa44bc added vtest 2023-02-10 19:20:51 +02:00
Michele Spagnolo 04575ff1aa Fix cross-system glissando bug
correction
2023-02-10 19:20:42 +02:00
Sam Lavin d6000daa18 Fix #11414: Fixed brace-wrapping issue 2023-02-10 19:20:20 +02:00
Sam Lavin 9c1c3985cb Fix #11414: Improved NumberInputField behavior when selected 2023-02-10 19:20:11 +02:00
Eism df5ba009a1 Fixed the problem of unintended panel undocking 2023-02-10 19:19:50 +02:00
Casper Jeukendrup fdd7905a0a Fix clicking FlatButton if you (accidentally) move the mouse between press and release
See https://github.com/musescore/MuseScore/issues/16012#issuecomment-1399656043
2023-02-10 19:19:29 +02:00
Casper Jeukendrup 6abfd1bd76 Fix crash when opening old score with instruments without InstrChannels 2023-02-10 19:19:06 +02:00
Elnur Ismailzada c1d50876fb
Merge pull request #16287 from Eism/repeat_segment_crash_fix_4.0.2
fixed #14599: Crash when doing "Repeat selection" with 256th notes or shorter. 4.0.2
2023-02-09 12:45:01 +02:00
Eism 59a602c3b2 Fixed tests 2023-02-09 10:39:29 +02:00
Eism 4be363958a fixed #14599: Converting fraction 1/256 from/to ticks does not work 2023-02-09 10:39:18 +02:00
Elnur Ismailzada 554286fae9
Merge pull request #16277 from Eism/audio_export_cancel_4.0.2
Export Audio process can't be cancelled. 4.0.2
2023-02-08 16:35:02 +02:00
Eism 6d5f691af0 Added shadow and borders for frameless dialogs 2023-02-08 15:48:05 +02:00
Eism 39acb33618 fixed #14147: Implemented cancel for audio exporting 2023-02-08 15:46:42 +02:00
RomanPudashkin aabbec1406
Merge pull request #16203 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-02-03 15:54:41 +02:00
Roman Pudashkin e18c9c0c5a fix #15513: This crash is a consequence of the changes introduced in PR #13724: we don't layout closed parts anymore, so some elements (like H/Vbox) do not have a parent. Their parent (system) is dynamically created when doLayout() is executed 2023-02-03 14:40:48 +02:00
Hemant Antony 2e9b876de7 Fix #11573: Page size stuck in metric system 2023-02-03 14:40:28 +02:00
Peter Jonas 90847f0c9b Instruments: Make Bb trumpet the default instead of C trumpet
Now Bb will be the default option in the Trumpet dropdown in the NSW
and Instruments dialog.

Fix #14957
2023-02-03 14:39:47 +02:00
Michele Spagnolo b2ee297f24 Don't compute voice offsets in TAB staves 2023-02-03 14:39:25 +02:00
Michele Spagnolo 2650e3845e added vtest 2023-02-03 14:26:20 +02:00
Michele Spagnolo cabf2f31f3 Improve slur collision logic in multi-voice cases 2023-02-03 14:25:36 +02:00
Michele Spagnolo b0d9a84029 Correction for cross-staff grace notes spacing 2023-02-03 14:23:38 +02:00
Michele Spagnolo de39c21f94 added vtest 2023-02-03 14:23:30 +02:00
Michele Spagnolo 26b6957f5e Fix collision checks for cross-staff stems 2023-02-03 14:23:21 +02:00
Michele Spagnolo d5ef2c2750 Fix slur voice cloning bug 2023-02-03 14:22:54 +02:00
Michele Spagnolo b07a68385b Fix tuplets entry bug
correction


correction
2023-02-03 14:22:33 +02:00
Michele Spagnolo 426431a2cc Fix system flag on parts creation 2023-02-03 14:21:28 +02:00
Casper Jeukendrup 05fed26186 MixerPanelContextMenuModel: properly update enabled/checked actions 2023-02-03 14:21:02 +02:00
Roman Pudashkin a8f143ff81 fix #15844: update m_measureRepeatCount (which is stored inside MStaff) when removing measure repeats 2023-02-03 14:20:37 +02:00
Casper Jeukendrup fb1cb12ebd Fix crash when repeating non-full-measure selection when next measure is measure repeat 2023-02-03 14:20:13 +02:00
Eism 1c97adc3bd fixed #12589 and #11656: Don't drag objects with middle button 2023-02-03 14:19:49 +02:00
Casper Jeukendrup 944ec79b0d Don't crash when deleting measures in corrupted score
to help the user to fix corruptions by deleting the affected measures.

Resolves: #16174
2023-02-03 14:19:33 +02:00
Roman Pudashkin 50c0037447 fix #16124: fixed applying offsets to selected chord parts 2023-02-03 14:17:58 +02:00
Roman Pudashkin dcb6436eab fix #14172: first calculate the duration of the first tied note, and then apply Swing 2023-02-03 14:17:38 +02:00
RomanPudashkin c229b14124
Merge pull request #16101 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-01-28 14:33:55 +02:00
Casper Jeukendrup cfffaa12d7
Merge pull request #16055 from cbjeukendrup/4.0.2_lupdate
Update translations for 4.0.2
2023-01-27 23:53:04 +01:00
Casper Jeukendrup 65bf44aa87 Restore information about meta tags in header/footer tooltip
Resolves: https://musescore.org/en/node/341358
2023-01-27 18:01:27 +02:00
Joachim Schmitz 5db9f19373 Let the Kiwis ;-) fall back to British English too 2023-01-27 17:58:17 +02:00
Joachim Schmitz d729b3ead6 Let the Aussies ;-) fall back to British English
rather than to American English, just like it was in 3.x
2023-01-27 17:58:06 +02:00
Rishav Raj 6f1b511af4 Change Hide/delete to Hide/Delete. (#15686)
* Change Hide/delete to Hide/Delete
2023-01-27 17:57:52 +02:00
Michele Spagnolo 2de2771ce1 Read and write MMRest properties
correction
2023-01-27 17:57:52 +02:00
Casper Jeukendrup 18b9e176c9 Fix #15861: Printing scores prints square the number of requested copies
On most systems, the QPrinter already prints n copies of what we feed it with, so we ourselves don't need to feed it with n copies too.
2023-01-27 17:57:52 +02:00
Grzegorz Pruchniakowski c938e80b73 Fix: retry the command -> retry
The "...and retry the command" occurs only once in strings to translate - only in this case.
These cases above are with "or" instead of "/"; and this case name is: Err::SelectCompleteTupletOrTremolo.

Greetings,
Gootector
2023-01-27 17:57:52 +02:00
Roman Pudashkin a47ab1a922 fix #15734: disable some File menu items if there is no open project 2023-01-27 17:57:52 +02:00
Roman Pudashkin c8239fdd80 File menu items are now available on all pages, not only on the Score page 2023-01-27 17:57:52 +02:00
Roman Pudashkin bd7579953f fixed a crash when there are no measures in the score (also see issue #11283) 2023-01-27 17:57:52 +02:00
Roman Pudashkin 3f6244d0f6 fix #15385: update repeat lists when changing the global tempo multiplier 2023-01-27 17:57:52 +02:00
Elnur Ismailzada 0b18c4bd27
Merge pull request #16098 from Eism/videoconverter_video_length_fix_4.0.1
[MU4] Video Converter. Video length fix. 4.0.1
2023-01-27 13:46:19 +02:00
Eism e47d522cef Fixed including dirs from ffmpeg 2023-01-27 12:59:37 +02:00
Eism d21770095e Fixed converting current time to tick 2023-01-27 12:59:31 +02:00
RomanPudashkin 3e9f13112f
Merge pull request #16074 from Eism/score_harmony_crash_fix_4.0.2
fixed #15897: Entering Roman numeral analysis crashes when using screen reader
2023-01-26 09:54:32 +02:00
Eism af3e4ae263 fixed #15897: The C++ standard library's regex implementation does not support lookarounds 2023-01-26 08:56:40 +02:00
Casper Jeukendrup a0165fd588
lupdate action: add ability to switch '-no-obsolete' on/off 2023-01-24 21:19:09 +01:00
RomanPudashkin 68b18e4948
Merge pull request #16041 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-01-24 11:23:57 +02:00
hirnaymay 54eefe4c17 #15684 MU4 Issue: Horizontal frame - Properties - "Display key, brackets and braces" should also mention "clef" #15684 (#16008)
Changed string value in Inspector\notation\frames\HorizontalFrameSettings.qml

from: text: qsTrc("inspector", "Display key, brackets and braces")
to: text: qsTrc("inspector", "Display clef, key and brackets in the next measure")
2023-01-24 10:44:06 +02:00
Casper Jeukendrup 7aac2afe33 Correctly detect Valencian system language 2023-01-24 10:43:18 +02:00
Michele Spagnolo 7d39d6cbd3 Collision correction (ignore all text-base items) 2023-01-24 10:43:18 +02:00
Michele Spagnolo 3894da1e54 Correction to staff hiding logic
comment
2023-01-24 10:43:18 +02:00
Michele Spagnolo 6ac0ba9f63 Fix articulation glitch 2023-01-24 10:43:18 +02:00
Eism 91911ef8b9 fixed #15119: Correct resolving screen for dialog 2023-01-24 10:43:18 +02:00
Eism e195205315 fixed #14542: Corrected the positioning of dialogs 2023-01-24 10:43:18 +02:00
RomanPudashkin a6922a60eb
Merge pull request #16038 from RomanPudashkin/inspector_improvements_4.0.2
inspector_improvements_4.0.2
2023-01-24 10:42:15 +02:00
Roman Pudashkin 9e6fb14688 added tests for undoChangeVisible and cmdToggleVisible 2023-01-24 10:05:49 +02:00
Roman Pudashkin 96ca173b64 fixed updating the Note Head section when using the v shortcut 2023-01-24 10:02:59 +02:00
Roman Pudashkin ed50308cba offsets must be applied to the entire chord, not just to its selected parts 2023-01-24 10:02:48 +02:00
Roman Pudashkin 8b77ec8359 fix #11740: re-implemented the v shortcut 2023-01-24 10:02:35 +02:00
Roman Pudashkin 93f3a2b505 fix #13487: implemented a more advanced algorithm for hiding note heads and attached elements 2023-01-24 10:02:26 +02:00
Roman Pudashkin daf685c53f fix #11096, #11159, #15096: from now on IElementRepositoryService::takeAllElements() returns all selected parts of notes, not just chords 2023-01-24 10:02:18 +02:00
Casper Jeukendrup 47af42e78c
Run lupdate on 4.0.1 branch 2023-01-24 08:50:42 +01:00
Elnur Ismailzada 93cb29e6f8
Merge pull request #16016 from Eism/score_corrupted_added_case_4.0.2
Added another case in which the score is considered corrupted. 4.0.2
2023-01-23 12:22:46 +02:00
Eism c2df6c36b8 Should process all segments 2023-01-23 08:23:10 +02:00
Eism b6d8004eaa Prevented crashes
If there is no play measure, for example 
the first measure on staff is the measure of measure repeat group, then we should skip all measure repeat group
If there is no measure repeat (score is corrupted), then  skip all measure repeat group
2023-01-23 08:23:02 +02:00
Eism e5504a2df0 Added another case in which the score is considered corrupted 2023-01-23 08:22:53 +02:00
RomanPudashkin 13f9eaed92
Merge pull request #15975 from RomanPudashkin/error_details_4.0.2
error_details_4.0.2
2023-01-19 22:47:24 +02:00
RomanPudashkin db7d92b6ae
Merge pull request #15976 from RomanPudashkin/popups_multi_monitor_position_fix_4.0.2
popups_multi_monitor_position_fix_4.0.2
2023-01-19 19:48:10 +02:00
Eism db2b727ccf fixed #14624: titleBar height equals content height 2023-01-19 18:43:08 +02:00
Eism 236d5e1e7e Use monitor dimensions when calculating maximum window size 2023-01-19 18:42:52 +02:00
RomanPudashkin dfe108e760
Merge pull request #15971 from RomanPudashkin/update_4.0.2
update_4.0.2
2023-01-19 18:35:08 +02:00
RomanPudashkin a71a7898a9
Merge pull request #15972 from RomanPudashkin/save_diagnostic_files_4.0.2
save_diagnostic_files_4.0.2
2023-01-19 18:25:57 +02:00
Roman Pudashkin f303161885 accessibility support 2023-01-19 18:04:48 +02:00
Roman Pudashkin 073d447c03 navigation support 2023-01-19 18:04:40 +02:00
Roman Pudashkin 8a5e2de409 changed the format of the error messages 2023-01-19 18:04:31 +02:00
Roman Pudashkin c52bdada23 implemented the ability to display error details inside the standard dialog 2023-01-19 18:04:19 +02:00
Roman Pudashkin 0ef68c16a3 implemented the ability to pass error details to the standard dialog 2023-01-19 18:03:50 +02:00
Roman Pudashkin 61d1938428 marked the OK button as "accent" by default 2023-01-19 18:03:37 +02:00
Roman Pudashkin 71c6516ef1 use WithIcon as the default option for errors/warnings 2023-01-19 18:03:21 +02:00
Roman Pudashkin 45a46e8410 use Ret instead of engraving::Err to pass more detailed information about an error 2023-01-19 18:02:27 +02:00
Roman Pudashkin a01788311d show a more user-friendly error/warning when a score is not opened successfully 2023-01-19 18:01:18 +02:00
Roman Pudashkin b3e707585a removed some obsolete subpages from DevTools 2023-01-19 17:31:37 +02:00
Roman Pudashkin 110a9b0358 task #15145: added the ability to enable the dev mode in stable builds 2023-01-19 17:31:23 +02:00
Roman Pudashkin 390abd2340 task #15830: added the ability to save diagnostic files (such as logs, shortcuts, etc.) into a zip archive 2023-01-19 17:31:11 +02:00
Casper Jeukendrup f305628d2b Fix crash when setting Chords with ledger lines invisible using Inspector
- The Inspector toggles the visibility of the selected `Chord`
- When the visibility of a `Chord` is changed, it also sets the visibility of its subitems (since d26cbf8b7d (diff-13f3103b0fd80f2da9ba0db1ff1f3d864eb6f0e0b16d1903000eae4d6721cec8R3645-R3649)), including Ledger Lines; this is recorded in the Undo Stack
- After the changes are done, the score is laid out again; as part of this, the ledger lines are deleted to be replaced with new ones
- Finally, information from the Undo Stack is requested to determine to what extent the playback needs to be re-rendered. While generating this info, the UndoStack comes across the deleted ledger lines that it still referenced, which causes a crash
- Pressing the 'V' shortcut toggles the visibility of the _notes_, rather than their parent Chords, so is not affected.

The solution is that we should not process temporary items like Ledger Lines for anything that outlives them, like undoable commands.
2023-01-19 17:22:09 +02:00
Hemant Antony dfe00f0976 Fix #15873: Remove Feedback option 2023-01-19 17:21:39 +02:00
Michele Spagnolo f8765f200c added vtest 2023-01-19 17:21:13 +02:00
Michele Spagnolo 6050bac502 Fix clef layout bug
correction
2023-01-19 17:21:04 +02:00
Casper Jeukendrup db41db57f7 Fix asking about saving score when receiving Quit event
For example on macOS when clicking "Quit" in the Dock icon context menu or when shutting down the system
2023-01-19 17:20:22 +02:00
Casper Jeukendrup ef4783f6ac Update window title when switching between parts 2023-01-19 17:19:51 +02:00
Roman Pudashkin 668470c425 fix #14949: don't handle the Left-click release event during playback 2023-01-19 17:19:22 +02:00
Roman Pudashkin d6c8f5775f fix #13403 2023-01-19 17:19:13 +02:00
Roman Pudashkin ef2261ddbc update selection when moving from one note to another within a single chord on a tab staff 2023-01-19 17:19:05 +02:00
Marc Sabatella b57fe728bb Fix page size on 302 import 2023-01-19 17:17:59 +02:00
Michele Spagnolo 9ba8bd21b1 added vtest 2023-01-19 17:17:32 +02:00
Michele Spagnolo 5155828f22 The "up" property should be set also for beamed rests
... not only for beamed chords.
2023-01-19 17:17:25 +02:00
FigmentBoy 335ae6185c Fix playback toggle on dock/undock 2023-01-19 17:16:55 +02:00
RomanPudashkin b807808d65
Merge pull request #15962 from RomanPudashkin/enable_ci_builds_for_4.0.2
enable_ci_builds_for_4.0.2
2023-01-19 11:26:36 +02:00
Roman Pudashkin cc9ced1711 enable ci builds for 4.0.2 2023-01-19 10:35:10 +02:00
pereverzev_v 50d46dd997 Bumped up the version number to 4.0.2 2023-01-18 16:43:17 +02:00
RomanPudashkin 9b70a8cb28
Merge pull request #15843 from RomanPudashkin/update_4.0.1
update_4.0.1
2023-01-12 19:47:12 +02:00
Michele Spagnolo 7273044709 Fix crash on deleting "system object" staff
correction
2023-01-12 19:12:29 +02:00
Roman Pudashkin 23415d5fb4 fixed a crash when using the "no effect" button on an effect that failed to load 2023-01-12 19:12:04 +02:00
Roman Pudashkin b119ee7e8c fix #14205: some VST plugins don't support more than 1 channel (we use 2 channels by default) 2023-01-12 19:11:55 +02:00
Roman Pudashkin 6b06c81cc7 fixed a broken VST window after re-opening it on windows (the problem can be reproduced, for example, with Vital Audio or Valhalla Supermassive) 2023-01-12 19:11:46 +02:00
Roman Pudashkin d50a9bd5bf fix #13867: deinit the plugin view before calling ~AbstractVstEditorView() 2023-01-12 19:11:34 +02:00
RomanPudashkin 76500c3b6e
Merge pull request #15834 from RomanPudashkin/update_4.0.1
update_4.0.1
2023-01-12 15:09:31 +02:00
Roman Pudashkin 3f24594504 ported missing function 2023-01-12 14:34:13 +02:00
Aaron Sattely f2640a05a8 add initial score creation tempo markings to all system object staves 2023-01-12 14:26:20 +02:00
Eism 3caa460cb2 Ignore Escape and Tab shortcuts 2023-01-12 14:20:38 +02:00
Eism 1285ea2346 Prevent the user from changing the escape shortcut 2023-01-12 14:20:38 +02:00
Eism 0f0d85c4f1 fixed #14698: Use our styled dialog view instead of qml dialog 2023-01-12 14:20:38 +02:00
Eism 9104cd92ca fixed #12791: Fixed numpad sequences 2023-01-12 14:20:38 +02:00
Casper Jeukendrup f5af414890 WASAPI Driver: don't crash (or rather hang) when starting client fails
We were waiting infinitely for the WASAPI_Client_Started event, but when there was an error while starting the client, that event would never be signaled. So MuseScore would be stuck infinitely on launch.
2023-01-12 14:18:07 +02:00
Michele Spagnolo 715509ef33 Fix duplicate system objects in parts 2023-01-12 14:16:45 +02:00
Roman Pudashkin ded3520942 fix #15292:
Unlike other OS, when the user tries to open a file on macOS, the path to the file will be contained in the QEvent::FileOpen event. This event can be postponed when opening the application. So we might get into a situation where we have already started loading the Home page (as the default start page), but we still haven't received QEvent::FileOpen. So that is why it is important to process QEvent::FileOpen as early as possible
2023-01-12 14:16:22 +02:00
Michele Spagnolo e5b889b88a Correct brackets bug at score creation 2023-01-12 14:15:58 +02:00
RomanPudashkin 5a86fc660b
Merge pull request #15832 from Eism/playback_start_from_fix_4.0.1
fixed #14609: Playback issue after playing the last measure
2023-01-12 13:58:34 +02:00
Eism ade35b4ed0 fixed #14609: Stop playback at the end of a track 2023-01-12 13:21:53 +02:00
Elnur Ismailzada f23ceb1e18
Merge pull request #15823 from Eism/videoconverter_ls_ts_4.0.1
Added commands for video convert mode. 4.0.1
2023-01-11 18:00:06 +02:00
Eism 7bd7155d78 Added ls and ts commands for video converter 2023-01-11 15:40:28 +02:00
pereverzev_v b6d3bfc1b6 Bumped up the version number to 4.0.1 2023-01-10 12:09:02 +02:00
RomanPudashkin 98d89adfc7
Merge pull request #15782 from RomanPudashkin/update_4.0.1
update_4.0.1
2023-01-09 20:02:30 +02:00
Eism f52a296ad0 fixed #15105: Added check for measure validity 2023-01-09 18:44:38 +02:00
Eism cdd745e715 fixed #15193: Close context menu before moving the cell 2023-01-09 18:44:38 +02:00
Eism acda813659 fixed #15186: Enabled context menu for text editing 2023-01-09 18:44:38 +02:00
Casper Jeukendrup 5c2cffa4ef Fix inserted measures being empty/corrupt in part scores
We _do_ need to run `Score::setUpTempoMap` in excerpt scores, to some extent: the parts about ticks and time signatures on staves must be done. Only sigmap and tempomap stuff belongs exclusively to master scores. (Fix regression caused by f0705a60ae)
2023-01-09 18:44:38 +02:00
Casper Jeukendrup 29aaccba57 Remove SF Pro workaround on macOS
To try whether it solves problems…
2023-01-09 18:44:38 +02:00
Casper Jeukendrup 3cc17fec3c Fix more possible crashes due to modifying segment annotations during loop 2023-01-09 18:44:38 +02:00
Casper Jeukendrup ab26fbded3 Fix crash AddLinkedStaff/Undo/DeleteInstrument/Undo with articulation
Fix crash when performing the following actions on a staff containing a chord with an articulation:
- Create a linked staff
- Undo
- Delete the instrument
- Undo
2023-01-09 18:44:38 +02:00
Casper Jeukendrup 73a5a305a6 Fix crash when deleting instrument where a segment has multiple annotations 2023-01-09 18:44:38 +02:00
Casper Jeukendrup 340faf5a68 Fix corruption when changing measure length 2023-01-09 18:44:38 +02:00
Roman Pudashkin 246dffd51c fix #14487: use the correct tpc value regardless of the state of the concert pitch checkbox 2023-01-09 18:44:38 +02:00
RomanPudashkin 4acdad8b7b
Merge pull request #15783 from RomanPudashkin/enable_ci_builds_for_4.0.1
enable_ci_builds_for_4.0.1
2023-01-09 18:44:02 +02:00
Roman Pudashkin 0a30b529c9 enable ci builds for 4.0.1 2023-01-09 18:42:18 +02:00
Eism 542a3034ae Fixed force mode for comminde line 2022-12-26 15:38:33 +02:00
Eism 548562132f Temporary disabled youtube usage 2022-12-13 23:58:31 +02:00
pereverzev_v e9869aa88d Added upper bound check for MuseSampler's version 2022-12-13 18:18:11 +02:00
pereverzev_v 9dcd13144a Switched API calls onto new dedicated domain 2022-12-13 13:40:45 +02:00
Michele Spagnolo 24b8e34858 keySigEvent must be added also if in C 2022-12-09 17:26:19 +02:00
DmitryArefiev 2ada4e779d Merge pull request #15068 from RomanPudashkin/blank_vst_window_fix
[MU4] Fix #14963: VST effect window on Master channel becomes blank after re-opening sore during one MU session
2022-12-09 14:12:39 +02:00
pereverzev+v 1d3a5a8771 Merge pull request #15071 from cbjeukendrup/handbook_url
Update handbook URL
2022-12-09 14:12:29 +02:00
pereverzev+v 4da8e5ed18 Merge pull request #15057 from vpereverzev/vst_plugin_params_crash_fix
[MU4] vst_plugin_state_loading
2022-12-09 12:41:21 +02:00
Aaron Sattely 25266e98a5 only use stem-anchored slurs on stemThrough staves 2022-12-09 12:41:04 +02:00
pereverzev+v 2e2085eb5d Merge pull request #15022 from RomanPudashkin/crash_when_closing_score
crash_when_closing_score
2022-12-08 19:58:26 +02:00
pereverzev+v bab78a6f81 Merge pull request #15024 from cbjeukendrup/partName_longName
Default part name should now be longName instead of trackName
2022-12-08 17:36:14 +02:00
pereverzev+v 12ec72a7fe Merge pull request #14940 from RomanPudashkin/use_only_ms_basic_metronome_sound
use_only_ms_basic_metronome_sound
2022-12-08 17:35:31 +02:00
Elnur Ismailzada dbbf2ad8e7 Merge pull request #15041 from Eism/score_copy_drag_crash_fix
fixed #13364: Attempt to duplicate element result in program freezing/crashing (Linux only)
2022-12-08 17:35:26 +02:00
Michele Spagnolo dc67d6429f When replacing an instrument, update transposition only once 2022-12-08 15:55:53 +02:00
RomanPudashkin c9b9717951 Merge pull request #15010 from vpereverzev/note_input_delay
[MU4] note_input_delay
2022-12-08 15:55:41 +02:00
RomanPudashkin 65f14814b9 Merge pull request #15025 from cbjeukendrup/pdf_export_multisize_parts
Pdf export: fix page size when writing parts with different page sizes to single file
2022-12-08 15:55:37 +02:00
Elnur Ismailzada 5654eb1da0
Merge pull request #15035 from Eism/score_ctrl_drag_disable_rc
score_ctrl_drag_disable_rc
2022-12-08 09:34:56 +02:00
Eism 701184d894 reverted #8174: lasso list selection
Element-by-element selection operations (Ctrl+click and Ctrl+drag) don't work very well. Let's reduce their number.
2022-12-08 08:50:03 +02:00
pereverzev_v f23002aedf Prevent crash on read of ChordLine during the copy-paste action 2022-12-07 23:30:22 +02:00
RomanPudashkin 92b3462113 Merge pull request #14982 from mike-spa/fixShiftRarrowSystemLineEdit
Fix shift + rightArrow system line edit
2022-12-07 17:18:11 +02:00
DmitryArefiev 8e17b96de8 Merge pull request #15009 from Eism/inspector_texts_fix
fixed #14968: Selecting two voltas will result in deletion of text and "repeat list" number, leading to score is not playable anymore
2022-12-07 17:00:44 +02:00
DmitryArefiev 95179da691 Merge pull request #14990 from RomanPudashkin/disappeared_vst_fx
[MU4] Fix #14752: Changing volume faders causes VST effects to be removed
2022-12-07 16:10:30 +02:00
pereverzev_v 1c5e4eb077 Applying spanner articulations specific to a staff only to chords from that staff 2022-12-07 14:41:46 +02:00
pereverzev_v 3820cd5411 Respect note length when calculating pitch bend intervals
Fixed #14958
2022-12-07 14:41:41 +02:00
RomanPudashkin cb5a7a8475 Merge pull request #14978 from RomanPudashkin/crash_when_add_fret_diagram
[MU4] Fix #14977: Crash when adding fret diagram to a note
2022-12-07 14:41:34 +02:00
Roman Pudashkin a43001b591 fix #14896: do not play the selected note twice if we were unable to add a new note 2022-12-06 19:51:46 +02:00
DmitryArefiev 02e6f1fdcf Merge pull request #14839 from cbjeukendrup/metronome_dont_mute_by_solo_or_range_selection
Don't mute metronome by solo or range selection
2022-12-06 19:51:39 +02:00
DmitryArefiev 2df795a9d7 Merge pull request #14948 from RomanPudashkin/disable_chord_symbols_playback
[MU4] Fix #13271:  'Play chord symbols' option doesn't save 'sound off' state for next opened scores and next MU sessions
2022-12-06 19:51:34 +02:00
RomanPudashkin ebf26c28e7 Merge pull request #14842 from Jojo-Schmitz/beams_crash
Fix GH14840: Crash when there are 6 or more beams (i.e. beamed 256th notes or shorter)
2022-12-06 17:57:48 +02:00
RomanPudashkin 7cd27b0805 Merge pull request #14987 from musescore/revert-14862-seek_optimization
Revert "seek_optimization"
2022-12-06 17:35:44 +02:00
Elnur Ismailzada cd7f437b6e
Merge pull request #14989 from Eism/backend_use_gtk_fix_rc
backend_use_gtk_fix_rc
2022-12-06 16:54:36 +02:00
Eism cc1853ea39 Create splash screen only for editor mode 2022-12-06 16:11:44 +02:00
Eism 32570c870e Don't install theme if screen usage is disabled
Screen usage disabled in converter mode
2022-12-06 16:11:36 +02:00
pereverzev+v 19abc468ad Merge pull request #14981 from vpereverzev/audio_export_issues
[MU4] audio_export_issues
2022-12-06 15:50:17 +02:00
Elnur Ismailzada 40c5b42bbd
Merge pull request #14938 from Eism/help_urls_fix_rc
help_urls_fix_rc
2022-12-05 15:24:25 +02:00
RomanPudashkin d791118d7b
Merge pull request #14939 from Eism/mmrest_crash_fix_rc
mmrest_crash_fix_rc
2022-12-05 14:21:49 +02:00
Eism 57e5f382e0 fixed #14918: Fixed a crash when accessing explicitParent in MMRest::layout 2022-12-05 10:10:47 +02:00
Eism 5a8d6ea733 fixed #14931: Fixed urls 2022-12-05 10:09:14 +02:00
pereverzev_v d050fb0a2d Fixed an issue with audio export on MS_Basic 2022-12-02 23:30:35 +02:00
pereverzev+v 85598a7881 Merge pull request #14884 from vpereverzev/musesounds_mappings
[MU4] preparation_for_musesounds_mappings
2022-12-02 19:23:36 +02:00
pereverzev+v 9de702260e Merge pull request #14672 from asattely/box-in-a-box
Fix #14643 - Crash when opening score with nested boxes
2022-12-02 19:23:30 +02:00
pereverzev+v 7f989ff0ce Merge pull request #14601 from cbjeukendrup/mscore_errors
Add missing error dialogs that should be the result of MScore errors
2022-12-02 18:38:21 +02:00
pereverzev+v 28ff70f8fb Merge pull request #14788 from cbjeukendrup/fp
Fixes for "fp"-like and "sf"-like dynamics
2022-12-02 18:38:12 +02:00
Casper Jeukendrup 2fa6ad8bcd Reduce margins 2022-12-02 18:38:01 +02:00
Casper Jeukendrup 95a9ac3ff1 Adjust spacing of items in Playback Toolbar 2022-12-02 18:37:56 +02:00
RomanPudashkin 890dfd80ec Merge pull request #14892 from RomanPudashkin/allow-space-to-remove-hyphen_fix
fix #13200 - allow using space to remove hyphen
2022-12-02 18:09:31 +02:00
RomanPudashkin 98a738855c Merge pull request #14889 from Eism/learn_hide_advanced_tab
fixed #14886: Hide 'Advanced' tab in 'Learn' section
2022-12-02 17:56:24 +02:00
Elnur Ismailzada 9f5e9f34d0 Merge pull request #14139 from cbjeukendrup/text_clipping
Fix various text clipping issues
2022-12-02 17:56:19 +02:00
RomanPudashkin 34b69c9a2f Merge pull request #14603 from cbjeukendrup/harmony_play_when_created
Play chord symbol after creating/editing and fix assertion failure
2022-12-02 12:57:15 +02:00
Michele Spagnolo 973a9a47ec Fix insert measure before MMRest 2022-12-02 12:56:52 +02:00
pereverzev_v b5a1133c6e Restored missing mapping id for electric guitar 2022-12-02 10:43:26 +02:00
RomanPudashkin a1bbe6487a Merge pull request #14561 from cbjeukendrup/default_page_size
Set default page size based on locale
2022-12-02 10:43:19 +02:00
pereverzev_v a988b5c549 Increased duration of staccato and staccatissimo notes for strings 2022-12-02 00:29:22 +02:00
pereverzev_v d7782c2413 Considering arpeggio's stretch during the rendering 2022-12-02 00:29:17 +02:00
RomanPudashkin d63f0cc1b3
Merge pull request #14870 from Eism/update_linux_fix_rc
update_linux_fix_rc
2022-12-01 18:29:29 +02:00
RomanPudashkin f9d4900da0
Merge pull request #14869 from RomanPudashkin/crash_after_export_rc
crash_after_export_rc
2022-12-01 18:29:13 +02:00
Michele Spagnolo 551fc83c6b Don't write undefined size and family property 2022-12-01 18:28:45 +02:00
Michele Spagnolo 0fbf0281ab Check if string contains custom formatting and set UNSTYLED 2022-12-01 18:28:45 +02:00
Michele Spagnolo e8cea477ab Fixing lost text formatting on copy/paste, save/reload
...and additional problems with styleChanged() command caused by incorrect UNSTYLED flag setting
2022-12-01 18:28:45 +02:00
Elnur Ismailzada 78350f8d80 Merge pull request #14850 from Eism/update_linux_fix
[MU4] Checking update on Linux
2022-12-01 16:58:29 +02:00
Roman Pudashkin 40dee9a240 fixed multiple crashes when creating a part and adding new instruments to it:
1. do not destroy bracket items inside ~Staff(): they will be deleted when DummyElement is deleted
2. use the correct score for the added part instead of using the main score
2022-12-01 16:55:09 +02:00
Roman Pudashkin b83262b669 removed some annoying logs 2022-12-01 16:54:52 +02:00
Roman Pudashkin c938c281c9 fix a crash when creating an excerpt and then deleting it via ctrl+z
1. we will now update m_potentialExcerpts every time there is any change in the excerpts list of the main score (to avoid storing irrelevant potential excerpts)

2. we will not recreate all items in m_potentialExcerpts every time. Only new ones will be created
2022-12-01 16:54:44 +02:00
Roman Pudashkin 02fa60e839 optimization: init excerpts only if the user confirms the export 2022-12-01 16:54:35 +02:00
Roman Pudashkin 262ccb2028 fixed a massive memory leak if the user exports parts that they have not yet opened. Such parts won't be added to the master score, but will be inited and filled with elements 2022-12-01 16:54:28 +02:00
Roman Pudashkin cea5f9b6c6 fix #13805: update m_parent when using setScore to ensure proper memory management 2022-12-01 16:54:19 +02:00
Casper Jeukendrup bcc69e95f8 Update name of cloud project when it has been renamed on MuseScore.com 2022-12-01 16:35:02 +02:00
Casper Jeukendrup d2635ec790 Fix name when saving project to cloud after re-opening
Should be filename, not work title
2022-12-01 16:34:54 +02:00
Roman Pudashkin df5498313a minor optimization 2022-12-01 15:43:54 +02:00
RomanPudashkin 2ec580f288 Merge pull request #14814 from Eism/shortcuts_find_macos_fix
fixed #14184 and #14585: Insert key instead of F on macOS
2022-12-01 14:36:50 +02:00
DmitryArefiev fe562d71b8 Merge pull request #14852 from RomanPudashkin/wrong_transposition_range
[MU4] Fix #14847: Replacing instrument affects instrument change with transposed instrument
2022-12-01 14:16:13 +02:00
pereverzev_v 805f1c1087 Added support of multi-voice playback for FluidSynth 2022-12-01 14:16:07 +02:00
Casper Jeukendrup acc57e2d5b LanguagesService: redirect short language codes to longer codes that we do have
For some languages, we only have long, specific codes in LanguagesHash / languages.json. If the user's system language is just "en", or "en_CY" for example, this will not be found. So, for short codes that are at risk, we map them to long codes that we do have.
2022-12-01 13:39:33 +02:00
jeetee cbba750a10 fix #13357 leading zeros on video duration 2022-12-01 13:39:33 +02:00
Marc Sabatella a1874b3a29 Fix scaling & offset of add/sus/no/omit 2022-12-01 13:39:33 +02:00
Marc Sabatella 3b71ff3b16 Fix chord symbol style file filter 2022-12-01 13:39:33 +02:00
Elnur Ismailzada 239f96a643
Merge pull request #14860 from Eism/win_workflow_fix
[MU4] RC. Fixed win workflow
2022-12-01 11:16:03 +02:00
Eism 3d9d3d4d41 Was missed after resolving conflicts on #14844 2022-12-01 10:31:21 +02:00
RomanPudashkin 4e334b10dd
Merge pull request #14855 from RomanPudashkin/update_4.0_rc
update_4.0_rc
2022-11-30 23:08:33 +02:00
RomanPudashkin 88a494cfb4
Merge pull request #14853 from cbjeukendrup/audio_export_no_solo_selection_4.0_rc
[MU4 RC] Don't solo selected tracks in audio export + fix exporting parts
2022-11-30 21:07:47 +02:00
Michele Spagnolo 7836c0f5d0 Fix beam glitch 2022-11-30 21:02:51 +02:00
Aaron Sattely eee1c1cd84 nullcheck in findLinkedVoiceElement 2022-11-30 20:57:51 +02:00
Roman Pudashkin 707e5852c7 fixed the chord symbol sound for string instruments 2022-11-30 20:57:31 +02:00
Roman Pudashkin 02945cbf12 fix #13327: use the standard articulation for chord symbols to ensure correct velocity calculation 2022-11-30 20:57:19 +02:00
Hemant Antony 1a023ff2d5 Fix #14807: Hide Count-in option 2022-11-30 20:56:53 +02:00
Casper Jeukendrup 1209e0b0ec
Let's try without the `setExportedNotation` method 2022-11-30 19:07:54 +01:00
Casper Jeukendrup 67cfccc028
Fix exporting audio for part scores 2022-11-30 19:07:54 +01:00
Casper Jeukendrup 458dca54fb
Don't solo selected staves during audio export 2022-11-30 19:07:53 +01:00
pereverzev_v 04c04001d7 Decreased the minimum interval between adjacent 2022-11-30 20:06:00 +02:00
RomanPudashkin 1431b58233 Merge pull request #14822 from Eism/volta_crash_fix
fixed #14685: Crash when opening one-measure score with 2nd ending assigned
2022-11-30 20:05:45 +02:00
RomanPudashkin f57122f224 Merge pull request #14804 from RomanPudashkin/change_instrument_fix
[MU4] Fix #14722: Incorrect transposition when changing from one transposing instrument to another
2022-11-30 20:05:03 +02:00
Elnur Ismailzada 9cfe34a1d5
Merge pull request #14844 from Eism/rc_nightly_rc
[MU4] Added triggering workflows for building 4.0_rc branch. RC
2022-11-30 14:26:43 +02:00
Eism 9f8c23b254 Checkout for 4.0_rc 2022-11-30 13:10:36 +02:00
pereverzev_v fe8a2de4c8 Brought back internal buffer capacity 2022-11-29 19:17:24 +02:00
RomanPudashkin c4977d4381
Merge pull request #14827 from cbjeukendrup/inspector_stemless_4.0_rc
[MU4 RC] Inspector: Fix the "Stemless" property
2022-11-29 16:39:12 +02:00
RomanPudashkin a4b5fed825 Merge pull request #14812 from cbjeukendrup/macOS_alt_characters
macOS: fix typing Option-key characters in Chord Symbols, Figured Bass, Fingering, Lyrics and Sticking
2022-11-29 15:54:06 +02:00
Casper Jeukendrup 6014da2192 Fix some other cases of overlapping notes
- for groups of tied notes where one or more notes were under a triplet
- for "cross-measure" notation
2022-11-29 15:26:54 +02:00
Casper Jeukendrup f745355e94
Inspector: Fix the "Stemless" property
It is a property of the chord rather than the stem, so we need a ChordSettingsModel.
2022-11-29 14:22:35 +01:00
pereverzev_v 7abe56a213 Allowing to enter into LowLatency mode only for buffer sizes lesser than supported upper bound 2022-11-29 14:06:17 +02:00
pereverzev_v 9e37717e15 Properly clear events after tempo changes 2022-11-28 23:46:42 +02:00
RomanPudashkin 6e5c4dc8e3 Merge pull request #14802 from sammik/instrument-change-fixes
fix Instrument change from palette
2022-11-28 22:34:31 +02:00
RomanPudashkin e74b6f308f Merge pull request #14799 from RomanPudashkin/update_sample_rate_in_liblame
[MU4] Fix #14662: Wrong pitch in exported audio file after changing Export sample rate settings (changing settings doesn't apply properly)
2022-11-28 22:28:16 +02:00
pereverzev_v dadc7d92cf Fixed #14093 2022-11-28 22:25:52 +02:00
RomanPudashkin 06b8692dec
Merge pull request #14761 from cbjeukendrup/🍒/4.0_rc/two_trivial_string_change_prs
[MU4 RC] Cherry-picking two trivial string change PRs
2022-11-28 10:38:16 +02:00
RomanPudashkin fdbd087461 Merge pull request #14781 from vpereverzev/tuplets_rendering
[MU4] tuplets_rendering
2022-11-27 19:44:14 +02:00
Peter Jonas 365446e370
Instruments: fix names of F and G soprano ocarinas
The trackName should not include the F or G tuning. This is added
separately in the traitName.

Now the F and G soprano ocarinas will be combined with the other
soprano ocarinas in the NSW and Instruments dialog.
2022-11-27 12:31:10 +01:00
Grzegorz Pruchniakowski 1ddc154484
Fix: Beam types -> Beam type
The first argument: should be "Beam type" because we select beam type, not types. The second argument: "types" occurs only once in strings to translate - only in this case.

Greetings,
Gootector
2022-11-27 12:31:09 +01:00
RomanPudashkin b43a6ec5a0
Merge pull request #14772 from RomanPudashkin/select_key_time_sig_fix_rc
select_key_time_sig_fix_rc
2022-11-26 18:01:09 +02:00
pereverzev_v e17bc32e88 Fixed #14634 2022-11-26 16:24:36 +02:00
Roman Pudashkin 5f171c5f6d fix #14769: added missing SelectType::ADD 2022-11-26 09:53:25 +02:00
Roman Pudashkin 54976734b4 introduced SoundSubCategory::Primary and SoundSubCategory::Secondary. For example, they can be used to differentiate the sound between Flute 1 and Flute 2 (or Violin 1 and Violin 2) 2022-11-25 19:05:43 +02:00
Roman Pudashkin ff1999223a don't treat OPE_OK as an error 2022-11-25 19:05:43 +02:00
Roman Pudashkin 149ea72df8 always restore the audio engine mode, even if something went wrong 2022-11-25 19:05:43 +02:00
Casper Jeukendrup 427f872221 Ensure the user is logged in when saving an existing cloud score 2022-11-25 19:05:43 +02:00
Roman Pudashkin f3168db80b more optimizations 2022-11-25 19:05:43 +02:00
Roman Pudashkin 84b26667a3 fix #14582: fixed massive memory leaks when selecting a range 2022-11-25 19:05:43 +02:00
Michele Spagnolo 6596497e7d Fix crash with invalid staff indices 2022-11-25 19:05:43 +02:00
Eism b942cc8ed0 Implemented progress dialog for uploading the score 2022-11-25 19:05:43 +02:00
Igor Korsukov a0de6dc41b fixed some crashes 2022-11-25 19:05:43 +02:00
Michele Spagnolo 5e8eb895c2 Make loop exit condition safer
(if the last segment was accidentally skipped, the equality was missed and we didn't exit the loop)
2022-11-25 19:05:43 +02:00
Michele Spagnolo c241032b8b Fix MM rest crash when doing ctrl+Z 2022-11-25 19:05:43 +02:00
RomanPudashkin 2409b8a330
Merge pull request #14747 from shoogle/instrument-bell-tree-4.0_rc
[MU4 RC] Add new instrument: Bell Tree
2022-11-25 17:17:08 +02:00
Peter Jonas 818bd2a763 Use Belltree MIDI drum sound for the Bell Tree and Mark Tree
The Mark Tree has no dedicated sound in General MIDI or Roland GS, so
we use the Belltree sound for it instead (drum note 84).
2022-11-25 14:28:22 +00:00
Peter Jonas 64e5086467 instruments.xml: Add Bell Tree and Mark Tree instruments
Run share/instruments/update_instruments_xml.py to fetch the latest
version of the online spreadsheet, which now contains the Bell Tree
and Mark Tree instruments.

https://en.wikipedia.org/wiki/Bell_tree
https://en.wikipedia.org/wiki/Mark_tree
2022-11-25 14:28:22 +00:00
pereverzev_v 3eb411716f Fixed a crash in exportdialogmodel 2022-11-25 14:53:37 +02:00
pereverzev_v 0ed7932801 Introduced TaskScheduler and parallelized audio sources rendering before mixing 2022-11-25 14:53:31 +02:00
RomanPudashkin a4675ee803
Merge pull request #14696 from RomanPudashkin/tremolo_mappings_rc
tremolo_mappings_rc
2022-11-23 20:39:31 +02:00
Roman Pudashkin 33498f043c fix #14527 2022-11-23 19:36:32 +02:00
Roman Pudashkin 69e21a5ee6 fix #14061: fixed the tremolo sound for string instruments 2022-11-23 19:36:19 +02:00
Roman Pudashkin f5a95dd0e1 introduced mpe::SoundSubCategory::Plucked 2022-11-23 19:36:10 +02:00
pereverzev_v 0fe713fe5a Added audio buffer profiler 2022-11-23 13:10:37 +02:00
pereverzev_v cd0626cce6 Fixed compilation errors for gcc and clang 2022-11-23 13:10:32 +02:00
pereverzev_v 14d66858ea Cleaned up redundant includes of IAudioBuffer 2022-11-23 13:10:28 +02:00
pereverzev_v 4ec9de79bc Proper number of channels for SineSource 2022-11-23 13:10:25 +02:00
pereverzev_v 82240d807b Added call of MuseSampler::allNotesAff to flush sounds 2022-11-23 13:10:22 +02:00
pereverzev_v cb75da2b3b Making audio devices sorting at model, not at audio driver itself 2022-11-23 13:10:19 +02:00
pereverzev_v 580307d973 Fixed issue with audio export launching when playback is running 2022-11-23 13:10:15 +02:00
pereverzev_v 5ec90f8827 Decoupled logic from AudioModule::init 2022-11-23 13:10:12 +02:00
pereverzev_v 74fb76bae0 Get rid of IAudioBuffer interface 2022-11-23 13:10:08 +02:00
pereverzev_v b65574ea33 Implemented lock-free audio-buffer 2022-11-23 13:10:05 +02:00
pereverzev_v aba024eda0 Implemented WASAPI audio driver 2022-11-23 13:10:01 +02:00
RomanPudashkin f0aa06f3ad
Merge pull request #14660 from RomanPudashkin/crash_after_copy_and_paste_notes_with_tremolo_rc
[MU4 RC] fix #14600: Crash when pasting a two-note tremolo that is too long to fit the bar
2022-11-22 15:21:23 +02:00
Roman Pudashkin 4474b20d99 fix #14600: tremolo must always have a second chord 2022-11-22 14:25:08 +02:00
RomanPudashkin d21ebb58fb
Merge pull request #14636 from RomanPudashkin/crash_when_inserting_new_measures_rc
[MU4 RC] Fix #14597: Crash when appending measures to new score
2022-11-22 09:59:01 +02:00
RomanPudashkin 2c14fae122
Merge pull request #14647 from cbjeukendrup/🍒/4.0_rc/crash_ctrl_drag_grip
[MU4 RC] Fix crash when Ctrl+dragging a grip if you also hit the element when hitting the grip
2022-11-22 08:32:55 +02:00
Casper Jeukendrup d4c4e6f6dc
Re-add MS3 hack for dragging barlines with Ctrl pressed 2022-11-22 00:58:37 +01:00
Casper Jeukendrup 02354e514a
Respect shift/ctrl modifiers when dragging grip (rather than whole element) 2022-11-22 00:58:37 +01:00
Casper Jeukendrup ff380a0958
Fix Ctrl+click to deselect one element from a range selection 2022-11-22 00:58:36 +01:00
Casper Jeukendrup 737f3d3b4b
Fix crash when Ctrl+dragging a grip if you also hit the element when hitting the grip
The element was unexpectedly deselected by Ctrl+MouseDown.
2022-11-22 00:58:36 +01:00
RomanPudashkin 1279972e0b
Merge pull request #14641 from asattely/explode-crash
fix underflow error in cmdExplode
2022-11-21 19:26:05 +02:00
RomanPudashkin 172169ea80
Merge pull request #14640 from RomanPudashkin/select_brackets_fix_rc
select_brackets_fix_rc
2022-11-21 19:08:35 +02:00
Roman Pudashkin 40c7901b41 fix #11883: use the dummy item for all brackets when destroying their original BracketItem to avoid invalid pointers 2022-11-21 18:09:46 +02:00
Roman Pudashkin 0ca2295793 fix #13870: reverted changes from PR #12697 2022-11-21 18:09:36 +02:00
Roman Pudashkin c76f4e72ab fix #14597: update the repeat lists after deleting all measures 2022-11-21 18:06:55 +02:00
RomanPudashkin 1e44ca6969
Merge pull request #14639 from RomanPudashkin/rc_ci_checks
rc_ci_checks
2022-11-21 18:04:50 +02:00
Roman Pudashkin d2afb72dab run the CI checks for PRs into 4.0_rc 2022-11-21 17:23:10 +02:00
Aaron Sattely f217faaf1d fix underflow error in cmdExplode 2022-11-20 19:50:50 -05:00
567 changed files with 13824 additions and 7463 deletions

View File

@ -14,7 +14,7 @@ on:
jobs:
build_mu4:
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.1

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.0.2
jobs:
codestyle:

View File

@ -4,9 +4,11 @@ on:
pull_request:
branches:
- master
- 4.0.2
schedule:
- cron: '0 4 */1 */1 *' # At 04:00 on every day-of-month
schedule:
- cron: '0 3 */1 */1 *' # At 03:00 on every day-of-month for master
- cron: '0 5 */1 */1 *' # At 05:00 on every day-of-month for 4.0_rc
workflow_dispatch:
inputs:
build_mode:
@ -30,8 +32,14 @@ jobs:
uses: styfle/cancel-workflow-action@0.9.1
with:
access_token: ${{ github.token }}
- name: Clone repository
- name: Clone repository (default)
uses: actions/checkout@v2
if: ${{ github.event_name != 'schedule' || github.event.schedule == '0 3 */1 */1 *' }}
- name: Clone repository (4.0_rc)
uses: actions/checkout@v2
if: ${{ github.event_name == 'schedule' && github.event.schedule == '0 5 */1 */1 *' }}
with:
ref: 4.0_rc
- name: Ccache cache files
uses: actions/cache@v2
with:
@ -101,8 +109,10 @@ jobs:
DO_PUBLISH='false'
fi
if [ "${{ github.event_name }}" == "pull_request" ]; then PR_INFO="_${{ github.event.pull_request.number }}_${pull_request_title}"; fi
UPLOAD_ARTIFACT_NAME="$(tr '":<>|*?/\\' '_' <<<"MU4_${BUILD_NUMBER}_Lin${PR_INFO}")"
ADD_INFO="_${GITHUB_REF#refs/heads/}"
if [ "${{ github.event_name }}" == "schedule" && "${{ github.event.schedule }}" == "0 5 */1 */1 *" }} ]; then ADD_INFO="_4.0_rc"; fi
if [ "${{ github.event_name }}" == "pull_request" ]; then ADD_INFO="_${{ github.event.pull_request.number }}_${pull_request_title}"; fi
UPLOAD_ARTIFACT_NAME="$(tr '":<>|*?/\\' '_' <<<"MU4_${BUILD_NUMBER}_Lin${ADD_INFO}")"
echo "github.repository: ${{ github.repository }}"
echo "BUILD_MODE=$BUILD_MODE" >> $GITHUB_ENV

View File

@ -4,9 +4,13 @@ on:
workflow_dispatch:
inputs:
publish:
description: 'Publish to Transifex: on - publish'
description: 'Publish to Transifex (on/off)'
required: false
default: 'off'
cleanup_obsolete:
description: 'Clean up obsolete strings (on/off)'
required: true
jobs:
lupdate:
runs-on: ubuntu-20.04
@ -27,17 +31,24 @@ jobs:
fi
fi
LUPDATE_ARGS=''
if [ "${{ github.event.inputs.cleanup_obsolete }}" == "on" ]; then
LUPDATE_ARGS='-no-obsolete'
fi
echo "DO_PUBLISH=$DO_PUBLISH" >> $GITHUB_ENV
echo "DO_PUBLISH: $DO_PUBLISH"
echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
echo "BUILD_NUMBER: $BUILD_NUMBER"
echo "LUPDATE_ARGS=$LUPDATE_ARGS" >> $GITHUB_ENV
echo "LUPDATE_ARGS: $LUPDATE_ARGS"
- name: Setup environment
run: |
sudo bash ./build/ci/translation/qt_install.sh
- name: Run lupdate
run: |
sudo bash ./build/ci/translation/run_lupdate.sh
sudo bash ./build/ci/translation/run_lupdate.sh ${{ env.LUPDATE_ARGS }}
- name: Publish to Transifex
if: env.DO_PUBLISH == 'true'
run: |

View File

@ -4,9 +4,11 @@ on:
pull_request:
branches:
- master
- 4.0.2
schedule:
- cron: '0 4 */1 */1 *' # At 04:00 on every day-of-month
schedule:
- cron: '0 3 */1 */1 *' # At 03:00 on every day-of-month for master
- cron: '0 5 */1 */1 *' # At 05:00 on every day-of-month for 4.0_rc
workflow_dispatch:
inputs:
build_mode:
@ -33,8 +35,14 @@ jobs:
uses: styfle/cancel-workflow-action@0.9.1
with:
access_token: ${{ github.token }}
- name: Clone repository
- name: Clone repository (default)
uses: actions/checkout@v2
if: ${{ github.event_name != 'schedule' || github.event.schedule == '0 3 */1 */1 *' }}
- name: Clone repository (4.0_rc)
uses: actions/checkout@v2
if: ${{ github.event_name == 'schedule' && github.event.schedule == '0 5 */1 */1 *' }}
with:
ref: 4.0_rc
- name: Ccache cache files
uses: actions/cache@v2
with:
@ -118,8 +126,10 @@ jobs:
DO_PUBLISH='false'
fi
if [ "${{ github.event_name }}" == "pull_request" ]; then PR_INFO="_${{ github.event.pull_request.number }}_${pull_request_title}"; fi
UPLOAD_ARTIFACT_NAME="$(tr '":<>|*?/\\' '_' <<<"MU4_${BUILD_NUMBER}_Mac${PR_INFO}")"
ADD_INFO="_${GITHUB_REF#refs/heads/}"
if [ "${{ github.event_name }}" == "schedule" && "${{ github.event.schedule }}" == "0 5 */1 */1 *" }} ]; then ADD_INFO="_4.0_rc"; fi
if [ "${{ github.event_name }}" == "pull_request" ]; then ADD_INFO="_${{ github.event.pull_request.number }}_${pull_request_title}"; fi
UPLOAD_ARTIFACT_NAME="$(tr '":<>|*?/\\' '_' <<<"MU4_${BUILD_NUMBER}_Mac${ADD_INFO}")"
echo "github.repository: ${{ github.repository }}"
echo "BUILD_MODE=$BUILD_MODE" >> $GITHUB_ENV

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.0.2
jobs:
run_tests:

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.0.2
jobs:
setup:

View File

@ -4,8 +4,11 @@ on:
pull_request:
branches:
- master
schedule:
- cron: '0 4 */1 */1 *' # At 04:00 on every day-of-month
- 4.0.2
schedule:
- cron: '0 3 */1 */1 *' # At 03:00 on every day-of-month for master
- cron: '0 5 */1 */1 *' # At 05:00 on every day-of-month for 4.0_rc
workflow_dispatch:
inputs:
build_mode:
@ -29,10 +32,17 @@ jobs:
uses: styfle/cancel-workflow-action@0.9.1
with:
access_token: ${{ github.token }}
- name: Clone repository
- name: Clone repository (default)
uses: actions/checkout@v2
if: ${{ github.event_name != 'schedule' || github.event.schedule == '0 3 */1 */1 *' }}
with:
fetch-depth: 3
- name: Clone repository (4.0_rc)
uses: actions/checkout@v2
if: ${{ github.event_name == 'schedule' && github.event.schedule == '0 5 */1 */1 *' }}
with:
fetch-depth: 3
ref: 4.0_rc
- name: Fetch submodules
run: |
git submodule update --init --recursive
@ -97,8 +107,10 @@ jobs:
DO_PUBLISH='false'
fi
if [ "${{ github.event_name }}" == "pull_request" ]; then PR_INFO="_${{ github.event.pull_request.number }}_${pull_request_title}"; fi
UPLOAD_ARTIFACT_NAME="$(tr '":<>|*?/\\' '_' <<<"MU4_${BUILD_NUMBER}_Win${PR_INFO}")"
ADD_INFO="_${GITHUB_REF#refs/heads/}"
if [ "${{ github.event_name }}" == "schedule" && "${{ github.event.schedule }}" == "0 5 */1 */1 *" }} ]; then ADD_INFO="_4.0_rc"; fi
if [ "${{ github.event_name }}" == "pull_request" ]; then ADD_INFO="_${{ github.event.pull_request.number }}_${pull_request_title}"; fi
UPLOAD_ARTIFACT_NAME="$(tr '":<>|*?/\\' '_' <<<"MU4_${BUILD_NUMBER}_Win${ADD_INFO}")"
echo "github.repository: ${{ github.repository }}"
echo "BUILD_MODE=$BUILD_MODE" >> $GITHUB_ENV

View File

@ -4,6 +4,7 @@ on:
pull_request:
branches:
- master
- 4.0.2
jobs:
run_tests:

View File

@ -1,5 +1,5 @@
MuseScore, free and open source music notation software
Copyright (C) 1999-2022 MuseScore BVBA and others
Copyright (C) 1999-2023 MuseScore BVBA and others
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 3 as published

View File

@ -1,7 +1,7 @@
{\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{\f0\fnil\fcharset0 Courier New;}{\f1\fnil\fcharset77 Courier New;}}
{\*\generator Riched20 6.3.9600}\viewkind4\uc1
\pard\sa200\sl276\slmult1\f0\fs18\lang12 MuseScore, free and open source music notation software.\par
Copyright (C) 1999-2022 MuseScore BVBA and others.\par
Copyright (C) 1999-2023 MuseScore BVBA and others.\par
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 3 as published by the Free Software Foundation and reproduce below with the following exception:\par
- If you create a document which uses fonts included in MuseScore, and embed this font or unaltered portions of this font into the document, then this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.\par
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\par

View File

@ -1,4 +1,4 @@
FROM library/ubuntu:18.04
FROM library/ubuntu:20.04
COPY setup.sh /setup.sh
COPY install_mu.sh /install_mu.sh
RUN bash -ex setup.sh
RUN bash -ex setup.sh

View File

@ -52,7 +52,6 @@ apt_packages_runtime=(
libegl1-mesa-dev
libodbc1
libpq-dev
libssl1.0.0
libxcomposite-dev
libxcursor-dev
libxi-dev

View File

@ -20,4 +20,4 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
HERE="$(cd "$(dirname "$0")" && pwd)"
bash $HERE/../linux/setup.sh --gcc_version 7
bash $HERE/../linux/setup.sh

View File

@ -82,7 +82,7 @@ if [ "$PACKTYPE" == "appimage" ]; then
# https://github.com/AppImage/AppImageSpec/blob/master/draft.md#update-information
case "${BUILD_MODE}" in
"stable_build") export UPDATE_INFORMATION="gh-releases-zsync|musescore|MuseScore|latest|MuseScore-*x86_64.AppImage.zsync";;
"nightly_build") export UPDATE_INFORMATION="zsync|https://ftp.osuosl.org/pub/musescore-nightlies/linux/${MAJOR_VERSION}x/nightly/MuseScoreNightly-latest-x86_64.AppImage.zsync";;
"nightly_build") export UPDATE_INFORMATION="zsync|https://ftp.osuosl.org/pub/musescore-nightlies/linux/${MAJOR_VERSION}x/nightly/MuseScoreNightly-latest-${BUILD_BRANCH}-x86_64.AppImage.zsync";;
*) unset UPDATE_INFORMATION;; # disable updates for other build modes
esac

View File

@ -21,18 +21,10 @@
# For maximum AppImage compatibility, build on the oldest Linux distribution
# that still receives security updates from its manufacturer.
echo "Setup Linux build environment"
trap 'echo Setup failed; exit 1' ERR
GCC_VERSION="10"
while [[ "$#" -gt 0 ]]; do
case $1 in
-g|--gcc_version) GCC_VERSION="$2"; shift ;;
esac
shift
done
df -h .
BUILD_TOOLS=$HOME/build_tools
@ -143,16 +135,17 @@ echo export QML2_IMPORT_PATH="${qt_dir}/qml" >> ${ENV_FILE}
##########################################################################
# COMPILER
sudo apt-get install -y --no-install-recommends "g++-${GCC_VERSION}"
gcc_version="10"
sudo apt-get install -y --no-install-recommends "g++-${gcc_version}"
sudo update-alternatives \
--install /usr/bin/gcc gcc "/usr/bin/gcc-${GCC_VERSION}" 40 \
--slave /usr/bin/g++ g++ "/usr/bin/g++-${GCC_VERSION}"
--install /usr/bin/gcc gcc "/usr/bin/gcc-${gcc_version}" 40 \
--slave /usr/bin/g++ g++ "/usr/bin/g++-${gcc_version}"
echo export CC="/usr/bin/gcc-${GCC_VERSION}" >> ${ENV_FILE}
echo export CXX="/usr/bin/g++-${GCC_VERSION}" >> ${ENV_FILE}
echo export CC="/usr/bin/gcc-${gcc_version}" >> ${ENV_FILE}
echo export CXX="/usr/bin/g++-${gcc_version}" >> ${ENV_FILE}
gcc-${GCC_VERSION} --version
g++-${GCC_VERSION} --version
gcc-${gcc_version} --version
g++-${gcc_version} --version
# CMAKE
# Get newer CMake (only used cached version if it is the same)

View File

@ -23,7 +23,7 @@ echo "Setup MacOS build environment"
trap 'echo Setup failed; exit 1' ERR
SKIP_ERR_FLAG=true
export MACOSX_DEPLOYMENT_TARGET=10.10
export MACOSX_DEPLOYMENT_TARGET=10.14
# install dependencies
wget -c --no-check-certificate -nv -O bottles.zip https://musescore.org/sites/musescore.org/files/2020-02/bottles-MuseScore-3.0-yosemite.zip
@ -91,9 +91,9 @@ installBottleManually libsndfile
# fixing install python 3.9 error (it is a dependency for ninja)
rm '/usr/local/bin/2to3'
brew install ninja
brew install ninja pkg-config
# Qt
export QT_SHORT_VERSION=5.15.2
export QT_PATH=$HOME/Qt
export QT_MACOS=$QT_PATH/$QT_SHORT_VERSION/clang_64

View File

@ -76,8 +76,11 @@ chmod 600 $SSH_KEY
FTP_PATH=${OS}/${MAJOR_VERSION}x/${BUILD_DIR}
file_extension="${ARTIFACT_NAME##*.}"
LATEST_NAME="MuseScoreNightly-latest-x86_64.${file_extension}"
if [ "$BUILD_MODE" == "nightly_build" ]; then
file_extension="${ARTIFACT_NAME##*.}"
BUILD_BRANCH=$(cat $ARTIFACTS_DIR/env/build_branch.env)
LATEST_NAME="MuseScoreNightly-latest-${BUILD_BRANCH}-x86_64.${file_extension}"
fi
echo "Copy ${ARTIFACTS_DIR}/${ARTIFACT_NAME} to $FTP_PATH"
scp -oStrictHostKeyChecking=no -C -i $SSH_KEY $ARTIFACTS_DIR/$ARTIFACT_NAME musescore-nightlies@ftp-osl.osuosl.org:~/ftp/$FTP_PATH

View File

@ -77,7 +77,7 @@ elseif (OS_IS_WASM)
else()
# Use pkg-config to get hints about paths
find_package(PkgConfig QUIET)
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
pkg_check_modules(LIBSNDFILE_PKGCONF sndfile>=1.0.25 QUIET)
endif()

View File

@ -21,7 +21,7 @@ set(MSCORE_UNSTABLE TRUE) # Mark as unstable
set(MSCORE_RELEASE_CHANNEL "devel")
if (NOT MUSESCORE_VERSION_LABEL)
SET(MUSESCORE_VERSION_LABEL "Development")
SET(MUSESCORE_VERSION_LABEL "dev")
endif (NOT MUSESCORE_VERSION_LABEL)
SET(MUSESCORE_NAME_VERSION "${MUSESCORE_NAME} ${MUSESCORE_VERSION_MAJOR}")

View File

@ -21,7 +21,7 @@
SET(MUSESCORE_NAME "MuseScore")
SET(MUSESCORE_VERSION_MAJOR "4")
SET(MUSESCORE_VERSION_MINOR "0")
SET(MUSESCORE_VERSION_PATCH "0")
SET(MUSESCORE_VERSION_PATCH "2")
SET(MUSESCORE_VERSION_LABEL "")
message(STATUS "MUSESCORE_BUILD_CONFIG ${MUSESCORE_BUILD_CONFIG}")

View File

@ -1153,7 +1153,7 @@
</Instrument>
<Instrument id="g-soprano-ocarina">
<family>ocarinas</family>
<trackName>G Soprano Ocarina</trackName>
<trackName>Soprano Ocarina</trackName>
<longName>G Soprano Ocarina</longName>
<shortName>G S. Oc.</shortName>
<traitName type="tuning">G</traitName>
@ -1171,7 +1171,7 @@
</Instrument>
<Instrument id="f-soprano-ocarina">
<family>ocarinas</family>
<trackName>F Soprano Ocarina</trackName>
<trackName>Soprano Ocarina</trackName>
<longName>F Soprano Ocarina</longName>
<shortName>F S. Oc.</shortName>
<traitName type="tuning">F</traitName>
@ -4693,7 +4693,7 @@
<trackName>Trumpet</trackName>
<longName>Trumpet</longName>
<shortName>Tpt.</shortName>
<traitName type="transposition">*C</traitName>
<traitName type="transposition">C</traitName>
<description>Trumpet in C. Nowadays the most common orchestral trumpet.</description>
<musicXMLid>brass.trumpet.c</musicXMLid>
<clef>G</clef>
@ -4734,8 +4734,8 @@
<trackName>Trumpet</trackName>
<longName>Trumpet</longName>
<shortName>Tpt.</shortName>
<traitName type="transposition">B♭</traitName>
<description>Trumpet in B♭.</description>
<traitName type="transposition">*B♭</traitName>
<description>Trumpet in B♭. Still the most common trumpet in non-orchestral contexts.</description>
<musicXMLid>brass.trumpet.bflat</musicXMLid>
<clef>G</clef>
<barlineSpan>1</barlineSpan>
@ -7532,6 +7532,33 @@
<program value="0"/> <!--Standard Kit-->
</Channel>
</Instrument>
<Instrument id="bell-tree">
<family>unpitched-metal-percussion</family>
<trackName>Bell Tree</trackName>
<longName>Bell Tree</longName>
<shortName>Be. Tr.</shortName>
<description>Inverted metal bowls nested on a vertical rod in order of pitch. The pitches are indefinite.</description>
<musicXMLid>metal.bells.bell-tree</musicXMLid>
<clef>PERC</clef>
<stafftype staffTypePreset="perc1Line">percussion</stafftype>
<barlineSpan>1</barlineSpan>
<drumset>1</drumset>
<singleNoteDynamics>0</singleNoteDynamics>
<Drum pitch="84"> <!--Belltree-->
<head>normal</head>
<line>0</line>
<voice>0</voice>
<name>Glissando Down</name>
<stem>1</stem>
<shortcut>A</shortcut>
</Drum>
<Channel>
<!--MIDI: Bank 128, Prog 0; MS General: Standard-->
<controller ctrl="0" value="1"/> <!--Bank MSB-->
<program value="0"/> <!--Standard Kit-->
</Channel>
<genre>world</genre>
</Instrument>
<Instrument id="bells">
<family>unpitched-metal-percussion</family>
<trackName>Bells</trackName>
@ -7817,6 +7844,33 @@
<program value="0"/> <!--Standard Kit-->
</Channel>
</Instrument>
<Instrument id="mark-tree">
<family>unpitched-metal-percussion</family>
<trackName>Mark Tree</trackName>
<longName>Mark Tree</longName>
<shortName>Mk. Tr.</shortName>
<description>Chimes hung from a horizontal bar in order of pitch. The pitches are indefinite.</description>
<musicXMLid>metal.bells.mark-tree</musicXMLid>
<clef>PERC</clef>
<stafftype staffTypePreset="perc1Line">percussion</stafftype>
<barlineSpan>1</barlineSpan>
<drumset>1</drumset>
<singleNoteDynamics>0</singleNoteDynamics>
<Drum pitch="84"> <!--Belltree-->
<head>normal</head>
<line>0</line>
<voice>0</voice>
<name>Glissando Down</name>
<stem>1</stem>
<shortcut>A</shortcut>
</Drum>
<Channel>
<!--MIDI: Bank 128, Prog 0; MS General: Standard-->
<controller ctrl="0" value="1"/> <!--Bank MSB-->
<program value="0"/> <!--Standard Kit-->
</Channel>
<genre>world</genre>
</Instrument>
<Instrument id="metal-castanets">
<family>unpitched-metal-percussion</family>
<trackName>Metal Castanets</trackName>

View File

@ -596,26 +596,26 @@ QT_TRANSLATE_NOOP3("engraving/instruments", "Contrabass Recorder", "contrabass-r
//: shortName for Contrabass Recorder; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Cb. Rec.", "contrabass-recorder shortName"),
//: description for G Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: description for Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Soprano ocarina pitched in G.", "g-soprano-ocarina description"),
//: trackName for G Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "G Soprano Ocarina", "g-soprano-ocarina trackName"),
//: longName for G Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: trackName for Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Soprano Ocarina", "g-soprano-ocarina trackName"),
//: longName for Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "G Soprano Ocarina", "g-soprano-ocarina longName"),
//: shortName for G Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: shortName for Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "G S. Oc.", "g-soprano-ocarina shortName"),
//: traitName for G Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: traitName for Soprano Ocarina; tuning: G; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "G", "g-soprano-ocarina traitName"),
//: description for F Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: description for Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Soprano ocarina pitched in F.", "f-soprano-ocarina description"),
//: trackName for F Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "F Soprano Ocarina", "f-soprano-ocarina trackName"),
//: longName for F Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: trackName for Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Soprano Ocarina", "f-soprano-ocarina trackName"),
//: longName for Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "F Soprano Ocarina", "f-soprano-ocarina longName"),
//: shortName for F Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: shortName for Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "F S. Oc.", "f-soprano-ocarina shortName"),
//: traitName for F Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
//: traitName for Soprano Ocarina; tuning: F; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "F", "f-soprano-ocarina traitName"),
//: description for Ocarina; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
@ -2588,7 +2588,7 @@ QT_TRANSLATE_NOOP3("engraving/instruments", "Trumpet", "c-trumpet longName"),
//: shortName for Trumpet; transposition: C; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Tpt.", "c-trumpet shortName"),
//: traitName for Trumpet; transposition: C; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "*C", "c-trumpet traitName"),
QT_TRANSLATE_NOOP3("engraving/instruments", "C", "c-trumpet traitName"),
//: channel for Trumpet; transposition: C; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "open", "c-trumpet channel"),
//: channel for Trumpet; transposition: C; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
@ -2608,7 +2608,7 @@ QT_TRANSLATE_NOOP3("engraving/instruments", "open", "trumpet channel"),
QT_TRANSLATE_NOOP3("engraving/instruments", "mute", "trumpet channel"),
//: description for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Trumpet in B♭.", "bb-trumpet description"),
QT_TRANSLATE_NOOP3("engraving/instruments", "Trumpet in B♭. Still the most common trumpet in non-orchestral contexts.", "bb-trumpet description"),
//: trackName for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Trumpet", "bb-trumpet trackName"),
//: longName for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
@ -2616,7 +2616,7 @@ QT_TRANSLATE_NOOP3("engraving/instruments", "Trumpet", "bb-trumpet longName"),
//: shortName for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Tpt.", "bb-trumpet shortName"),
//: traitName for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "B♭", "bb-trumpet traitName"),
QT_TRANSLATE_NOOP3("engraving/instruments", "*B♭", "bb-trumpet traitName"),
//: channel for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "open", "bb-trumpet channel"),
//: channel for Trumpet; transposition: B♭; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
@ -3951,6 +3951,15 @@ QT_TRANSLATE_NOOP3("engraving/instruments", "Bell Plate", "bell-plate longName")
//: shortName for Bell Plate; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Be. Pla.", "bell-plate shortName"),
//: description for Bell Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Inverted metal bowls nested on a vertical rod in order of pitch. The pitches are indefinite.", "bell-tree description"),
//: trackName for Bell Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Bell Tree", "bell-tree trackName"),
//: longName for Bell Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Bell Tree", "bell-tree longName"),
//: shortName for Bell Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Be. Tr.", "bell-tree shortName"),
//: description for Bells; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Bells.", "bells description"),
//: trackName for Bells; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
@ -4041,6 +4050,15 @@ QT_TRANSLATE_NOOP3("engraving/instruments", "Iron Pipes", "iron-pipes longName")
//: shortName for Iron Pipes; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Ir. Pi.", "iron-pipes shortName"),
//: description for Mark Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Chimes hung from a horizontal bar in order of pitch. The pitches are indefinite.", "mark-tree description"),
//: trackName for Mark Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Mark Tree", "mark-tree trackName"),
//: longName for Mark Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Mark Tree", "mark-tree longName"),
//: shortName for Mark Tree; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Mk. Tr.", "mark-tree shortName"),
//: description for Metal Castanets; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names
QT_TRANSLATE_NOOP3("engraving/instruments", "Metal castanets.", "metal-castanets description"),
//: trackName for Metal Castanets; Please see https://github.com/musescore/MuseScore/wiki/Translating-instrument-names

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -383,6 +383,26 @@
<render>striangle</render>
</token>
<token class="modifier">
<name>add</name>
<render>add</render>
</token>
<token class="modifier">
<name>sus</name>
<render>sus</render>
</token>
<token class="modifier">
<name>no</name>
<render>no</render>
</token>
<token class="modifier">
<name>omit</name>
<render>omit</render>
</token>
<renderRoot>:n :a m:0.5:0</renderRoot>
<renderFunction>:a m:0.5:0 :n</renderFunction>
<renderBase>m:-0.2:1 / m:0.2:1 :n :a m:0:-2</renderBase>

View File

@ -69,7 +69,9 @@ int AppShell::run(int argc, char** argv)
qputenv("QML_DISABLE_DISK_CACHE", "true");
#ifdef Q_OS_LINUX
qputenv("QT_QPA_PLATFORMTHEME", "gtk3");
if (qEnvironmentVariable("QT_QPA_PLATFORM") != "offscreen") {
qputenv("QT_QPA_PLATFORMTHEME", "gtk3");
}
#endif
const char* appName;
@ -150,9 +152,10 @@ int AppShell::run(int argc, char** argv)
m->onPreInit(runMode);
}
SplashScreen splashScreen;
SplashScreen* splashScreen = nullptr;
if (runMode == framework::IApplication::RunMode::Editor) {
splashScreen.show();
splashScreen = new SplashScreen();
splashScreen->show();
}
// ====================================================
@ -257,7 +260,10 @@ int AppShell::run(int argc, char** argv)
engine->load(url);
splashScreen.close();
if (splashScreen) {
splashScreen->close();
delete splashScreen;
}
}
}
@ -285,6 +291,8 @@ int AppShell::run(int argc, char** argv)
// Deinit
globalModule.invokeQueuedCalls();
for (mu::modularity::IModuleSetup* m : m_modules) {
m->onDeinit();
}

View File

@ -9,9 +9,9 @@
<file>qml/DevTools/Preferences/SettingsPage.qml</file>
<file>qml/NotationPage/NotationStatusBar.qml</file>
<file>qml/HomePage/PluginsPage.qml</file>
<file>qml/DevTools/VST/VSTTests.qml</file>
<file>qml/DevTools/Gallery/GeneralComponentsGallery.qml</file>
<file>qml/DevTools/CrashHandler/CrashHandlerDevTools.qml</file>
<file>qml/DevTools/CorruptScore/CorruptScoreDevTools.qml</file>
<file>qml/AboutDialog.qml</file>
<file>qml/AboutMusicXMLDialog.qml</file>
<file>qml/resources/mu_logo.svg</file>
@ -60,7 +60,6 @@
<file>qml/Preferences/internal/IncrementalPropertyControlWithTitle.qml</file>
<file>qml/Preferences/internal/KeyboardLayoutsSection.qml</file>
<file>qml/Preferences/internal/AudioGenerationSection.qml</file>
<file>qml/DevTools/Autobot/AutobotControl.qml</file>
<file>qml/DevTools/KeyNav/KeyNavExample.qml</file>
<file>qml/DevTools/KeyNav/KeyNavSection.qml</file>
<file>qml/DevTools/KeyNav/KeyNavSubSection.qml</file>

View File

@ -200,6 +200,14 @@ void AppShellModule::onInit(const IApplication::RunMode&)
#endif
}
void AppShellModule::onAllInited(const framework::IApplication::RunMode&)
{
//! NOTE: process QEvent::FileOpen as early as possible if it was postponed
#ifdef Q_OS_MACOS
qApp->processEvents();
#endif
}
void AppShellModule::onDeinit()
{
s_sessionsManager->deinit();

View File

@ -41,6 +41,7 @@ public:
void onPreInit(const framework::IApplication::RunMode& mode) override;
void onInit(const framework::IApplication::RunMode& mode) override;
void onAllInited(const framework::IApplication::RunMode& mode) override;
void onDeinit() override;
};
}

View File

@ -87,6 +87,8 @@ void CommandLineController::parse(const QStringList& args)
// m_parser.addOption(QCommandLineOption("piano-position", "Show Piano top or bottom. Default bottom", "bottom"));
m_parser.addOption(QCommandLineOption("resolution", "Resolution [2160p, 1440p, 1080p, 720p, 480p, 360p]", "1080p"));
m_parser.addOption(QCommandLineOption("fps", "Frame per second [60, 30, 24]", "24"));
m_parser.addOption(QCommandLineOption("ls", "Pause before playback in seconds (3.0)", "3.0"));
m_parser.addOption(QCommandLineOption("ts", "Pause before end of video in seconds (3.0)", "3.0"));
m_parser.addOption(QCommandLineOption("gp-linked", "create tabulature linked staves for guitar pro"));
m_parser.addOption(QCommandLineOption("gp-experimental", "experimental features for guitar pro import"));
@ -316,6 +318,14 @@ void CommandLineController::apply()
if (m_parser.isSet("fps")) {
videoExportConfiguration()->setFps(intValue("fps"));
}
if (m_parser.isSet("ls")) {
videoExportConfiguration()->setLeadingSec(doubleValue("ls"));
}
if (m_parser.isSet("ts")) {
videoExportConfiguration()->setTrailingSec(doubleValue("ts"));
}
}
#endif
@ -324,7 +334,7 @@ void CommandLineController::apply()
}
if (m_parser.isSet("f")) {
m_converterTask.params[CommandLineController::ParamKey::ForceMode] = m_parser.value("f");
m_converterTask.params[CommandLineController::ParamKey::ForceMode] = true;
}
if (m_parser.isSet("S")) {

View File

@ -51,7 +51,6 @@ public:
virtual std::string handbookUrl() const = 0;
virtual std::string askForHelpUrl() const = 0;
virtual std::string bugReportUrl() const = 0;
virtual std::string leaveFeedbackUrl() const = 0;
virtual std::string museScoreUrl() const = 0;
virtual std::string museScoreForumUrl() const = 0;
virtual std::string museScoreContributionUrl() const = 0;

View File

@ -21,7 +21,6 @@
*/
#include "applicationactioncontroller.h"
#include <QCoreApplication>
#include <QApplication>
#include <QCloseEvent>
#include <QFileOpenEvent>
@ -31,6 +30,7 @@
#include "async/async.h"
#include "audio/synthtypes.h"
#include "defer.h"
#include "translation.h"
#include "log.h"
@ -63,7 +63,6 @@ void ApplicationActionController::init()
dispatcher()->reg(this, "online-handbook", this, &ApplicationActionController::openOnlineHandbookPage);
dispatcher()->reg(this, "ask-help", this, &ApplicationActionController::openAskForHelpPage);
dispatcher()->reg(this, "report-bug", this, &ApplicationActionController::openBugReportPage);
dispatcher()->reg(this, "leave-feedback", this, &ApplicationActionController::openLeaveFeedbackPage);
dispatcher()->reg(this, "preference-dialog", this, &ApplicationActionController::openPreferencesDialog);
dispatcher()->reg(this, "revert-factory", this, &ApplicationActionController::revertToFactorySettings);
@ -127,9 +126,10 @@ void ApplicationActionController::onDropEvent(QDropEvent* event)
bool ApplicationActionController::eventFilter(QObject* watched, QEvent* event)
{
if (event->type() == QEvent::Close && watched == mainWindow()->qWindow()) {
quit(false);
event->ignore();
if ((event->type() == QEvent::Close && watched == mainWindow()->qWindow())
|| event->type() == QEvent::Quit) {
bool accepted = quit(false);
event->setAccepted(accepted);
return true;
}
@ -159,23 +159,39 @@ mu::ValCh<bool> ApplicationActionController::isFullScreen() const
return result;
}
void ApplicationActionController::quit(bool isAllInstances, const io::path_t& installerPath)
bool ApplicationActionController::quit(bool isAllInstances, const io::path_t& installerPath)
{
if (projectFilesController()->closeOpenedProject()) {
if (isAllInstances) {
multiInstancesProvider()->quitForAll();
}
if (multiInstancesProvider()->instances().size() == 1 && !installerPath.empty()) {
interactive()->openUrl(QUrl::fromLocalFile(installerPath.toQString()));
}
if (multiInstancesProvider()->instances().size() > 1) {
multiInstancesProvider()->notifyAboutInstanceWasQuited();
}
QCoreApplication::quit();
if (m_quiting) {
return false;
}
m_quiting = true;
DEFER {
m_quiting = false;
};
if (!projectFilesController()->closeOpenedProject()) {
return false;
}
if (isAllInstances) {
multiInstancesProvider()->quitForAll();
}
if (multiInstancesProvider()->instances().size() == 1 && !installerPath.empty()) {
#if defined(Q_OS_LINUX)
interactive()->revealInFileBrowser(installerPath);
#else
interactive()->openUrl(QUrl::fromLocalFile(installerPath.toQString()));
#endif
}
if (multiInstancesProvider()->instances().size() > 1) {
multiInstancesProvider()->notifyAboutInstanceWasQuited();
}
QCoreApplication::quit();
return true;
}
void ApplicationActionController::restart()
@ -231,12 +247,6 @@ void ApplicationActionController::openBugReportPage()
interactive()->openUrl(bugReportUrl);
}
void ApplicationActionController::openLeaveFeedbackPage()
{
std::string leaveFeedbackUrl = configuration()->leaveFeedbackUrl();
interactive()->openUrl(leaveFeedbackUrl);
}
void ApplicationActionController::openPreferencesDialog()
{
if (multiInstancesProvider()->isPreferencesAlreadyOpened()) {
@ -258,8 +268,7 @@ void ApplicationActionController::revertToFactorySettings()
IInteractive::Result result = interactive()->warning(title, question,
{ interactive()->buttonData(IInteractive::Button::Cancel),
IInteractive::ButtonData(revertBtn, trc("appshell", "Revert"), true) },
revertBtn, IInteractive::WithIcon
);
revertBtn);
if (result.standardButton() == IInteractive::Button::Cancel) {
return;
@ -284,10 +293,3 @@ void ApplicationActionController::revertToFactorySettings()
restart();
}
bool ApplicationActionController::canReceiveAction(const mu::actions::ActionCode& code) const
{
Q_UNUSED(code);
auto focus = QGuiApplication::focusWindow();
return !focus || focus->modality() == Qt::WindowModality::NonModal;
}

View File

@ -65,14 +65,13 @@ public:
void onDragEnterEvent(QDragEnterEvent* event) override;
void onDragMoveEvent(QDragMoveEvent* event) override;
void onDropEvent(QDropEvent* event) override;
bool canReceiveAction(const mu::actions::ActionCode&) const override;
private:
bool eventFilter(QObject* watched, QEvent* event) override;
void setupConnections();
void quit(bool isAllInstances, const io::path_t& installerPath = io::path_t());
bool quit(bool isAllInstances, const io::path_t& installerPath = io::path_t());
void restart();
void toggleFullScreen();
@ -83,11 +82,12 @@ private:
void openOnlineHandbookPage();
void openAskForHelpPage();
void openBugReportPage();
void openLeaveFeedbackPage();
void openPreferencesDialog();
void revertToFactorySettings();
bool m_quiting = false;
async::Channel<bool> m_fullScreenChannel;
async::Channel<actions::ActionCodeList> m_actionsReceiveAvailableChanged;
};

View File

@ -85,11 +85,6 @@ const UiActionList ApplicationUiActions::m_actions = {
mu::context::CTX_ANY,
TranslatableString("action", "&Report a bug")
),
UiAction("leave-feedback",
mu::context::UiCtxAny,
mu::context::CTX_ANY,
TranslatableString("action", "F&eedback")
),
UiAction("revert-factory",
mu::context::UiCtxAny,
mu::context::CTX_ANY,

View File

@ -42,12 +42,11 @@ static const Settings::Key HAS_COMPLETED_FIRST_LAUNCH_SETUP(module_name, "applic
static const Settings::Key STARTUP_MODE_TYPE(module_name, "application/startup/modeStart");
static const Settings::Key STARTUP_SCORE_PATH(module_name, "application/startup/startScore");
static const std::string MUSESCORE_ONLINE_HANDBOOK_URL_PATH("/redirect/help");
static const std::string MUSESCORE_ONLINE_HANDBOOK_URL_PATH("/handbook/4");
static const std::string MUSESCORE_ASK_FOR_HELP_URL_PATH("/redirect/post/question");
static const std::string MUSESCORE_BUG_REPORT_URL_PATH("/redirect/post/bug-report?locale=");
static const std::string MUSESCORE_FORUM_URL_PATH("/forum");
static const std::string MUSESCORE_CONTRIBUTE_URL_PATH("/contribute");
static const std::string LEAVE_FEEDBACK_URL("https://musescore.com/content/editor-feedback");
static const std::string MUSICXML_URL("https://w3.org");
static const std::string MUSICXML_LICENSE_URL(MUSICXML_URL + "/community/about/process/final/");
static const std::string MUSICXML_LICENSE_DEED_URL(MUSICXML_URL + "/community/about/process/fsa-deed/");
@ -116,7 +115,7 @@ std::string AppShellConfiguration::handbookUrl() const
QString::fromStdString(utm)
};
return MUSESCORE_ONLINE_HANDBOOK_URL_PATH + "?" + params.join("&").toStdString();
return museScoreUrl() + MUSESCORE_ONLINE_HANDBOOK_URL_PATH + "?" + params.join("&").toStdString();
}
std::string AppShellConfiguration::askForHelpUrl() const
@ -127,7 +126,7 @@ std::string AppShellConfiguration::askForHelpUrl() const
"locale=" + QString::fromStdString(languageCode)
};
return MUSESCORE_ASK_FOR_HELP_URL_PATH + "?" + params.join("&").toStdString();
return museScoreUrl() + MUSESCORE_ASK_FOR_HELP_URL_PATH + "?" + params.join("&").toStdString();
}
std::string AppShellConfiguration::bugReportUrl() const
@ -142,18 +141,7 @@ std::string AppShellConfiguration::bugReportUrl() const
QString::fromStdString(_sha)
};
return MUSESCORE_BUG_REPORT_URL_PATH + "?" + params.join("&").toStdString();
}
std::string AppShellConfiguration::leaveFeedbackUrl() const
{
std::string utm = utmParameters(UTM_MEDIUM_MENU);
QStringList params = {
QString::fromStdString(utm)
};
return LEAVE_FEEDBACK_URL + "?" + params.join("&").toStdString();
return museScoreUrl() + MUSESCORE_BUG_REPORT_URL_PATH + "?" + params.join("&").toStdString();
}
std::string AppShellConfiguration::museScoreUrl() const
@ -163,12 +151,12 @@ std::string AppShellConfiguration::museScoreUrl() const
std::string AppShellConfiguration::museScoreForumUrl() const
{
return globalConfiguration()->museScoreUrl() + MUSESCORE_FORUM_URL_PATH;
return museScoreUrl() + MUSESCORE_FORUM_URL_PATH;
}
std::string AppShellConfiguration::museScoreContributionUrl() const
{
return globalConfiguration()->museScoreUrl() + MUSESCORE_CONTRIBUTE_URL_PATH;
return museScoreUrl() + MUSESCORE_CONTRIBUTE_URL_PATH;
}
std::string AppShellConfiguration::musicXMLLicenseUrl() const

View File

@ -65,7 +65,6 @@ public:
std::string handbookUrl() const override;
std::string askForHelpUrl() const override;
std::string bugReportUrl() const override;
std::string leaveFeedbackUrl() const override;
std::string museScoreUrl() const override;
std::string museScoreForumUrl() const override;
std::string museScoreContributionUrl() const override;

View File

@ -46,6 +46,9 @@ static void updateWindowPosition()
WinFramelessWindowController::WinFramelessWindowController()
: FramelessWindowController()
{
memset(&m_monitorInfo, 0, sizeof(MONITORINFO));
m_monitorInfo.cbSize = sizeof(MONITORINFO);
qApp->installEventFilter(this);
qApp->installNativeEventFilter(this);
}
@ -129,7 +132,7 @@ bool WinFramelessWindowController::nativeEventFilter(const QByteArray& eventType
return false;
}
bool WinFramelessWindowController::removeWindowFrame(MSG* message, long* result) const
bool WinFramelessWindowController::removeWindowFrame(MSG* message, long* result)
{
NCCALCSIZE_PARAMS& params = *reinterpret_cast<NCCALCSIZE_PARAMS*>(message->lParam);
@ -138,11 +141,15 @@ bool WinFramelessWindowController::removeWindowFrame(MSG* message, long* result)
GetWindowPlacement(s_hwnd, &placement);
if (placement.showCmd == SW_SHOWMAXIMIZED) {
qreal borderWidth = this->borderWidth();
params.rgrc[0].left += borderWidth;
params.rgrc[0].top += borderWidth;
params.rgrc[0].right -= borderWidth;
params.rgrc[0].bottom -= borderWidth;
HMONITOR hMonitor = MonitorFromWindow(message->hwnd, MONITOR_DEFAULTTONULL);
if (hMonitor != NULL) {
GetMonitorInfoW(hMonitor, &m_monitorInfo);
}
params.rgrc[0].left = m_monitorInfo.rcWork.left;
params.rgrc[0].top = m_monitorInfo.rcWork.top;
params.rgrc[0].right = m_monitorInfo.rcWork.right;
params.rgrc[0].bottom = m_monitorInfo.rcWork.bottom;
}
/// NOTE: remove window frame
@ -150,35 +157,34 @@ bool WinFramelessWindowController::removeWindowFrame(MSG* message, long* result)
return true;
}
bool WinFramelessWindowController::calculateWindowSize(MSG* message, long* result) const
bool WinFramelessWindowController::calculateWindowSize(MSG* message, long* result)
{
QWindow* window = mainWindow()->qWindow();
if (!window) {
if (!isWindowMaximized(message->hwnd)) {
return false;
}
QScreen* windowScreen = window->screen();
if (!windowScreen) {
RECT windowRect;
if (!GetWindowRect(message->hwnd, &windowRect)) {
return false;
}
const QRect availableGeometry = windowScreen->availableGeometry();
double scaleFactor = uiConfiguration()->guiScaling();
HMONITOR hMonitor = MonitorFromRect(&windowRect, MONITOR_DEFAULTTONULL);
if (!hMonitor) {
return false;
}
GetMonitorInfoW(hMonitor, &m_monitorInfo);
RECT monitorRect = m_monitorInfo.rcMonitor;
RECT monitorWorkAreaRect = m_monitorInfo.rcWork;
auto minMaxInfo = reinterpret_cast<MINMAXINFO*>(message->lParam);
minMaxInfo->ptMaxSize.x = availableGeometry.width() * scaleFactor;
minMaxInfo->ptMaxSize.y = availableGeometry.height() * scaleFactor;
if (windowScreen == QGuiApplication::primaryScreen()) {
minMaxInfo->ptMaxPosition.x = availableGeometry.x();
minMaxInfo->ptMaxPosition.y = availableGeometry.y();
}
minMaxInfo->ptMinTrackSize.x = window->minimumWidth() * scaleFactor;
minMaxInfo->ptMinTrackSize.y = window->minimumHeight() * scaleFactor;
minMaxInfo->ptMaxTrackSize = minMaxInfo->ptMaxSize;
minMaxInfo->ptMaxSize.x = monitorWorkAreaRect.right - monitorWorkAreaRect.left;
minMaxInfo->ptMaxSize.y = monitorWorkAreaRect.bottom - monitorWorkAreaRect.top;
minMaxInfo->ptMaxPosition.x = abs(windowRect.left - monitorRect.left);
minMaxInfo->ptMaxPosition.y = abs(windowRect.top - monitorRect.top);
minMaxInfo->ptMinTrackSize.x = minMaxInfo->ptMaxSize.x;
minMaxInfo->ptMinTrackSize.y = minMaxInfo->ptMaxSize.y;
*result = 0;
return true;
@ -187,8 +193,10 @@ bool WinFramelessWindowController::calculateWindowSize(MSG* message, long* resul
bool WinFramelessWindowController::processMouseMove(MSG* message, long* result) const
{
const LONG borderWidth = this->borderWidth();
RECT winrect;
GetWindowRect(message->hwnd, &winrect);
RECT windowRect;
if (!GetWindowRect(message->hwnd, &windowRect)) {
return false;
}
long x = GET_X_LPARAM(message->lParam);
long y = GET_Y_LPARAM(message->lParam);
@ -197,8 +205,8 @@ bool WinFramelessWindowController::processMouseMove(MSG* message, long* result)
QRect moveAreaRect = windowTitleBarMoveArea();
int moveAreaHeight = static_cast<int>(moveAreaRect.height() * scaleFactor);
int moveAreaWidth = static_cast<int>(moveAreaRect.width() * scaleFactor);
int moveAreaX = winrect.left + static_cast<int>(moveAreaRect.x() * scaleFactor);
int moveAreaY = winrect.top + borderWidth + static_cast<int>(moveAreaRect.y() * scaleFactor);
int moveAreaX = windowRect.left + static_cast<int>(moveAreaRect.x() * scaleFactor);
int moveAreaY = windowRect.top + borderWidth + static_cast<int>(moveAreaRect.y() * scaleFactor);
/// NOTE: titlebar`s move area
if (x >= moveAreaX && x < moveAreaX + moveAreaWidth
@ -208,53 +216,53 @@ bool WinFramelessWindowController::processMouseMove(MSG* message, long* result)
}
/// NOTE: bottom left corner
if (x >= winrect.left && x < winrect.left + borderWidth
&& y < winrect.bottom && y >= winrect.bottom - borderWidth) {
if (x >= windowRect.left && x < windowRect.left + borderWidth
&& y < windowRect.bottom && y >= windowRect.bottom - borderWidth) {
*result = HTBOTTOMLEFT;
return true;
}
/// NOTE: bottom right corner
if (x < winrect.right && x >= winrect.right - borderWidth
&& y < winrect.bottom && y >= winrect.bottom - borderWidth) {
if (x < windowRect.right && x >= windowRect.right - borderWidth
&& y < windowRect.bottom && y >= windowRect.bottom - borderWidth) {
*result = HTBOTTOMRIGHT;
return true;
}
/// NOTE: top left corner
if (x >= winrect.left && x < winrect.left + borderWidth
&& y >= winrect.top && y < winrect.top + borderWidth) {
if (x >= windowRect.left && x < windowRect.left + borderWidth
&& y >= windowRect.top && y < windowRect.top + borderWidth) {
*result = HTTOPLEFT;
return true;
}
/// NOTE: top right corner
if (x < winrect.right && x >= winrect.right - borderWidth
&& y >= winrect.top && y < winrect.top + borderWidth) {
if (x < windowRect.right && x >= windowRect.right - borderWidth
&& y >= windowRect.top && y < windowRect.top + borderWidth) {
*result = HTTOPRIGHT;
return true;
}
/// NOTE: left border
if (x >= winrect.left && x < winrect.left + borderWidth) {
if (x >= windowRect.left && x < windowRect.left + borderWidth) {
*result = HTLEFT;
return true;
}
/// NOTE: right border
if (x < winrect.right && x >= winrect.right - borderWidth) {
if (x < windowRect.right && x >= windowRect.right - borderWidth) {
*result = HTRIGHT;
return true;
}
/// NOTE: bottom border
if (y < winrect.bottom && y >= winrect.bottom - borderWidth) {
if (y < windowRect.bottom && y >= windowRect.bottom - borderWidth) {
*result = HTBOTTOM;
return true;
}
/// NOTE: top border
if (y >= winrect.top && y < winrect.top + borderWidth) {
if (y >= windowRect.top && y < windowRect.top + borderWidth) {
*result = HTTOP;
return true;
}
@ -325,6 +333,17 @@ bool WinFramelessWindowController::showSystemMenuIfNeed(MSG* message) const
return true;
}
bool WinFramelessWindowController::isWindowMaximized(HWND hWnd) const
{
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
if (!GetWindowPlacement(hWnd, &wp)) {
return false;
}
return wp.showCmd == SW_MAXIMIZE;
}
int WinFramelessWindowController::borderWidth() const
{
NONCLIENTMETRICS nonClientMetrics = {};

View File

@ -31,6 +31,8 @@
#include "ui/iuiconfiguration.h"
#include "ui/imainwindow.h"
#include "windows.h"
namespace mu::appshell {
class WinFramelessWindowController : public QObject, public FramelessWindowController
{
@ -46,17 +48,21 @@ private:
bool eventFilter(QObject* watched, QEvent* event) override;
bool nativeEventFilter(const QByteArray& eventType, void* message, long* result) override;
bool removeWindowFrame(MSG* message, long* result) const;
bool calculateWindowSize(MSG* message, long* result) const;
bool removeWindowFrame(MSG* message, long* result);
bool calculateWindowSize(MSG* message, long* result);
bool processMouseMove(MSG* message, long* result) const;
bool processMouseRightClick(MSG* message) const;
void updateContextMenuState(MSG* message) const;
bool showSystemMenuIfNeed(MSG* message) const;
bool isWindowMaximized(HWND hWnd) const;
int borderWidth() const;
QScreen* m_screen = nullptr;
MONITORINFO m_monitorInfo;
};
}

View File

@ -59,6 +59,20 @@ StyledDialogView {
source: "qrc:/qml/resources/mu_logo.svg"
sourceSize: Qt.size(100, 100)
MouseArea {
anchors.fill: parent
property int clickCount: 0
onClicked: {
clickCount++
if (clickCount % 3 == 0) {
aboutModel.toggleDevMode()
}
}
}
}
Column {
@ -122,7 +136,7 @@ StyledDialogView {
StyledTextLabel {
Layout.fillWidth: true
text: qsTrc("appshell/about", "Copyright © 1999-2022 MuseScore BVBA and others.\nPublished under the <a href=\"%1\">GNU General Public License version 3</a>.")
text: qsTrc("appshell/about", "Copyright © 1999-2023 MuseScore BVBA and others.\nPublished under the <a href=\"%1\">GNU General Public License version 3</a>.")
.arg("https://www.gnu.org/licenses/gpl-3.0.html")
.replace("\n", "<br>")

View File

@ -0,0 +1,74 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.15
import MuseScore.Ui 1.0
import MuseScore.UiComponents 1.0
import MuseScore.Diagnostics 1.0
Rectangle {
color: ui.theme.backgroundSecondaryColor
CorruptScoreDevToolsModel {
id: model
}
Column {
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: 12
spacing: 12
Rectangle {
readonly property real padding: 12
width: hintLabel.implicitWidth + 2 * padding
height: hintLabel.implicitHeight + 2 * padding
color: Utils.colorWithAlpha(border.color, 0.25)
border.color: "red"
border.width: 1
radius: 6
Row {
id: hintLabel
anchors.fill: parent
anchors.margins: parent.padding
spacing: 4
StyledIconLabel {
iconCode: IconCode.WARNING
}
StyledTextLabel {
text: "DANGER! This button does exactly what it says!"
}
}
}
FlatButton {
text: "Corrupt the open score"
onClicked: model.corruptOpenScore()
}
}
}

View File

@ -31,7 +31,7 @@ import MuseScore.Mpe 1.0
import "./Gallery"
import "./Interactive"
import "./CrashHandler"
import "./VST"
import "./CorruptScore"
import "./KeyNav"
import "./Preferences"
@ -49,12 +49,8 @@ DockPage {
case "gallery": root.central = galleryComp; break
case "interactive": root.central = interactiveComp; break
case "crashhandler": root.central = crashhandlerComp; break
case "audio": root.central = audioComp; break
case "synth": root.central = synthSettingsComp; break
case "midiports": root.central = midiPortsComp; break
case "vst": root.central = vstComponent; break
case "corruptscore": root.central = corruptScoreComp; break
case "mpe": root.central = mpeComponent; break
case "autobot": root.central = autobotComp; break
case "navigation": root.central = keynavComp; break
}
}
@ -84,12 +80,8 @@ DockPage {
{ "name": "gallery", "title": "UI Gallery" },
{ "name": "interactive", "title": "Interactive" },
{ "name": "crashhandler", "title": "Crash handler" },
{ "name": "audio", "title": "Audio" },
{ "name": "synth", "title": "Synth" },
{ "name": "midiports", "title": "MIDI ports" },
{ "name": "vst", "title": "VST" },
{ "name": "corruptscore", "title": "Corrupt score" },
{ "name": "mpe", "title": "MPE" },
{ "name": "autobot", "title": "Autobot" },
{ "name": "navigation", "title": "KeyNav" }
]
@ -128,30 +120,9 @@ DockPage {
}
Component {
id: audioComp
id: corruptScoreComp
Playback {}
}
Component {
id: synthSettingsComp
SynthSettings {}
}
Component {
id: midiPortsComp
MidiPorts {}
}
Component {
id: vstComponent
//safe if VST is not available
Loader {
source: "qrc:/qml/DevTools/VST/VSTTests.qml"
}
CorruptScoreDevTools {}
}
Component {
@ -162,14 +133,6 @@ DockPage {
}
}
Component {
id: autobotComp
Loader {
source: "qrc:/qml/DevTools/Autobot/AutobotControl.qml"
}
}
Component {
id: keynavComp

View File

@ -366,12 +366,36 @@ Rectangle {
text: "Text with icon"
}
FlatButton {
icon: IconCode.SAVE
text: "Suuuuuuuuuuuuuper long text with icon"
}
FlatButton {
icon: IconCode.SAVE
text: "Elided suuuuuuuuuuuuuper long text with icon"
width: 132
}
FlatButton {
icon: IconCode.SAVE
text: "Text with icon"
orientation: Qt.Horizontal
}
FlatButton {
icon: IconCode.SAVE
text: "Suuuuuuuuuuuuuper long text with icon"
orientation: Qt.Horizontal
}
FlatButton {
icon: IconCode.SAVE
text: "Elided suuuuuuuuuuuuuper long text with icon"
orientation: Qt.Horizontal
width: 132
}
FlatButton {
text: "Just text"
}

View File

@ -50,7 +50,7 @@ StyledDialogView {
property string value: ""
width: 150
onCurrentTextEdited: input.value = newTextValue
onTextChanged: input.value = newTextValue
}
StyledTextLabel {

View File

@ -1,212 +0,0 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import QtQuick 2.15
import MuseScore.UiComponents 1.0
import MuseScore.Ui 1.0
import MuseScore.Vst 1.0
Rectangle {
id: root
color: ui.theme.backgroundPrimaryColor
NavigationSection {
id: navSec
name: "VstTests"
enabled: root.visible
order: 1
}
VstPluginListModelExample {
id: pluginListModel
Component.onCompleted: {
load()
}
}
Row {
anchors {
top: parent.top
topMargin: 24
left: parent.left
leftMargin: 24
right: parent.right
rightMargin: 24
}
NavigationPanel {
id: dropdownNav
name: "Dropdowns"
section: navSec
order: 1
}
Column {
spacing: 4
StyledTextLabel {
id: sequencesTitle
text: "Track sequence"
}
StyledDropdown {
id: sequences
navigation.name: "TrackSequence Dropdown"
navigation.panel: dropdownNav
navigation.order: 1
textRole: "value"
valueRole: "value"
currentIndex: sequences.indexOfValue(pluginListModel.currentSequenceId)
model: pluginListModel.sequenceIdList
onActivated: function(index, value) {
pluginListModel.currentSequenceId = value
}
}
}
Column {
spacing: 4
StyledTextLabel {
id: tracksTitle
text: "Track"
}
StyledDropdown {
id: tracks
navigation.name: "Tracks Dropdown"
navigation.panel: dropdownNav
navigation.order: 2
textRole: "value"
valueRole: "value"
model: pluginListModel.trackIdList
currentIndex: tracks.indexOfValue(pluginListModel.currentTrackId)
onActivated: function(index, value) {
pluginListModel.currentTrackId = value
}
}
}
Column {
spacing: 4
StyledTextLabel {
id: synthResourceTitle
text: "Synth resource"
}
StyledDropdown {
id: synthResources
width: 200
navigation.name: "Synth Resources Dropdown"
navigation.panel: dropdownNav
navigation.order: 3
textRole: "value"
valueRole: "value"
model: pluginListModel.availableSynthResources
currentIndex: synthResources.indexOfValue(pluginListModel.currentSynthResource)
onActivated: function(index, value) {
pluginListModel.currentSynthResource = value
}
}
}
Column {
spacing: 4
StyledTextLabel {
id: fxResourcesTitle
text: "Synth resource"
}
StyledDropdown {
id: fxResources
width: 200
navigation.name: "Synth Resources Dropdown"
navigation.panel: dropdownNav
navigation.order: 3
textRole: "value"
valueRole: "value"
model: pluginListModel.availableFxResources
currentIndex: fxResources.indexOfValue(pluginListModel.currentFxResource)
onCurrentValueChanged: {
if (fxResources.currentIndex == -1) {
return
}
pluginListModel.currentFxResource = fxResources.currentValue
}
}
}
FlatButton {
id: synthEditorButton
height: parent.height
text: "Show plugin view"
onClicked: {
pluginListModel.showSynthPluginEditor()
}
}
FlatButton {
id: fxEditorButton
height: parent.height
text: "Show plugin view"
onClicked: {
pluginListModel.showFxPluginEditor()
}
}
}
}

View File

@ -333,6 +333,7 @@ DockPage {
MixerPanel {
navigationSection: mixerPanel.navigationSection
navigationPanelOrderStart: mixerPanel.navigationPanelOrderStart
Component.onCompleted: {
mixerPanel.contextMenuModel = contextMenuModel

View File

@ -57,7 +57,7 @@ Rectangle {
FlatButton {
anchors.left: parent.left
width: 160
minWidth: 160
navigation.panel: root.navigation
navigation.order: 2
@ -76,7 +76,6 @@ Rectangle {
navigation.panel: root.navigation
navigation.order: 3
width: 132
text: qsTrc("global", "Cancel")
onClicked: {
@ -92,7 +91,6 @@ Rectangle {
navigation.panel: root.navigation
navigation.order: 1
width: 132
accentButton: true
text: qsTrc("global", "OK")

View File

@ -51,12 +51,14 @@ BaseSection {
width: parent.width
delegate: Row {
width: parent.width
spacing: root.columnSpacing
RoundedRadioButton {
anchors.verticalCenter: parent.verticalCenter
width: root.columnWidth
width: filePicker.visible ? Math.max(implicitWidth, root.columnWidth)
: parent.width
checked: modelData.checked
text: modelData.title
@ -72,6 +74,8 @@ BaseSection {
}
FilePicker {
id: filePicker
pathFieldWidth: root.columnWidth
spacing: root.columnSpacing
@ -102,6 +106,8 @@ BaseSection {
height: contentHeight
delegate: CheckBox {
width: parent.width
text: modelData.title
checked: modelData.visible

View File

@ -67,7 +67,7 @@ Rectangle {
text: Boolean(item) ? item.title : ""
icon: Boolean(item) ? item.icon : IconCode.NONE
//enabled: Boolean(item) ? item.enabled : false
enabled: Boolean(item) ? item.enabled : false
toolTipTitle: Boolean(item) ? item.title : ""
toolTipDescription: Boolean(item) ? item.description : ""
toolTipShortcut: Boolean(item) ? item.shortcuts : ""

View File

@ -70,7 +70,7 @@ Rectangle {
order: 1
onNavigationEvent: function(event) {
if (event.type === NavigationEvent.AboutActive) {
if (event.type === NavigationEvent.AboutActive && tabsPanel.visible) {
event.setData("controlName", tabs.currentItem.navigation.name)
}
}
@ -87,6 +87,9 @@ Rectangle {
visible: frameModel.titleBarVisible
isHorizontalPanel: frameModel.isHorizontalPanel
navigation.panel: navPanel
navigation.order: 1
onHandleContextMenuItemRequested: function(itemId) {
frameModel.handleMenuItem(itemId)
}

View File

@ -28,6 +28,8 @@ DockPanelView {
default property alias contentComponent : contentLoader.sourceComponent
property int navigationPanelOrderStart: 1 // take into account the context menu button
Loader {
id: contentLoader

View File

@ -37,6 +37,8 @@ Item {
property alias heightWhenVisible: titleBar.heightWhenVisible
property bool isHorizontalPanel: false
property alias navigation: contextMenuButton.navigation
signal handleContextMenuItemRequested(string itemId)
width: parent.width

View File

@ -45,8 +45,13 @@ Rectangle {
signal toggleWindowMaximizedRequested()
signal closeWindowRequested()
height: content.childrenRect.height
RowLayout {
anchors.fill: parent
id: content
anchors.left: parent.left
anchors.right: parent.right
spacing: 8
@ -95,7 +100,7 @@ Rectangle {
AppSystemButtons {
id: systemButtons
Layout.alignment: Qt.RightLeft | Qt.AlignVCenter
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.preferredWidth: width
Layout.preferredHeight: height

View File

@ -97,6 +97,11 @@ void AboutModel::copyRevisionToClipboard() const
.arg(MUSESCORE_REVISION));
}
void AboutModel::toggleDevMode()
{
globalConfiguration()->setDevModeEnabled(!globalConfiguration()->devModeEnabled());
}
QVariantMap AboutModel::makeUrl(const QUrl& url, bool showPath) const
{
QVariantMap urlMap;

View File

@ -27,6 +27,7 @@
#include "modularity/ioc.h"
#include "iappshellconfiguration.h"
#include "update/iupdateconfiguration.h"
#include "global/iglobalconfiguration.h"
class QUrl;
@ -37,6 +38,7 @@ class AboutModel : public QObject
INJECT(appshell, IAppShellConfiguration, configuration)
INJECT(appshell, update::IUpdateConfiguration, updateConfiguration)
INJECT(appshell, framework::IGlobalConfiguration, globalConfiguration)
public:
explicit AboutModel(QObject* parent = nullptr);
@ -53,6 +55,8 @@ public:
Q_INVOKABLE void copyRevisionToClipboard() const;
Q_INVOKABLE void toggleDevMode();
private:
QVariantMap makeUrl(const QUrl& url, bool showPath = true) const;
};

View File

@ -24,7 +24,6 @@
#include "types/translatablestring.h"
#include "config.h"
#include "version.h"
#include "log.h"
using namespace mu::appshell;
@ -323,7 +322,6 @@ MenuItem* AppMenuModel::makeHelpMenu()
makeSeparator(),
makeMenuItem("ask-help"),
makeMenuItem("report-bug"),
makeMenuItem("leave-feedback"),
makeSeparator(),
makeMenuItem("about", MenuItemRole::AboutRole),
makeMenuItem("about-qt", MenuItemRole::AboutQtRole),
@ -348,29 +346,8 @@ MenuItem* AppMenuModel::makeDiagnosticMenu()
makeMenuItem("diagnostic-show-profiler"),
};
MenuItemList accessibilityItems {
makeMenuItem("diagnostic-show-navigation-tree"),
makeMenuItem("diagnostic-show-accessible-tree"),
makeMenuItem("diagnostic-accessible-tree-dump"),
};
MenuItemList engravingItems {
makeMenuItem("diagnostic-show-engraving-elements"),
makeSeparator(),
makeMenuItem("show-element-bounding-rects"),
makeMenuItem("color-element-shapes"),
makeMenuItem("show-segment-shapes"),
makeMenuItem("color-segment-shapes"),
makeMenuItem("show-skylines"),
makeMenuItem("show-system-bounding-rects"),
makeMenuItem("show-corrupted-measures")
};
MenuItemList autobotItems {
makeMenuItem("autobot-show-scripts"),
};
MenuItemList items {
makeMenuItem("diagnostic-save-diagnostic-files"),
makeMenu(TranslatableString("appshell/menu/diagnostic", "&System"), systemItems, "menu-system")
};
@ -382,7 +359,29 @@ MenuItem* AppMenuModel::makeDiagnosticMenu()
items << makeMenu(TranslatableString("appshell/menu/diagnostic", "&Muse Sampler"), museSamplerItems, "menu-musesampler");
#endif
if (framework::Version::unstable()) {
if (globalConfiguration()->devModeEnabled()) {
MenuItemList engravingItems {
makeMenuItem("diagnostic-show-engraving-elements"),
makeSeparator(),
makeMenuItem("show-element-bounding-rects"),
makeMenuItem("color-element-shapes"),
makeMenuItem("show-segment-shapes"),
makeMenuItem("color-segment-shapes"),
makeMenuItem("show-skylines"),
makeMenuItem("show-system-bounding-rects"),
makeMenuItem("show-corrupted-measures")
};
MenuItemList autobotItems {
makeMenuItem("autobot-show-scripts"),
};
MenuItemList accessibilityItems {
makeMenuItem("diagnostic-show-navigation-tree"),
makeMenuItem("diagnostic-show-accessible-tree"),
makeMenuItem("diagnostic-accessible-tree-dump"),
};
items << makeMenu(TranslatableString("appshell/menu/diagnostic", "&Accessibility"), accessibilityItems, "menu-accessibility")
<< makeMenu(TranslatableString("appshell/menu/diagnostic", "&Engraving"), engravingItems, "menu-engraving")
<< makeMenu(TranslatableString("appshell/menu/diagnostic", "Auto&bot"), autobotItems, "menu-autobot")

View File

@ -38,6 +38,7 @@
#include "internal/iappmenumodelhook.h"
#include "plugins/ipluginsservice.h"
#include "update/iupdateconfiguration.h"
#include "global/iglobalconfiguration.h"
namespace mu::appshell {
class AppMenuModel : public uicomponents::AbstractMenuModel
@ -54,6 +55,7 @@ class AppMenuModel : public uicomponents::AbstractMenuModel
INJECT(appshell, IAppMenuModelHook, appMenuModelHook)
INJECT(appshell, plugins::IPluginsService, pluginsService)
INJECT(appshell, update::IUpdateConfiguration, updateConfiguration)
INJECT(appshell, framework::IGlobalConfiguration, globalConfiguration)
public:
explicit AppMenuModel(QObject* parent = nullptr);

View File

@ -107,8 +107,7 @@ bool FirstLaunchSetupModel::askAboutClosingEarly()
trc("appshell/gettingstarted", "If you choose to cancel, then be sure to check out "
"our free Muse Sounds playback library on musescore.org."),
buttons,
int(IInteractive::Button::Cancel),
IInteractive::Option::WithIcon);
int(IInteractive::Button::Cancel));
return result.standardButton() == IInteractive::Button::Cancel;
}

View File

@ -24,8 +24,6 @@
#include "translation.h"
#include "version.h"
using namespace mu::appshell;
static const QString HOME_PAGE("musescore://home");
@ -93,7 +91,7 @@ void MainToolBarModel::load()
m_items << buildItem(mu::qtrc("appshell", "Score"), NOTATION_PAGE);
m_items << buildItem(mu::qtrc("appshell", "Publish"), PUBLISH_PAGE);
if (framework::Version::unstable()) {
if (globalConfiguration()->devModeEnabled()) {
m_items << buildItem(mu::qtrc("appshell", "DevTools"), DEVTOOLS_PAGE);
}

View File

@ -29,6 +29,7 @@
#include "modularity/ioc.h"
#include "context/iglobalcontext.h"
#include "iglobalconfiguration.h"
namespace mu::appshell {
class MainToolBarModel : public QAbstractListModel, public async::Asyncable
@ -36,6 +37,7 @@ class MainToolBarModel : public QAbstractListModel, public async::Asyncable
Q_OBJECT
INJECT(appshell, context::IGlobalContext, context)
INJECT(appshell, framework::IGlobalConfiguration, globalConfiguration)
public:
explicit MainToolBarModel(QObject* parent = nullptr);

View File

@ -35,8 +35,6 @@ void MainWindowTitleProvider::load()
update();
context()->currentProjectChanged().onNotify(this, [this]() {
update();
if (auto currentProject = context()->currentProject()) {
currentProject->pathChanged().onNotify(this, [this]() {
update();
@ -47,6 +45,10 @@ void MainWindowTitleProvider::load()
});
}
});
context()->currentNotationChanged().onNotify(this, [this]() {
update();
});
}
QString MainWindowTitleProvider::title() const

View File

@ -91,6 +91,8 @@ QList<unsigned int> CommonAudioApiConfigurationModel::bufferSizeList() const
result << bufferSize;
}
std::sort(result.begin(), result.end());
return result;
}

View File

@ -78,6 +78,13 @@ IInteractive::Result AutobotInteractive::warning(const std::string& title, const
return m_real->warning(title, text, buttons, defBtn, options);
}
IInteractive::Result AutobotInteractive::warning(const std::string& title, const Text& text, const std::string& detailedText,
const ButtonDatas& buttons, int defBtn,
const Options& options) const
{
return m_real->warning(title, text, detailedText, buttons, defBtn, options);
}
IInteractive::Result AutobotInteractive::error(const std::string& title, const std::string& text, const Buttons& buttons,
const Button& def, const Options& options) const
{
@ -90,6 +97,12 @@ IInteractive::Result AutobotInteractive::error(const std::string& title, const T
return m_real->error(title, text, buttons, defBtn, options);
}
IInteractive::Result AutobotInteractive::error(const std::string& title, const Text& text, const std::string& detailedText,
const ButtonDatas& buttons, int defBtn, const Options& options) const
{
return m_real->error(title, text, detailedText, buttons, defBtn, options);
}
io::path_t AutobotInteractive::selectOpeningFile(const QString& title, const io::path_t& dir, const std::vector<std::string>& filter)
{
return m_real->selectOpeningFile(title, dir, filter);

View File

@ -57,6 +57,9 @@ public:
Result warning(const std::string& title, const Text& text, const ButtonDatas& buttons = {}, int defBtn = int(Button::NoButton),
const Options& options = {}) const override;
Result warning(const std::string& title, const Text& text, const std::string& detailedText, const ButtonDatas& buttons = {},
int defBtn = int(Button::NoButton), const Options& options = {}) const override;
// error
Result error(const std::string& title, const std::string& text, const Buttons& buttons = {}, const Button& def = Button::NoButton,
const Options& options = {}) const override;
@ -64,6 +67,9 @@ public:
Result error(const std::string& title, const Text& text, const ButtonDatas& buttons = {}, int defBtn = int(Button::NoButton),
const Options& options = {}) const override;
Result error(const std::string& title, const Text& text, const std::string& detailedText, const ButtonDatas& buttons = {},
int defBtn = int(Button::NoButton), const Options& options = {}) const override;
// files
io::path_t selectOpeningFile(const QString& title, const io::path_t& dir, const std::vector<std::string>& filter) override;
io::path_t selectSavingFile(const QString& title, const io::path_t& dir, const std::vector<std::string>& filter,

View File

@ -39,7 +39,7 @@ public:
virtual void signIn() = 0;
virtual void signOut() = 0;
virtual Ret requireAuthorization(const std::string& text = {}) = 0;
virtual Ret ensureAuthorization(const std::string& text = {}) = 0;
virtual ValCh<bool> userAuthorized() const = 0;
virtual ValCh<AccountInfo> accountInfo() const = 0;

View File

@ -158,5 +158,5 @@ mu::io::path_t CloudConfiguration::tokensFilePath() const
QString CloudConfiguration::apiRootUrl() const
{
return "https://api.musescore.com/editor/v1";
return "https://desktop.musescore.com/editor/v1";
}

View File

@ -416,8 +416,12 @@ void CloudService::signOut()
clearTokens();
}
mu::Ret CloudService::requireAuthorization(const std::string& text)
mu::Ret CloudService::ensureAuthorization(const std::string& text)
{
if (m_userAuthorized.val) {
return make_ok();
}
UriQuery query("musescore://cloud/requireauthorization");
query.addParam("text", Val(text));
return interactive()->open(query).ret;

View File

@ -60,7 +60,7 @@ public:
void signIn() override;
void signOut() override;
Ret requireAuthorization(const std::string& text = {}) override;
Ret ensureAuthorization(const std::string& text = {}) override;
ValCh<bool> userAuthorized() const override;
ValCh<AccountInfo> accountInfo() const override;

View File

@ -109,7 +109,7 @@ FocusScope {
FlatButton {
id: accountInfoButton
width: prv.buttonWidth
minWidth: prv.buttonWidth
text: qsTrc("cloud", "Account info")
accentButton: true
@ -131,7 +131,7 @@ FocusScope {
}
FlatButton {
width: prv.buttonWidth
minWidth: prv.buttonWidth
text: qsTrc("cloud", "Sign out")
navigation.name: "SignOut"

View File

@ -108,7 +108,7 @@ FocusScope {
FlatButton {
Layout.alignment: Qt.AlignLeft
width: privateProperties.buttonWidth
minWidth: privateProperties.buttonWidth
text: qsTrc("cloud", "Learn more")
navigation.name: "LearnMore"
@ -126,7 +126,7 @@ FocusScope {
spacing: 22
FlatButton {
width: privateProperties.buttonWidth
minWidth: privateProperties.buttonWidth
text: qsTrc("cloud", "Sign in")
navigation.name: "SignIn"
@ -140,7 +140,7 @@ FocusScope {
FlatButton {
id: createNewAccount
width: privateProperties.buttonWidth
minWidth: privateProperties.buttonWidth
text: qsTrc("cloud", "Create new account")
accentButton: true

View File

@ -56,7 +56,7 @@ void UiContextResolver::init()
notifyAboutContextChanged();
});
notation->interaction()->textEditingEnded().onNotify(this, [this]() {
notation->interaction()->textEditingEnded().onReceive(this, [this](engraving::TextBase*) {
notifyAboutContextChanged();
});

View File

@ -223,6 +223,9 @@ RetVal<project::INotationProjectPtr> BackendApi::openProject(const io::path_t& p
}
notation->setViewMode(ViewMode::PAGE);
for (IExcerptNotationPtr excerpt : notationProject->masterNotation()->excerpts().val) {
excerpt->notation()->setViewMode(ViewMode::PAGE);
}
return RetVal<INotationProjectPtr>::make_ok(notationProject);
}
@ -565,6 +568,7 @@ Ret BackendApi::doExportScorePartsPdfs(const IMasterNotationPtr masterNotation,
jsonForPdfs["scoreBin"] = QString::fromLatin1(scoreBin);
INotationPtrList notations;
notations.push_back(masterNotation->notation());
QJsonArray partsArray;
QJsonArray partsNamesArray;

View File

@ -92,6 +92,8 @@ mu::Ret ConverterController::fileConvert(const io::path_t& in, const io::path_t&
ret = convertFullNotation(writer, notationProject->masterNotation()->notation(), out);
}
globalContext()->setCurrentProject(nullptr);
return make_ret(Ret::Code::Ok);
}

View File

@ -29,6 +29,7 @@ set(MODULE_SRC
${CMAKE_CURRENT_LIST_DIR}/diagnosticsmodule.h
${CMAKE_CURRENT_LIST_DIR}/diagnosticutils.h
${CMAKE_CURRENT_LIST_DIR}/idiagnosticspathsregister.h
${CMAKE_CURRENT_LIST_DIR}/idiagnosticsconfiguration.h
${CMAKE_CURRENT_LIST_DIR}/iengravingelementsprovider.h
${CMAKE_CURRENT_LIST_DIR}/internal/diagnosticsconfiguration.cpp
@ -42,6 +43,12 @@ set(MODULE_SRC
${CMAKE_CURRENT_LIST_DIR}/internal/engravingelementsprovider.cpp
${CMAKE_CURRENT_LIST_DIR}/internal/engravingelementsprovider.h
${CMAKE_CURRENT_LIST_DIR}/internal/isavediagnosticfilesscenario.h
${CMAKE_CURRENT_LIST_DIR}/internal/savediagnosticfilesscenario.cpp
${CMAKE_CURRENT_LIST_DIR}/internal/savediagnosticfilesscenario.h
${CMAKE_CURRENT_LIST_DIR}/internal/diagnosticfileswriter.cpp
${CMAKE_CURRENT_LIST_DIR}/internal/diagnosticfileswriter.h
${CMAKE_CURRENT_LIST_DIR}/view/diagnosticspathsmodel.cpp
${CMAKE_CURRENT_LIST_DIR}/view/diagnosticspathsmodel.h
${CMAKE_CURRENT_LIST_DIR}/view/diagnosticaccessiblemodel.cpp
@ -66,6 +73,8 @@ set(MODULE_SRC
${CMAKE_CURRENT_LIST_DIR}/devtools/crashhandlerdevtoolsmodel.cpp
${CMAKE_CURRENT_LIST_DIR}/devtools/crashhandlerdevtoolsmodel.h
${CMAKE_CURRENT_LIST_DIR}/devtools/corruptscoredevtoolsmodel.cpp
${CMAKE_CURRENT_LIST_DIR}/devtools/corruptscoredevtoolsmodel.h
)
# --- Crashpad ---

View File

@ -0,0 +1,67 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "corruptscoredevtoolsmodel.h"
using namespace mu::diagnostics;
CorruptScoreDevToolsModel::CorruptScoreDevToolsModel(QObject* parent)
: QObject(parent)
{
}
void CorruptScoreDevToolsModel::corruptOpenScore()
{
project::INotationProjectPtr project = globalContext()->currentProject();
if (!project) {
return;
}
LOGW() << "Score corruption on demand!";
mu::notation::INotationPtr notation = project->masterNotation()->notation();
notation->undoStack()->prepareChanges();
for (engraving::System* system : notation->elements()->msScore()->systems()) {
for (engraving::MeasureBase* measureBase : system->measures()) {
if (!measureBase->isMeasure()) {
continue;
}
mu::engraving::Measure* measure = mu::engraving::toMeasure(measureBase);
mu::engraving::Segment* firstSegment = measure->first(mu::engraving::SegmentType::ChordRest);
for (mu::engraving::Segment* s = firstSegment; s; s = s->next(mu::engraving::SegmentType::ChordRest)) {
mu::engraving::EngravingItem* element = s->element(0);
if (!element) {
continue;
}
mu::engraving::ChordRest* cr = toChordRest(element);
cr->undoChangeProperty(mu::engraving::Pid::DURATION, mu::engraving::Fraction::fromString(u"0/4"));
}
}
}
notation->undoStack()->commitChanges();
}

View File

@ -0,0 +1,45 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_DIAGNOSTICS_CORRUPTSCORENDEVTOOLSMODEL_H
#define MU_DIAGNOSTICS_CORRUPTSCORENDEVTOOLSMODEL_H
#include <QObject>
#include "modularity/ioc.h"
#include "context/iglobalcontext.h"
namespace mu::diagnostics {
class CorruptScoreDevToolsModel : public QObject
{
Q_OBJECT
INJECT(diagnostics, context::IGlobalContext, globalContext)
public:
explicit CorruptScoreDevToolsModel(QObject* parent = nullptr);
Q_INVOKABLE void corruptOpenScore();
};
}
#endif // MU_DIAGNOSTICS_CORRUPTSCORENDEVTOOLSMODEL_H

View File

@ -33,6 +33,7 @@
#include "internal/diagnosticsactionscontroller.h"
#include "internal/diagnosticspathsregister.h"
#include "internal/engravingelementsprovider.h"
#include "internal/savediagnosticfilesscenario.h"
#include "internal/crashhandler/crashhandler.h"
@ -50,6 +51,7 @@
#include "view/engraving/engravingelementsmodel.h"
#include "devtools/crashhandlerdevtoolsmodel.h"
#include "devtools/corruptscoredevtoolsmodel.h"
#include "log.h"
#include "config.h"
@ -57,8 +59,8 @@
using namespace mu::diagnostics;
using namespace mu::modularity;
static std::shared_ptr<DiagnosticsConfiguration> s_configuration = std::make_shared<DiagnosticsConfiguration>();
static std::shared_ptr<DiagnosticsActionsController> s_actionsController = std::make_shared<DiagnosticsActionsController>();
static std::shared_ptr<DiagnosticsConfiguration> s_configuration = {};
static std::shared_ptr<DiagnosticsActionsController> s_actionsController = {};
std::string DiagnosticsModule::moduleName() const
{
@ -67,8 +69,13 @@ std::string DiagnosticsModule::moduleName() const
void DiagnosticsModule::registerExports()
{
s_configuration = std::make_shared<DiagnosticsConfiguration>();
s_actionsController = std::make_shared<DiagnosticsActionsController>();
ioc()->registerExport<IDiagnosticsPathsRegister>(moduleName(), new DiagnosticsPathsRegister());
ioc()->registerExport<EngravingElementsProvider>(moduleName(), new EngravingElementsProvider());
ioc()->registerExport<IDiagnosticsConfiguration>(moduleName(), s_configuration);
ioc()->registerExport<ISaveDiagnosticFilesScenario>(moduleName(), new SaveDiagnosticFilesScenario());
}
void DiagnosticsModule::resolveImports()
@ -104,6 +111,7 @@ void DiagnosticsModule::registerUiTypes()
qmlRegisterType<EngravingElementsModel>("MuseScore.Diagnostics", 1, 0, "EngravingElementsModel");
qmlRegisterType<CrashHandlerDevToolsModel>("MuseScore.Diagnostics", 1, 0, "CrashHandlerDevToolsModel");
qmlRegisterType<CorruptScoreDevToolsModel>("MuseScore.Diagnostics", 1, 0, "CorruptScoreDevToolsModel");
}
void DiagnosticsModule::onInit(const framework::IApplication::RunMode&)

View File

@ -0,0 +1,45 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_DIAGNOSTICS_IDIAGNOSTICSCONFIGURATION_H
#define MU_DIAGNOSTICS_IDIAGNOSTICSCONFIGURATION_H
#include "modularity/imoduleexport.h"
#include "io/path.h"
namespace mu::diagnostics {
class IDiagnosticsConfiguration : MODULE_EXPORT_INTERFACE
{
INTERFACE_ID(IDiagnosticsConfiguration)
public:
virtual bool isDumpUploadAllowed() const = 0;
virtual void setIsDumpUploadAllowed(bool val) = 0;
virtual bool shouldWarnBeforeSavingDiagnosticFiles() const = 0;
virtual void setShouldWarnBeforeSavingDiagnosticFiles(bool val) = 0;
virtual io::path_t diagnosticFilesDefaultSavingPath() const = 0;
};
}
#endif // MU_DIAGNOSTICS_IDIAGNOSTICSCONFIGURATION_H

View File

@ -0,0 +1,97 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "diagnosticfileswriter.h"
#include "serialization/zipwriter.h"
#include "containers.h"
#include "log.h"
using namespace mu::diagnostics;
using namespace mu::io;
mu::Ret DiagnosticFilesWriter::writeDiagnosticFiles(const path_t& destinationPath)
{
TRACEFUNC;
static const std::vector<std::string> DIRS_TO_WRITE {
"logs",
"vst",
"plugins",
"workspaces",
};
ZipWriter zip(destinationPath);
for (const std::string& dirName : DIRS_TO_WRITE) {
RetVal<io::paths_t> files = scanDir(dirName);
if (!files.ret) {
LOGE() << files.ret;
continue;
}
for (const io::path_t& filePath : files.val) {
Ret ret = addFileToZip(filePath, zip, dirName);
if (!ret) {
LOGE() << ret.toString();
}
}
}
const std::vector<std::string> FILES_TO_WRITE {
"shortcuts.xml",
"midi_mappings.xml",
};
for (const std::string& fileName : FILES_TO_WRITE) {
Ret ret = addFileToZip(globalConfiguration()->userAppDataPath() + "/" + fileName, zip);
if (!ret) {
LOGE() << ret.toString();
}
}
return make_ok();
}
mu::RetVal<mu::io::paths_t> DiagnosticFilesWriter::scanDir(const std::string& dirName)
{
RetVal<io::paths_t> paths = fileSystem()->scanFiles(globalConfiguration()->userAppDataPath() + "/" + dirName,
{ "*" },
ScanMode::FilesInCurrentDirAndSubdirs);
return paths;
}
mu::Ret DiagnosticFilesWriter::addFileToZip(const path_t& filePath, ZipWriter& zip, const std::string& destinationDirName)
{
RetVal<ByteArray> data = fileSystem()->readFile(filePath);
if (!data.ret) {
return data.ret;
}
std::string fileName = io::filename(filePath).toStdString();
std::string filePathInZip = destinationDirName.empty() ? fileName : destinationDirName + "/" + fileName;
zip.addFile(filePathInZip, data.val);
return make_ok();
}

View File

@ -0,0 +1,51 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_DIAGNOSTICS_DIAGNOSTICFILESWRITER_H
#define MU_DIAGNOSTICS_DIAGNOSTICFILESWRITER_H
#include "modularity/ioc.h"
#include "io/ifilesystem.h"
#include "global/iglobalconfiguration.h"
#include "types/ret.h"
#include "io/path.h"
namespace mu {
class ZipWriter;
}
namespace mu::diagnostics {
class DiagnosticFilesWriter
{
INJECT_STATIC(diagnostics, io::IFileSystem, fileSystem)
INJECT_STATIC(diagnostics, framework::IGlobalConfiguration, globalConfiguration)
public:
static Ret writeDiagnosticFiles(const io::path_t& destinationZipPath);
private:
static RetVal<io::paths_t> scanDir(const std::string& dirName);
static mu::Ret addFileToZip(const io::path_t& filePath, ZipWriter& zip, const std::string& destinationDirName = std::string());
};
}
#endif // MU_DIAGNOSTICS_DIAGNOSTICFILESWRITER_H

View File

@ -29,6 +29,11 @@ using namespace mu::actions;
using namespace mu::diagnostics;
const UiActionList DiagnosticsActions::m_actions = {
UiAction("diagnostic-save-diagnostic-files",
mu::context::UiCtxAny,
mu::context::CTX_ANY,
TranslatableString("action", "Save diagnostic files")
),
UiAction("diagnostic-show-paths",
mu::context::UiCtxAny,
mu::context::CTX_ANY,

View File

@ -25,8 +25,11 @@
#include "view/diagnosticaccessiblemodel.h"
#include "log.h"
using namespace mu::diagnostics;
using namespace mu::accessibility;
using namespace mu::framework;
static const mu::UriQuery SYSTEM_PATHS_URI("musescore://diagnostics/system/paths?sync=false&modal=false&floating=true");
static const mu::UriQuery PROFILER_URI("musescore://diagnostics/system/profiler?sync=false&modal=false&floating=true");
@ -42,6 +45,7 @@ void DiagnosticsActionsController::init()
dispatcher()->reg(this, "diagnostic-show-accessible-tree", [this]() { openUri(ACCESSIBLE_TREE_URI); });
dispatcher()->reg(this, "diagnostic-accessible-tree-dump", []() { DiagnosticAccessibleModel::dumpTree(); });
dispatcher()->reg(this, "diagnostic-show-engraving-elements", [this]() { openUri(ENGRAVING_ELEMENTS_URI, false); });
dispatcher()->reg(this, "diagnostic-save-diagnostic-files", this, &DiagnosticsActionsController::saveDiagnosticFiles);
}
void DiagnosticsActionsController::openUri(const mu::UriQuery& uri, bool isSingle)
@ -52,3 +56,11 @@ void DiagnosticsActionsController::openUri(const mu::UriQuery& uri, bool isSingl
interactive()->open(uri);
}
void DiagnosticsActionsController::saveDiagnosticFiles()
{
Ret ret = saveDiagnosticsScenario()->saveDiagnosticFiles();
if (!ret) {
LOGE() << ret.toString();
}
}

View File

@ -27,12 +27,14 @@
#include "actions/actionable.h"
#include "iinteractive.h"
#include "accessibility/iaccessibilitycontroller.h"
#include "isavediagnosticfilesscenario.h"
namespace mu::diagnostics {
class DiagnosticsActionsController : public actions::Actionable
{
INJECT(diagnostics, actions::IActionsDispatcher, dispatcher)
INJECT(diagnostics, framework::IInteractive, interactive)
INJECT(diagnostics, diagnostics::ISaveDiagnosticFilesScenario, saveDiagnosticsScenario)
public:
DiagnosticsActionsController() = default;
@ -41,6 +43,7 @@ public:
private:
void openUri(const mu::UriQuery& uri, bool isSingle = true);
void saveDiagnosticFiles();
};
}

View File

@ -27,10 +27,12 @@ using namespace mu::diagnostics;
using namespace mu::framework;
static const Settings::Key IS_DUMP_UPLOAD_ALLOWED("diagnostics", "diagnostics/is_dump_upload_allowed");
static const Settings::Key SHOULD_WARN_BEFORE_SAVING_DIAGNOSTIC_FILES("diagnostics", "diagnostics/shouldWarnBeforeSavingDiagnosticFiles");
void DiagnosticsConfiguration::init()
{
settings()->setDefaultValue(IS_DUMP_UPLOAD_ALLOWED, Val(true));
settings()->setDefaultValue(SHOULD_WARN_BEFORE_SAVING_DIAGNOSTIC_FILES, Val(true));
}
bool DiagnosticsConfiguration::isDumpUploadAllowed() const
@ -42,3 +44,18 @@ void DiagnosticsConfiguration::setIsDumpUploadAllowed(bool val)
{
settings()->setSharedValue(IS_DUMP_UPLOAD_ALLOWED, Val(val));
}
bool DiagnosticsConfiguration::shouldWarnBeforeSavingDiagnosticFiles() const
{
return settings()->value(SHOULD_WARN_BEFORE_SAVING_DIAGNOSTIC_FILES).toBool();
}
void DiagnosticsConfiguration::setShouldWarnBeforeSavingDiagnosticFiles(bool val)
{
settings()->setSharedValue(SHOULD_WARN_BEFORE_SAVING_DIAGNOSTIC_FILES, Val(val));
}
mu::io::path_t DiagnosticsConfiguration::diagnosticFilesDefaultSavingPath() const
{
return globalConfiguration()->homePath();
}

View File

@ -22,16 +22,28 @@
#ifndef MU_DIAGNOSTICS_DIAGNOSTICSCONFIGURATION_H
#define MU_DIAGNOSTICS_DIAGNOSTICSCONFIGURATION_H
#include "idiagnosticsconfiguration.h"
#include "modularity/ioc.h"
#include "iglobalconfiguration.h"
namespace mu::diagnostics {
class DiagnosticsConfiguration
class DiagnosticsConfiguration : public IDiagnosticsConfiguration
{
INJECT(diagnostics, framework::IGlobalConfiguration, globalConfiguration)
public:
DiagnosticsConfiguration() = default;
void init();
bool isDumpUploadAllowed() const;
void setIsDumpUploadAllowed(bool val);
bool isDumpUploadAllowed() const override;
void setIsDumpUploadAllowed(bool val) override;
bool shouldWarnBeforeSavingDiagnosticFiles() const override;
void setShouldWarnBeforeSavingDiagnosticFiles(bool val) override;
io::path_t diagnosticFilesDefaultSavingPath() const override;
};
}

View File

@ -19,25 +19,23 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_AUDIO_IAUDIOBUFFER_H
#define MU_AUDIO_IAUDIOBUFFER_H
#ifndef MU_DIAGNOSTICS_ISAVEDIAGNOSTICFILESSCENARIO_H
#define MU_DIAGNOSTICS_ISAVEDIAGNOSTICFILESSCENARIO_H
#include <memory>
#include "../iaudiosource.h"
#include "modularity/imoduleexport.h"
namespace mu::audio {
class IAudioBuffer
#include "types/ret.h"
namespace mu::diagnostics {
class ISaveDiagnosticFilesScenario : MODULE_EXPORT_INTERFACE
{
INTERFACE_ID(ISaveDiagnosticFilesScenario)
public:
virtual ~IAudioBuffer() = default;
virtual ~ISaveDiagnosticFilesScenario() = default;
virtual void setSource(std::shared_ptr<IAudioSource> source) = 0;
virtual void forward() = 0;
virtual void pop(float* dest, size_t sampleCount) = 0;
virtual void setMinSampleLag(size_t lag) = 0;
virtual mu::Ret saveDiagnosticFiles() = 0;
};
using IAudioBufferPtr = std::shared_ptr<IAudioBuffer>;
}
#endif // MU_AUDIO_IAUDIOBUFFER_H
#endif // MU_DIAGNOSTICS_ISAVEDIAGNOSTICFILESSCENARIO_H

View File

@ -0,0 +1,74 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "savediagnosticfilesscenario.h"
#include "diagnosticfileswriter.h"
#include "translation.h"
#include <QApplication>
using namespace mu::diagnostics;
using namespace mu::framework;
mu::Ret SaveDiagnosticFilesScenario::saveDiagnosticFiles()
{
if (configuration()->shouldWarnBeforeSavingDiagnosticFiles()) {
IInteractive::Result result = interactive()->warning(
trc("diagnostics", "Save diagnostic files?"),
trc("diagnostics", "This will create a .zip file with information about your MuseScore setup "
"to help developers diagnose any problems you are having. "
"You can inspect the contents of this file before sending it to anyone."),
{ IInteractive::Button::Cancel, IInteractive::Button::Save }, IInteractive::Button::Save,
IInteractive::Option::WithIcon | IInteractive::Option::WithDontShowAgainCheckBox);
if (result.standardButton() != IInteractive::Button::Save) {
return make_ret(Ret::Code::Cancel);
}
configuration()->setShouldWarnBeforeSavingDiagnosticFiles(result.showAgain());
}
io::path_t path = interactive()->selectSavingFile(
qtrc("diagnostics", "Save diagnostic files"),
configuration()->diagnosticFilesDefaultSavingPath(),
{ "(*.zip)" });
if (path.empty()) {
return make_ret(Ret::Code::Cancel);
}
qApp->setOverrideCursor(Qt::WaitCursor);
qApp->processEvents();
Ret ret = DiagnosticFilesWriter::writeDiagnosticFiles(path);
qApp->restoreOverrideCursor();
if (!ret) {
return ret;
}
interactive()->revealInFileBrowser(path);
return make_ok();
}

View File

@ -0,0 +1,42 @@
/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef MU_DIAGNOSTICS_SAVEDIAGNOSTICFILESSCENARIO_H
#define MU_DIAGNOSTICS_SAVEDIAGNOSTICFILESSCENARIO_H
#include "isavediagnosticfilesscenario.h"
#include "modularity/ioc.h"
#include "idiagnosticsconfiguration.h"
#include "iinteractive.h"
namespace mu::diagnostics {
class SaveDiagnosticFilesScenario : public ISaveDiagnosticFilesScenario
{
INJECT(diagnostics, diagnostics::IDiagnosticsConfiguration, configuration)
INJECT(diagnostics, framework::IInteractive, interactive)
public:
Ret saveDiagnosticFiles() override;
};
}
#endif // MU_DIAGNOSTICS_SAVEDIAGNOSTICFILESSCENARIO_H

View File

@ -55,7 +55,7 @@ Rectangle {
anchors.verticalCenter: parent.verticalCenter
anchors.margins: 16
clearTextButtonVisible: true
onCurrentTextEdited: function(newTextValue) {
onTextChanged: function(newTextValue) {
profModel.find(newTextValue)
}
}

View File

@ -29,6 +29,7 @@
#include "libmscore/segment.h"
#include "libmscore/chord.h"
#include "libmscore/note.h"
#include "libmscore/bracketItem.h"
#ifndef ENGRAVING_NO_ACCESSIBILITY
#include "accessibility/accessibleitem.h"
@ -44,6 +45,7 @@ DummyElement::DummyElement(EngravingObject* parent)
DummyElement::~DummyElement()
{
delete m_bracketItem;
delete m_note;
delete m_chord;
delete m_segment;
@ -83,6 +85,9 @@ void DummyElement::init()
m_note = Factory::createNote(m_chord);
m_note->setParent(m_chord);
m_bracketItem = Factory::createBracketItem(m_system);
m_bracketItem->setParent(m_system);
}
RootItem* DummyElement::rootItem()
@ -120,6 +125,11 @@ Note* DummyElement::note()
return m_note;
}
BracketItem* DummyElement::bracketItem()
{
return m_bracketItem;
}
EngravingItem* DummyElement::clone() const
{
return nullptr;

View File

@ -48,6 +48,7 @@ public:
Segment* segment();
Chord* chord();
Note* note();
BracketItem* bracketItem();
EngravingItem* clone() const override;
@ -66,6 +67,7 @@ private:
Segment* m_segment = nullptr;
Chord* m_chord = nullptr;
Note* m_note = nullptr;
BracketItem* m_bracketItem = nullptr;
};
}

View File

@ -33,12 +33,11 @@
using namespace mu::io;
using namespace mu::engraving;
Err mu::engraving::compat::mscxToMscz(const String& mscxFilePath, ByteArray* msczData)
mu::Ret mu::engraving::compat::mscxToMscz(const String& mscxFilePath, ByteArray* msczData)
{
File mscxFile(mscxFilePath);
if (!mscxFile.open(IODevice::ReadOnly)) {
LOGE() << "failed open file: " << mscxFilePath;
return Err::FileOpenError;
return make_ret(Err::FileOpenError, mscxFilePath);
}
ByteArray mscxData = mscxFile.readAll();
@ -52,30 +51,27 @@ Err mu::engraving::compat::mscxToMscz(const String& mscxFilePath, ByteArray* msc
writer.open();
writer.writeScoreFile(mscxData);
return Err::NoError;
return make_ok();
}
Err mu::engraving::compat::loadMsczOrMscx(MasterScore* score, const String& path, bool ignoreVersionError)
mu::Ret mu::engraving::compat::loadMsczOrMscx(MasterScore* score, const String& path, bool ignoreVersionError)
{
ByteArray msczData;
if (path.endsWith(u".mscx", mu::CaseInsensitive)) {
//! NOTE Convert mscx -> mscz
Err err = mscxToMscz(path, &msczData);
if (err != Err::NoError) {
return err;
Ret ret = mscxToMscz(path, &msczData);
if (!ret) {
return ret;
}
} else if (path.endsWith(u".mscz", mu::CaseInsensitive)) {
File msczFile(path);
if (!msczFile.open(IODevice::ReadOnly)) {
LOGE() << "failed open file: " << path;
return Err::FileOpenError;
return make_ret(Err::FileOpenError, path);
}
msczData = msczFile.readAll();
} else {
LOGE() << "unknown type, path: " << path;
return Err::FileUnknownType;
return make_ret(Err::FileUnknownType, path);
}
score->setFileInfoProvider(std::make_shared<LocalFileInfoProvider>(path));
@ -90,32 +86,29 @@ Err mu::engraving::compat::loadMsczOrMscx(MasterScore* score, const String& path
reader.open();
ScoreReader scoreReader;
Err err = scoreReader.loadMscz(score, reader, ignoreVersionError);
return err;
return scoreReader.loadMscz(score, reader, ignoreVersionError);
}
Err mu::engraving::compat::loadMsczOrMscx(EngravingProjectPtr project, const String& path, bool ignoreVersionError)
mu::Ret mu::engraving::compat::loadMsczOrMscx(EngravingProjectPtr project, const String& path, bool ignoreVersionError)
{
ByteArray msczData;
String filePath = path;
if (path.endsWith(u".mscx", mu::CaseInsensitive)) {
//! NOTE Convert mscx -> mscz
Err err = mscxToMscz(path, &msczData);
if (err != Err::NoError) {
return err;
Ret ret = mscxToMscz(path, &msczData);
if (!ret) {
return ret;
}
} else if (path.endsWith(u".mscz", mu::CaseInsensitive)) {
File msczFile(path);
if (!msczFile.open(IODevice::ReadOnly)) {
LOGE() << "failed open file: " << path;
return Err::FileOpenError;
return make_ret(Err::FileOpenError, path);
}
msczData = msczFile.readAll();
} else {
LOGE() << "unknown type, path: " << path;
return Err::FileUnknownType;
return make_ret(Err::FileUnknownType, path);
}
project->setFileInfoProvider(std::make_shared<LocalFileInfoProvider>(path));
@ -129,6 +122,5 @@ Err mu::engraving::compat::loadMsczOrMscx(EngravingProjectPtr project, const Str
MscReader reader(params);
reader.open();
Err err = project->loadMscz(reader, ignoreVersionError);
return err;
return project->loadMscz(reader, ignoreVersionError);
}

View File

@ -26,9 +26,9 @@
#include "engravingproject.h"
namespace mu::engraving::compat {
Err mscxToMscz(const String& mscxFilePath, ByteArray* msczData);
Err loadMsczOrMscx(MasterScore* score, const String& path, bool ignoreVersionError = false);
Err loadMsczOrMscx(EngravingProjectPtr project, const String& path, bool ignoreVersionError = false);
Ret mscxToMscz(const String& mscxFilePath, ByteArray* msczData);
Ret loadMsczOrMscx(MasterScore* score, const String& path, bool ignoreVersionError = false);
Ret loadMsczOrMscx(EngravingProjectPtr project, const String& path, bool ignoreVersionError = false);
}
#endif // MU_ENGRAVING_MSCXCOMPAT_H

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<museScore version="4.00">
<Style>
<pageWidth>8.5</pageWidth>
<pageHeight>11</pageHeight>
<pageWidth>8.26772</pageWidth>
<pageHeight>11.6929</pageHeight>
<pagePrintableWidth>7.08661</pagePrintableWidth>
<pageEvenLeftMargin>0.590551</pageEvenLeftMargin>
<pageOddLeftMargin>0.590551</pageOddLeftMargin>

View File

@ -55,6 +55,8 @@ inline Ret make_ret(Err err, const io::path_t& filePath = "")
String text;
switch (err) {
case Err::NoError:
return make_ok();
case Err::FileUnknownError:
text = mtrc("engraving", "Unknown error");
break;
@ -92,7 +94,6 @@ inline Ret make_ret(Err err, const io::path_t& filePath = "")
text = mtrc("engraving", "File \"%1\" is critically corrupted and cannot be processed.").arg(filePath.toString());
break;
case Err::Undefined:
case Err::NoError:
case Err::UnknownError:
case Err::IgnoreError:
case Err::UserAbort:

View File

@ -101,43 +101,38 @@ bool EngravingProject::readOnly() const
return m_masterScore->readOnly();
}
Err EngravingProject::setupMasterScore(bool forceMode)
Ret EngravingProject::setupMasterScore(bool forceMode)
{
TRACEFUNC;
Err err = doSetupMasterScore(m_masterScore, forceMode);
return err;
return doSetupMasterScore(forceMode);
}
Err EngravingProject::doSetupMasterScore(MasterScore* score, bool forceMode)
Ret EngravingProject::doSetupMasterScore(bool forceMode)
{
TRACEFUNC;
score->createPaddingTable();
score->connectTies();
m_masterScore->createPaddingTable();
m_masterScore->connectTies();
for (Part* p : score->parts()) {
for (Part* p : m_masterScore->parts()) {
p->updateHarmonyChannels(false);
}
score->rebuildMidiMapping();
score->setSoloMute();
m_masterScore->rebuildMidiMapping();
m_masterScore->setSoloMute();
for (Score* s : score->scoreList()) {
for (Score* s : m_masterScore->scoreList()) {
s->setPlaylistDirty();
s->addLayoutFlags(LayoutFlag::FIX_PITCH_VELO);
s->setLayoutAll();
}
score->updateChannel();
score->update();
m_masterScore->updateChannel();
m_masterScore->update();
if (!forceMode) {
if (!score->sanityCheck()) {
return Err::FileCorrupted;
}
}
Ret ret = checkCorrupted();
m_isCorruptedUponLoading = !ret;
return Err::NoError;
return forceMode ? make_ok() : ret;
}
MasterScore* EngravingProject::masterScore() const
@ -145,13 +140,12 @@ MasterScore* EngravingProject::masterScore() const
return m_masterScore;
}
Err EngravingProject::loadMscz(const MscReader& msc, bool ignoreVersionError)
Ret EngravingProject::loadMscz(const MscReader& msc, bool ignoreVersionError)
{
TRACEFUNC;
MScore::setError(MsError::MS_NO_ERROR);
ScoreReader scoreReader;
Err err = scoreReader.loadMscz(m_masterScore, msc, ignoreVersionError);
return err;
return scoreReader.loadMscz(m_masterScore, msc, ignoreVersionError);
}
bool EngravingProject::writeMscz(MscWriter& writer, bool onlySelection, bool createThumbnail)
@ -164,3 +158,15 @@ bool EngravingProject::writeMscz(MscWriter& writer, bool onlySelection, bool cre
return ok;
}
bool EngravingProject::isCorruptedUponLoading() const
{
return m_isCorruptedUponLoading;
}
Ret EngravingProject::checkCorrupted() const
{
TRACEFUNC;
return m_masterScore->sanityCheck();
}

View File

@ -65,11 +65,14 @@ public:
bool readOnly() const;
MasterScore* masterScore() const;
Err setupMasterScore(bool forceMode);
Ret setupMasterScore(bool forceMode);
Err loadMscz(const MscReader& msc, bool ignoreVersionError);
Ret loadMscz(const MscReader& msc, bool ignoreVersionError);
bool writeMscz(MscWriter& writer, bool onlySelection, bool createThumbnail);
bool isCorruptedUponLoading() const;
Ret checkCorrupted() const;
private:
friend class MasterScore;
@ -77,9 +80,11 @@ private:
void init(const MStyle& style);
Err doSetupMasterScore(MasterScore* score, bool forceMode);
Ret doSetupMasterScore(bool forceMode);
MasterScore* m_masterScore = nullptr;
bool m_isCorruptedUponLoading = false;
};
using EngravingProjectPtr = std::shared_ptr<EngravingProject>;

View File

@ -48,6 +48,8 @@ public:
virtual io::path_t partStyleFilePath() const = 0;
virtual void setPartStyleFilePath(const io::path_t& path) = 0;
virtual SizeF defaultPageSize() const = 0;
virtual String iconsFontFamily() const = 0;
virtual draw::Color defaultColor() const = 0;

View File

@ -560,7 +560,7 @@ bool SymbolFont::isValid(SymId id) const
bool SymbolFont::useFallbackFont(SymId id) const
{
return MScore::useFallbackFont && !sym(id).isValid() && this != SymbolFonts::fallbackFont();
return MScore::useFallbackFont && !sym(id).isValid() && this != SymbolFonts::fallbackFont(false);
}
// =============================================

View File

@ -52,17 +52,7 @@ SymbolFont* SymbolFonts::fontByName(const String& name)
}
if (!font) {
LOGE() << "ScoreFont not found in list: " << name;
LOGE() << "ScoreFonts in list:";
for (const SymbolFont& f : s_symbolFonts) {
LOGE() << " " << f.name();
}
font = fallbackFont();
LOGE() << "Using fallback font " << font->name() << " instead.";
return font;
return fallbackFont();
}
if (!font->m_loaded) {
@ -92,11 +82,11 @@ void SymbolFonts::setFallbackFont(const String& name)
}
}
SymbolFont* SymbolFonts::fallbackFont()
SymbolFont* SymbolFonts::fallbackFont(bool load)
{
SymbolFont* font = &s_symbolFonts[s_fallback.index];
if (!font->m_loaded) {
if (load && !font->m_loaded) {
font->load();
}

Some files were not shown because too many files have changed in this diff Show More