@@ -95,6 +95,9 @@ function App.new()
9595 self .currentAction = { tool = " brush" }
9696 self .startTime = os.clock ()
9797 self .overlaySelection = nil
98+ self .overlayLine = nil
99+ self .overlayRectangle = nil
100+ self .overlayCircle = nil
98101
99102 return self
100103end
@@ -717,12 +720,60 @@ function App:event(event, handler)
717720 )
718721 end
719722
723+ if self .overlayLine then
724+ local start = self .overlayLine .start
725+ local finish = self .overlayLine .finish or start
726+
727+ self .plugins .overlay :addLine (
728+ event .window ,
729+ start .x , start .y ,
730+ finish .x , finish .y ,
731+ self .currentColor ,
732+ 2
733+ )
734+ end
735+
736+ if self .overlayRectangle then
737+ local start = self .overlayRectangle .start
738+ local finish = self .overlayRectangle .finish or start
739+
740+ local x1 = start .x
741+ local y1 = start .y
742+ local x2 = finish .x
743+ local y2 = finish .y
744+
745+ local boxX = math.min (x1 , x2 )
746+ local boxY = math.min (y1 , y2 )
747+ local boxW = math.abs (x2 - x1 )
748+ local boxH = math.abs (y2 - y1 )
749+
750+ self .plugins .overlay :addBox (
751+ event .window ,
752+ boxX , boxY , boxW , boxH ,
753+ self .currentColor ,
754+ 2
755+ )
756+ end
757+
758+ if self .overlayCircle then
759+ local start = self .overlayCircle .start
760+ local finish = self .overlayCircle .finish or start
761+
762+ self .plugins .overlay :addEllipse (
763+ event .window ,
764+ start .x , start .y ,
765+ finish .x , finish .y ,
766+ self .currentColor ,
767+ 2
768+ )
769+ end
770+
720771 local time = os.clock () - self .startTime
721772 self .plugins .overlay :draw (event .window , " marching_ants" , time )
722773
723774 ctx .renderCtx :swapBuffers ()
724775
725- if self .overlaySelection then
776+ if self .overlaySelection or self . overlayLine or self . overlayRectangle or self . overlayCircle then
726777 handler :requestRedraw (event .window )
727778 end
728779
@@ -793,6 +844,21 @@ function App:update(message, window)
793844 )
794845 self .isDrawing = true
795846 self .plugins .ui :refreshView (window )
847+ elseif self .currentAction .tool == " line" then
848+ local x = (message .x / message .elementWidth ) * 800
849+ local y = (message .y / message .elementHeight ) * 600
850+ self .overlayLine = { start = { x = x , y = y }, finish = nil }
851+ self .isDrawing = true
852+ elseif self .currentAction .tool == " square" then
853+ local x = (message .x / message .elementWidth ) * 800
854+ local y = (message .y / message .elementHeight ) * 600
855+ self .overlayRectangle = { start = { x = x , y = y }, finish = nil }
856+ self .isDrawing = true
857+ elseif self .currentAction .tool == " circle" then
858+ local x = (message .x / message .elementWidth ) * 800
859+ local y = (message .y / message .elementHeight ) * 600
860+ self .overlayCircle = { start = { x = x , y = y }, finish = nil }
861+ self .isDrawing = true
796862 end
797863 elseif message .type == " StopDrawing" then
798864 if self .currentAction .tool == " select" and self .overlaySelection then
@@ -809,6 +875,51 @@ function App:update(message, window)
809875 self .resources .compute :setSelection (startPos .x , startPos .y , finishPos .x , finishPos .y )
810876 self .overlaySelection .finish = { x = x , y = y }
811877 end
878+ elseif self .currentAction .tool == " line" and self .overlayLine then
879+ local x = (message .x / message .elementWidth ) * 800
880+ local y = (message .y / message .elementHeight ) * 600
881+
882+ local start = self .overlayLine .start
883+ if start .x ~= x or start .y ~= y then
884+ self .resources .compute :drawLine (
885+ start .x , start .y ,
886+ x , y ,
887+ 2 ,
888+ self .currentColor
889+ )
890+ self .plugins .ui :refreshView (window )
891+ end
892+ self .overlayLine = nil
893+ elseif self .currentAction .tool == " square" and self .overlayRectangle then
894+ local x = (message .x / message .elementWidth ) * 800
895+ local y = (message .y / message .elementHeight ) * 600
896+
897+ local start = self .overlayRectangle .start
898+ if start .x ~= x or start .y ~= y then
899+ self .resources .compute :drawRectangle (
900+ start .x , start .y ,
901+ x , y ,
902+ 2 ,
903+ self .currentColor
904+ )
905+ self .plugins .ui :refreshView (window )
906+ end
907+ self .overlayRectangle = nil
908+ elseif self .currentAction .tool == " circle" and self .overlayCircle then
909+ local x = (message .x / message .elementWidth ) * 800
910+ local y = (message .y / message .elementHeight ) * 600
911+
912+ local start = self .overlayCircle .start
913+ if start .x ~= x or start .y ~= y then
914+ self .resources .compute :drawEllipse (
915+ start .x , start .y ,
916+ x , y ,
917+ 2 ,
918+ self .currentColor
919+ )
920+ self .plugins .ui :refreshView (window )
921+ end
922+ self .overlayCircle = nil
812923 end
813924 self .isDrawing = false
814925 window .shouldRedraw = true
@@ -839,6 +950,21 @@ function App:update(message, window)
839950 local y = (message .y / message .elementHeight ) * 600
840951 self .overlaySelection .finish = { x = x , y = y }
841952 window .shouldRedraw = true
953+ elseif self .currentAction .tool == " line" and self .overlayLine then
954+ local x = (message .x / message .elementWidth ) * 800
955+ local y = (message .y / message .elementHeight ) * 600
956+ self .overlayLine .finish = { x = x , y = y }
957+ window .shouldRedraw = true
958+ elseif self .currentAction .tool == " square" and self .overlayRectangle then
959+ local x = (message .x / message .elementWidth ) * 800
960+ local y = (message .y / message .elementHeight ) * 600
961+ self .overlayRectangle .finish = { x = x , y = y }
962+ window .shouldRedraw = true
963+ elseif self .currentAction .tool == " circle" and self .overlayCircle then
964+ local x = (message .x / message .elementWidth ) * 800
965+ local y = (message .y / message .elementHeight ) * 600
966+ self .overlayCircle .finish = { x = x , y = y }
967+ window .shouldRedraw = true
842968 end
843969 self .plugins .ui :requestRedraw (window )
844970 end
0 commit comments