Merge branch 'master' into hsh

# Conflicts:
#	include/amuse/Common.hpp
This commit is contained in:
Luke Street 2021-04-19 01:20:00 -04:00
commit 4e07b3b685
27 changed files with 334 additions and 271 deletions

View File

@ -2,6 +2,10 @@ cmake_minimum_required(VERSION 3.10 FATAL_ERROR) # because of c++17
project(amuse)
if(POLICY CMP0072)
cmake_policy(SET CMP0072 NEW)
endif()
if (NOT MSVC)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@ -81,9 +85,15 @@ target_include_directories(amuse PUBLIC include)
target_link_libraries(amuse PUBLIC
athena-core
lzokay
logvisor
fmt
${ZLIB_LIBRARIES}
)
target_atdna(amuse atdna_AudioGroupPool.cpp include/amuse/AudioGroupPool.hpp)
target_atdna(amuse atdna_AudioGroupProject.cpp include/amuse/AudioGroupProject.hpp)
target_atdna(amuse atdna_AudioGroupSampleDirectory.cpp include/amuse/AudioGroupSampleDirectory.hpp)
if(NX)
target_sources(amuse PRIVATE include/switch_math.hpp)
endif()
@ -157,11 +167,11 @@ if(TARGET boo AND NOT WINDOWS_STORE AND NOT NX)
endif()
# Editor
find_package(Qt5 COMPONENTS Widgets)
if (Qt5Widgets_FOUND)
message(STATUS "Qt5 found, amuse-gui will be built")
find_package(Qt6 COMPONENTS Widgets PATHS /usr/local/opt/qt)
if (Qt6Widgets_FOUND)
message(STATUS "Qt6 found, amuse-gui will be built")
add_subdirectory(Editor)
else()
message(STATUS "Qt5 not found, amuse-gui will not be built")
message(STATUS "Qt6 not found, amuse-gui will not be built")
endif()
endif()

View File

