slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题

  上次解决区域选择不能跨冻结列问题的时候,剩了个尾巴,从右往左选择的时候,会出现选择不正常的情况,后续对这个问题进行了修正。

在修正问题前,需要选择的方向,即从左往右还是从右往左选择(L->R Or R->L)。

  确定是否跨区域,前提知道选择的方向,即(L->R && Start <= frozenColumn && End > frozenColumn || R->L && Start>frozenColumn && End <=frozenColumn) 。

  从选择方向得知,我们需要记录开始和结束 (Start ,End)。

  上述准备条件之后剩下的就是计算border了,L->R的情况跨区域的时候 L的右边框0,R->L 的时候,R的左边框0。

  起点问题 ,L->R跨区域的情况,R的Left为0;R->L跨区域的情况,L的起点为L父容器的宽度- 当前的左起点。

  分析之后,改造代码:

  

function handleDrag(e, dd) {
if (!_dragging) {
return;
}
e.stopImmediatePropagation(); var end = _grid.getCellFromPoint(
e.pageX - _$activeCanvas.offset().left + _columnOffset,
e.pageY - _$activeCanvas.offset().top + _rowOffset
); if ((!_grid.canCellBeSelected(end.row, end.cell))
//|| (!_isRightCanvas && (end.cell > _gridOptions.frozenColumn))
//|| (_isRightCanvas && (end.cell <= _gridOptions.frozenColumn))
//|| ( !_isBottomCanvas && ( end.row >= _gridOptions.frozenRow ) )
|| (_isBottomCanvas && (end.row < _gridOptions.frozenRow))
) {
return;
} dd.range.end = end;
var canvas = $(_grid.getActiveCanvasNode(e));
_decorator.show(new Slick.Range(dd.range.start.row, dd.range.start.cell, end.row, end.cell), {
start: _startCell.cell,
canvas: canvas,
end: dd.range.end.cell
});
}
function show(range, cfg) {
var canvas = cfg.canvas;
var start = cfg.start;
var end = cfg.end;
var from = grid.getCellNodeBox(range.fromRow, range.fromCell);
var to = grid.getCellNodeBox(range.toRow, range.toCell); // range left to right
var directLR = start <= end;
// frozenColumn temp var
var frozenColumn = grid.getOptions().frozenColumn; var lR = false;
// lR true condition
if (directLR) {
lR = start <= frozenColumn && end > frozenColumn;
} else {
lR = start > frozenColumn && end <= frozenColumn;
} if (!_elem) {
_elem = $("<div></div>", { css: options.selectionCss })
.addClass(options.selectionCssClass)
.css("position", "absolute")
.appendTo(grid.getActiveCanvasNode());
_borderWidth = _elem.css("border-left-width");
} // lr ,create new element .
if (lR && !_rElem) {
_rElem = $("<div></div>", { css: options.selectionCss })
.addClass(options.selectionCssClass)
.css("position", "absolute")
.appendTo(canvas);
} // ! lr ,remove _rElem
if (!lR && _rElem) {
_rElem.remove();
_rElem = null;
} var temp = lR && directLR ? _rElem : _elem;
var lWidth = lR ? directLR ? canvas.width() : to.right - 2 : (to.right - from.left - 2);
var lLeft = lR && !directLR ? 0 : (from.left - 1);
//console.log("DIRECT_LR:" + directLR + " FROM_L:" + from.left + " TO_L:" + to.left + " FROM_R:" + from.right + " TO_R" + to.right + " START:" + start + " END:" + end + " LWIDTH:" + lWidth)
if (_elem) {
_elem.css("border-right-width", lR ? directLR ? "0px" : _borderWidth : _borderWidth);
_elem.css("border-left-width", lR ? directLR ? _borderWidth : "0px" : _borderWidth);
_elem.css({
top: from.top - 1,
left: lLeft,
height: to.bottom - from.top - 2,
width: lWidth
});
} if (_rElem) {
var rLeft = directLR ? 0 : from.left;
var rWidth = !directLR ? canvas.width() : (to.right - 2);
//console.log("RWIDTH:" + rWidth + " RLEFT:" + rLeft);
_rElem.css("border-left-width", lR ? directLR ? "0px" : _borderWidth : _borderWidth);
_rElem.css("border-right-width", lR ? directLR ? _borderWidth : "0px" : _borderWidth);
_rElem.css({
top: from.top - 1,
left: rLeft,
height: to.bottom - from.top - 2,
width: rWidth
});
} return temp;
}

