diff options
author | Joe Crayne <joe@jerkface.net> | 2019-06-16 03:01:50 -0400 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2019-06-16 03:01:50 -0400 |
commit | 8196b2799d596c732fc9df6df788b62c707d1ef6 (patch) | |
tree | 17daf2276d432d859dce18198ec7a42d5bbf4506 | |
parent | d47f7ede02f6ef40ab7c439f9b7538ef9c16d554 (diff) |
Added a right pane to select/deselect mesh groups.
-rw-r--r-- | MeshSketch.hs | 77 |
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) | |||
34 | import GI.Gdk.Objects | 34 | import GI.Gdk.Objects |
35 | import GI.GLib.Constants | 35 | import GI.GLib.Constants |
36 | import GI.Gtk hiding (IsWindow,windowFullscreen,windowUnfullscreen) | 36 | import GI.Gtk hiding (IsWindow,windowFullscreen,windowUnfullscreen) |
37 | import qualified GI.Gtk.Objects as Gtk | ||
37 | import LambdaCube.GL as LC | 38 | import LambdaCube.GL as LC |
38 | import LambdaCube.GL.Mesh as LC | 39 | import LambdaCube.GL.Mesh as LC |
39 | import Numeric.LinearAlgebra as Math hiding ((<>)) | 40 | import 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 | ||
270 | data MeshSketch = MeshSketch | 271 | data 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 | ||
275 | type SignalHandlerId = Foreign.C.Types.CULong | 279 | type 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 | ||
284 | new :: IO GLArea | 288 | new :: IO Gtk.Paned |
285 | new = do | 289 | new = 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 | |||
339 | newGroupsListWidget = 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 | ||
349 | onUnrealize :: MeshSketch -> IO () | 369 | onUnrealize :: MeshSketch -> IO () |
350 | onUnrealize mm = do | 370 | onUnrealize 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 | ||
397 | onRender :: w -> Realized -> GLContext -> IO Bool | 425 | onRender :: 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 |