@ -153,9 +153,9 @@ void ADSRView::mousePressEvent(QMouseEvent* ev) {
QPointF((width() - 30.0) * ((adTime + 1.0) / totalTime) + 30.0, sustainY),
};
const qreal dists[] = {
PointDistance(ev->localPos(), points[0]),
PointDistance(ev->localPos(), points[1]),
PointDistance(ev->localPos(), points[2]),
PointDistance(ev->position(), points[0]),
PointDistance(ev->position(), points[1]),
PointDistance(ev->position(), points[2]),
};
int minDist = 0;
@ -196,16 +196,16 @@ void ADSRView::mouseMoveEvent(QMouseEvent* ev) {
qreal totalTime = adTime + 1.0 + relTime;
if (m_dragPoint == 0) {
const qreal newAttack = std::max(0.0, (ev->localPos().x() - 30.0) / (width() - 30.0) * totalTime);
const qreal newAttack = std::max(0.0, (ev->position().x() - 30.0) / (width() - 30.0) * totalTime);
const qreal delta = newAttack - aTime;
ctrls->setAttackAndDecay(newAttack, std::max(0.0, ctrls->m_decay->value() - delta), m_cycleIdx);
} else if (m_dragPoint == 1) {
const qreal newDecay = std::max(0.0, (ev->localPos().x() - 30.0) * totalTime / (width() - 30.0) - aTime);
const qreal newSustain = (-ev->localPos().y() + (height() - 16.0)) / (height() - 16.0);
const qreal newDecay = std::max(0.0, (ev->position().x() - 30.0) * totalTime / (width() - 30.0) - aTime);
const qreal newSustain = (-ev->position().y() + (height() - 16.0)) / (height() - 16.0);
ctrls->setDecayAndSustain(newDecay, newSustain * 100.0, m_cycleIdx);
} else if (m_dragPoint == 2) {
const qreal newRelease =
std::max(0.0, (width() - 30.0) * (adTime + 1.0) / (ev->localPos().x() - 30.0) - (adTime + 1.0));
std::max(0.0, (width() - 30.0) * (adTime + 1.0) / (ev->position().x() - 30.0) - (adTime + 1.0));
ctrls->setRelease(newRelease, m_cycleIdx);
ctrls->m_release->setValue(newRelease);
}

View File

@ -7,13 +7,13 @@ set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5 COMPONENTS LinguistTools Network Qml Svg Widgets Xml REQUIRED)
find_package(Qt6 COMPONENTS LinguistTools Network Qml SvgWidgets Widgets Xml REQUIRED)
configure_file(resources/translation_res.qrc translation_res.qrc @ONLY)
set(TRANSLATIONS
resources/lang_de.ts
)
QT5_CREATE_TRANSLATION(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../lib ${TRANSLATIONS})
QT6_CREATE_TRANSLATION(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../lib ${TRANSLATIONS})
add_executable(amuse-gui WIN32 MACOSX_BUNDLE
ADSREditor.cpp
@ -137,11 +137,11 @@ set_target_properties(amuse-gui PROPERTIES
target_link_libraries(amuse-gui
${PLAT_LIBS}
Qt5::Network
Qt5::Qml
Qt5::Svg
Qt5::Widgets
Qt5::Xml
Qt6::Network
Qt6::Qml
Qt6::SvgWidgets
Qt6::Widgets
Qt6::Xml
amuse
athena-core

View File

@ -73,8 +73,8 @@ void ShowInGraphicalShell(QWidget* parent, const QString& pathIn) {
// we cannot select a file here, because no file browser really supports it...
const QString folder = fileInfo.isDir() ? fileInfo.absoluteFilePath() : fileInfo.filePath();
QProcess browserProc;
const QString browserArgs = QStringLiteral("xdg-open \"%1\"").arg(QFileInfo(folder).path());
browserProc.startDetached(browserArgs);
const QStringList browserArgs = QStringList() << QStringLiteral("%1").arg(QFileInfo(folder).path());
browserProc.startDetached(QStringLiteral("xdg-open"), browserArgs);
#endif
}

View File

@ -137,11 +137,11 @@ void CurveView::mouseMoveEvent(QMouseEvent* ev) {
}
const qreal xIncrement = (width() - 30.0) / 127.0;
const int idx = int(std::round((ev->localPos().x() - 30.0) / xIncrement));
const int idx = int(std::round((ev->position().x() - 30.0) / xIncrement));
if (idx < 0 || idx > 127) {
return;
}
const int val = 127 - std::clamp(0, int(std::round(ev->localPos().y() / (height() - 16.0) * 127.0)), 127);
const int val = 127 - std::clamp(0, int(std::round(ev->position().y() / (height() - 16.0) * 127.0)), 127);
CurveEditUndoCommand::RedoData newData;
auto& curve = static_cast<amuse::Curve&>(table);

View File

@ -226,7 +226,7 @@ AddRemoveButtons::AddRemoveButtons(QWidget* parent)
static QIcon ListingDeleteIcon;
static QIcon ListingDeleteHoveredIcon;
void ListingDeleteButton::enterEvent(QEvent* event) { setIcon(ListingDeleteHoveredIcon); }
void ListingDeleteButton::enterEvent(QEnterEvent* event) { setIcon(ListingDeleteHoveredIcon); }
void ListingDeleteButton::leaveEvent(QEvent* event) { setIcon(ListingDeleteIcon); }
@ -264,7 +264,7 @@ bool BaseObjectDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, c
connect(findUsagesAction, &QAction::triggered, this, &BaseObjectDelegate::doFindUsages);
menu->addAction(findUsagesAction);
menu->popup(ev->globalPos());
menu->popup(ev->globalPosition().toPoint());
}
}
return false;

View File

@ -229,7 +229,7 @@ class ListingDeleteButton : public QPushButton {
Q_OBJECT
public:
explicit ListingDeleteButton(QWidget* parent = Q_NULLPTR);
void enterEvent(QEvent* event) override;
void enterEvent(QEnterEvent* event) override;
void leaveEvent(QEvent* event) override;
};

View File

@ -39,7 +39,7 @@ KeyboardOctave::KeyboardOctave(int octave, const QString& svgPath, QWidget* pare
const auto& naturalKeyName = NaturalKeyNames[i];
if (renderer()->elementExists(naturalKeyName)) {
m_natural[i] = renderer()->matrixForElement(naturalKeyName).mapRect(renderer()->boundsOnElement(naturalKeyName));
m_natural[i] = renderer()->transformForElement(naturalKeyName).mapRect(renderer()->boundsOnElement(naturalKeyName));
}
}
@ -47,7 +47,7 @@ KeyboardOctave::KeyboardOctave(int octave, const QString& svgPath, QWidget* pare
const auto& sharpKeyName = SharpKeyNames[i];
if (renderer()->elementExists(sharpKeyName)) {
m_sharp[i] = renderer()->matrixForElement(sharpKeyName).mapRect(renderer()->boundsOnElement(sharpKeyName));
m_sharp[i] = renderer()->transformForElement(sharpKeyName).mapRect(renderer()->boundsOnElement(sharpKeyName));
}
}
@ -151,7 +151,7 @@ void KeyboardWidget::mouseReleaseEvent(QMouseEvent* event) {
m_holding = false;
}
void KeyboardWidget::enterEvent(QEvent* event) {
void KeyboardWidget::enterEvent(QEnterEvent* event) {
if (m_statusFocus)
m_statusFocus->enter();
}
@ -179,7 +179,7 @@ KeyboardSlider::KeyboardSlider(QWidget* parent) : QSlider(parent) {}
KeyboardSlider::~KeyboardSlider() = default;
void KeyboardSlider::enterEvent(QEvent* event) {
void KeyboardSlider::enterEvent(QEnterEvent* event) {
if (m_statusFocus)
m_statusFocus->enter();
}

View File

@ -54,7 +54,7 @@ public:
void mouseMoveEvent(QMouseEvent* event) override;
void mousePressEvent(QMouseEvent* event) override;
void mouseReleaseEvent(QMouseEvent* event) override;
void enterEvent(QEvent* event) override;
void enterEvent(QEnterEvent* event) override;
void leaveEvent(QEvent* event) override;
void wheelEvent(QWheelEvent* event) override;
void showEvent(QShowEvent* event) override;
@ -74,7 +74,7 @@ public:
explicit KeyboardSlider(QWidget* parent = Q_NULLPTR);
~KeyboardSlider() override;
void enterEvent(QEvent* event) override;
void enterEvent(QEnterEvent* event) override;
void leaveEvent(QEvent* event) override;
void setStatusFocus(StatusBarFocus* statusFocus);
void sliderChange(SliderChange change) override;

View File

@ -138,7 +138,7 @@ int KeymapView::getKey(const QPoint& localPos) const {
}
void KeymapView::mouseMoveEvent(QMouseEvent* ev) {
const int octave = ev->x() / 280;
const int octave = ev->position().x() / 280;
const int key = getKey(ev->pos() - QPoint(octave * 280, height() / 2 - 100));
if (octave >= 0 && key >= 0) {
@ -174,7 +174,7 @@ KeymapView::KeymapView(QWidget* parent)
if (m_octaveRenderer.elementExists(naturalKeyName)) {
m_natural[i] =
m_octaveRenderer.matrixForElement(naturalKeyName).mapRect(m_octaveRenderer.boundsOnElement(naturalKeyName));
m_octaveRenderer.transformForElement(naturalKeyName).mapRect(m_octaveRenderer.boundsOnElement(naturalKeyName));
}
}
@ -183,7 +183,7 @@ KeymapView::KeymapView(QWidget* parent)
if (m_octaveRenderer.elementExists(sharpKeyName)) {
m_sharp[i] =
m_octaveRenderer.matrixForElement(sharpKeyName).mapRect(m_octaveRenderer.boundsOnElement(sharpKeyName));
m_octaveRenderer.transformForElement(sharpKeyName).mapRect(m_octaveRenderer.boundsOnElement(sharpKeyName));
}
}

View File

@ -519,7 +519,7 @@ void LayersTableView::deleteSelection() {
std::vector<std::pair<amuse::LayerMapping, int>> data;
data.reserve(list.size());
for (const QModelIndex idx : list) {
for (const QModelIndex& idx : list) {
data.emplace_back(amuse::LayerMapping{}, idx.row());
}

View File

@ -29,6 +29,8 @@
#include <amuse/Engine.hpp>
#include <boo/audiodev/IAudioVoiceEngine.hpp>
#include <cmath>
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
, m_navIt(m_navList.begin())
@ -261,7 +263,7 @@ void MainWindow::updateWindowTitle() {
void MainWindow::updateRecentFileActions() {
const QSettings settings;
const QStringList files = settings.value(QStringLiteral("recentFileList")).toStringList();
const int numRecentFiles = std::min(files.size(), int(MaxRecentFiles));
const int numRecentFiles = std::min(files.size(), qsizetype(MaxRecentFiles));
for (int i = 0; i < numRecentFiles; ++i) {
const QString text = QStringLiteral("&%1 %2").arg(i + 1).arg(QDir(files[i]).dirName());
@ -519,8 +521,9 @@ bool MainWindow::_setEditor(EditorWidget* editor, bool appendNav) {
m_interactiveSeq.reset();
if (editor != m_ui.editorContents->currentWidget() && m_ui.editorContents->currentWidget() != m_faceSvg)
getEditorWidget()->unloadData();
if (appendNav && m_navIt != m_navList.end())
m_navList.erase(m_navIt + 1, m_navList.end());
if (appendNav && m_navIt != m_navList.end()) {
m_navList.erase(std::next(m_navIt, 1), m_navList.end());
}
if (!editor || !editor->valid()) {
m_ui.editorContents->setCurrentWidget(m_faceSvg);
updateWindowTitle();
@ -1189,7 +1192,7 @@ bool TreeDelegate::editorEvent(QEvent* event, QAbstractItemModel* __model, const
connect(renameAction, &QAction::triggered, this, &TreeDelegate::doRename);
menu->addAction(renameAction);
menu->popup(ev->globalPos());
menu->popup(ev->globalPosition().toPoint());
}
}
@ -1484,12 +1487,12 @@ void MainWindow::newLayersAction() {
}
void MainWindow::updateNavigationButtons() {
m_goForward->setDisabled(m_navIt == m_navList.end() || m_navIt + 1 == m_navList.end());
m_goForward->setDisabled(m_navIt == m_navList.end() || std::next(m_navIt, 1) == m_navList.end());
m_goBack->setDisabled(m_navIt == m_navList.begin());
}
void MainWindow::goForward() {
if (m_navIt == m_navList.end() || m_navIt + 1 == m_navList.end())
if (m_navIt == m_navList.end() || std::next(m_navIt, 1) == m_navList.end())
return;
++m_navIt;
openEditor(*m_navIt, false);

View File

@ -5,7 +5,6 @@
#include <memory>
#include <QFileDialog>
#include <QLinkedList>
#include <QMainWindow>
#include <QMessageBox>
#include <QStyledItemDelegate>
@ -113,8 +112,8 @@ class MainWindow : public QMainWindow {
Ui::MainWindow m_ui;
QAction* m_goBack;
QAction* m_goForward;
QLinkedList<ProjectModel::INode*> m_navList;
QLinkedList<ProjectModel::INode*>::iterator m_navIt;
std::list<ProjectModel::INode*> m_navList;
std::list<ProjectModel::INode*>::iterator m_navIt;
QAction* m_clearRecentFileAct;
QAction* m_recentFileActs[MaxRecentFiles];
TreeDelegate m_treeDelegate;

View File

@ -22,7 +22,7 @@ QIcon ProjectModel::SongGroupNode::Icon;
QIcon ProjectModel::SoundGroupNode::Icon;
OutlineFilterProxyModel::OutlineFilterProxyModel(ProjectModel* source)
: QSortFilterProxyModel(source), m_usageKey({}, Qt::CaseInsensitive) {
: QSortFilterProxyModel(source), m_usageKey({}, QRegularExpression::CaseInsensitiveOption) {
setSourceModel(source);
setRecursiveFilteringEnabled(true);
setFilterCaseSensitivity(Qt::CaseInsensitive);
@ -31,10 +31,10 @@ OutlineFilterProxyModel::OutlineFilterProxyModel(ProjectModel* source)
void OutlineFilterProxyModel::setFilterRegExp(const QString& pattern) {
if (pattern.startsWith(QStringLiteral("usages:"))) {
m_usageKey.setPattern(pattern.mid(7));
QSortFilterProxyModel::setFilterRegExp(QString());
QSortFilterProxyModel::setFilterRegularExpression(QString());
} else {
m_usageKey.setPattern(QString());
QSortFilterProxyModel::setFilterRegExp(pattern);
QSortFilterProxyModel::setFilterRegularExpression(pattern);
}
}
@ -498,8 +498,12 @@ ProjectModel::BasePoolObjectNode* ProjectModel::CollectionNode::nodeOfId(amuse::
}
ProjectModel::ProjectModel(const QString& path, QObject* parent)
: QAbstractItemModel(parent), m_dir(path), m_outlineProxy(this), m_nullProxy(this), m_pageObjectProxy(this) {
m_root = amuse::MakeObj<RootNode>();
: QAbstractItemModel(parent)
, m_dir(path)
, m_root(amuse::MakeObj<RootNode>())
, m_outlineProxy(this)
, m_nullProxy(this)
, m_pageObjectProxy(this) {
GroupNode::Icon = QIcon(QStringLiteral(":/icons/IconGroup.svg"));
SongGroupNode::Icon = QIcon(QStringLiteral(":/icons/IconSongGroup.svg"));

View File

@ -38,7 +38,7 @@ enum AmuseItemEditFlags {
class OutlineFilterProxyModel : public QSortFilterProxyModel {
Q_OBJECT
QRegExp m_usageKey;
QRegularExpression m_usageKey;
public:
explicit OutlineFilterProxyModel(ProjectModel* source);
@ -91,10 +91,6 @@ public:
private:
QDir m_dir;
OutlineFilterProxyModel m_outlineProxy;
NullItemProxyModel m_nullProxy;
PageObjectProxyModel m_pageObjectProxy;
amuse::ProjectDatabase m_projectDatabase;
std::unordered_map<QString, std::unique_ptr<amuse::AudioGroupDatabase>> m_groups;
@ -380,6 +376,11 @@ public:
QString MakeDedupedSubprojectName(const QString& origName);
static QString MakeDedupedName(const QString& origName, amuse::NameDB* db);
private:
OutlineFilterProxyModel m_outlineProxy;
NullItemProxyModel m_nullProxy;
PageObjectProxyModel m_pageObjectProxy;
public:
explicit ProjectModel(const QString& path, QObject* parent = Q_NULLPTR);
~ProjectModel() override;

View File

@ -390,7 +390,7 @@ bool MIDIFileDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, con
connect(sngAction, &QAction::triggered, this, &MIDIFileDelegate::doExportSNG);
menu->addAction(sngAction);
menu->popup(ev->globalPos());
menu->popup(ev->globalPosition().toPoint());
}
}
return false;
@ -1172,7 +1172,7 @@ void PageTableView::deleteSelection() {
std::vector<std::pair<uint8_t, amuse::SongGroupIndex::PageEntry>> data;
data.reserve(list.size());
for (const QModelIndex idx : list) {
for (const QModelIndex& idx : list) {
data.emplace_back(model()->data(idx).toInt() - 1, amuse::SongGroupIndex::PageEntry{});
}

View File

@ -243,7 +243,7 @@ CommandWidget::CommandWidget(QWidget* parent, amuse::SoundMacro::ICmd* cmd, amus
cb->setFixedHeight(30);
cb->setProperty("fieldIndex", f);
cb->setProperty("fieldName", fieldName);
for (const auto choice : field.m_choices) {
for (const auto& choice : field.m_choices) {
if (choice.empty()) {
break;
}
@ -514,7 +514,10 @@ void SoundMacroListing::startAutoscroll(QWidget* source, QMouseEvent* event, int
m_autoscrollTimer = startTimer(50);
m_autoscrollDelta = delta;
m_autoscrollSource = source;
m_autoscrollEvent = *event;
if (m_autoscrollEvent) {
delete m_autoscrollEvent;
}
m_autoscrollEvent = event->clone();
}
void SoundMacroListing::stopAutoscroll() {
@ -523,6 +526,9 @@ void SoundMacroListing::stopAutoscroll() {
m_autoscrollTimer = -1;
}
m_autoscrollDelta = 0;
if (m_autoscrollEvent) {
delete m_autoscrollEvent;
}
m_autoscrollSource = nullptr;
}
@ -534,7 +540,7 @@ void SoundMacroListing::timerEvent(QTimerEvent* event) {
int valueDelta = bar->value() - oldValue;
if (valueDelta != 0) {
if (m_autoscrollSource)
QApplication::sendEvent(m_autoscrollSource, &m_autoscrollEvent);
QApplication::sendEvent(m_autoscrollSource, m_autoscrollEvent);
update();
}
}
@ -811,7 +817,7 @@ CatalogueItem::CatalogueItem(amuse::SoundMacro::CmdOp op, const QString& name, c
CatalogueItem::CatalogueItem(const CatalogueItem& other, QWidget* parent) : QWidget(parent), m_op(other.getCmdOp()) {
QHBoxLayout* layout = new QHBoxLayout;
QHBoxLayout* oldLayout = static_cast<QHBoxLayout*>(other.layout());
m_iconLab.setPixmap(*static_cast<QLabel*>(oldLayout->itemAt(0)->widget())->pixmap());
m_iconLab.setPixmap(static_cast<QLabel*>(oldLayout->itemAt(0)->widget())->pixmap(Qt::ReturnByValue));
layout->addWidget(&m_iconLab);
m_label.setText(static_cast<QLabel*>(oldLayout->itemAt(1)->widget())->text());
layout->addWidget(&m_label);

View File

@ -115,7 +115,7 @@ class SoundMacroListing : public QWidget {
int m_autoscrollTimer = -1;
int m_autoscrollDelta = 0;
QWidget* m_autoscrollSource = nullptr;
QMouseEvent m_autoscrollEvent = {{}, {}, {}, {}, {}};
QMouseEvent* m_autoscrollEvent = nullptr;
void startAutoscroll(QWidget* source, QMouseEvent* event, int delta);
void stopAutoscroll();
bool beginDrag(CommandWidget* widget);

View File

@ -496,7 +496,10 @@ void EffectListing::startAutoscroll(QWidget* source, QMouseEvent* event, int del
m_autoscrollTimer = startTimer(50);
m_autoscrollDelta = delta;
m_autoscrollSource = source;
m_autoscrollEvent = *event;
if (m_autoscrollEvent != nullptr) {
delete m_autoscrollEvent;
}
m_autoscrollEvent = event->clone();
}
void EffectListing::stopAutoscroll() {
@ -505,6 +508,9 @@ void EffectListing::stopAutoscroll() {
m_autoscrollTimer = -1;
}
m_autoscrollDelta = 0;
if (m_autoscrollEvent != nullptr) {
delete m_autoscrollEvent;
}
m_autoscrollSource = nullptr;
}
@ -516,7 +522,7 @@ void EffectListing::timerEvent(QTimerEvent* event) {
int valueDelta = bar->value() - oldValue;
if (valueDelta != 0) {
if (m_autoscrollSource)
QApplication::sendEvent(m_autoscrollSource, &m_autoscrollEvent);
QApplication::sendEvent(m_autoscrollSource, m_autoscrollEvent);
update();
}
}
@ -740,7 +746,7 @@ EffectCatalogueItem::EffectCatalogueItem(const EffectCatalogueItem& other, QWidg
: QWidget(parent), m_type(other.getType()) {
QHBoxLayout* layout = new QHBoxLayout;
QHBoxLayout* oldLayout = static_cast<QHBoxLayout*>(other.layout());
m_iconLab.setPixmap(*static_cast<QLabel*>(oldLayout->itemAt(0)->widget())->pixmap());
m_iconLab.setPixmap(static_cast<QLabel*>(oldLayout->itemAt(0)->widget())->pixmap(Qt::ReturnByValue));
layout->addWidget(&m_iconLab);
m_label.setText(static_cast<QLabel*>(oldLayout->itemAt(1)->widget())->text());
layout->addWidget(&m_label);

View File

@ -126,7 +126,7 @@ class EffectListing : public QWidget {
int m_autoscrollTimer = -1;
int m_autoscrollDelta = 0;
QWidget* m_autoscrollSource = nullptr;
QMouseEvent m_autoscrollEvent = {{}, {}, {}, {}, {}};
QMouseEvent* m_autoscrollEvent = nullptr;
void startAutoscroll(QWidget* source, QMouseEvent* event, int delta);
void stopAutoscroll();
bool beginDrag(EffectWidget* widget);

View File

@ -56,7 +56,7 @@ MainWindow* g_MainWindow = nullptr;
int main(int argc, char* argv[]) {
QApplication::setAttribute(Qt::AA_Use96Dpi);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
#endif

View File

@ -1,6 +1,6 @@
include_directories(${LIBPNG_INCLUDE_DIR})
add_executable(amuse-mkqticon mkqticon.c)
target_link_libraries(amuse-mkqticon ${PNG_LIB} ${ZLIB_LIBRARIES})
target_link_libraries(amuse-mkqticon ${PNG_LIBRARIES} ${ZLIB_LIBRARIES})
target_include_directories(amuse-mkqticon PRIVATE ${PNG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR})
macro(declare_qticon_target)
add_custom_command(OUTPUT ${amuse_BINARY_DIR}/Editor/platforms/freedesktop/mainicon_qt.bin

File diff suppressed because it is too large Load Diff

View File

@ -15,6 +15,13 @@
#include "amuse/Studio.hpp"
namespace amuse {
constexpr float convertMusyXPanToAmusePan(uint32_t pan) {
// Amuse expects pan values to be between [-1,1] while MusyX expects pan to be between [0,127], we need to make sure
// to map the values properly, we do this by subtracting the center value and then dividing, thus forcing [0, 127] into
// [-1,1], we must also make sure clamp the result so we don't over or underflow.
return std::clamp(static_cast<float>(pan - 64) / 63.f, -1.f, 1.f);
}
class IBackendVoice;
struct Keymap;
struct LayerMapping;

View File

@ -57,8 +57,11 @@ static void ReadRangedObjectIds(NameDB* db, athena::io::IStreamReader& r, NameDB
template <athena::Endian DNAE, class T>
static void WriteRangedObjectIds(athena::io::IStreamWriter& w, const T& list) {
if (list.cbegin() == list.cend())
if (list.cbegin() == list.cend()) {
uint16_t term = 0xffff;
athena::io::Write<athena::io::PropType::None>::Do<decltype(term), DNAE>({}, term, w);
return;
}
bool inRange = false;
uint16_t lastId = list.cbegin()->first.id & 0x3fff;
for (auto it = list.cbegin() + 1; it != list.cend(); ++it) {

View File

@ -105,8 +105,16 @@ void Emitter::_update() {
void Emitter::setVectors(const float* pos, const float* dir) {
for (size_t i = 0; i < m_pos.size(); ++i) {
m_pos[i] = pos[i];
m_dir[i] = dir[i];
if (!std::isnan(pos[i])) {
m_pos[i] = pos[i];
} else {
m_pos[i] = 0.f;
}
if (!std::isnan(dir[i])) {
m_dir[i] = dir[i];
} else {
m_dir[i] = 0.f;
}
}
m_dirty = true;
}

View File

@ -12,10 +12,26 @@ static constexpr Vector3f Cross(const Vector3f& a, const Vector3f& b) {
void Listener::setVectors(const float* pos, const float* dir, const float* heading, const float* up) {
for (int i = 0; i < 3; ++i) {
m_pos[i] = pos[i];
m_dir[i] = dir[i];
m_heading[i] = heading[i];
m_up[i] = up[i];
if (!std::isnan(pos[i])) {
m_pos[i] = pos[i];
} else {
m_pos[i] = 0.f;
}
if (!std::isnan(dir[i])) {
m_dir[i] = dir[i];
} else {
m_dir[i] = 0.f;
}
if (!std::isnan(heading[i])) {
m_heading[i] = heading[i];
} else {
m_heading[i] = 0.f;
}
if (std::isnan(up[i])) {
m_up[i] = up[i];
} else {
m_heading[i] = 0.f;
}
}
m_heading = Normalize(m_heading);