@@ -285,7 +285,7 @@ struct ModelBox : widget::OpaqueWidget { | |||
void onHoverKey(const HoverKeyEvent& e) override { | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
if (e.key == GLFW_KEY_F1 && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_F1, RACK_MOD_CTRL)) { | |||
system::openBrowser(model->getManualUrl()); | |||
e.consume(this); | |||
} | |||
@@ -799,7 +799,7 @@ struct Browser : widget::OpaqueWidget { | |||
void onHoverKey(const HoverKeyEvent& e) override { | |||
if (e.action == GLFW_PRESS) { | |||
// Secret key command to dump all visible modules into rack | |||
if (e.key == GLFW_KEY_F2 && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT | GLFW_MOD_ALT)) { | |||
if (e.isKeyCommand(GLFW_KEY_F2, RACK_MOD_CTRL | GLFW_MOD_SHIFT | GLFW_MOD_ALT)) { | |||
int count = 0; | |||
for (widget::Widget* w : modelContainer->children) { | |||
ModelBox* mb = dynamic_cast<ModelBox*>(w); | |||
@@ -841,7 +841,7 @@ inline void ClearButton::onAction(const ActionEvent& e) { | |||
inline void BrowserSearchField::onSelectKey(const SelectKeyEvent& e) { | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
// Backspace when the field is empty to clear filters. | |||
if (e.key == GLFW_KEY_BACKSPACE) { | |||
if (e.isKeyCommand(GLFW_KEY_BACKSPACE) || e.isKeyCommand(GLFW_KEY_BACKSPACE, RACK_MOD_CTRL)) { | |||
if (text == "") { | |||
browser->clear(); | |||
e.consume(this); | |||
@@ -315,52 +315,52 @@ void ModuleWidget::onHover(const HoverEvent& e) { | |||
void ModuleWidget::onHoverKey(const HoverKeyEvent& e) { | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
if (e.key == GLFW_KEY_C && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_C, RACK_MOD_CTRL)) { | |||
copyClipboard(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_V && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_V, RACK_MOD_CTRL)) { | |||
if (pasteClipboardAction()) { | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_D && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_D, RACK_MOD_CTRL)) { | |||
cloneAction(false); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_D && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.isKeyCommand(GLFW_KEY_D, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
cloneAction(true); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_I && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_I, RACK_MOD_CTRL)) { | |||
resetAction(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_R && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_R, RACK_MOD_CTRL)) { | |||
randomizeAction(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_U && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_U, RACK_MOD_CTRL)) { | |||
disconnectAction(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_E && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_E, RACK_MOD_CTRL)) { | |||
bypassAction(!module->isBypassed()); | |||
e.consume(this); | |||
} | |||
if ((e.key == GLFW_KEY_DELETE || e.key == GLFW_KEY_BACKSPACE) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_DELETE) || e.isKeyCommand(GLFW_KEY_BACKSPACE)) { | |||
// Deletes `this` | |||
removeAction(); | |||
e.consume(NULL); | |||
return; | |||
} | |||
if (e.key == GLFW_KEY_F1 && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_F1, RACK_MOD_CTRL)) { | |||
std::string manualUrl = model->getManualUrl(); | |||
if (!manualUrl.empty()) | |||
system::openBrowser(manualUrl); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_F4 && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_F4, RACK_MOD_CTRL)) { | |||
APP->scene->rackScroll->zoomToBound(getBox()); | |||
e.consume(this); | |||
} | |||
@@ -33,7 +33,7 @@ struct ParamField : ui::TextField { | |||
} | |||
void onSelectKey(const SelectKeyEvent& e) override { | |||
if (e.action == GLFW_PRESS && (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER)) { | |||
if (e.action == GLFW_PRESS && (e.isKeyCommand(GLFW_KEY_ENTER) || e.isKeyCommand(GLFW_KEY_KP_ENTER))) { | |||
engine::ParamQuantity* pq = paramWidget->getParamQuantity(); | |||
assert(pq); | |||
float oldValue = pq->getValue(); | |||
@@ -170,40 +170,40 @@ void Scene::onDragHover(const DragHoverEvent& e) { | |||
void Scene::onHoverKey(const HoverKeyEvent& e) { | |||
// Key commands that override children | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
// DEBUG("key '%d '%c' scancode %d '%c' keyName '%s'", e.key, e.key, e.scancode, e.scancode, e.keyName.c_str()); | |||
if (e.key == GLFW_KEY_N && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
// DEBUG("key %d '%c' scancode %d keyName '%s'", e.key, e.key, e.scancode, e.keyName.c_str()); | |||
if (e.isKeyCommand(GLFW_KEY_N, RACK_MOD_CTRL)) { | |||
APP->patch->loadTemplateDialog(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_Q && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_Q, RACK_MOD_CTRL)) { | |||
APP->window->close(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_O && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_O, RACK_MOD_CTRL)) { | |||
APP->patch->loadDialog(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_O && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.isKeyCommand(GLFW_KEY_O, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
APP->patch->revertDialog(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_S && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_S, RACK_MOD_CTRL)) { | |||
APP->patch->saveDialog(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_S && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.isKeyCommand(GLFW_KEY_S, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
APP->patch->saveAsDialog(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_Z && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_Z, RACK_MOD_CTRL)) { | |||
APP->history->undo(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_Z && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.isKeyCommand(GLFW_KEY_Z, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
APP->history->redo(); | |||
e.consume(this); | |||
} | |||
if ((e.key == GLFW_KEY_MINUS || e.key == GLFW_KEY_KP_SUBTRACT) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_MINUS, RACK_MOD_CTRL) || e.isKeyCommand(GLFW_KEY_KP_SUBTRACT, RACK_MOD_CTRL)) { | |||
float zoom = std::log2(APP->scene->rackScroll->getZoom()); | |||
zoom *= 2; | |||
zoom = std::ceil(zoom - 0.01f) - 1; | |||
@@ -212,7 +212,7 @@ void Scene::onHoverKey(const HoverKeyEvent& e) { | |||
e.consume(this); | |||
} | |||
// Numpad has a "+" key, but the main keyboard section hides it under "=" | |||
if ((e.key == GLFW_KEY_EQUAL || e.key == GLFW_KEY_KP_ADD) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_EQUAL, RACK_MOD_CTRL) || e.isKeyCommand(GLFW_KEY_KP_ADD, RACK_MOD_CTRL)) { | |||
float zoom = std::log2(APP->scene->rackScroll->getZoom()); | |||
zoom *= 2; | |||
zoom = std::floor(zoom + 0.01f) + 1; | |||
@@ -220,23 +220,23 @@ void Scene::onHoverKey(const HoverKeyEvent& e) { | |||
APP->scene->rackScroll->setZoom(std::pow(2.f, zoom)); | |||
e.consume(this); | |||
} | |||
if ((e.key == GLFW_KEY_0 || e.key == GLFW_KEY_KP_0) && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_0, RACK_MOD_CTRL) || e.isKeyCommand(GLFW_KEY_KP_0, RACK_MOD_CTRL)) { | |||
APP->scene->rackScroll->setZoom(1.f); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_F1 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_F1)) { | |||
system::openBrowser("https://vcvrack.com/manual/"); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_F3 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_F3)) { | |||
settings::cpuMeter ^= true; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_F4 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_F4)) { | |||
APP->scene->rackScroll->zoomToModules(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_F11 && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_F11)) { | |||
APP->window->setFullScreen(!APP->window->isFullScreen()); | |||
// The MenuBar will be hidden when the mouse moves over the RackScrollWidget. | |||
// menuBar->hide(); | |||
@@ -244,57 +244,57 @@ void Scene::onHoverKey(const HoverKeyEvent& e) { | |||
} | |||
// Module selections | |||
if (e.key == GLFW_KEY_A && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_A, RACK_MOD_CTRL)) { | |||
rack->selectAll(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_A && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.isKeyCommand(GLFW_KEY_A, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
rack->deselectAll(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_C && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_C, RACK_MOD_CTRL)) { | |||
if (rack->hasSelection()) { | |||
rack->copyClipboardSelection(); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_I && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_I, RACK_MOD_CTRL)) { | |||
if (rack->hasSelection()) { | |||
rack->resetSelectionAction(); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_R && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_R, RACK_MOD_CTRL)) { | |||
if (rack->hasSelection()) { | |||
rack->randomizeSelectionAction(); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_U && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_U, RACK_MOD_CTRL)) { | |||
if (rack->hasSelection()) { | |||
rack->disconnectSelectionAction(); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_E && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_E, RACK_MOD_CTRL)) { | |||
if (rack->hasSelection()) { | |||
rack->bypassSelectionAction(!rack->isSelectionBypassed()); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_D && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_D, RACK_MOD_CTRL)) { | |||
if (rack->hasSelection()) { | |||
rack->cloneSelectionAction(false); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_D && (e.mods & RACK_MOD_MASK) == (RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (e.isKeyCommand(GLFW_KEY_D, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
if (rack->hasSelection()) { | |||
rack->cloneSelectionAction(true); | |||
e.consume(this); | |||
} | |||
} | |||
if ((e.key == GLFW_KEY_DELETE || e.key == GLFW_KEY_BACKSPACE) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_DELETE) || e.isKeyCommand(GLFW_KEY_BACKSPACE)) { | |||
if (rack->hasSelection()) { | |||
rack->deleteSelectionAction(); | |||
e.consume(this); | |||
@@ -331,17 +331,17 @@ void Scene::onHoverKey(const HoverKeyEvent& e) { | |||
// Key commands that can be overridden by children | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
// Alternative key command for exiting fullscreen, since F11 doesn't work reliably on Mac due to "Show desktop" OS binding. | |||
if (e.key == GLFW_KEY_ESCAPE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_ESCAPE, 0)) { | |||
if (APP->window->isFullScreen()) { | |||
APP->window->setFullScreen(false); | |||
e.consume(this); | |||
} | |||
} | |||
if (e.key == GLFW_KEY_V && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_V, RACK_MOD_CTRL)) { | |||
rack->pasteClipboardAction(); | |||
e.consume(this); | |||
} | |||
if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_ENTER) || e.isKeyCommand(GLFW_KEY_KP_ENTER)) { | |||
browser->show(); | |||
e.consume(this); | |||
} | |||
@@ -133,7 +133,7 @@ struct CcChoice : LedDisplayChoice { | |||
} | |||
void onSelectKey(const SelectKeyEvent& e) override { | |||
if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && e.action == GLFW_PRESS && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.action == GLFW_PRESS && (e.isKeyCommand(GLFW_KEY_ENTER) || e.isKeyCommand(GLFW_KEY_KP_ENTER))) { | |||
DeselectEvent eDeselect; | |||
onDeselect(eDeselect); | |||
APP->event->selectedWidget = NULL; | |||
@@ -235,7 +235,7 @@ struct NoteChoice : LedDisplayChoice { | |||
} | |||
void onSelectKey(const SelectKeyEvent& e) override { | |||
if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && e.action == GLFW_PRESS && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.action == GLFW_PRESS && (e.isKeyCommand(GLFW_KEY_ENTER) || e.isKeyCommand(GLFW_KEY_KP_ENTER))) { | |||
DeselectEvent eDeselect; | |||
onDeselect(eDeselect); | |||
APP->event->selectedWidget = NULL; | |||
@@ -50,7 +50,7 @@ void MenuOverlay::onHoverKey(const HoverKeyEvent& e) { | |||
if (e.isConsumed()) | |||
return; | |||
if (e.action == GLFW_PRESS && e.key == GLFW_KEY_ESCAPE) { | |||
if (e.action == GLFW_PRESS && e.isKeyCommand(GLFW_KEY_ESCAPE)) { | |||
ActionEvent eAction; | |||
onAction(eAction); | |||
} | |||
@@ -178,38 +178,38 @@ void ScrollWidget::onHoverKey(const HoverKeyEvent& e) { | |||
return; | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
if (e.key == GLFW_KEY_PAGE_UP && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_PAGE_UP)) { | |||
offset.y -= box.size.y * 0.5; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_PAGE_UP && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_PAGE_UP, GLFW_MOD_SHIFT)) { | |||
offset.x -= box.size.x * 0.5; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_PAGE_DOWN && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_PAGE_DOWN)) { | |||
offset.y += box.size.y * 0.5; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_PAGE_DOWN && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_PAGE_DOWN, GLFW_MOD_SHIFT)) { | |||
offset.x += box.size.x * 0.5; | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_HOME)) { | |||
math::Rect containerBox = container->getVisibleChildrenBoundingBox(); | |||
offset.y = containerBox.getTop(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_HOME, GLFW_MOD_SHIFT)) { | |||
math::Rect containerBox = container->getVisibleChildrenBoundingBox(); | |||
offset.x = containerBox.getLeft(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_END)) { | |||
math::Rect containerBox = container->getVisibleChildrenBoundingBox(); | |||
offset.y = containerBox.getBottom(); | |||
e.consume(this); | |||
} | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_END, GLFW_MOD_SHIFT)) { | |||
math::Rect containerBox = container->getVisibleChildrenBoundingBox(); | |||
offset.x = containerBox.getRight(); | |||
e.consume(this); | |||
@@ -120,7 +120,7 @@ void TextField::onSelectText(const SelectTextEvent& e) { | |||
void TextField::onSelectKey(const SelectKeyEvent& e) { | |||
if (e.action == GLFW_PRESS || e.action == GLFW_REPEAT) { | |||
// Backspace | |||
if (e.key == GLFW_KEY_BACKSPACE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_BACKSPACE)) { | |||
if (cursor == selection) { | |||
cursor = std::max(cursor - 1, 0); | |||
} | |||
@@ -128,7 +128,7 @@ void TextField::onSelectKey(const SelectKeyEvent& e) { | |||
e.consume(this); | |||
} | |||
// Ctrl+Backspace | |||
if (e.key == GLFW_KEY_BACKSPACE && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_BACKSPACE, RACK_MOD_CTRL)) { | |||
if (cursor == selection) { | |||
cursorToPrevWord(); | |||
} | |||
@@ -136,7 +136,7 @@ void TextField::onSelectKey(const SelectKeyEvent& e) { | |||
e.consume(this); | |||
} | |||
// Delete | |||
if (e.key == GLFW_KEY_DELETE && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_DELETE)) { | |||
if (cursor == selection) { | |||
cursor = std::min(cursor + 1, (int) text.size()); | |||
} | |||
@@ -144,7 +144,7 @@ void TextField::onSelectKey(const SelectKeyEvent& e) { | |||
e.consume(this); | |||
} | |||
// Ctrl+Delete | |||
if (e.key == GLFW_KEY_DELETE && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_DELETE, RACK_MOD_CTRL)) { | |||
if (cursor == selection) { | |||
cursorToNextWord(); | |||
} | |||
@@ -152,81 +152,93 @@ void TextField::onSelectKey(const SelectKeyEvent& e) { | |||
e.consume(this); | |||
} | |||
// Left | |||
if (e.key == GLFW_KEY_LEFT) { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
cursorToPrevWord(); | |||
} | |||
else { | |||
cursor = std::max(cursor - 1, 0); | |||
} | |||
if (!(e.mods & GLFW_MOD_SHIFT)) { | |||
selection = cursor; | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_LEFT)) { | |||
cursor = std::max(cursor - 1, 0); | |||
selection = cursor; | |||
e.consume(this); | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_LEFT, RACK_MOD_CTRL)) { | |||
cursorToPrevWord(); | |||
selection = cursor; | |||
e.consume(this); | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_LEFT, GLFW_MOD_SHIFT)) { | |||
cursor = std::max(cursor - 1, 0); | |||
e.consume(this); | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_LEFT, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
cursorToPrevWord(); | |||
e.consume(this); | |||
} | |||
// Right | |||
if (e.key == GLFW_KEY_RIGHT) { | |||
if ((e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
cursorToNextWord(); | |||
} | |||
else { | |||
cursor = std::min(cursor + 1, (int) text.size()); | |||
} | |||
if (!(e.mods & GLFW_MOD_SHIFT)) { | |||
selection = cursor; | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_RIGHT)) { | |||
cursor = std::min(cursor + 1, (int) text.size()); | |||
selection = cursor; | |||
e.consume(this); | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_RIGHT, RACK_MOD_CTRL)) { | |||
cursorToNextWord(); | |||
selection = cursor; | |||
e.consume(this); | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_RIGHT, GLFW_MOD_SHIFT)) { | |||
cursor = std::min(cursor + 1, (int) text.size()); | |||
e.consume(this); | |||
} | |||
if (e.isKeyCommand(GLFW_KEY_RIGHT, RACK_MOD_CTRL | GLFW_MOD_SHIFT)) { | |||
cursorToNextWord(); | |||
e.consume(this); | |||
} | |||
// Up (placeholder) | |||
if (e.key == GLFW_KEY_UP) { | |||
if (e.isKeyCommand(GLFW_KEY_UP)) { | |||
e.consume(this); | |||
} | |||
// Down (placeholder) | |||
if (e.key == GLFW_KEY_DOWN) { | |||
if (e.isKeyCommand(GLFW_KEY_DOWN)) { | |||
e.consume(this); | |||
} | |||
// Home | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_HOME)) { | |||
selection = cursor = 0; | |||
e.consume(this); | |||
} | |||
// Shift+Home | |||
if (e.key == GLFW_KEY_HOME && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_HOME, GLFW_MOD_SHIFT)) { | |||
cursor = 0; | |||
e.consume(this); | |||
} | |||
// End | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_END)) { | |||
selection = cursor = text.size(); | |||
e.consume(this); | |||
} | |||
// Shift+End | |||
if (e.key == GLFW_KEY_END && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_END, GLFW_MOD_SHIFT)) { | |||
cursor = text.size(); | |||
e.consume(this); | |||
} | |||
// Ctrl+V | |||
if (e.key == GLFW_KEY_V && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_V, RACK_MOD_CTRL)) { | |||
pasteClipboard(); | |||
e.consume(this); | |||
} | |||
// Ctrl+X | |||
if (e.key == GLFW_KEY_X && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_X, RACK_MOD_CTRL)) { | |||
cutClipboard(); | |||
e.consume(this); | |||
} | |||
// Ctrl+C | |||
if (e.key == GLFW_KEY_C && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_C, RACK_MOD_CTRL)) { | |||
copyClipboard(); | |||
e.consume(this); | |||
} | |||
// Ctrl+A | |||
if (e.key == GLFW_KEY_A && (e.mods & RACK_MOD_MASK) == RACK_MOD_CTRL) { | |||
if (e.isKeyCommand(GLFW_KEY_A, RACK_MOD_CTRL)) { | |||
selectAll(); | |||
e.consume(this); | |||
} | |||
// Enter | |||
if ((e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER) && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_ENTER) || e.isKeyCommand(GLFW_KEY_KP_ENTER)) { | |||
if (multiline) { | |||
insertText("\n"); | |||
} | |||
@@ -237,19 +249,19 @@ void TextField::onSelectKey(const SelectKeyEvent& e) { | |||
e.consume(this); | |||
} | |||
// Tab | |||
if (e.key == GLFW_KEY_TAB && (e.mods & RACK_MOD_MASK) == 0) { | |||
if (e.isKeyCommand(GLFW_KEY_TAB)) { | |||
if (nextField) | |||
APP->event->setSelectedWidget(nextField); | |||
e.consume(this); | |||
} | |||
// Shift+Tab | |||
if (e.key == GLFW_KEY_TAB && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||
if (e.isKeyCommand(GLFW_KEY_TAB, GLFW_MOD_SHIFT)) { | |||
if (prevField) | |||
APP->event->setSelectedWidget(prevField); | |||
e.consume(this); | |||
} | |||
// Consume all printable keys unless Ctrl is held | |||
if ((GLFW_KEY_SPACE <= e.key && e.key <= GLFW_KEY_GRAVE_ACCENT) && (e.mods & RACK_MOD_CTRL) == 0) { | |||
if (GLFW_KEY_SPACE <= e.key && e.key < 128 && (e.mods & RACK_MOD_CTRL) == 0) { | |||
e.consume(this); | |||
} | |||