@@ -16,6 +16,7 @@ SED := perl -pi -e | |||||
SOURCES += dep/nanovg/src/nanovg.c | SOURCES += dep/nanovg/src/nanovg.c | ||||
SOURCES += dep/osdialog/osdialog.c | SOURCES += dep/osdialog/osdialog.c | ||||
SOURCES += dep/oui-blendish/blendish.c | |||||
SOURCES += dep/pffft/pffft.c dep/pffft/fftpack.c | SOURCES += dep/pffft/pffft.c dep/pffft/fftpack.c | ||||
SOURCES += $(wildcard src/*.c src/*/*.c) | SOURCES += $(wildcard src/*.c src/*/*.c) | ||||
SOURCES += $(wildcard src/*.cpp src/*/*.cpp) | SOURCES += $(wildcard src/*.cpp src/*/*.cpp) | ||||
@@ -130,7 +131,7 @@ valgrind: $(STANDALONE_TARGET) | |||||
valgrind --suppressions=valgrind.supp ./$< -d | valgrind --suppressions=valgrind.supp ./$< -d | ||||
clean: | clean: | ||||
rm -rfv $(TARGET) $(STANDALONE_TARGET) libRack.dll.a Rack.res build dist *.d | |||||
rm -rfv build dist *.a Rack.res *.d $(TARGET) $(STANDALONE_TARGET) | |||||
# For Windows resources | # For Windows resources | ||||
@@ -1 +1 @@ | |||||
Subproject commit 910847b53396fd394e5fa25c3430caea02a3fe70 | |||||
Subproject commit 008cceaa10d18661129fb94b2b678c1827c04cd3 |
@@ -19,6 +19,11 @@ struct TextField : widget::OpaqueWidget { | |||||
*/ | */ | ||||
int selection = 0; | int selection = 0; | ||||
/** For Tab and Shift-Tab focusing. | |||||
*/ | |||||
Widget* prevField = NULL; | |||||
Widget* nextField = NULL; | |||||
TextField(); | TextField(); | ||||
void draw(const DrawArgs& args) override; | void draw(const DrawArgs& args) override; | ||||
void onDragHover(const DragHoverEvent& e) override; | void onDragHover(const DragHoverEvent& e) override; | ||||
@@ -608,31 +608,10 @@ struct EngineButton : MenuButton { | |||||
static bool isLoggingIn = false; | static bool isLoggingIn = false; | ||||
struct AccountEmailField : ui::TextField { | |||||
ui::TextField* passwordField; | |||||
void onSelectKey(const SelectKeyEvent& e) override { | |||||
if (e.action == GLFW_PRESS && e.key == GLFW_KEY_TAB) { | |||||
APP->event->setSelected(passwordField); | |||||
e.consume(this); | |||||
} | |||||
if (!e.getTarget()) | |||||
ui::TextField::onSelectKey(e); | |||||
} | |||||
}; | |||||
struct AccountPasswordField : ui::PasswordField { | |||||
struct AccountPasswordField : ui::TextField { | |||||
ui::MenuItem* logInItem; | ui::MenuItem* logInItem; | ||||
void onSelectKey(const SelectKeyEvent& e) override { | |||||
if (e.action == GLFW_PRESS && (e.key == GLFW_KEY_ENTER || e.key == GLFW_KEY_KP_ENTER)) { | |||||
logInItem->doAction(); | |||||
e.consume(this); | |||||
} | |||||
if (!e.getTarget()) | |||||
ui::PasswordField::onSelectKey(e); | |||||
void onAction(const ActionEvent& e) override { | |||||
logInItem->doAction(); | |||||
} | } | ||||
}; | }; | ||||
@@ -802,7 +781,7 @@ struct LibraryMenu : ui::Menu { | |||||
registerItem->url = "https://vcvrack.com/login"; | registerItem->url = "https://vcvrack.com/login"; | ||||
addChild(registerItem); | addChild(registerItem); | ||||
AccountEmailField* emailField = new AccountEmailField; | |||||
ui::TextField* emailField = new ui::TextField; | |||||
emailField->placeholder = "Email"; | emailField->placeholder = "Email"; | ||||
emailField->box.size.x = 240.0; | emailField->box.size.x = 240.0; | ||||
addChild(emailField); | addChild(emailField); | ||||
@@ -810,7 +789,8 @@ struct LibraryMenu : ui::Menu { | |||||
AccountPasswordField* passwordField = new AccountPasswordField; | AccountPasswordField* passwordField = new AccountPasswordField; | ||||
passwordField->placeholder = "Password"; | passwordField->placeholder = "Password"; | ||||
passwordField->box.size.x = 240.0; | passwordField->box.size.x = 240.0; | ||||
emailField->passwordField = passwordField; | |||||
passwordField->nextField = emailField; | |||||
emailField->nextField = passwordField; | |||||
addChild(passwordField); | addChild(passwordField); | ||||
LogInItem* logInItem = new LogInItem; | LogInItem* logInItem = new LogInItem; | ||||
@@ -7,7 +7,7 @@ namespace ui { | |||||
Label::Label() { | Label::Label() { | ||||
box.size.y = BND_WIDGET_HEIGHT; | box.size.y = BND_WIDGET_HEIGHT; | ||||
fontSize = 13; | |||||
fontSize = BND_LABEL_FONT_SIZE; | |||||
lineHeight = 1.2; | lineHeight = 1.2; | ||||
color = bndGetTheme()->regularTheme.textColor; | color = bndGetTheme()->regularTheme.textColor; | ||||
} | } | ||||
@@ -6,9 +6,6 @@ namespace rack { | |||||
namespace ui { | namespace ui { | ||||
#define BND_LABEL_FONT_SIZE 13 | |||||
void MenuItem::draw(const DrawArgs& args) { | void MenuItem::draw(const DrawArgs& args) { | ||||
BNDwidgetState state = BND_DEFAULT; | BNDwidgetState state = BND_DEFAULT; | ||||
@@ -220,6 +220,18 @@ void TextField::onSelectKey(const SelectKeyEvent& e) { | |||||
} | } | ||||
e.consume(this); | e.consume(this); | ||||
} | } | ||||
// Tab | |||||
if (e.key == GLFW_KEY_TAB && (e.mods & RACK_MOD_MASK) == 0) { | |||||
if (nextField) | |||||
APP->event->setSelected(nextField); | |||||
e.consume(this); | |||||
} | |||||
// Shift-Tab | |||||
if (e.key == GLFW_KEY_TAB && (e.mods & RACK_MOD_MASK) == GLFW_MOD_SHIFT) { | |||||
if (prevField) | |||||
APP->event->setSelected(prevField); | |||||
e.consume(this); | |||||
} | |||||
// Consume all printable keys | // Consume all printable keys | ||||
if (e.keyName != "") { | if (e.keyName != "") { | ||||
e.consume(this); | e.consume(this); | ||||