drag works
This commit is contained in:
@@ -24,6 +24,11 @@ class Vec2D{
|
|||||||
//return acos(dot(v));
|
//return acos(dot(v));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
T angleDeg(Vec2D &v){
|
||||||
|
|
||||||
|
return angle(v) * 180 / M_PI;
|
||||||
|
};
|
||||||
|
|
||||||
T dot(Vec2D &v){
|
T dot(Vec2D &v){
|
||||||
return (x*v.x) + (y*v.y);
|
return (x*v.x) + (y*v.y);
|
||||||
};
|
};
|
||||||
|
|||||||
+45
-176
@@ -11,12 +11,15 @@
|
|||||||
#include "libremidi/message.hpp"
|
#include "libremidi/message.hpp"
|
||||||
#include "libremidi/observer_configuration.hpp"
|
#include "libremidi/observer_configuration.hpp"
|
||||||
|
|
||||||
|
#include <SFML/Graphics/RectangleShape.hpp>
|
||||||
#include <SFML/Main.hpp>
|
#include <SFML/Main.hpp>
|
||||||
#include <SFML/Graphics.hpp>
|
#include <SFML/Graphics.hpp>
|
||||||
#include <SFML/Graphics/RenderWindow.hpp>
|
#include <SFML/Graphics/RenderWindow.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
#include <SFML/Window.hpp>
|
#include <SFML/Window.hpp>
|
||||||
#include <SFML/OpenGL.hpp>
|
#include <SFML/OpenGL.hpp>
|
||||||
|
|
||||||
|
#include <SFML/Window/Mouse.hpp>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -68,6 +71,8 @@ int main(){
|
|||||||
|
|
||||||
midi_out.open_port(midi_out_ports[2]);
|
midi_out.open_port(midi_out_ports[2]);
|
||||||
|
|
||||||
|
Vec2D<float> drag_origin;
|
||||||
|
|
||||||
sf::Clock deltaClock;
|
sf::Clock deltaClock;
|
||||||
|
|
||||||
while(window.isOpen()){
|
while(window.isOpen()){
|
||||||
@@ -79,15 +84,38 @@ int main(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.clear();
|
sf::Vector2i mp = sf::Mouse::getPosition(window);
|
||||||
|
Vec2D<float> mouse_pos = {(float)mp.x, (float)mp.y};
|
||||||
|
|
||||||
|
bool mouse_toggled = false;
|
||||||
|
mouse_pressed = sf::Mouse::isButtonPressed(sf::Mouse::Button::Left);
|
||||||
|
|
||||||
|
if(!mouse_pressed && mouse_clicked) mouse_clicked = false;
|
||||||
|
if(mouse_pressed && !mouse_clicked){
|
||||||
|
mouse_clicked = true;
|
||||||
|
mouse_toggled = true;
|
||||||
|
drag_start = mouse_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.clear(sf::Color(46,46,46));
|
||||||
|
|
||||||
|
bool hovering = false;
|
||||||
|
|
||||||
for( auto& n : nodes){
|
for( auto& n : nodes){
|
||||||
|
|
||||||
|
if((n.position - mouse_pos).length() <= n.radius && !hovering) {
|
||||||
|
n.hover_move = true;
|
||||||
|
hovering = true;
|
||||||
|
} else {
|
||||||
|
n.hover_move = false;
|
||||||
|
}
|
||||||
|
|
||||||
if(mouse_clicked && n.hover_move){
|
if(mouse_clicked && n.hover_move){
|
||||||
n.clicked = true;
|
n.clicked = true;
|
||||||
}
|
}
|
||||||
|
if(mouse_toggled) drag_origin = n.position;
|
||||||
if(mouse_pressed && n.clicked){
|
if(mouse_pressed && n.clicked){
|
||||||
n.position = mouse_pos;
|
n.position = mouse_pos - (drag_start - drag_origin);
|
||||||
}
|
}
|
||||||
if(!mouse_pressed) n.clicked = false;
|
if(!mouse_pressed) n.clicked = false;
|
||||||
n.update();
|
n.update();
|
||||||
@@ -106,184 +134,25 @@ int main(){
|
|||||||
n.draw(&window);
|
n.draw(&window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!hovering && mouse_clicked) {
|
||||||
|
Vec2D<float> ref = {1.f,0.f};
|
||||||
|
Vec2D<float> lineVec = mouse_pos - drag_start;
|
||||||
|
float width = lineVec.length();
|
||||||
|
float angle = ref.angleDeg(lineVec);
|
||||||
|
|
||||||
|
sf::RectangleShape line;
|
||||||
|
line.setSize(sf::Vector2f(width, 2));
|
||||||
|
line.setPosition(drag_start.x, drag_start.y);
|
||||||
|
line.setRotation(angle);
|
||||||
|
line.setFillColor(sf::Color(100,0,0));
|
||||||
|
window.draw(line);
|
||||||
|
}
|
||||||
//window.draw();
|
//window.draw();
|
||||||
window.display();
|
window.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***/
|
|
||||||
/*SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv){*/
|
|
||||||
/**/
|
|
||||||
/* if (not SDL_Init(SDL_INIT_VIDEO)) {*/
|
|
||||||
/* SDL_Log("Unable to initialize SDL: %s", SDL_GetError());*/
|
|
||||||
/* return SDL_APP_FAILURE;*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* SDL_Window* window = SDL_CreateWindow("Window", 1920, 1080, SDL_WINDOW_OPENGL|SDL_WINDOW_FULLSCREEN);*/
|
|
||||||
/* if (not window){*/
|
|
||||||
/* SDL_Log("Unable to create window: %s", SDL_GetError());*/
|
|
||||||
/* return SDL_APP_FAILURE;*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* gl = SDL_GL_CreateContext(window);*/
|
|
||||||
/**/
|
|
||||||
/* SDL_ShowWindow(window);*/
|
|
||||||
/**/
|
|
||||||
/* int window_width;*/
|
|
||||||
/* int window_height;*/
|
|
||||||
/* SDL_GetWindowSize(window, &window_width, &window_height);*/
|
|
||||||
/**/
|
|
||||||
/**/
|
|
||||||
/*// cairo_device_t* device = cairo_glx_device_create();*/
|
|
||||||
/**/
|
|
||||||
/* sdl_cairo_surface = SDL_CreateSurface(renderer_width, renderer_height, SDL_PIXELFORMAT_RGBA32);*/
|
|
||||||
/**/
|
|
||||||
/* int stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, sdl_cairo_surface->w);*/
|
|
||||||
/* cr_surface = cairo_image_surface_create_for_data((unsigned char*) sdl_cairo_surface->pixels, CAIRO_FORMAT_RGB24, sdl_cairo_surface->w, sdl_cairo_surface->h, stride);*/
|
|
||||||
/**/
|
|
||||||
/* cr = cairo_create(cr_surface);*/
|
|
||||||
/* SDL_Log("%d", cairo_surface_status(cr_surface));*/
|
|
||||||
/**/
|
|
||||||
/* int cairo_x_multiplier = renderer_width / window_width;*/
|
|
||||||
/* int cairo_y_multiplier = renderer_height / window_height;*/
|
|
||||||
/**/
|
|
||||||
/* cairo_surface_set_device_scale(cr_surface, cairo_x_multiplier, cairo_y_multiplier);*/
|
|
||||||
/**/
|
|
||||||
/* for(const libremidi::input_port& port : obs.get_input_ports()){*/
|
|
||||||
/* midi_in_ports.push_back(port);*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* for(const libremidi::output_port& port : obs.get_output_ports()){*/
|
|
||||||
/* midi_out_ports.push_back(port);*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* for(int i = 0; i < 10; i++){*/
|
|
||||||
/* nodes.emplace(nodes.end(), Node(i*10.0f, i*10.0f, 15.0f));*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* for(int i = 0; i < 10; i++){*/
|
|
||||||
/* signals.emplace(signals.end(), Signal(i*10.0f, i*10.0f, 5.0f));*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* IMGUI_CHECKVERSION();*/
|
|
||||||
/* ImGui::CreateContext();*/
|
|
||||||
/* io = ImGui::GetIO(); (void)io;*/
|
|
||||||
/**/
|
|
||||||
/* ImGui::StyleColorsDark();*/
|
|
||||||
/* //ImGui::StyleColorsLight();*/
|
|
||||||
/**/
|
|
||||||
/* // Setup Platform/Renderer backends*/
|
|
||||||
/* ImGui_ImplSDL3_InitForSDLRenderer(window, renderer);*/
|
|
||||||
/* ImGui_ImplSDLRenderer3_Init(renderer);*/
|
|
||||||
/**/
|
|
||||||
/* *appstate = new AppContext{*/
|
|
||||||
/* window,*/
|
|
||||||
/* renderer,*/
|
|
||||||
/* (float)window_width,*/
|
|
||||||
/* (float)window_height*/
|
|
||||||
/* };*/
|
|
||||||
/**/
|
|
||||||
/* return SDL_APP_CONTINUE;*/
|
|
||||||
/*}*/
|
|
||||||
/**/
|
|
||||||
/*SDL_AppResult SDL_AppIterate(void *appstate){*/
|
|
||||||
/* auto* app = (AppContext*)appstate;*/
|
|
||||||
/**/
|
|
||||||
/* SDL_SetRenderDrawColor(app->renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);*/
|
|
||||||
/* SDL_RenderClear(app->renderer); */
|
|
||||||
/**/
|
|
||||||
/* // ---------- cairo*/
|
|
||||||
/**/
|
|
||||||
/**/
|
|
||||||
/* cairo_set_source_rgba(cr, 0, 0, 0, 1.0);*/
|
|
||||||
/* cairo_rectangle(cr, 0, 0, app->width, app->height);*/
|
|
||||||
/* cairo_fill(cr);*/
|
|
||||||
/**/
|
|
||||||
/* for( auto& n : nodes){*/
|
|
||||||
/**/
|
|
||||||
/* if(mouse_clicked && n.hover_move){*/
|
|
||||||
/* n.clicked = true;*/
|
|
||||||
/* }*/
|
|
||||||
/* if(mouse_pressed && n.clicked){*/
|
|
||||||
/* n.position = mouse_pos;*/
|
|
||||||
/* }*/
|
|
||||||
/* if(!mouse_pressed) n.clicked = false;*/
|
|
||||||
/* n.update();*/
|
|
||||||
/* n.draw(cr, mouse_pos);*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* for( auto& n : signals){*/
|
|
||||||
/* n.update();*/
|
|
||||||
/* n.draw(cr);*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* SDL_Texture *texture = SDL_CreateTextureFromSurface(app->renderer, sdl_cairo_surface);*/
|
|
||||||
/**/
|
|
||||||
/* // ---------- ImGUI*/
|
|
||||||
/**/
|
|
||||||
/*ImGui_ImplSDLRenderer3_NewFrame();*/
|
|
||||||
/*ImGui_ImplSDL3_NewFrame();*/
|
|
||||||
/*ImGui::NewFrame();*/
|
|
||||||
/**/
|
|
||||||
/*ImGui::Begin("MIDI Config");*/
|
|
||||||
/*ImGui::SameLine();*/
|
|
||||||
/**/
|
|
||||||
/*for(auto port : midi_out_ports){*/
|
|
||||||
/* if(ImGui::Button(port.port_name.c_str())){*/
|
|
||||||
/* midi_out.open_port(port);*/
|
|
||||||
/* midi_out.send_message(144, 100, 40);*/
|
|
||||||
/* };*/
|
|
||||||
/*}*/
|
|
||||||
/**/
|
|
||||||
/*ImGui::Text("%f %f", mouse_pos.x, mouse_pos.y);*/
|
|
||||||
/**/
|
|
||||||
/*ImGui::End();*/
|
|
||||||
/*ImGui::Render();*/
|
|
||||||
/**/
|
|
||||||
/**/
|
|
||||||
/* // ---------- Render*/
|
|
||||||
/**/
|
|
||||||
/* SDL_RenderTexture(app->renderer, texture, NULL, NULL);*/
|
|
||||||
/*// ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), app->renderer); */
|
|
||||||
/**/
|
|
||||||
/* SDL_RenderPresent(app->renderer);*/
|
|
||||||
/**/
|
|
||||||
/*// auto time = SDL_GetTicks();*/
|
|
||||||
/* SDL_Delay(5);*/
|
|
||||||
/* return SDL_APP_CONTINUE;*/
|
|
||||||
/*}*/
|
|
||||||
/**/
|
|
||||||
/*SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event){*/
|
|
||||||
/* //auto* app = (AppContext*)appstate;*/
|
|
||||||
/* mouse_clicked = false;*/
|
|
||||||
/**/
|
|
||||||
/* const SDL_Event *ev = event;*/
|
|
||||||
/* ImGui_ImplSDL3_ProcessEvent(ev);*/
|
|
||||||
/**/
|
|
||||||
/* if (event->type == SDL_EVENT_QUIT) {*/
|
|
||||||
/* return SDL_APP_SUCCESS;*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* if(event->type == SDL_EVENT_MOUSE_MOTION){*/
|
|
||||||
/* mouse_pos = {event->motion.x, event->motion.y};*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* if(event->type == SDL_EVENT_MOUSE_BUTTON_DOWN){*/
|
|
||||||
/* if(event->button.button == SDL_BUTTON_LEFT) {*/
|
|
||||||
/* if(!mouse_pressed) {*/
|
|
||||||
/* drag_start = mouse_pos;*/
|
|
||||||
/* mouse_clicked = true;*/
|
|
||||||
/* }*/
|
|
||||||
/* mouse_pressed = true;*/
|
|
||||||
/* }*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* if(event->type == SDL_EVENT_MOUSE_BUTTON_UP){*/
|
|
||||||
/* if(event->button.button == SDL_BUTTON_LEFT) mouse_pressed = false;*/
|
|
||||||
/* }*/
|
|
||||||
/**/
|
|
||||||
/* return SDL_APP_CONTINUE;*/
|
|
||||||
/*}*/
|
|
||||||
/**/
|
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -27,7 +27,9 @@ class Node : public Movable{
|
|||||||
void draw(sf::RenderWindow* window) {
|
void draw(sf::RenderWindow* window) {
|
||||||
|
|
||||||
sf::CircleShape circle(radius);
|
sf::CircleShape circle(radius);
|
||||||
circle.setFillColor(sf::Color::Green);
|
circle.setOrigin(radius/2.f, radius/2.f);
|
||||||
|
if(!hover_move) circle.setFillColor(sf::Color(180, 210, 115));
|
||||||
|
if(hover_move) circle.setFillColor(sf::Color(108, 153, 187));
|
||||||
circle.setPosition(position.x, position.y);
|
circle.setPosition(position.x, position.y);
|
||||||
window->draw(circle);
|
window->draw(circle);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ class Signal : public Movable{
|
|||||||
|
|
||||||
void draw(sf::RenderWindow *window) {
|
void draw(sf::RenderWindow *window) {
|
||||||
sf::CircleShape circle(radius);
|
sf::CircleShape circle(radius);
|
||||||
circle.setFillColor(sf::Color());
|
circle.setFillColor(sf::Color(232, 125, 62));
|
||||||
circle.setPosition(position.x, position.y);
|
circle.setPosition(position.x, position.y);
|
||||||
// circle.getPoint();
|
// circle.getPoint();
|
||||||
// circle.getPointCount()
|
// circle.getPointCount()
|
||||||
|
|||||||
Reference in New Issue
Block a user