diff options
| -rw-r--r-- | MainWindow.cpp | 72 | ||||
| -rw-r--r-- | MainWindow.h | 5 | 
2 files changed, 76 insertions, 1 deletions
diff --git a/MainWindow.cpp b/MainWindow.cpp index 01d14ef..e59ea65 100644 --- a/MainWindow.cpp +++ b/MainWindow.cpp @@ -257,6 +257,16 @@ MainWindow::draw()  	{  		dc_image.drawHashBox(selected_gate->get_x(), selected_gate->get_y(), selected_gate->get_width(), selected_gate->get_height());  	} +	else if (!selected_gates.empty()) +	{ +		/* draw border box if multuple gates selected */ +		Gate *selgate; +		for (auto g = selected_gates.begin(); g != selected_gates.end(); ++g) +		{ +			selgate = (*g); +			dc_image.drawHashBox(selgate->get_x(), selgate->get_y(), selgate->get_width(), selgate->get_height()); +		} +	}  	/* draw dragging link */  	if (dragging_link && selected_gate) @@ -323,6 +333,15 @@ MainWindow::draw()  	} +	/*draw rubber band */ +	if (rubberbanding) +	{ +		FXint mousex, mousey; +		FXuint mbuttons; +		canvas->getCursorPosition(mousex, mousey, mbuttons); +		dc_image.drawRectangle(rubberband_startx, rubberband_starty, mousex-rubberband_startx, mousey-rubberband_starty); +	} +  	/* update options panel */  	if (selected_gate)  	{ @@ -337,6 +356,7 @@ MainWindow::draw()  		output_details->setText("(None)");  	} +  	FXDCWindow dc_canvas(canvas);  	dc_canvas.drawImage(canvas_image, 0, 0);  } @@ -660,6 +680,38 @@ MainWindow::remove_all_gates()  	draw();  } +void +MainWindow::find_gates_in_area(int x, int y, int width, int height) +{ +	/* +	 * find all gates in a given rectangle +	 */ +	Gate *gate; +	int gx, gy, gw, gh; +	for (auto g = gates.begin(); g != gates.end(); ++g) +	{ +		gate = (*g).get(); +		gx = gate->get_x(); +		gy = gate->get_y(); +		gw = gate->get_width(); +		gh = gate->get_height(); + +		/* check if rectangles intersect */ +		if(gx < x+width && gx+gw > x +		   && gy < y+height && gy+gh > y) +		{ +			printf("adding gate %d to selected gates list\n", gate->get_id()); +			selected_gates.push_back(gate); +		} +		if (!selected_gates.empty()) +		{ +			selected_gate = nullptr; +			selected_input.gate = nullptr; +			selected_input.input = -1; +		} +	} +} +  long  MainWindow::on_paint(FXObject*, FXSelector, void *ptr)  { @@ -715,6 +767,17 @@ MainWindow::on_left_mouse_down(FXObject*, FXSelector, void *ptr)  				/* an input is selected */  			}  		} +		else +		{ +			rubberbanding = true; +			rubberband_startx = ev->last_x; +			rubberband_starty = ev->last_y; +		} + +		if (!selected_gates.empty()) +		{ +			selected_gates.clear(); +		}  	}  	draw();  	return 1; @@ -765,6 +828,13 @@ MainWindow::on_left_mouse_up(FXObject*, FXSelector, void *ptr)  		}  		dragging_link = false;  	} +	if (rubberbanding) +	{ +		rubberbanding = false; +		find_gates_in_area(rubberband_startx, rubberband_starty, ev->last_x-rubberband_startx, ev->last_y-rubberband_starty); +		draw(); +	} +  	return 1;  } @@ -889,9 +959,9 @@ MainWindow::on_key_release(FXObject *sender, FXSelector sel, void *ptr)  long  MainWindow::on_mouse_move(FXObject *sender, FXSelector sel, void *ptr)  { +	FXEvent* event = (FXEvent*)ptr;  	if (lmouse_down && !dragging_link && selected_gate)  	{ -		FXEvent* event = (FXEvent*)ptr;  		selected_gate->set_x(event->last_x-selected_gate->get_width()/2);  		selected_gate->set_y(event->last_y-selected_gate->get_height()/2);  	} diff --git a/MainWindow.h b/MainWindow.h index 484ebaa..04162ed 100644 --- a/MainWindow.h +++ b/MainWindow.h @@ -101,6 +101,7 @@ class MainWindow : public FXMainWindow  		Gate *find_gate_at(int x, int y);  		Gate *find_gate_by_id(int id);  		void remove_all_gates(); +		void find_gates_in_area(int x, int y, int width, int height);  		bool save_file();  		bool load_file(); @@ -148,11 +149,15 @@ class MainWindow : public FXMainWindow  		Gate::GATE_TYPE selected_gate_type = Gate::NONE; // the type of gate we will place  		struct selected_input selected_input; +		std::vector<Gate *> selected_gates;  		/* mouse */  		bool lmouse_down = false;  		bool rmouse_down = false;  		bool dragging_link = false; +		bool rubberbanding = false; +		int rubberband_startx; +		int rubberband_starty;  		/* keyboard */  		bool lshift_down = false;  | 
