Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徽霖
Vscode
提交
69f9a3b8
V
Vscode
项目概览
徽霖
/
Vscode
通知
9
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
Vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
69f9a3b8
编写于
1月 25, 2018
作者:
M
Matt Bierner
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Persist scroll position in image view
上级
045c212f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
35 addition
and
7 deletion
+35
-7
src/vs/workbench/browser/parts/editor/resourceViewer.ts
src/vs/workbench/browser/parts/editor/resourceViewer.ts
+35
-7
未找到文件。
src/vs/workbench/browser/parts/editor/resourceViewer.ts
浏览文件 @
69f9a3b8
...
...
@@ -330,6 +330,12 @@ Registry.as<IStatusbarRegistry>(Extensions.Statusbar).registerStatusbarItem(
new
StatusbarItemDescriptor
(
ZoomStatusbarItem
,
StatusbarAlignment
.
RIGHT
,
101
)
);
interface
ImageState
{
scale
:
Scale
;
offsetX
:
number
;
offsetY
:
number
;
}
class
InlineImageView
{
private
static
readonly
SCALE_PINCH_FACTOR
=
0.05
;
private
static
readonly
SCALE_FACTOR
=
1.5
;
...
...
@@ -350,9 +356,9 @@ class InlineImageView {
private
static
IMAGE_RESOURCE_ETAG_CACHE
=
new
LRUCache
<
string
,
{
etag
:
string
,
src
:
string
}
>
(
100
);
/**
* Store the scale of an image so it can be restored when changing editor tabs
* Store the scale
and position
of an image so it can be restored when changing editor tabs
*/
private
static
readonly
IMAGE_SCALE_CACHE
=
new
LRUCache
<
string
,
number
>
(
100
);
private
static
readonly
imageStateCache
=
new
LRUCache
<
string
,
ImageState
>
(
100
);
public
static
create
(
container
:
Builder
,
...
...
@@ -367,7 +373,8 @@ class InlineImageView {
const
cacheKey
=
descriptor
.
resource
.
toString
();
let
scaleDirection
=
ScaleDirection
.
IN
;
let
scale
:
Scale
=
InlineImageView
.
IMAGE_SCALE_CACHE
.
get
(
cacheKey
)
||
'
fit
'
;
const
initialState
:
ImageState
=
InlineImageView
.
imageStateCache
.
get
(
cacheKey
)
||
{
scale
:
'
fit
'
,
offsetX
:
0
,
offsetY
:
0
};
let
scale
=
initialState
.
scale
;
let
img
:
Builder
|
null
=
null
;
let
imgElement
:
HTMLImageElement
|
null
=
null
;
...
...
@@ -381,7 +388,7 @@ class InlineImageView {
img
.
addClass
(
'
scale-to-fit
'
);
img
.
removeClass
(
'
pixelated
'
);
img
.
style
(
'
width
'
,
'
auto
'
);
InlineImageView
.
IMAGE_SCALE_CACHE
.
set
(
cacheKey
,
null
);
InlineImageView
.
imageStateCache
.
set
(
cacheKey
,
null
);
}
else
{
const
oldWidth
=
imgElement
.
width
;
const
oldHeight
=
imgElement
.
height
;
...
...
@@ -400,15 +407,19 @@ class InlineImageView {
img
.
removeClass
(
'
scale-to-fit
'
);
img
.
style
(
'
width
'
,
`
${(
imgElement
.
naturalWidth
*
scale
)}
px`
);
img
.
style
(
'
height
'
,
'
auto
'
);
InlineImageView
.
IMAGE_SCALE_CACHE
.
set
(
cacheKey
,
scale
);
const
newWidth
=
imgElement
.
width
;
const
scaleFactor
=
(
newWidth
-
oldWidth
)
/
oldWidth
;
const
newScrollLeft
=
((
oldWidth
*
scaleFactor
*
dx
)
+
scrollLeft
);
const
newScrollTop
=
((
oldHeight
*
scaleFactor
*
dy
)
+
scrollTop
);
scrollbar
.
setScrollPosition
({
scrollLeft
:
((
oldWidth
*
scaleFactor
*
dx
)
+
scrollLeft
)
,
scrollTop
:
((
oldHeight
*
scaleFactor
*
dy
)
+
scrollTop
)
,
scrollLeft
:
newScrollLeft
,
scrollTop
:
newScrollTop
,
});
InlineImageView
.
imageStateCache
.
set
(
cacheKey
,
{
scale
:
scale
,
offsetX
:
newScrollLeft
,
offsetY
:
newScrollTop
});
}
ZoomStatusbarItem
.
instance
.
show
(
scale
,
updateScale
);
scrollbar
.
scanDomNode
();
...
...
@@ -474,6 +485,17 @@ class InlineImageView {
// scrolling up, pinching out should increase the scale
const
delta
=
-
e
.
deltaY
;
updateScale
(
scale
as
number
+
delta
*
InlineImageView
.
SCALE_PINCH_FACTOR
);
})
.
on
(
DOM
.
EventType
.
SCROLL
,
()
=>
{
if
(
!
imgElement
||
!
imgElement
.
parentElement
||
scale
===
'
fit
'
)
{
return
;
}
const
entry
=
InlineImageView
.
imageStateCache
.
get
(
cacheKey
);
if
(
entry
)
{
const
{
scrollTop
,
scrollLeft
}
=
imgElement
.
parentElement
;
InlineImageView
.
imageStateCache
.
set
(
cacheKey
,
{
scale
:
entry
.
scale
,
offsetX
:
scrollLeft
,
offsetY
:
scrollTop
});
}
});
$
(
container
)
...
...
@@ -489,6 +511,12 @@ class InlineImageView {
scrollbar
.
scanDomNode
();
img
.
style
(
'
visibility
'
,
'
visible
'
);
updateScale
(
scale
);
if
(
initialState
.
scale
!==
'
fit
'
)
{
scrollbar
.
setScrollPosition
({
scrollLeft
:
initialState
.
offsetX
,
scrollTop
:
initialState
.
offsetY
,
});
}
});
return
context
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录