Skip to content

Commit 7c1beb7

Browse files
committed
Simple vue frame slider working in Jupyter and Girder
1 parent 5b4e56c commit 7c1beb7

File tree

5 files changed

+49
-25
lines changed

5 files changed

+49
-25
lines changed

Diff for: girder/girder_large_image/web_client/views/imageViewerSelectWidget.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import * as viewers from './imageViewerWidget';
1111

1212
import imageViewerSelectWidget from '../templates/imageViewerSelectWidget.pug';
1313
import '../stylesheets/imageViewerSelectWidget.styl';
14-
import FrameSelector from '../vue/components/FrameSelector.vue';
14+
15+
import FrameSelector from '../widgets/FrameSelector.vue';
16+
import DualInput from '../widgets/DualInput.vue';
17+
import Vue from 'vue';
1518

1619
wrap(ItemView, 'render', function (render) {
1720
// ItemView is a special case in which rendering is done asynchronously,
@@ -73,9 +76,12 @@ var ImageViewerSelectWidget = View.extend({
7376

7477
_createVue(imageMetadata, frameUpdate) {
7578
const el = this.$('#vue-container').get(0);
76-
const vm = new FrameSelector({
79+
FrameSelector.components = { DualInput };
80+
const component = Vue.extend(FrameSelector);
81+
const vm = new component({
7782
el,
7883
propsData: {
84+
currentFrame: 0,
7985
itemId: this.itemId,
8086
imageMetadata: imageMetadata,
8187
frameUpdate: frameUpdate,

Diff for: girder/girder_large_image/web_client/widgets

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../large_image/widgets

Diff for: large_image/widgets/DualInput.vue

+33-17
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,76 @@
11
<script>
22
module.exports = {
3+
name: 'DualInput',
34
props: ['label', 'currentValue', 'valueMax', 'sliderLabels', 'maxMerge'],
5+
emits: ['updateValue', 'updateMaxMerge'],
6+
data() {
7+
return {
8+
value: this.currentValue,
9+
merge: this.maxMerge,
10+
};
11+
},
412
watch: {
5-
currentValue() {
6-
this.$emit('update', this.currentValue)
7-
}
13+
currentValue(v) {
14+
this.value = v;
15+
},
16+
value(v) {
17+
this.$emit('updateValue', v);
18+
},
19+
maxMerge(v) {
20+
this.merge = v;
21+
},
22+
merge(v) {
23+
this.$emit('updateMaxMerge', v);
24+
}
825
}
926
};
1027
</script>
1128

1229
<template>
1330
<tr :class="sliderLabels && sliderLabels.length ? 'dual-controls tall' : 'dual-controls'">
14-
<td><label for="numberControl">{{ label }}:</label></td>
31+
<td><label for="numberControl">{{ label }}: </label></td>
1532
<td>
1633
<input
17-
v-model="currentValue"
34+
v-model="value"
1835
type="number"
1936
name="numberControl"
2037
min="0"
2138
:max="valueMax"
22-
:disabled="maxMerge"
39+
:disabled="merge"
2340
>
2441
</td>
2542
<td class="slider-control-cell">
2643
<input
27-
v-model="currentValue"
44+
v-model="value"
2845
type="range"
2946
name="sliderControl"
3047
min="0"
3148
:max="valueMax"
32-
:disabled="maxMerge"
33-
style="width: 100%"
49+
:disabled="merge"
3450
>
3551
<div class="bubble-wrap">
3652
<output
37-
v-if="sliderLabels && sliderLabels.length > currentValue"
38-
:style="'left:'+currentValue/valueMax*100+'%; transform:translateX(-'+currentValue/valueMax*100+'%)'"
53+
v-if="sliderLabels && sliderLabels.length > value"
54+
:style="'left:'+value/valueMax*100+'%; transform:translateX(-'+value/valueMax*100+'%)'"
3955
class="bubble"
4056
>
41-
{{ sliderLabels[currentValue] }}
57+
{{ sliderLabels[value] }}
4258
</output>
4359
<span
44-
v-if="sliderLabels && sliderLabels.length > currentValue"
45-
:style="'left:'+currentValue/valueMax*100+'%; transform:translateX(-'+currentValue/valueMax*100+'%)'"
60+
v-if="sliderLabels && sliderLabels.length > value"
61+
:style="'left:'+value/valueMax*100+'%; transform:translateX(-'+value/valueMax*100+'%)'"
4662
class="bubble-after"
4763
/>
4864
</div>
4965
</td>
5066
<td
51-
v-show="maxMerge !== undefined"
67+
v-show="merge !== undefined"
5268
class="max-merge-cell"
5369
:title="'Max Merge ' + label"
5470
>
5571
<input
5672
:id="'maxMerge'+label"
57-
v-model="maxMerge"
73+
v-model="merge"
5874
type="checkbox"
5975
>
6076
<label :for="'maxMerge'+label">Max Merge</label>
@@ -95,7 +111,7 @@ module.exports = {
95111
top: -1px;
96112
left: 50%;
97113
}
98-
.slider-control-cell {
114+
.slider-control-cell, .slider-control-cell > input {
99115
width: 100%;
100116
}
101117
.max-merge-cell {

Diff for: large_image/widgets/FrameSelector.vue

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script>
2-
modules.export = {
2+
module.exports = {
33
name: 'FrameSelector',
44
props: ['currentFrame', 'itemId', 'imageMetadata', 'frameUpdate', 'liConfig'],
55
data() {
@@ -9,8 +9,9 @@ modules.export = {
99
};
1010
},
1111
created() {
12-
console.log(this.imageMetadata)
13-
this.maxFrame = this.imageMetadata.frames.length - 1;
12+
if (this.imageMetadata && this.imageMetadata.frames) {
13+
this.maxFrame = this.imageMetadata.frames.length - 1;
14+
}
1415
},
1516
watch: {
1617
currentFrame() {
@@ -32,13 +33,13 @@ modules.export = {
3233
<div id="current_image_frame" class="invisible">
3334
{{ currentFrame }}
3435
</div>
35-
<dual-input
36+
<DualInput
3637
v-if="currentModeId === 0"
3738
:currentValue.sync="currentFrame"
3839
:valueMax="maxFrame"
3940
:maxMerge="false"
4041
label="Frame"
41-
@update="updateCurrentFrame"
42+
@updateValue="updateCurrentFrame"
4243
/>
4344
</div>
4445
</template>

Diff for: large_image/widgets/components.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class DualInput(ipyvue.VueTemplate):
1515
class FrameSelector(ipyvue.VueTemplate, traitlets.HasTraits):
1616
template_file = __file__, 'FrameSelector.vue'
1717
components = traitlets.Dict({
18-
'dual-input': DualInput().template.template,
18+
'DualInput': DualInput().template.template,
1919
}).tag(sync=True)
2020

2121
imageMetadata = traitlets.Dict().tag(sync=True)

0 commit comments

Comments
 (0)