| @@ -11,7 +11,7 @@ However, a free commercial license is available for plugins sold through the [VC | |||||
| Email contact@vcvrack.com for more information about licensing or the VCV Store. | Email contact@vcvrack.com for more information about licensing or the VCV Store. | ||||
| The **Core panel graphics** in the `res/Core` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). | The **Core panel graphics** in the `res/Core` directory are copyright © 2019 [Grayscale](http://grayscale.info/) and licensed under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/). | ||||
| You may not create derivative works. | |||||
| You may not create derivative works of these graphics. | |||||
| The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works. | The **VCV logo and icon** are copyright © 2017 Andrew Belt and may not be used in derivative works. | ||||
| @@ -22,9 +22,9 @@ struct Port { | |||||
| Unstable API. Use set/getChannels() instead. | Unstable API. Use set/getChannels() instead. | ||||
| May be 0 to PORT_MAX_CHANNELS. | May be 0 to PORT_MAX_CHANNELS. | ||||
| */ | */ | ||||
| uint8_t channels = 1; | |||||
| uint8_t channels = 0; | |||||
| /** Unstable API. Use isConnected() instead. */ | /** Unstable API. Use isConnected() instead. */ | ||||
| bool active; | |||||
| bool active = false; | |||||
| /** For rendering plug lights on cables. | /** For rendering plug lights on cables. | ||||
| Green for positive, red for negative, and blue for polyphonic. | Green for positive, red for negative, and blue for polyphonic. | ||||
| */ | */ | ||||
| @@ -84,7 +84,13 @@ struct Port { | |||||
| }; | }; | ||||
| struct Output : Port {}; | |||||
| struct Output : Port { | |||||
| Output() { | |||||
| channels = 1; | |||||
| } | |||||
| }; | |||||
| struct Input : Port {}; | struct Input : Port {}; | ||||
| @@ -254,7 +254,7 @@ struct State { | |||||
| widget::Widget *scrollWidget = NULL; | widget::Widget *scrollWidget = NULL; | ||||
| /** For double-clicking */ | /** For double-clicking */ | ||||
| double lastClickTime = -INFINITY; | double lastClickTime = -INFINITY; | ||||
| math::Vec lastClickPos; | |||||
| widget::Widget *lastClickedWidget = NULL; | |||||
| void setHovered(widget::Widget *w); | void setHovered(widget::Widget *w); | ||||
| void setDragged(widget::Widget *w); | void setDragged(widget::Widget *w); | ||||
| @@ -216,7 +216,7 @@ void CableWidget::draw(const widget::DrawContext &ctx) { | |||||
| // Draw opaque if mouse is hovering over a connected port | // Draw opaque if mouse is hovering over a connected port | ||||
| if (output->channels > 1) { | if (output->channels > 1) { | ||||
| // Increase thickness if output port is polyphonic | // Increase thickness if output port is polyphonic | ||||
| thickness = 7; | |||||
| thickness = 9; | |||||
| } | } | ||||
| if (outputPort->hovered || inputPort->hovered) { | if (outputPort->hovered || inputPort->hovered) { | ||||
| @@ -98,6 +98,7 @@ void State::finalizeWidget(widget::Widget *w) { | |||||
| if (dragHoveredWidget == w) setDragHovered(NULL); | if (dragHoveredWidget == w) setDragHovered(NULL); | ||||
| if (selectedWidget == w) setSelected(NULL); | if (selectedWidget == w) setSelected(NULL); | ||||
| if (scrollWidget == w) scrollWidget = NULL; | if (scrollWidget == w) scrollWidget = NULL; | ||||
| if (lastClickedWidget == w) lastClickedWidget = NULL; | |||||
| } | } | ||||
| void State::handleButton(math::Vec pos, int button, int action, int mods) { | void State::handleButton(math::Vec pos, int button, int action, int mods) { | ||||
| @@ -136,16 +137,16 @@ void State::handleButton(math::Vec pos, int button, int action, int mods) { | |||||
| if (action == GLFW_PRESS) { | if (action == GLFW_PRESS) { | ||||
| const double doubleClickDuration = 0.5; | const double doubleClickDuration = 0.5; | ||||
| const float doubleClickDistance = 10; | |||||
| double clickTime = glfwGetTime(); | double clickTime = glfwGetTime(); | ||||
| if (clickTime - lastClickTime <= doubleClickDuration && pos.minus(lastClickPos).norm() <= doubleClickDistance) { | |||||
| if (clickedWidget | |||||
| && clickTime - lastClickTime <= doubleClickDuration | |||||
| && lastClickedWidget == clickedWidget) { | |||||
| // event::DoubleClick | // event::DoubleClick | ||||
| event::DoubleClick eDoubleClick; | event::DoubleClick eDoubleClick; | ||||
| clickedWidget->onDoubleClick(eDoubleClick); | clickedWidget->onDoubleClick(eDoubleClick); | ||||
| } | } | ||||
| lastClickTime = clickTime; | lastClickTime = clickTime; | ||||
| lastClickPos = pos; | |||||
| lastClickedWidget = clickedWidget; | |||||
| } | } | ||||
| } | } | ||||
| @@ -433,7 +433,7 @@ int Window::getMods() { | |||||
| } | } | ||||
| void Window::setFullScreen(bool fullScreen) { | void Window::setFullScreen(bool fullScreen) { | ||||
| if (isFullScreen()) { | |||||
| if (!fullScreen) { | |||||
| glfwSetWindowMonitor(win, NULL, internal->lastWindowX, internal->lastWindowY, internal->lastWindowWidth, internal->lastWindowHeight, GLFW_DONT_CARE); | glfwSetWindowMonitor(win, NULL, internal->lastWindowX, internal->lastWindowY, internal->lastWindowWidth, internal->lastWindowHeight, GLFW_DONT_CARE); | ||||
| } | } | ||||
| else { | else { | ||||