themtags/v0.5.0
@@ -366,6 +366,7 @@ struct RackScene : Scene { | |||||
void step() override; | void step() override; | ||||
void draw(NVGcontext *vg) override; | void draw(NVGcontext *vg) override; | ||||
Widget *onHoverKey(Vec pos, int key) override; | Widget *onHoverKey(Vec pos, int key) override; | ||||
bool onPathDrop(Vec pos, const std::list<std::string>& paths) override; | |||||
}; | }; | ||||
//////////////////// | //////////////////// | ||||
@@ -147,6 +147,7 @@ struct Widget { | |||||
virtual void onDragEnter(Widget *origin) {} | virtual void onDragEnter(Widget *origin) {} | ||||
virtual void onDragLeave(Widget *origin) {} | virtual void onDragLeave(Widget *origin) {} | ||||
virtual void onDragDrop(Widget *origin) {} | virtual void onDragDrop(Widget *origin) {} | ||||
virtual bool onPathDrop(Vec pos, const std::list<std::string>& paths); | |||||
virtual void onAction() {} | virtual void onAction() {} | ||||
virtual void onChange() {} | virtual void onChange() {} | ||||
@@ -118,5 +118,17 @@ Widget *RackScene::onHoverKey(Vec pos, int key) { | |||||
} | } | ||||
bool RackScene::onPathDrop(Vec pos, const std::list<std::string>& paths) { | |||||
if (paths.size() >= 1) { | |||||
const std::string& firstPath = paths.front(); | |||||
if (extractExtension(firstPath) == "vcv") { | |||||
gRackWidget->loadPatch(firstPath); | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
} // namespace rack | } // namespace rack |
@@ -203,7 +203,7 @@ void charCallback(GLFWwindow *window, unsigned int codepoint) { | |||||
} | } | ||||
} | } | ||||
void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { | |||||
void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mods) { | |||||
if (action == GLFW_PRESS || action == GLFW_REPEAT) { | if (action == GLFW_PRESS || action == GLFW_REPEAT) { | ||||
// onFocusKey | // onFocusKey | ||||
if (gFocusedWidget && gFocusedWidget->onFocusKey(key)) | if (gFocusedWidget && gFocusedWidget->onFocusKey(key)) | ||||
@@ -213,6 +213,14 @@ void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods | |||||
} | } | ||||
} | } | ||||
void dropCallback(GLFWwindow *window, int count, const char **paths) { | |||||
std::list<std::string> pathsList; | |||||
for (int i = 0; i < count; i++) { | |||||
pathsList.push_back(paths[i]); | |||||
} | |||||
gScene->onPathDrop(gMousePos, pathsList); | |||||
} | |||||
void errorCallback(int error, const char *description) { | void errorCallback(int error, const char *description) { | ||||
fprintf(stderr, "GLFW error %d: %s\n", error, description); | fprintf(stderr, "GLFW error %d: %s\n", error, description); | ||||
} | } | ||||
@@ -272,6 +280,7 @@ void guiInit() { | |||||
glfwSetScrollCallback(gWindow, scrollCallback); | glfwSetScrollCallback(gWindow, scrollCallback); | ||||
glfwSetCharCallback(gWindow, charCallback); | glfwSetCharCallback(gWindow, charCallback); | ||||
glfwSetKeyCallback(gWindow, keyCallback); | glfwSetKeyCallback(gWindow, keyCallback); | ||||
glfwSetDropCallback(gWindow, dropCallback); | |||||
// Set up GLEW | // Set up GLEW | ||||
glewExperimental = GL_TRUE; | glewExperimental = GL_TRUE; | ||||
@@ -184,6 +184,19 @@ Widget *Widget::onScroll(Vec pos, Vec scrollRel) { | |||||
return NULL; | return NULL; | ||||
} | } | ||||
bool Widget::onPathDrop(Vec pos, const std::list<std::string>& paths) { | |||||
for (auto it = children.rbegin(); it != children.rend(); it++) { | |||||
Widget *child = *it; | |||||
if (!child->visible) | |||||
continue; | |||||
if (child->box.contains(pos)) { | |||||
if (child->onPathDrop(pos.minus(child->box.pos), paths)); | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
void Widget::onZoom() { | void Widget::onZoom() { | ||||
for (auto it = children.rbegin(); it != children.rend(); it++) { | for (auto it = children.rbegin(); it != children.rend(); it++) { | ||||
Widget *child = *it; | Widget *child = *it; | ||||