@@ -21,7 +21,7 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
2121 construct : function ( ) {
2222 this . base ( arguments ) ;
2323
24- const layout = new qx . ui . layout . VBox ( 10 ) ;
24+ const layout = new qx . ui . layout . VBox ( 15 ) ;
2525 this . _setLayout ( layout ) ;
2626
2727 this . __populateLayout ( ) ;
@@ -48,7 +48,25 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
4848 } ,
4949 } ,
5050
51+ statics : {
52+ createThumbnail : function ( source , size ) {
53+ return new qx . ui . basic . Image ( ) . set ( {
54+ source : source ,
55+ alignY : "middle" ,
56+ scale : true ,
57+ allowGrowX : true ,
58+ allowGrowY : true ,
59+ allowShrinkX : true ,
60+ allowShrinkY : true ,
61+ maxWidth : size ,
62+ maxHeight : size ,
63+ } ) ;
64+ } ,
65+ } ,
66+
5167 members : {
68+ __selectedModelLayout : null ,
69+
5270 __populateLayout : function ( ) {
5371 this . _removeAll ( ) ;
5472
@@ -71,43 +89,56 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
7189 } ,
7290
7391 __addModelsInfo : function ( ) {
74- const modelLayout = new qx . ui . container . Composite ( new qx . ui . layout . VBox ( 16 ) ) ;
92+ const modelLayout = new qx . ui . container . Composite ( new qx . ui . layout . VBox ( 6 ) ) ;
93+
94+ this . __selectedModelLayout = new qx . ui . container . Composite ( new qx . ui . layout . VBox ( 6 ) ) ;
95+ modelLayout . add ( this . __selectedModelLayout ) ;
7596
7697 const anatomicalModelsData = this . getAnatomicalModelsData ( ) ;
7798 const modelsInfo = anatomicalModelsData [ "licensedResources" ] ;
7899 if ( modelsInfo . length > 1 ) {
79- const sBox = new qx . ui . form . SelectBox ( ) . set ( {
80- minWidth : 200 ,
81- allowGrowX : false ,
82- } ) ;
83- modelsInfo . forEach ( modelInfo => {
84- const sbItem = new qx . ui . form . ListItem ( modelInfo [ "source" ] [ "features" ] [ "name" ] ) ;
85- sbItem . modelId = modelInfo [ "source" ] [ "id" ] ;
86- sBox . add ( sbItem ) ;
100+ const modelSelectionLayout = new qx . ui . container . Composite ( new qx . ui . layout . VBox ( 4 ) ) ;
101+ const titleLabel = new qx . ui . basic . Label ( this . tr ( "This bundle contains:" ) ) ;
102+ modelSelectionLayout . add ( titleLabel ) ;
103+ const thumbnailsLayout = new qx . ui . container . Composite ( new qx . ui . layout . HBox ( 2 ) ) ;
104+ modelSelectionLayout . add ( thumbnailsLayout ) ;
105+ const thumbnailTapped = idx => {
106+ this . __populateSelectedModelInfo ( idx ) ;
107+ const selectedBorderColor = qx . theme . manager . Color . getInstance ( ) . resolve ( "strong-main" ) ;
108+ const unselectedBorderColor = "transparent" ;
109+ thumbnailsLayout . getChildren ( ) . forEach ( ( thumbnail , index ) => {
110+ osparc . utils . Utils . updateBorderColor ( thumbnail , index === idx ? selectedBorderColor : unselectedBorderColor ) ;
111+ } ) ;
112+ }
113+ modelsInfo . forEach ( ( modelInfo , idx ) => {
114+ const miniThumbnail = this . self ( ) . createThumbnail ( modelInfo [ "source" ] [ "thumbnail" ] , 32 ) ;
115+ miniThumbnail . set ( {
116+ toolTipText : osparc . store . LicensedItems . licensedResourceNameAndVersion ( modelInfo ) ,
117+ } ) ;
118+ osparc . utils . Utils . addBorder ( miniThumbnail ) ;
119+ miniThumbnail . addListener ( "tap" , ( ) => thumbnailTapped ( idx ) ) ;
120+ thumbnailsLayout . add ( miniThumbnail ) ;
87121 } ) ;
88- this . _add ( sBox ) ;
89- sBox . addListener ( "changeSelection" , e => {
90- const selection = e . getData ( ) ;
91- if ( selection . length ) {
92- const idxFound = modelsInfo . findIndex ( mdlInfo => mdlInfo [ "source" ] [ "id" ] === selection [ 0 ] . modelId )
93- this . __populateModelInfo ( modelLayout , anatomicalModelsData , idxFound ) ;
94- }
95- } , this ) ;
96- this . __populateModelInfo ( modelLayout , anatomicalModelsData , 0 ) ;
122+ modelLayout . add ( modelSelectionLayout ) ;
123+ thumbnailTapped ( 0 ) ;
124+
125+ this . __populateSelectedModelInfo ( ) ;
97126 } else {
98- this . __populateModelInfo ( modelLayout , anatomicalModelsData , 0 ) ;
127+ this . __populateSelectedModelInfo ( ) ;
99128 }
100129
101130 this . _add ( modelLayout ) ;
102131 } ,
103132
104- __populateModelInfo : function ( modelLayout , anatomicalModelsData , selectedIdx = 0 ) {
105- modelLayout . removeAll ( ) ;
133+ __populateSelectedModelInfo : function ( selectedIdx = 0 ) {
134+ this . __selectedModelLayout . removeAll ( ) ;
106135
107- const anatomicalModel = anatomicalModelsData [ "licensedResources" ] [ selectedIdx ] [ "source" ] ;
108- const topGrid = new qx . ui . layout . Grid ( 8 , 8 ) ;
136+ const anatomicalModelsData = this . getAnatomicalModelsData ( ) ;
137+
138+ const topGrid = new qx . ui . layout . Grid ( 8 , 6 ) ;
109139 topGrid . setColumnFlex ( 0 , 1 ) ;
110- const topLayout = new qx . ui . container . Composite ( topGrid ) ;
140+ const headerLayout = new qx . ui . container . Composite ( topGrid ) ;
141+ const anatomicalModel = anatomicalModelsData [ "licensedResources" ] [ selectedIdx ] [ "source" ] ;
111142 let description = anatomicalModel [ "description" ] || "" ;
112143 description = description . replace ( / S P E A G / g, " " ) ; // remove SPEAG substring
113144 const delimiter = " - " ;
@@ -120,7 +151,7 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
120151 allowGrowX : true ,
121152 allowGrowY : true ,
122153 } ) ;
123- topLayout . add ( titleLabel , {
154+ headerLayout . add ( titleLabel , {
124155 column : 0 ,
125156 row : 0 ,
126157 } ) ;
@@ -135,7 +166,7 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
135166 allowGrowX : true ,
136167 allowGrowY : true ,
137168 } ) ;
138- topLayout . add ( subtitleLabel , {
169+ headerLayout . add ( subtitleLabel , {
139170 column : 0 ,
140171 row : 1 ,
141172 } ) ;
@@ -166,27 +197,17 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
166197 decorator : "rounded" ,
167198 } ) ;
168199 manufacturerLink . addListener ( "tap" , ( ) => window . open ( manufacturerData [ "link" ] ) ) ;
169- topLayout . add ( manufacturerLink , {
200+ headerLayout . add ( manufacturerLink , {
170201 column : 1 ,
171202 row : 0 ,
172203 rowSpan : 2 ,
173204 } ) ;
174205 }
175- modelLayout . add ( topLayout ) ;
206+ this . __selectedModelLayout . add ( headerLayout ) ;
176207
177208
178209 const middleLayout = new qx . ui . container . Composite ( new qx . ui . layout . HBox ( 16 ) ) ;
179- const thumbnail = new qx . ui . basic . Image ( ) . set ( {
180- source : anatomicalModel [ "thumbnail" ] ,
181- alignY : "middle" ,
182- scale : true ,
183- allowGrowX : true ,
184- allowGrowY : true ,
185- allowShrinkX : true ,
186- allowShrinkY : true ,
187- maxWidth : 256 ,
188- maxHeight : 256 ,
189- } ) ;
210+ const thumbnail = this . self ( ) . createThumbnail ( anatomicalModel [ "thumbnail" ] , 256 ) ;
190211 middleLayout . add ( thumbnail ) ;
191212
192213 const features = anatomicalModel [ "features" ] ;
@@ -264,14 +285,14 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
264285
265286 middleLayout . add ( featuresLayout ) ;
266287
267- modelLayout . add ( middleLayout ) ;
288+ this . __selectedModelLayout . add ( middleLayout ) ;
268289
269- const importButton = this . __createImportSection ( anatomicalModelsData , selectedIdx ) ;
270- modelLayout . add ( importButton ) ;
290+ const importSection = this . __createImportSection ( anatomicalModelsData , selectedIdx ) ;
291+ this . __selectedModelLayout . add ( importSection ) ;
271292 } ,
272293
273294 __createImportSection : function ( anatomicalModelsData , selectedIdx ) {
274- const importSection = new qx . ui . container . Composite ( new qx . ui . layout . VBox ( 5 ) . set ( {
295+ const importSection = new qx . ui . container . Composite ( new qx . ui . layout . VBox ( ) . set ( {
275296 alignX : "center"
276297 } ) ) ;
277298
@@ -281,6 +302,7 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
281302 center : true ,
282303 maxWidth : 200 ,
283304 alignX : "center" ,
305+ marginTop : 10 ,
284306 } ) ;
285307 this . bind ( "openBy" , importButton , "visibility" , {
286308 converter : openBy => openBy ? "visible" : "excluded"
@@ -344,7 +366,7 @@ qx.Class.define("osparc.vipMarket.AnatomicalModelDetails", {
344366 . then ( licensedItems => {
345367 const lowerLicensedItems = osparc . store . LicensedItems . getLowerLicensedItems ( licensedItems , licensedItemData [ "key" ] , licensedItemData [ "version" ] )
346368 if ( licensedItemData [ "licensedResources" ] . length > 1 || lowerLicensedItems . length ) {
347- let text = this . tr ( "This Bundle gives you access to:" ) + "<br>" ;
369+ let text = this . tr ( "This bundle gives you access to:" ) + "<br>" ;
348370 licensedItemData [ "licensedResources" ] . forEach ( licensedResource => {
349371 text += `- ${ osparc . store . LicensedItems . licensedResourceNameAndVersion ( licensedResource ) } <br>` ;
350372 } ) ;
0 commit comments