修正后的结果:

OK 到这里,未完待续!

slickgrid ( nsunleo-slickgrid ) 3 修正区域选择不能跨冻结列的问题的更多相关文章

  1. slickgrid ( nsunleo-slickgrid ) 2 修正区域选择不能跨冻结列的问题

    slickgrid( nsunleo-slickgrid )  2 修正区域选择不能跨冻结列的问题 周六的时候,留了个小小的尾巴,区域选择的问题进做到了定位: 问题原因,在slickgrid启动冻结之 ...

  2. slickgrid ( nsunleo-slickgrid ) 8 区域选择与复制粘贴

    区域选择 区域选择是通过插件CellRangeSelector实现的,默认不支持跨冻结列进行选择,修正了选择,支持跨冻结列,代码如下,通过判断选择的起点和终点所落在的冻结范围进行计算,如从左往右进行复 ...

  3. slickgrid ( nsunleo-slickgrid ) 4 解决区域选择和列选择冲突

    slickgrid ( nsunleo-slickgrid ) 3 解决区域选择和列选择冲突 之前启用区域选择的时候,又启用了列选择(CheckboxSelectColumn),此时发现选择状态与区域 ...

  4. ajax 城市区域选择三级联动

    <body onLoad="sheng()"><div class="xqbody">    <form action=" ...

  5. Vim的使用 区域选择

    1.Visual Block 区域选择,这里的Visual表示视觉,图像,可视化. 2.    小写v:字符选择     shift+v(大写V):行选择               ctrl+v:矩 ...

  6. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  7. QTableView表格控件区域选择-自绘选择区域

    目录 一.开心一刻 二.概述 三.效果展示 四.实现思路 1.绘制区域 2.绘制边框 3.绘制 五.相关文章 原文链接:QTableView表格控件区域选择-自绘选择区域 一.开心一刻 陪完客户回到家 ...

  8. 使用Qt5+CMake实现图片的区域选择(附源码)

    近期研发涉及到了图片的区域选择,找来一些资料一直不能很满意,所以自己实现了一个. 实现步骤如下.源码可以点击ImageAOI获取. 如下资料来自源码的README. ImageAOI (XLabel) ...

  9. 图像的ROI区域选择与复制

    [opencv学习笔记六]图像的ROI区域选择与复制 孜然   7 人赞同了该文章 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感 ...

随机推荐

  1. Filebeat 日志收集

    Filebeat 介绍 Filebeat 安装 # 上传代码包 [root@redis03 ~]# rz filebeat-6.6.0-x86_64.rpm # 安装 [root@redis03 ~] ...

  2. 桶排序 && leetcode 41

    桶排序 对于0-1000 ,用1001个桶  简单版 或者用10个桶0-9,先按各位装桶,然后依(桶)次放回,然后再按十位放桶,放回,然后百位. 也就是基数排序 https://www.cnblogs ...

  3. Gym 101464C - 计算几何+二分(uva1463)

    不是很难,但是我觉得对代码能力的要求还是挺高的. 注意模块化. 因为是浮点数,所以二分用的很多很多. 参考 https://blog.csdn.net/njupt_lyy/article/detail ...

  4. npm fetch All In One

    npm fetch All In One fetch for TypeScript { "compilerOptions": { "lib": ["D ...

  5. LeetCode 算法题解 js 版 (001 Two Sum)

    LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...

  6. Swift 5.3

    Swift 5.3 https://swift.org/blog/ refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  7. git include只包含某些文件

    .gitignore: * # include !.gitignore !a.txt !dir2

  8. Flutter Demo: PageView横向使用

    video import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends ...

  9. Oracle数据库在给表添加字段的sql中用comment报错

    原因:不同于mysql,Oracle数据库在添加表字段时不能直接用comment,而是单独写一个sql语句,如下: alter table SYS_USER add SENDMSG_LASTTIME ...

  10. 解决使用Redis时配置 fastjson反序列化报错 com.alibaba.fastjson.JSONException: autoType is not support

    1.问题描述 在使用redis时,配置自定义序列化redisTemplate为FastJsonRedisSerializer .  1 /** 2 * 自定义redis序列化器 3 */ 4 @Sup ...