From 9f05959d4d5fea7fc26e0cedb7217f0be92bcae9 Mon Sep 17 00:00:00 2001
From: wpxp123456 <2677556700@qq.com>
Date: Tue, 25 Aug 2020 14:33:12 +0800
Subject: [PATCH] feat(hide column): hide column

hide column
---
 src/controllers/constant.js           |  10 ++
 src/controllers/controlHistory.js     |  20 ++++
 src/controllers/rowColumnOperation.js |  88 +++++++++++++-
 src/global/draw.js                    | 164 ++++++++++++++------------
 src/global/rhchInit.js                |  29 +++--
 src/locale/en.js                      |   2 +-
 6 files changed, 215 insertions(+), 98 deletions(-)

diff --git a/src/controllers/constant.js b/src/controllers/constant.js
index ddb7e6f14..3731014a1 100644
--- a/src/controllers/constant.js
+++ b/src/controllers/constant.js
@@ -395,6 +395,16 @@ function rightclickHTML(){
                         ${rightclick.showHide}${rightclick.row}
                     </div>
                 </div>
+                <div id="luckysheet-hidCols" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
+                    <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">
+                        ${rightclick.hideSelected}${rightclick.column}
+                    </div>
+                </div>
+                <div id="luckysheet-showHidCols" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
+                    <div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">
+                        ${rightclick.showHide}${rightclick.column}
+                    </div>
+                </div>
             </div>
             <div id="luckysheetCellsHandleDel_sub" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-rightgclick-menu-sub luckysheet-mousedown-cancel">
                 <div id="luckysheet-delCellsMoveLeft" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
diff --git a/src/controllers/controlHistory.js b/src/controllers/controlHistory.js
index adaebd7e9..0046ff495 100644
--- a/src/controllers/controlHistory.js
+++ b/src/controllers/controlHistory.js
@@ -154,6 +154,16 @@ const controlHistory = {
             //行高、列宽 刷新  
             jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
         }
+        else if (ctr.type == "showHidCols") { // 隐藏、显示列 撤销操作
+            //config
+            Store.config = ctr.config;
+            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;
+        
+            server.saveParam("cg", ctr.sheetIndex, ctr.config["colhidden"], { "k": "colhidden" });
+        
+            //行高、列宽 刷新  
+            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+        }
         else if (ctr.type == "datachangeAll") {
             formula.execFunctionGroup();
             jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, null, ctr.range, "datachangeAll", ctr.ctrlValue);
@@ -405,6 +415,16 @@ const controlHistory = {
             //行高、列宽 刷新  
             jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
         }
+        else if (ctr.type == "showHidCols") { // 隐藏、显示列 重做操作
+            //config
+            Store.config = ctr.curconfig;
+            Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;
+        
+            server.saveParam("cg", ctr.sheetIndex, ctr.curconfig["colhidden"], { "k": "colhidden" });
+        
+            //行高、列宽 刷新  
+            jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+        }
         else if (ctr.type == "datachangeAll") {
             formula.execFunctionGroup();
             jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, null, ctr.currange, "datachangeAll", ctr.ctrlValue);
diff --git a/src/controllers/rowColumnOperation.js b/src/controllers/rowColumnOperation.js
index 2586cd447..f36900eaa 100644
--- a/src/controllers/rowColumnOperation.js
+++ b/src/controllers/rowColumnOperation.js
@@ -1295,9 +1295,7 @@ export function rowColumnOperationInitial(){
 
         for(let s = 0; s < Store.luckysheet_select_save.length; s++){
             let r1 = Store.luckysheet_select_save[s].row[0],
-                r2 = Store.luckysheet_select_save[s].row[1],
-                c1 = Store.luckysheet_select_save[s].column[0],
-                c2 = Store.luckysheet_select_save[s].column[1];
+                r2 = Store.luckysheet_select_save[s].row[1];
 
             for(let r = r1; r <= r2; r++){
                 cfg["rowhidden"][r] = 0;
@@ -1336,9 +1334,7 @@ export function rowColumnOperationInitial(){
 
         for(let s = 0; s < Store.luckysheet_select_save.length; s++){
             let r1 = Store.luckysheet_select_save[s].row[0],
-                r2 = Store.luckysheet_select_save[s].row[1],
-                c1 = Store.luckysheet_select_save[s].column[0],
-                c2 = Store.luckysheet_select_save[s].column[1];
+                r2 = Store.luckysheet_select_save[s].row[1];
 
             for(let r = r1; r <= r2; r++){
                 delete cfg["rowhidden"][r];
@@ -1367,6 +1363,86 @@ export function rowColumnOperationInitial(){
         jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
     })
 
+    //隐藏、显示列
+    $("#luckysheet-hidCols").click(function (event) {
+        $("#luckysheet-rightclick-menu").hide();
+        luckysheetContainerFocus();
+
+        let cfg = $.extend(true, {}, Store.config);
+        if(cfg["colhidden"] == null){
+            cfg["colhidden"] = {};
+        }
+
+        for(let s = 0; s < Store.luckysheet_select_save.length; s++){
+            let c1 = Store.luckysheet_select_save[s].column[0],
+                c2 = Store.luckysheet_select_save[s].column[1];
+
+            for(let c = c1; c <= c2; c++){
+                cfg["colhidden"][c] = 0;
+            }
+        }
+    
+        //保存撤销
+        if(Store.clearjfundo){
+            let redo = {};
+            redo["type"] = "showHidCols";
+            redo["sheetIndex"] = Store.currentSheetIndex;
+            redo["config"] = $.extend(true, {}, Store.config);
+            redo["curconfig"] = cfg;
+    
+            Store.jfundo = [];
+            Store.jfredo.push(redo);
+        }
+    
+        //config
+        Store.config = cfg;
+        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;
+    
+        server.saveParam("cg", Store.currentSheetIndex, cfg["colhidden"], { "k": "colhidden" });
+    
+        //行高、列宽 刷新  
+        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+    })
+    $("#luckysheet-showHidCols").click(function (event) {
+        $("#luckysheet-rightclick-menu").hide();
+        luckysheetContainerFocus();
+
+        let cfg = $.extend(true, {}, Store.config);
+        if(cfg["colhidden"] == null){
+            return;
+        }
+
+        for(let s = 0; s < Store.luckysheet_select_save.length; s++){
+            let c1 = Store.luckysheet_select_save[s].column[0],
+                c2 = Store.luckysheet_select_save[s].column[1];
+
+            for(let c = c1; c <= c2; c++){
+                delete cfg["colhidden"][c];
+            }
+        }
+    
+        //保存撤销
+        if(Store.clearjfundo){
+            let redo = {};
+            redo["type"] = "showHidCols";
+            redo["sheetIndex"] = Store.currentSheetIndex;
+            redo["config"] = $.extend(true, {}, Store.config);
+            redo["curconfig"] = cfg;
+    
+            Store.jfundo = [];
+            Store.jfredo.push(redo);
+        }
+    
+        //config
+        Store.config = cfg;
+        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;
+    
+        server.saveParam("cg", Store.currentSheetIndex, cfg["colhidden"], { "k": "colhidden" });
+    
+        //行高、列宽 刷新  
+        jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+    })
+
     //删除单元格(左移、上移)
     $("#luckysheet-delCellsMoveLeft").click(function (event) {
         $("#luckysheet-rightclick-menu").hide();
diff --git a/src/global/draw.js b/src/global/draw.js
index 2a2821263..397410319 100644
--- a/src/global/draw.js
+++ b/src/global/draw.js
@@ -223,28 +223,33 @@ function luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, offsetLeft) {
         // if(end_c > scrollWidth + drawWidth+1){
         //     break;
         // }
+        
+        if (Store.config["colhidden"] != null && Store.config["colhidden"][c] != null) {
 
-        luckysheetTableContent.fillStyle = "#ffffff";
-        luckysheetTableContent.fillRect(
-            (start_c + offsetLeft - 1) , 
-            0, 
-            (end_c - start_c) ,
-            Store.columeHeaderHeight -1
-        )
-        luckysheetTableContent.fillStyle = "#000000";
+        }
+        else {
+            luckysheetTableContent.fillStyle = "#ffffff";
+            luckysheetTableContent.fillRect(
+                (start_c + offsetLeft - 1) , 
+                0, 
+                (end_c - start_c) ,
+                Store.columeHeaderHeight -1
+            )
+            luckysheetTableContent.fillStyle = "#000000";
 
-        //列标题栏序列号
-        luckysheetTableContent.save();//save scale before draw text
-        luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);
-        let abc = chatatABC(c);
-        let textMetrics = getMeasureText(abc, luckysheetTableContent);
-        //luckysheetTableContent.measureText(abc);
+            //列标题栏序列号
+            luckysheetTableContent.save();//save scale before draw text
+            luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);
+            let abc = chatatABC(c);
+            let textMetrics = getMeasureText(abc, luckysheetTableContent);
+            //luckysheetTableContent.measureText(abc);
 
-        let horizonAlignPos = Math.round((start_c + (end_c - start_c) / 2 + offsetLeft)  - textMetrics.width / 2);
-        let verticalAlignPos = Math.round(Store.columeHeaderHeight / 2 );
-        
-        luckysheetTableContent.fillText(abc, horizonAlignPos/Store.zoomRatio, verticalAlignPos/Store.zoomRatio);
-        luckysheetTableContent.restore();//restore scale after draw text
+            let horizonAlignPos = Math.round((start_c + (end_c - start_c) / 2 + offsetLeft)  - textMetrics.width / 2);
+            let verticalAlignPos = Math.round(Store.columeHeaderHeight / 2 );
+            
+            luckysheetTableContent.fillText(abc, horizonAlignPos/Store.zoomRatio, verticalAlignPos/Store.zoomRatio);
+            luckysheetTableContent.restore();//restore scale after draw text
+        }
 
         //列标题栏竖线 vertical
         luckysheetTableContent.beginPath();
@@ -465,6 +470,10 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
         }
 
         let end_r = Store.visibledatarow[r] - scrollHeight;
+
+        if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
+            continue;
+        }
         
         for (let c = dataset_col_st; c <= dataset_col_ed; c++) {
             let start_c;
@@ -477,78 +486,77 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
 
             let end_c = Store.visibledatacolumn[c] - scrollWidth;
             
-            if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
-
+            if (Store.config["colhidden"] != null && Store.config["colhidden"][c] != null) {
+                continue
+            }
+            
+            let firstcolumnlen = Store.defaultcollen;
+            if (Store.config["columnlen"] != null && Store.config["columnlen"][c] != null) {
+                firstcolumnlen = Store.config["columnlen"][c];
             }
-            else {
-                let firstcolumnlen = Store.defaultcollen;
-                if (Store.config["columnlen"] != null && Store.config["columnlen"][c] != null) {
-                    firstcolumnlen = Store.config["columnlen"][c];
-                }
 
-                if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
-                    let value = Store.flowdata[r][c];
+            if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
+                let value = Store.flowdata[r][c];
 
-                    if(getObjType(value) == "object" && ("mc" in value)){
-                        borderOffset[r + "_" + c] = { 
-                            "start_r": start_r,
-                            "start_c": start_c, 
-                            "end_r": end_r, 
-                            "end_c": end_c 
-                        };
+                if(getObjType(value) == "object" && ("mc" in value)){
+                    borderOffset[r + "_" + c] = { 
+                        "start_r": start_r,
+                        "start_c": start_c, 
+                        "end_r": end_r, 
+                        "end_c": end_c 
+                    };
 
-                        if("rs" in value["mc"]){
-                            let key = "r"+ r + "c" + c;
+                    if("rs" in value["mc"]){
+                        let key = "r"+ r + "c" + c;
+                        mergeCache[key] = cellupdate.length;
+                    }
+                    else{
+                        let key = "r"+ value["mc"].r + "c" + value["mc"].c;
+                        let margeMain = cellupdate[mergeCache[key]];
+
+                        if(margeMain == null){
                             mergeCache[key] = cellupdate.length;
+                            cellupdate.push({
+                                "r": r, 
+                                "c": c, 
+                                "start_c": start_c, 
+                                "start_r": start_r, 
+                                "end_r": end_r, 
+                                "end_c": end_c, 
+                                "firstcolumnlen": firstcolumnlen, 
+                            });
                         }
                         else{
-                            let key = "r"+ value["mc"].r + "c" + value["mc"].c;
-                            let margeMain = cellupdate[mergeCache[key]];
-
-                            if(margeMain == null){
-                                mergeCache[key] = cellupdate.length;
-                                cellupdate.push({
-                                    "r": r, 
-                                    "c": c, 
-                                    "start_c": start_c, 
-                                    "start_r": start_r, 
-                                    "end_r": end_r, 
-                                    "end_c": end_c, 
-                                    "firstcolumnlen": firstcolumnlen, 
-                                });
+                            if(margeMain.c == c){
+                                margeMain.end_r += (end_r - start_r - 1);
                             }
-                            else{
-                                if(margeMain.c == c){
-                                    margeMain.end_r += (end_r - start_r - 1);
-                                }
-                                
-                                if(margeMain.r == r){
-                                    margeMain.end_c += (end_c - start_c);
-                                    margeMain.firstcolumnlen += firstcolumnlen;
-                                }
+                            
+                            if(margeMain.r == r){
+                                margeMain.end_c += (end_c - start_c);
+                                margeMain.firstcolumnlen += firstcolumnlen;
                             }
-
-                            continue;
                         }
+
+                        continue;
                     }
                 }
-
-                cellupdate.push({
-                    "r": r, 
-                    "c": c, 
-                    "start_r": start_r, 
-                    "start_c": start_c, 
-                    "end_r": end_r, 
-                    "end_c": end_c, 
-                    "firstcolumnlen": firstcolumnlen, 
-                });
-                borderOffset[r + "_" + c] = { 
-                    "start_r": start_r, 
-                    "start_c": start_c, 
-                    "end_r": end_r, 
-                    "end_c": end_c 
-                };
             }
+
+            cellupdate.push({
+                "r": r, 
+                "c": c, 
+                "start_r": start_r, 
+                "start_c": start_c, 
+                "end_r": end_r, 
+                "end_c": end_c, 
+                "firstcolumnlen": firstcolumnlen, 
+            });
+            borderOffset[r + "_" + c] = { 
+                "start_r": start_r, 
+                "start_c": start_c, 
+                "end_r": end_r, 
+                "end_c": end_c 
+            };
         }
     }
 
diff --git a/src/global/rhchInit.js b/src/global/rhchInit.js
index 90066fac0..f8622b3eb 100644
--- a/src/global/rhchInit.js
+++ b/src/global/rhchInit.js
@@ -8,21 +8,19 @@ export default function rhchInit(rowheight, colwidth) {
         Store.visibledatarow = [];
         Store.rh_height = 0;
 
-        for (let i = 0; i < rowheight; i++) {
+        for (let r = 0; r < rowheight; r++) {
             let rowlen = Store.defaultrowlen;
 
-            if (Store.config["rowlen"] != null && Store.config["rowlen"][i] != null) {
-                rowlen = Store.config["rowlen"][i];
+            if (Store.config["rowlen"] != null && Store.config["rowlen"][r] != null) {
+                rowlen = Store.config["rowlen"][r];
             }
 
-            if (Store.config["rowhidden"] != null && Store.config["rowhidden"][i] != null) {
-                rowlen = Store.config["rowhidden"][i];
+            if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
                 Store.visibledatarow.push(Store.rh_height);
                 continue;
             }
-            else {
-                Store.rh_height += Math.round((rowlen + 1)*Store.zoomRatio);
-            }
+            
+            Store.rh_height += Math.round((rowlen + 1) * Store.zoomRatio);
 
             Store.visibledatarow.push(Store.rh_height); //行的临时长度分布
         }
@@ -37,14 +35,14 @@ export default function rhchInit(rowheight, colwidth) {
 
         let maxColumnlen = 120;
 
-        for (let i = 0; i < colwidth; i++) {
+        for (let c = 0; c < colwidth; c++) {
             let firstcolumnlen = Store.defaultcollen;
 
-            if (Store.config["columnlen"] != null && Store.config["columnlen"][i] != null) {
-                firstcolumnlen = Store.config["columnlen"][i];
+            if (Store.config["columnlen"] != null && Store.config["columnlen"][c] != null) {
+                firstcolumnlen = Store.config["columnlen"][c];
             }
             else {
-                if (Store.flowdata[0] != null && Store.flowdata[0][i] != null) {
+                if (Store.flowdata[0] != null && Store.flowdata[0][c] != null) {
                     if (firstcolumnlen > 300) {
                         firstcolumnlen = 300;
                     }
@@ -57,11 +55,16 @@ export default function rhchInit(rowheight, colwidth) {
                             Store.config["columnlen"] = {};
                         }
 
-                        Store.config["columnlen"][i] = firstcolumnlen;
+                        Store.config["columnlen"][c] = firstcolumnlen;
                     }
                 }
             }
 
+            if(Store.config["colhidden"] != null && Store.config["colhidden"][c] != null){
+                Store.visibledatacolumn.push(Store.ch_width);
+                continue;
+            }
+
             Store.ch_width += Math.round((firstcolumnlen + 1)*Store.zoomRatio);
 
             Store.visibledatacolumn.push(Store.ch_width);//列的临时长度分布
diff --git a/src/locale/en.js b/src/locale/en.js
index fd9c80f8c..689742265 100644
--- a/src/locale/en.js
+++ b/src/locale/en.js
@@ -496,7 +496,7 @@ export default {
         deleteSelected: 'Delete selected ',
         hide: 'Hide',
         hideSelected: 'Hide selected ',
-        showHide: 'Show hide',
+        showHide: 'Show hide ',
         to: 'Towards',
         left: 'Left',
         right: 'Right',