Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
purescript-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Grégoire Locqueville
purescript-gargantext
Commits
a31e6830
Commit
a31e6830
authored
Oct 04, 2022
by
Przemyslaw Kaminski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[GraphExplorer] Camera in separate module, fixes to updating and centering it
parent
9e37faed
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
206 additions
and
162 deletions
+206
-162
GraphTypes.purs
src/Gargantext/Components/GraphExplorer/GraphTypes.purs
+99
-0
Layout.purs
src/Gargantext/Components/GraphExplorer/Layout.purs
+5
-4
Resources.purs
src/Gargantext/Components/GraphExplorer/Resources.purs
+5
-4
Legend.purs
src/Gargantext/Components/GraphExplorer/Sidebar/Legend.purs
+7
-6
Buttons.purs
src/Gargantext/Components/GraphExplorer/Toolbar/Buttons.purs
+3
-5
Types.purs
src/Gargantext/Components/GraphExplorer/Types.purs
+2
-92
Utils.purs
src/Gargantext/Components/GraphExplorer/Utils.purs
+11
-10
Camera.js
src/Gargantext/Hooks/Sigmax/Camera.js
+5
-0
Camera.purs
src/Gargantext/Hooks/Sigmax/Camera.purs
+53
-0
Sigma.purs
src/Gargantext/Hooks/Sigmax/Sigma.purs
+13
-38
Types.purs
src/Gargantext/Hooks/Sigmax/Types.purs
+3
-3
No files found.
src/Gargantext/Components/GraphExplorer/GraphTypes.purs
0 → 100644
View file @
a31e6830
module Gargantext.Components.GraphExplorer.GraphTypes where
import Gargantext.Prelude
import Data.Eq.Generic (genericEq)
import Data.Generic.Rep (class Generic)
import Data.Maybe (Maybe(..), fromJust)
import Data.Newtype (class Newtype)
import Data.Ord.Generic (genericCompare)
import Data.Show.Generic (genericShow)
import Partial.Unsafe (unsafePartial)
import Record as Record
import Simple.JSON as JSON
import Type.Proxy (Proxy(..))
newtype Cluster = Cluster { clustDefault :: Int }
derive instance Generic Cluster _
derive instance Newtype Cluster _
instance Eq Cluster where eq = genericEq
instance JSON.ReadForeign Cluster where
readImpl f = do
inst <- JSON.readImpl f
pure $ Cluster $ Record.rename clust_defaultP clustDefaultP inst
instance JSON.WriteForeign Cluster where
writeImpl (Cluster cl) = JSON.writeImpl $ Record.rename clustDefaultP clust_defaultP cl
newtype ClusterCount = ClusterCount
{ id :: Int
, count :: Int
}
derive instance Generic ClusterCount _
derive instance Newtype ClusterCount _
newtype Node = Node {
attributes :: Cluster
, children :: Array String
, id_ :: String
, label :: String
, size :: Int
, type_ :: String
, x :: Number
, y :: Number
}
x_coordP = Proxy :: Proxy "x_coord"
xP = Proxy :: Proxy "x"
y_coordP = Proxy :: Proxy "y_coord"
yP = Proxy :: Proxy "y"
clustDefaultP = Proxy :: Proxy "clustDefault"
clust_defaultP = Proxy :: Proxy "clust_default"
cameraP = Proxy :: Proxy "camera"
mCameraP = Proxy :: Proxy "mCamera"
idP = Proxy :: Proxy "id"
id_P = Proxy :: Proxy "id_"
typeP = Proxy :: Proxy "type"
type_P = Proxy :: Proxy "type_"
derive instance Generic Node _
derive instance Newtype Node _
instance Eq Node where eq = genericEq
instance Ord Node where compare (Node n1) (Node n2) = compare n1.id_ n2.id_
instance JSON.ReadForeign Node where
readImpl f = do
inst <- JSON.readImpl f
pure $ Node $
Record.rename idP id_P $
Record.rename typeP type_P $
Record.rename x_coordP xP $
Record.rename y_coordP yP $ inst
instance JSON.WriteForeign Node where
writeImpl (Node nd) = JSON.writeImpl $
Record.rename id_P idP $
Record.rename type_P typeP $
Record.rename xP x_coordP $
Record.rename yP y_coordP nd
newtype Edge = Edge {
confluence :: Number
, id_ :: String
, source :: String
, target :: String
, weight :: Number
}
derive instance Generic Edge _
derive instance Newtype Edge _
instance Eq Edge where eq = genericEq
instance Ord Edge where compare (Edge e1) (Edge e2) = compare e1.id_ e2.id_
instance JSON.ReadForeign Edge where
readImpl f = do
inst <- JSON.readImpl f
pure $ Edge $ Record.rename idP id_P inst
instance JSON.WriteForeign Edge where
writeImpl (Edge ed) = JSON.writeImpl $ Record.rename id_P idP ed
src/Gargantext/Components/GraphExplorer/Layout.purs
View file @
a31e6830
...
@@ -17,6 +17,7 @@ import Effect (Effect)
...
@@ -17,6 +17,7 @@ import Effect (Effect)
import Gargantext.Components.App.Store as AppStore
import Gargantext.Components.App.Store as AppStore
import Gargantext.Components.Bootstrap as B
import Gargantext.Components.Bootstrap as B
import Gargantext.Components.GraphExplorer.Frame.DocFocus (docFocus)
import Gargantext.Components.GraphExplorer.Frame.DocFocus (docFocus)
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Resources as Graph
import Gargantext.Components.GraphExplorer.Resources as Graph
import Gargantext.Components.GraphExplorer.Sidebar as GES
import Gargantext.Components.GraphExplorer.Sidebar as GES
import Gargantext.Components.GraphExplorer.Store as GraphStore
import Gargantext.Components.GraphExplorer.Store as GraphStore
...
@@ -289,7 +290,7 @@ convert :: GET.GraphData -> Tuple (Maybe GET.MetaData) SigmaxT.SGraph
...
@@ -289,7 +290,7 @@ convert :: GET.GraphData -> Tuple (Maybe GET.MetaData) SigmaxT.SGraph
convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
where
where
nodes = foldMapWithIndex nodeFn r.nodes
nodes = foldMapWithIndex nodeFn r.nodes
nodeFn _i nn@(GET.Node n) =
nodeFn _i nn@(GE
G
T.Node n) =
Seq.singleton {
Seq.singleton {
borderColor: color
borderColor: color
, children: n.children
, children: n.children
...
@@ -307,12 +308,12 @@ convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
...
@@ -307,12 +308,12 @@ convert (GET.GraphData r) = Tuple r.metaData $ SigmaxT.Graph {nodes, edges}
, _original: nn
, _original: nn
}
}
where
where
cDef (GET.Cluster {clustDefault}) = clustDefault
cDef (GE
G
T.Cluster {clustDefault}) = clustDefault
color = GET.intColor (cDef n.attributes)
color = GET.intColor (cDef n.attributes)
gargType = unsafePartial $ fromJust $ Types.modeFromString n.type_
gargType = unsafePartial $ fromJust $ Types.modeFromString n.type_
nodesMap = SigmaxT.nodesMap nodes
nodesMap = SigmaxT.nodesMap nodes
edges = foldMapWithIndex edgeFn $ A.sortWith (\(GET.Edge {weight}) -> weight) r.edges
edges = foldMapWithIndex edgeFn $ A.sortWith (\(GE
G
T.Edge {weight}) -> weight) r.edges
edgeFn i ee@(GET.Edge e) =
edgeFn i ee@(GE
G
T.Edge e) =
Seq.singleton
Seq.singleton
{ id : e.id_
{ id : e.id_
, color
, color
...
...
src/Gargantext/Components/GraphExplorer/Resources.purs
View file @
a31e6830
...
@@ -19,6 +19,7 @@ import Gargantext.Components.GraphExplorer.Types as GET
...
@@ -19,6 +19,7 @@ import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.Themes (darksterTheme)
import Gargantext.Components.Themes (darksterTheme)
import Gargantext.Components.Themes as Themes
import Gargantext.Components.Themes as Themes
import Gargantext.Hooks.Sigmax as Sigmax
import Gargantext.Hooks.Sigmax as Sigmax
import Gargantext.Hooks.Sigmax.Camera as Camera
import Gargantext.Hooks.Sigmax.Graphology as Graphology
import Gargantext.Hooks.Sigmax.Graphology as Graphology
import Gargantext.Hooks.Sigmax.ForceAtlas2 as ForceAtlas2
import Gargantext.Hooks.Sigmax.ForceAtlas2 as ForceAtlas2
import Gargantext.Hooks.Sigmax.Sigma as Sigma
import Gargantext.Hooks.Sigmax.Sigma as Sigma
...
@@ -148,12 +149,12 @@ drawGraphCpt = R.memo' $ here.component "graph" cpt where
...
@@ -148,12 +149,12 @@ drawGraphCpt = R.memo' $ here.component "graph" cpt where
Just fa2 -> ForceAtlas2.stop fa2
Just fa2 -> ForceAtlas2.stop fa2
case mCamera of
case mCamera of
Just
(GET.Camera { ratio, x, y })
-> do
Just
cam
-> do
Sigma.updateCamera sig { ratio, x, y }
Camera.updateCamera (Camera.camera sig) cam
-- Default camera: slightly de-zoom the graph to avoid
-- Default camera: slightly de-zoom the graph to avoid
-- nodes sticking to the container borders
-- nodes sticking to the container borders
Nothing ->
Nothing ->
Sigma.updateCamera sig { ratio: 1.1, x: 0.5, y: 0.5 }
Camera.updateCamera (Camera.camera sig) Camera.defaultCamera
-- Reload Sigma on Theme changes
-- Reload Sigma on Theme changes
-- TODO
-- TODO
...
...
src/Gargantext/Components/GraphExplorer/Sidebar/Legend.purs
View file @
a31e6830
...
@@ -10,6 +10,7 @@ import Data.Sequence (Seq)
...
@@ -10,6 +10,7 @@ import Data.Sequence (Seq)
import Data.Set as Set
import Data.Set as Set
import Data.Traversable (foldMap, intercalate)
import Data.Traversable (foldMap, intercalate)
import Gargantext.Components.Bootstrap as B
import Gargantext.Components.Bootstrap as B
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax.Types as ST
import Gargantext.Hooks.Sigmax.Types as ST
import Gargantext.Utils (getter, nbsp, (?))
import Gargantext.Utils (getter, nbsp, (?))
...
@@ -23,8 +24,8 @@ here = R2.here "Gargantext.Components.GraphExplorer.Sidebar.Legend"
...
@@ -23,8 +24,8 @@ here = R2.here "Gargantext.Components.GraphExplorer.Sidebar.Legend"
type Props =
type Props =
( legendSeq :: Seq GET.Legend
( legendSeq :: Seq GET.Legend
, extractedNodeList :: Array GET.Node
, extractedNodeList :: Array GE
G
T.Node
, nodeCountList :: Array GET.ClusterCount
, nodeCountList :: Array GE
G
T.ClusterCount
, selectedNodeIds :: T.Box ST.NodeIds
, selectedNodeIds :: T.Box ST.NodeIds
)
)
...
@@ -76,7 +77,7 @@ legendCpt = here.component "legend" cpt where
...
@@ -76,7 +77,7 @@ legendCpt = here.component "legend" cpt where
]
]
]
]
filterByCluster :: Int -> Array GE
T.Node -> Array GE
T.Node
filterByCluster :: Int -> Array GE
GT.Node -> Array GEG
T.Node
filterByCluster id
filterByCluster id
= A.filter
= A.filter
( getter _.attributes
( getter _.attributes
...
@@ -84,7 +85,7 @@ filterByCluster id
...
@@ -84,7 +85,7 @@ filterByCluster id
>>> eq id
>>> eq id
)
)
getClusterNodeCount :: Array GET.ClusterCount -> Int -> Int
getClusterNodeCount :: Array GE
G
T.ClusterCount -> Int -> Int
getClusterNodeCount nodeCountList id
getClusterNodeCount nodeCountList id
= nodeCountList
= nodeCountList
# A.find
# A.find
...
@@ -98,7 +99,7 @@ getClusterNodeCount nodeCountList id
...
@@ -98,7 +99,7 @@ getClusterNodeCount nodeCountList id
---------------------------------------------------------
---------------------------------------------------------
type SelectedNodesProps =
type SelectedNodesProps =
( extractedNodeList :: Array GET.Node
( extractedNodeList :: Array GE
G
T.Node
, selectedNodeIds :: T.Box ST.NodeIds
, selectedNodeIds :: T.Box ST.NodeIds
, clusterId :: Int
, clusterId :: Int
, nodeCount :: Int
, nodeCount :: Int
...
@@ -146,7 +147,7 @@ selectedNodesCpt = here.component "selectedNodes" cpt where
...
@@ -146,7 +147,7 @@ selectedNodesCpt = here.component "selectedNodes" cpt where
{ className: "graph-legend-nodes" }
{ className: "graph-legend-nodes" }
[
[
flip foldMap (filterByCluster clusterId extractedNodeList)
flip foldMap (filterByCluster clusterId extractedNodeList)
\(GET.Node { label: nodeLabel, id_: nodeId }) ->
\(GE
G
T.Node { label: nodeLabel, id_: nodeId }) ->
H.li
H.li
{ className: "graph-legend-nodes__item" }
{ className: "graph-legend-nodes__item" }
...
...
src/Gargantext/Components/GraphExplorer/Toolbar/Buttons.purs
View file @
a31e6830
...
@@ -32,6 +32,7 @@ import Gargantext.Components.GraphExplorer.Resources as Graph
...
@@ -32,6 +32,7 @@ import Gargantext.Components.GraphExplorer.Resources as Graph
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Utils as GEU
import Gargantext.Components.GraphExplorer.Utils as GEU
import Gargantext.Hooks.Sigmax as Sigmax
import Gargantext.Hooks.Sigmax as Sigmax
import Gargantext.Hooks.Sigmax.Camera as Camera
import Gargantext.Hooks.Sigmax.Graphology as Graphology
import Gargantext.Hooks.Sigmax.Graphology as Graphology
import Gargantext.Hooks.Sigmax.Sigma as Sigma
import Gargantext.Hooks.Sigmax.Sigma as Sigma
import Gargantext.Hooks.Sigmax.Types as SigmaxTypes
import Gargantext.Hooks.Sigmax.Types as SigmaxTypes
...
@@ -54,7 +55,7 @@ centerButton sigmaRef = B.button
...
@@ -54,7 +55,7 @@ centerButton sigmaRef = B.button
, callback: \_ -> do
, callback: \_ -> do
let sigma = R.readRef sigmaRef
let sigma = R.readRef sigmaRef
Sigmax.dependOnSigma sigma "[centerButton] sigma: Nothing" $ \s ->
Sigmax.dependOnSigma sigma "[centerButton] sigma: Nothing" $ \s ->
Sigma.goToAllCameras s {x: 0.0, y: 0.0, ratio: 1.0, angle: 0.0}
Camera.updateCamera (Camera.camera s) Camera.defaultCamera
}
}
[ H.text "Center" ]
[ H.text "Center" ]
...
@@ -96,10 +97,7 @@ cameraButton { id
...
@@ -96,10 +97,7 @@ cameraButton { id
nodes = Graphology.nodes graph
nodes = Graphology.nodes graph
graphData = GET.GraphData $ hyperdataGraph { edges = A.fromFoldable $ Seq.map GEU.stEdgeToGET edges
graphData = GET.GraphData $ hyperdataGraph { edges = A.fromFoldable $ Seq.map GEU.stEdgeToGET edges
, nodes = A.fromFoldable $ GEU.normalizeNodes $ Seq.map GEU.stNodeToGET nodes }
, nodes = A.fromFoldable $ GEU.normalizeNodes $ Seq.map GEU.stNodeToGET nodes }
let cameras = map Sigma.toCamera $ Sigma.cameras s
let camera = Camera.toCamera $ Camera.camera s
let camera = case cameras of
[c] -> GET.Camera { ratio: c.ratio, x: c.x, y: c.y }
_ -> GET.Camera { ratio: 1.0, x: 0.0, y: 0.0 }
let hyperdataGraph' = GET.HyperdataGraph { graph: graphData, mCamera: Just camera }
let hyperdataGraph' = GET.HyperdataGraph { graph: graphData, mCamera: Just camera }
launchAff_ $ do
launchAff_ $ do
eClonedGraphId <- cloneGraph { id, hyperdataGraph: hyperdataGraph', session }
eClonedGraphId <- cloneGraph { id, hyperdataGraph: hyperdataGraph', session }
...
...
src/Gargantext/Components/GraphExplorer/Types.purs
View file @
a31e6830
...
@@ -12,91 +12,13 @@ import Data.Show.Generic (genericShow)
...
@@ -12,91 +12,13 @@ import Data.Show.Generic (genericShow)
import Partial.Unsafe (unsafePartial)
import Partial.Unsafe (unsafePartial)
import Record as Record
import Record as Record
import Simple.JSON as JSON
import Simple.JSON as JSON
import Gargantext.Components.GraphExplorer.GraphTypes
import Gargantext.Hooks.Sigmax.Camera (Camera(..))
import Type.Proxy (Proxy(..))
import Type.Proxy (Proxy(..))
type GraphId = Int
type GraphId = Int
newtype Node = Node {
attributes :: Cluster
, children :: Array String
, id_ :: String
, label :: String
, size :: Int
, type_ :: String
, x :: Number
, y :: Number
}
x_coordP = Proxy :: Proxy "x_coord"
xP = Proxy :: Proxy "x"
y_coordP = Proxy :: Proxy "y_coord"
yP = Proxy :: Proxy "y"
clustDefaultP = Proxy :: Proxy "clustDefault"
clust_defaultP = Proxy :: Proxy "clust_default"
cameraP = Proxy :: Proxy "camera"
mCameraP = Proxy :: Proxy "mCamera"
idP = Proxy :: Proxy "id"
id_P = Proxy :: Proxy "id_"
typeP = Proxy :: Proxy "type"
type_P = Proxy :: Proxy "type_"
derive instance Generic Node _
derive instance Newtype Node _
instance Eq Node where eq = genericEq
instance Ord Node where compare (Node n1) (Node n2) = compare n1.id_ n2.id_
instance JSON.ReadForeign Node where
readImpl f = do
inst <- JSON.readImpl f
pure $ Node $
Record.rename idP id_P $
Record.rename typeP type_P $
Record.rename x_coordP xP $
Record.rename y_coordP yP $ inst
instance JSON.WriteForeign Node where
writeImpl (Node nd) = JSON.writeImpl $
Record.rename id_P idP $
Record.rename type_P typeP $
Record.rename xP x_coordP $
Record.rename yP y_coordP nd
newtype Cluster = Cluster { clustDefault :: Int }
derive instance Generic Cluster _
derive instance Newtype Cluster _
instance Eq Cluster where eq = genericEq
instance JSON.ReadForeign Cluster where
readImpl f = do
inst <- JSON.readImpl f
pure $ Cluster $ Record.rename clust_defaultP clustDefaultP inst
instance JSON.WriteForeign Cluster where
writeImpl (Cluster cl) = JSON.writeImpl $ Record.rename clustDefaultP clust_defaultP cl
newtype ClusterCount = ClusterCount
{ id :: Int
, count :: Int
}
derive instance Generic ClusterCount _
derive instance Newtype ClusterCount _
newtype Edge = Edge {
confluence :: Number
, id_ :: String
, source :: String
, target :: String
, weight :: Number
}
derive instance Generic Edge _
derive instance Newtype Edge _
instance Eq Edge where eq = genericEq
instance Ord Edge where compare (Edge e1) (Edge e2) = compare e1.id_ e2.id_
instance JSON.ReadForeign Edge where
readImpl f = do
inst <- JSON.readImpl f
pure $ Edge $ Record.rename idP id_P inst
instance JSON.WriteForeign Edge where
writeImpl (Edge ed) = JSON.writeImpl $ Record.rename id_P idP ed
-- | A 'fully closed interval' in CS parlance
-- | A 'fully closed interval' in CS parlance
type InclusiveRange t = { min :: t, max :: t }
type InclusiveRange t = { min :: t, max :: t }
...
@@ -246,18 +168,6 @@ instance Show SideTab where
...
@@ -246,18 +168,6 @@ instance Show SideTab where
show SideTabData = "Data"
show SideTabData = "Data"
show SideTabCommunity = "Community"
show SideTabCommunity = "Community"
newtype Camera =
Camera { ratio :: Number
, x :: Number
, y :: Number
}
derive instance Generic Camera _
derive instance Newtype Camera _
instance Eq Camera where eq = genericEq
derive newtype instance JSON.ReadForeign Camera
derive newtype instance JSON.WriteForeign Camera
newtype HyperdataGraph = HyperdataGraph {
newtype HyperdataGraph = HyperdataGraph {
graph :: GraphData
graph :: GraphData
, mCamera :: Maybe Camera
, mCamera :: Maybe Camera
...
...
src/Gargantext/Components/GraphExplorer/Utils.purs
View file @
a31e6830
...
@@ -11,16 +11,17 @@ import Data.Foldable (maximum, minimum)
...
@@ -11,16 +11,17 @@ import Data.Foldable (maximum, minimum)
import Data.Maybe (Maybe(..))
import Data.Maybe (Maybe(..))
import Data.Newtype (wrap)
import Data.Newtype (wrap)
import Data.Sequence as Seq
import Data.Sequence as Seq
import Gargantext.Components.GraphExplorer.GraphTypes as GEGT
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Components.GraphExplorer.Types as GET
import Gargantext.Hooks.Sigmax.Types as ST
import Gargantext.Hooks.Sigmax.Types as ST
import Gargantext.Utils (getter)
import Gargantext.Utils (getter)
import Gargantext.Utils.Seq as GUS
import Gargantext.Utils.Seq as GUS
stEdgeToGET :: Record ST.Edge -> GET.Edge
stEdgeToGET :: Record ST.Edge -> GE
G
T.Edge
stEdgeToGET { _original } = _original
stEdgeToGET { _original } = _original
stNodeToGET :: Record ST.Node -> GET.Node
stNodeToGET :: Record ST.Node -> GE
G
T.Node
stNodeToGET { id, label, x, y, _original: GE
T.Node { attributes, size, type_ } } = GE
T.Node {
stNodeToGET { id, label, x, y, _original: GE
GT.Node { attributes, size, type_ } } = GEG
T.Node {
attributes
attributes
, children: []
, children: []
, id_: id
, id_: id
...
@@ -33,11 +34,11 @@ stNodeToGET { id, label, x, y, _original: GET.Node { attributes, size, type_ } }
...
@@ -33,11 +34,11 @@ stNodeToGET { id, label, x, y, _original: GET.Node { attributes, size, type_ } }
-----------------------------------------------------------------------
-----------------------------------------------------------------------
normalizeNodes :: Seq.Seq GE
T.Node -> Seq.Seq GE
T.Node
normalizeNodes :: Seq.Seq GE
GT.Node -> Seq.Seq GEG
T.Node
normalizeNodes ns = Seq.map normalizeNode ns
normalizeNodes ns = Seq.map normalizeNode ns
where
where
xs = map (\(GET.Node { x }) -> x) ns
xs = map (\(GE
G
T.Node { x }) -> x) ns
ys = map (\(GET.Node { y }) -> y) ns
ys = map (\(GE
G
T.Node { y }) -> y) ns
mMinx = minimum xs
mMinx = minimum xs
mMaxx = maximum xs
mMaxx = maximum xs
mMiny = minimum ys
mMiny = minimum ys
...
@@ -56,12 +57,12 @@ normalizeNodes ns = Seq.map normalizeNode ns
...
@@ -56,12 +57,12 @@ normalizeNodes ns = Seq.map normalizeNode ns
ydivisor = case mYrange of
ydivisor = case mYrange of
Nothing -> 1.0
Nothing -> 1.0
Just ydiv -> 1.0 / ydiv
Just ydiv -> 1.0 / ydiv
normalizeNode (GE
T.Node n@{ x, y }) = GE
T.Node $ n { x = x * xdivisor
normalizeNode (GE
GT.Node n@{ x, y }) = GEG
T.Node $ n { x = x * xdivisor
, y = y * ydivisor }
, y = y * ydivisor }
------------------------------------------------------------------------
------------------------------------------------------------------------
takeGreatestNodeByCluster :: GET.HyperdataGraph -> Int -> Int -> Array GET.Node
takeGreatestNodeByCluster :: GET.HyperdataGraph -> Int -> Int -> Array GE
G
T.Node
takeGreatestNodeByCluster graphData take clusterId
takeGreatestNodeByCluster graphData take clusterId
= graphData
= graphData
# getter _.graph
# getter _.graph
...
@@ -77,7 +78,7 @@ takeGreatestNodeByCluster graphData take clusterId
...
@@ -77,7 +78,7 @@ takeGreatestNodeByCluster graphData take clusterId
>>> A.takeEnd take
>>> A.takeEnd take
>>> A.reverse
>>> A.reverse
countNodeByCluster :: GET.HyperdataGraph -> Int -> GET.ClusterCount
countNodeByCluster :: GET.HyperdataGraph -> Int -> GE
G
T.ClusterCount
countNodeByCluster graphData clusterId
countNodeByCluster graphData clusterId
= graphData
= graphData
# getter _.graph
# getter _.graph
...
...
src/Gargantext/Hooks/Sigmax/Camera.js
0 → 100644
View file @
a31e6830
'use strict'
;
export
function
_setState
(
cam
,
state
)
{
return
cam
.
setState
(
state
);
}
src/Gargantext/Hooks/Sigmax/Camera.purs
0 → 100644
View file @
a31e6830
module Gargantext.Hooks.Sigmax.Camera where
import Gargantext.Prelude
import Data.Eq.Generic (genericEq)
import Data.Generic.Rep (class Generic)
import Data.Newtype (class Newtype)
import Effect (Effect)
import Effect.Uncurried (EffectFn2, runEffectFn2)
import FFI.Simple ((..))
import Gargantext.Hooks.Sigmax.Sigma as Sigma
import Simple.JSON as JSON
foreign import data CameraInstance' :: Row Type
type CameraInstance = { | CameraInstance' }
type CameraRow =
( angle :: Number
, ratio :: Number
, x :: Number
, y :: Number )
newtype Camera =
Camera { |CameraRow }
derive instance Generic Camera _
derive instance Newtype Camera _
instance Eq Camera where eq = genericEq
derive newtype instance JSON.ReadForeign Camera
derive newtype instance JSON.WriteForeign Camera
defaultCamera :: Camera
defaultCamera = Camera { angle: 0.0
, ratio: 1.1
, x: 0.5
, y: 0.5 }
camera :: Sigma.Sigma -> CameraInstance
camera sig = sig .. "camera"
toCamera :: CameraInstance -> Camera
toCamera c = Camera { angle, ratio, x, y }
where
angle = c .. "angle" :: Number
ratio = c .. "ratio" :: Number
x = c .. "x" :: Number
y = c .. "y" :: Number
updateCamera :: CameraInstance -> Camera -> Effect Unit
updateCamera cam (Camera { angle, ratio, x, y }) = runEffectFn2 _setState cam { angle, ratio, x, y }
foreign import _setState :: forall e. EffectFn2 CameraInstance {|CameraRow} Unit
src/Gargantext/Hooks/Sigmax/Sigma.purs
View file @
a31e6830
...
@@ -190,44 +190,19 @@ sigmaEasing =
...
@@ -190,44 +190,19 @@ sigmaEasing =
, cubicInOut : SigmaEasing "cubicInOut"
, cubicInOut : SigmaEasing "cubicInOut"
}
}
type CameraProps =
-- DEPRECATED
( x :: Number
-- -- | Get an array of a sigma instance's `cameras`.
, y :: Number
-- cameras :: Sigma -> Array CameraInstance
, ratio :: Number
-- cameras s = Object.values cs
, angle :: Number
-- where
)
-- -- For some reason, `sigma.cameras` is an object with integer keys.
-- cs = s .. "cameras" :: Object.Object CameraInstance
foreign import data CameraInstance' :: Row Type
type CameraInstance = { | CameraInstance' }
-- goTo :: Record CameraProps -> CameraInstance -> Effect Unit
-- goTo props cam = pure $ cam ... "goTo" $ [props]
-- | Get an array of a sigma instance's `cameras`.
cameras :: Sigma -> Array CameraInstance
-- goToAllCameras :: Sigma -> Record CameraProps -> Effect Unit
cameras s = Object.values cs
-- goToAllCameras s props = traverse_ (goTo props) $ cameras s
where
-- For some reason, `sigma.cameras` is an object with integer keys.
cs = s .. "cameras" :: Object.Object CameraInstance
toCamera :: CameraInstance -> Record CameraProps
toCamera c = { angle, ratio, x, y }
where
angle = c .. "angle" :: Number
ratio = c .. "ratio" :: Number
x = c .. "x" :: Number
y = c .. "y" :: Number
updateCamera :: Sigma -> { ratio :: Number, x :: Number, y :: Number } -> Effect Unit
updateCamera sig { ratio, x, y } = do
let camera = sig .. "camera"
_ <- pure $ (camera .= "ratio") ratio
_ <- pure $ (camera .= "x") x
_ <- pure $ (camera .= "y") y
pure unit
goTo :: Record CameraProps -> CameraInstance -> Effect Unit
goTo props cam = pure $ cam ... "goTo" $ [props]
goToAllCameras :: Sigma -> Record CameraProps -> Effect Unit
goToAllCameras s props = traverse_ (goTo props) $ cameras s
takeScreenshot :: Sigma -> Effect String
takeScreenshot :: Sigma -> Effect String
takeScreenshot = runEffectFn1 _takeScreenshot
takeScreenshot = runEffectFn1 _takeScreenshot
...
...
src/Gargantext/Hooks/Sigmax/Types.purs
View file @
a31e6830
...
@@ -13,7 +13,7 @@ import Data.Tuple (Tuple(..))
...
@@ -13,7 +13,7 @@ import Data.Tuple (Tuple(..))
import Partial.Unsafe (unsafePartial)
import Partial.Unsafe (unsafePartial)
import Prelude (class Eq, class Show, map, ($), (&&), (==), (||), (<$>), mod, not)
import Prelude (class Eq, class Show, map, ($), (&&), (==), (||), (<$>), mod, not)
import Gargantext.Components.GraphExplorer.
Types as GE
T
import Gargantext.Components.GraphExplorer.
GraphTypes as GEG
T
import Gargantext.Data.Louvain as Louvain
import Gargantext.Data.Louvain as Louvain
import Gargantext.Types as GT
import Gargantext.Types as GT
...
@@ -47,7 +47,7 @@ type Node = (
...
@@ -47,7 +47,7 @@ type Node = (
, type :: String -- available types: circle, cross, def, diamond, equilateral, pacman, square, star
, type :: String -- available types: circle, cross, def, diamond, equilateral, pacman, square, star
, x :: Number
, x :: Number
, y :: Number
, y :: Number
, _original :: GET.Node
, _original :: GE
G
T.Node
)
)
type Edge = (
type Edge = (
...
@@ -62,7 +62,7 @@ type Edge = (
...
@@ -62,7 +62,7 @@ type Edge = (
, targetNode :: Record Node
, targetNode :: Record Node
, weight :: Number
, weight :: Number
, weightIdx :: Int
, weightIdx :: Int
, _original :: GET.Edge
, _original :: GE
G
T.Edge
)
)
type NodeIds = Set.Set NodeId
type NodeIds = Set.Set NodeId
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment