summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2019-06-16 03:01:50 -0400
committerJoe Crayne <joe@jerkface.net>2019-06-16 03:01:50 -0400
commit8196b2799d596c732fc9df6df788b62c707d1ef6 (patch)
tree17daf2276d432d859dce18198ec7a42d5bbf4506
parentd47f7ede02f6ef40ab7c439f9b7538ef9c16d554 (diff)
Added a right pane to select/deselect mesh groups.
-rw-r--r--MeshSketch.hs77
1 files changed, 53 insertions, 24 deletions
diff --git a/MeshSketch.hs b/MeshSketch.hs
index 4ddfec0..3253008 100644
--- a/MeshSketch.hs
+++ b/MeshSketch.hs
@@ -34,6 +34,7 @@ import GI.GObject.Functions (signalHandlerDisconnect)
34import GI.Gdk.Objects 34import GI.Gdk.Objects
35import GI.GLib.Constants 35import GI.GLib.Constants
36import GI.Gtk hiding (IsWindow,windowFullscreen,windowUnfullscreen) 36import GI.Gtk hiding (IsWindow,windowFullscreen,windowUnfullscreen)
37import qualified GI.Gtk.Objects as Gtk
37import LambdaCube.GL as LC 38import LambdaCube.GL as LC
38import LambdaCube.GL.Mesh as LC 39import LambdaCube.GL.Mesh as LC
39import Numeric.LinearAlgebra as Math hiding ((<>)) 40import Numeric.LinearAlgebra as Math hiding ((<>))
@@ -268,8 +269,11 @@ setUniforms gl storage st = do
268 -- updateRingUniforms storage (stRingBuffer st) 269 -- updateRingUniforms storage (stRingBuffer st)
269 270
270data MeshSketch = MeshSketch 271data MeshSketch = MeshSketch
271 { mmWidget :: GLArea 272 { mmWidget :: GLArea
272 , mmRealized :: IORef (Maybe Realized) 273 , mmPaned :: Gtk.Paned
274 , mmGroupsPanel :: Gtk.TreeView
275 , mmListStore :: Gtk.ListStore
276 , mmRealized :: IORef (Maybe Realized)
273 } 277 }
274 278
275type SignalHandlerId = Foreign.C.Types.CULong 279type SignalHandlerId = Foreign.C.Types.CULong
@@ -281,7 +285,7 @@ data Realized = Realized
281 , stSigs :: [SignalHandlerId] -- Signals attached by onRealize. 285 , stSigs :: [SignalHandlerId] -- Signals attached by onRealize.
282 } 286 }
283 287
284new :: IO GLArea 288new :: IO Gtk.Paned
285new = do 289new = do
286 putStrLn "new!" 290 putStrLn "new!"
287 m <- do 291 m <- do
@@ -315,36 +319,52 @@ new = do
315 "diffuseColor" @: V4F 319 "diffuseColor" @: V4F
316 return $ (,) <$> mobj <*> mpipeline 320 return $ (,) <$> mobj <*> mpipeline
317 either (\e _ -> hPutStrLn stderr e >> throwIO (userError e)) (&) m $ \(obj,pipeline) -> do 321 either (\e _ -> hPutStrLn stderr e >> throwIO (userError e)) (&) m $ \(obj,pipeline) -> do
318
319 {-
320 let pipeline = pipeline0 { dynamicPipeline = (dynamicPipeline pipeline0)
321 { targets = fmap nocolorv (targets $ dynamicPipeline pipeline0) } }
322 nocolorv (RenderTarget v) = RenderTarget (fmap nocolor v)
323 nocolor (TargetItem LC.Color (Just (Framebuffer LC.Color))) = TargetItem LC.Color Nothing
324 nocolor x = x -}
325
326 -- putStrLn $ ppShow (dynamicPipeline pipeline)
327 mapM_ (putStrLn . ppShow) (targets $ dynamicPipeline pipeline) 322 mapM_ (putStrLn . ppShow) (targets $ dynamicPipeline pipeline)
328 {-
329 RenderTarget
330 { renderTargets =
331 [ TargetItem { targetSemantic = Depth , targetRef = Just (Framebuffer Depth) }
332 , TargetItem { targetSemantic = Color , targetRef = Just (Framebuffer Color) }
333 ]
334 }
335 -}
336
337 ref <- newIORef Nothing 323 ref <- newIORef Nothing
338 -- glarea <- newGLWidget return (lambdaRender app glmethods) 324 (groups,liststore) <- newGroupsListWidget
339 do 325 panes <- panedNew OrientationHorizontal
326 g <- do
340 g <- gLAreaNew 327 g <- gLAreaNew
341 let mm = MeshSketch g ref 328 let mm = MeshSketch g panes groups liststore ref
342 gLAreaSetHasDepthBuffer g True 329 gLAreaSetHasDepthBuffer g True
343 st <- return g 330 st <- return g
344 _ <- on g #realize $ withCurrentGL g (onRealize obj (dynamicPipeline pipeline) (dynamicSchema pipeline) mm) 331 _ <- on g #realize $ withCurrentGL g (onRealize obj (dynamicPipeline pipeline) (dynamicSchema pipeline) mm)
345 _ <- on g #unrealize $ onUnrealize mm 332 _ <- on g #unrealize $ onUnrealize mm
346 _ <- on g #createContext $ nullableContext (onCreateContext g) 333 _ <- on g #createContext $ nullableContext (onCreateContext g)
347 return g 334 return g
335 panedPack1 panes g True True
336 return panes
337
338
339newGroupsListWidget = do
340 liststore <- listStoreNew [gtypeBoolean,gtypeString]
341 treeView <- treeViewNewWithModel liststore
342 togc <- do
343 togr <- cellRendererToggleNew
344 togc <- treeViewColumnNew
345 treeViewColumnPackStart togc togr False
346 return togc
347 groupc <- do
348 groupr <- cellRendererTextNew
349 -- grey <- newZeroRGBA
350 -- -- b <- rGBAParse grey "rgb(128,128,128)"
351 -- setCellRendererTextBackgroundRgba groupr grey
352 -- setCellRendererTextForegroundRgba groupr grey
353 -- -- rGBAFree grey
354 groupc <- treeViewColumnNew
355 -- treeViewColumnSetTitle groupc "group"
356 treeViewColumnPackStart groupc groupr False
357 return groupc
358 one <- treeViewAppendColumn treeView togc
359 two <- treeViewAppendColumn treeView groupc
360 iter <- listStoreAppend liststore
361 gvalue <- toGValue (Just "sample text" :: Maybe Text)
362 gtrue <- toGValue True
363 listStoreSetValue liststore iter 0 gtrue
364 listStoreSetValue liststore iter 1 gvalue
365 return (treeView,liststore)
366
367
348 368
349onUnrealize :: MeshSketch -> IO () 369onUnrealize :: MeshSketch -> IO ()
350onUnrealize mm = do 370onUnrealize mm = do
@@ -392,6 +412,14 @@ onRealize mesh pipeline schema mm = do
392 sigr <- on w #render $ onRender w r 412 sigr <- on w #render $ onRender w r
393 sigs <- on w #resize $ onResize w r 413 sigs <- on w #resize $ onResize w r
394 414
415 do
416 panedWin <- widgetGetWindow (mmPaned mm)
417 widgetShow (mmGroupsPanel mm)
418 panedPack2 (mmPaned mm) (mmGroupsPanel mm) True True
419 forM_ panedWin $ \win -> do
420 panedW <- windowGetWidth win
421 panedSetPosition (mmPaned mm) (panedW * 8 `div` 10)
422 -- widgetQueueAllocate (mmPaned mm)
395 writeIORef (mmRealized mm) $ Just r { stSigs = [sige,sigr,sigs] } 423 writeIORef (mmRealized mm) $ Just r { stSigs = [sige,sigr,sigs] }
396 424
397onRender :: w -> Realized -> GLContext -> IO Bool 425onRender :: w -> Realized -> GLContext -> IO Bool
@@ -694,6 +722,7 @@ onEvent w realized ev = do
694 -- end doDragPlane 722 -- end doDragPlane
695 723
696 EventTypeButtonPress -> do 724 EventTypeButtonPress -> do
725 widgetGrabFocus w
697 bev <- get ev #button 726 bev <- get ev #button
698 h <- get bev #x 727 h <- get bev #x
699 k <- get bev #y 728 k <- get bev #y