From 145b157ba183ebf877c93ed2dbb01ec737c993d3 Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期二, 08 十二月 2020 18:59:33 +0800 Subject: [PATCH] Merge branch 'WJC' --- HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs | 637 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 596 insertions(+), 41 deletions(-) diff --git a/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs b/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs index fe144d9..95c6385 100644 --- a/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs +++ b/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs @@ -49,10 +49,10 @@ case FunctionType.Dimmer: case FunctionType.RGB: case FunctionType.RGBW: - case FunctionType.CCT: + case FunctionType.ColorTemperature: { //2琛ㄧず(寮�锛屽叧)鍔熻兘 - SwitchBrightnessView(fLayout, device, index, edit,2); + SwitchBrightnessView(fLayout, device, index, edit, 2); } break; case FunctionType.Relay: @@ -68,32 +68,112 @@ SwitchView(fLayout, device, index, edit, 3); } break; - case FunctionType.TrietexCurtain: - case FunctionType.RollerCurtain: + case FunctionType.MotorCurtain: + case FunctionType.RollingShutter: { //3琛ㄧず(寮�锛屽叧锛屾殏鍋�)鍔熻兘 SwitchBrightnessView(fLayout, device, index, edit, 3); } break; - case FunctionType.AC: { + case FunctionType.AC: + { #region 鐣岄潰 ///寮�鍏� - LogicView.FunTypeView curtainSwitchView = new LogicView.FunTypeView(); - curtainSwitchView.btnText.TextID = StringId.switchLogic; - fLayout.AddChidren(curtainSwitchView.FLayoutView()); + LogicView.FunTypeView acSwitchVie = new LogicView.FunTypeView(); + acSwitchVie.btnText.TextID = StringId.switchLogic; + fLayout.AddChidren(acSwitchVie.FLayoutView()); + + ///娓╁害 + LogicView.FunTypeView temperatureView = new LogicView.FunTypeView(); + temperatureView.frameLayout.Y = acSwitchVie.frameLayout.Bottom; + temperatureView.btnText.TextID = StringId.temperatureLogic; + fLayout.AddChidren(temperatureView.FLayoutView()); ///妯″紡 LogicView.FunTypeView acModehView = new LogicView.FunTypeView(); - acModehView.frameLayout.Y = curtainSwitchView.frameLayout.Bottom; + acModehView.frameLayout.Y = temperatureView.frameLayout.Bottom; acModehView.btnText.TextID = StringId.modeLogic; fLayout.AddChidren(acModehView.FLayoutView()); + + ///椋庨�� + LogicView.FunTypeView acSpeedView = new LogicView.FunTypeView(); + acSpeedView.frameLayout.Y = acModehView.frameLayout.Bottom; + acSpeedView.btnText.TextID = StringId.speedLogic; + fLayout.AddChidren(acSpeedView.FLayoutView()); #endregion #region 鐐瑰嚮浜嬩欢 ///寮�鍏崇偣鍑讳簨浠� - curtainSwitchView.btnClick.MouseUpEventHandler += (sender, e) => + acSwitchVie.btnClick.MouseUpEventHandler += (sender, e) => { - SwitchViewMethod(device, curtainSwitchView.btnState, 2); + SwitchViewMethod(device, acSwitchVie.btnState, 2); }; + ///娓╁害鐐瑰嚮浜嬩欢 + temperatureView.btnClick.MouseUpEventHandler += (sender, e) => + { + FrameLayout frame = new FrameLayout + { + BackgroundColor = CSS.CSS_Color.viewTrans60lucence, + }; + this.AddChidren(frame); + LogicView.TimeView view = new LogicView.TimeView(); + view.FLayoutView(frame); + EventHandler<MouseEventArgs> removefLayout = (sender1, e1) => + { + //绉婚櫎fLayout鐣岄潰 + frame.RemoveFromParent(); + }; + //鍙栨秷鐐瑰嚮浜嬩欢 + view.btnCancel.MouseUpEventHandler += removefLayout; + + //鍒濆鍖栧垪琛� + var temperatureList = new List<string>(); + for (int i = 16; i < 32; i++) + { + //娣诲姞鏁版嵁 + temperatureList.Add(i.ToString() + "鈩�"); + temperatureList.Add((i + 0.5).ToString() + "鈩�"); + + } + + //鍔犺浇鏁版嵁鐣岄潰鐨勮缃柟娉�(鍒楄〃浜掍笉鑱斿姩) + view.mUIPickerView.setNPicker(temperatureList, null, null); + + //榛樿鍒濆閫変腑鐘舵�� + view.mUIPickerView.setCurrentItems(9, 0, 0); + //瀹氫箟涓�涓眬閮ㄥ彉閲忚褰曢�変腑鏃堕棿 + string temperature = "25鈩�"; + for (int i = 0; i < temperatureList.Count; i++) + { + if (temperatureList[i] == temperatureView.btnState.Text) + { + //鏇存柊鐘舵�� + view.mUIPickerView.setCurrentItems(i, 0, 0); + //鏇存柊鐘舵�� + temperature = temperatureList[i]; + break; + } + } + //閫変腑鏃堕棿鍥炶皟鏂规硶,鏃堕棿鍙樺寲涓�娆″洖璋冧竴娆� + view.mUIPickerView.OnSelectChangeEvent += (index1, index2, index3) => + { + temperature = temperatureList[index1]; + }; + //纭畾鐐瑰嚮浜嬩欢 + view.btnConfirm.MouseUpEventHandler += (sender2, e2) => + { + Dictionary<string, string> dic = new Dictionary<string, string>(); + LogicMethod.dictionary(dic, "key", "set_temp"); + string keyVlaue = "set_temp"; + string set_temp_value = temperature.Replace("鈩�", ""); + LogicMethod.dictionary(dic, "value", set_temp_value); + selectedState = device.functionType + "_set_temp"; + AddDictionaryData(dicSateteList, keyVlaue, dic); + RemView(frame); + temperatureView.btnState.Text = temperature; + + }; + }; + ///妯″紡鐐瑰嚮浜嬩欢 acModehView.btnClick.MouseUpEventHandler += (sender, e) => { @@ -109,14 +189,15 @@ }; this.AddChidren(frame); LogicView.DateView modeView = new LogicView.DateView(); - modeView.btnTitle.TextID = StringId.modeLogic; + modeView.btnTitle.TextID = StringId.modeLogic; modeView.FLayoutView(frame, modeStr.Count); modeView.btnCancel.MouseUpEventHandler += (sender2, e2) => { frame.RemoveFromParent(); }; ///瀹氫箟涓�涓狟tn璁板綍閫変腑鐘舵�� - Button checkBtn = new Button{ + Button checkBtn = new Button + { Tag = "unknown", }; for (int i = 0; i < modeStr.Count; i++) @@ -145,16 +226,260 @@ }; } - modeView.btnConfirm.MouseUpEventHandler += (sender1,e1) => { - if (checkBtn.Tag.ToString()== "unknown") { + modeView.btnConfirm.MouseUpEventHandler += (sender1, e1) => + { + if (checkBtn.Tag.ToString() == "unknown") + { return; } - + Dictionary<string, string> dic = new Dictionary<string, string>(); LogicMethod.dictionary(dic, "key", "mode"); string keyVlaue = "mode"; - LogicMethod.dictionary(dic, "value", GetModeValueString(checkBtn.Tag.ToString())); + LogicMethod.dictionary(dic, "value", GetModeValueString(checkBtn.Tag.ToString(), keyVlaue)); acModehView.btnState.Text = checkBtn.Tag.ToString(); + selectedState = device.functionType + "_mode"; + AddDictionaryData(dicSateteList, keyVlaue, dic); + RemView(frame); + }; + }; + ///椋庨�熺偣鍑讳簨浠� + acSpeedView.btnClick.MouseUpEventHandler += (sender, e) => + { + + List<string> speedStr = new List<string> { + Language.StringByID(StringId.LowWindSpeed), + Language.StringByID(StringId.MiddleWindSpeed), + Language.StringByID(StringId.HighWindSpeed), + Language.StringByID(StringId.Auto), + }; + FrameLayout frame = new FrameLayout + { + BackgroundColor = CSS.CSS_Color.viewTrans60lucence, + }; + this.AddChidren(frame); + LogicView.DateView speedView = new LogicView.DateView(); + speedView.btnTitle.TextID = StringId.modeLogic; + speedView.FLayoutView(frame, speedStr.Count); + speedView.btnCancel.MouseUpEventHandler += (sender2, e2) => + { + frame.RemoveFromParent(); + }; + ///瀹氫箟涓�涓狟tn璁板綍閫変腑鐘舵�� + Button checkBtn = new Button + { + Tag = "unknown", + }; + for (int i = 0; i < speedStr.Count; i++) + { + LogicView.CheckView speedTypeView = new LogicView.CheckView(); + speedTypeView.frameLayout.Y = Application.GetRealHeight(56 + 50 * i); + speedView.frameLayout.AddChidren(speedTypeView.FLayoutView()); + speedTypeView.btnText.Text = speedStr[i]; + speedTypeView.btnClick.Tag = speedStr[i];//鏍囪 + + if (acModehView.btnState.Text == speedStr[i]) + { + //鏄剧ず涔嬪墠鐨勯�変腑鐘舵�� + checkBtn.IsSelected = false; + speedTypeView.btnCheckIcon.IsSelected = true; + checkBtn = speedTypeView.btnCheckIcon; + checkBtn.Tag = speedTypeView.btnClick.Tag.ToString(); + } + //鏄熸湡鐨勭偣鍑讳簨浠� + speedTypeView.btnClick.MouseUpEventHandler += (sender1, e1) => + { + checkBtn.IsSelected = false; + speedTypeView.btnCheckIcon.IsSelected = true; + checkBtn = speedTypeView.btnCheckIcon; + checkBtn.Tag = speedTypeView.btnClick.Tag.ToString(); + }; + + } + speedView.btnConfirm.MouseUpEventHandler += (sender1, e1) => + { + if (checkBtn.Tag.ToString() == "unknown") + { + return; + } + + Dictionary<string, string> dic = new Dictionary<string, string>(); + LogicMethod.dictionary(dic, "key", "fan"); + string keyVlaue = "fan"; + LogicMethod.dictionary(dic, "value", GetModeValueString(checkBtn.Tag.ToString(), keyVlaue)); + acSpeedView.btnState.Text = checkBtn.Tag.ToString(); + selectedState = device.functionType + "_fan"; + AddDictionaryData(dicSateteList, keyVlaue, dic); + RemView(frame); + }; + }; + if (edit) + { + GetEditState(device, index, acSwitchVie.btnState, temperatureView.btnState, acModehView.btnState, acSpeedView.btnState); + } + + #endregion + } + break; + case FunctionType.FloorHeating: + { + #region 鐣岄潰 + ///寮�鍏� + LogicView.FunTypeView floorHeatingSwitchVie = new LogicView.FunTypeView(); + floorHeatingSwitchVie.btnText.TextID = StringId.switchLogic; + fLayout.AddChidren(floorHeatingSwitchVie.FLayoutView()); + + ///娓╁害 + LogicView.FunTypeView temperatureView = new LogicView.FunTypeView(); + temperatureView.frameLayout.Y = floorHeatingSwitchVie.frameLayout.Bottom; + temperatureView.btnText.TextID = StringId.temperatureLogic; + fLayout.AddChidren(temperatureView.FLayoutView()); + + ///妯″紡 + LogicView.FunTypeView floorHeatingModehView = new LogicView.FunTypeView(); + floorHeatingModehView.frameLayout.Y = temperatureView.frameLayout.Bottom; + floorHeatingModehView.btnText.TextID = StringId.modeLogic; + fLayout.AddChidren(floorHeatingModehView.FLayoutView()); + + + #endregion + #region 鐐瑰嚮浜嬩欢 + ///寮�鍏崇偣鍑讳簨浠� + floorHeatingSwitchVie.btnClick.MouseUpEventHandler += (sender, e) => + { + SwitchViewMethod(device, floorHeatingSwitchVie.btnState, 2); + }; + ///娓╁害鐐瑰嚮浜嬩欢 + temperatureView.btnClick.MouseUpEventHandler += (sender, e) => + { + FrameLayout frame = new FrameLayout + { + BackgroundColor = CSS.CSS_Color.viewTrans60lucence, + }; + this.AddChidren(frame); + LogicView.TimeView view = new LogicView.TimeView(); + view.FLayoutView(frame); + EventHandler<MouseEventArgs> removefLayout = (sender1, e1) => + { + //绉婚櫎fLayout鐣岄潰 + frame.RemoveFromParent(); + }; + //鍙栨秷鐐瑰嚮浜嬩欢 + view.btnCancel.MouseUpEventHandler += removefLayout; + + //鍒濆鍖栧垪琛� + var temperatureList = new List<string>(); + for (int i = 16; i < 32; i++) + { + //娣诲姞鏁版嵁 + temperatureList.Add(i.ToString() + "鈩�"); + temperatureList.Add((i + 0.5).ToString() + "鈩�"); + + } + + //鍔犺浇鏁版嵁鐣岄潰鐨勮缃柟娉�(鍒楄〃浜掍笉鑱斿姩) + view.mUIPickerView.setNPicker(temperatureList, null, null); + + //榛樿鍒濆閫変腑鐘舵�� + view.mUIPickerView.setCurrentItems(9, 0, 0); + //瀹氫箟涓�涓眬閮ㄥ彉閲忚褰曢�変腑鏃堕棿 + string temperature = "25鈩�"; + for (int i = 0; i < temperatureList.Count; i++) + { + if (temperatureList[i] == temperatureView.btnState.Text) + { + //鏇存柊鐘舵�� + view.mUIPickerView.setCurrentItems(i, 0, 0); + //鏇存柊鐘舵�� + temperature = temperatureList[i]; + break; + } + } + //閫変腑鏃堕棿鍥炶皟鏂规硶,鏃堕棿鍙樺寲涓�娆″洖璋冧竴娆� + view.mUIPickerView.OnSelectChangeEvent += (index1, index2, index3) => + { + temperature = temperatureList[index1]; + }; + //纭畾鐐瑰嚮浜嬩欢 + view.btnConfirm.MouseUpEventHandler += (sender2, e2) => + { + Dictionary<string, string> dic = new Dictionary<string, string>(); + LogicMethod.dictionary(dic, "key", "set_temp"); + string keyVlaue = "set_temp"; + string set_temp_value = temperature.Replace("鈩�", ""); + LogicMethod.dictionary(dic, "value", set_temp_value); + selectedState = device.functionType + "_set_temp"; + AddDictionaryData(dicSateteList, keyVlaue, dic); + RemView(frame); + temperatureView.btnState.Text = temperature; + + }; + }; + ///妯″紡鐐瑰嚮浜嬩欢 + floorHeatingModehView.btnClick.MouseUpEventHandler += (sender, e) => + { + List<string> modeStr = new List<string> { + Language.StringByID(StringId.dayMode), + Language.StringByID(StringId.nightMode), + Language.StringByID(StringId.leaveMode), + Language.StringByID(StringId.ordinaryMode), + Language.StringByID(StringId.timeMode), + }; + FrameLayout frame = new FrameLayout + { + BackgroundColor = CSS.CSS_Color.viewTrans60lucence, + }; + this.AddChidren(frame); + LogicView.DateView modeView = new LogicView.DateView(); + modeView.btnTitle.TextID = StringId.modeLogic; + modeView.FLayoutView(frame, modeStr.Count); + modeView.btnCancel.MouseUpEventHandler += (sender2, e2) => + { + frame.RemoveFromParent(); + }; + ///瀹氫箟涓�涓狟tn璁板綍閫変腑鐘舵�� + Button checkBtn = new Button + { + Tag = "unknown", + }; + for (int i = 0; i < modeStr.Count; i++) + { + LogicView.CheckView modeTypeView = new LogicView.CheckView(); + modeTypeView.frameLayout.Y = Application.GetRealHeight(56 + 50 * i); + modeView.frameLayout.AddChidren(modeTypeView.FLayoutView()); + modeTypeView.btnText.Text = modeStr[i]; + modeTypeView.btnClick.Tag = modeStr[i];//鏍囪 + + if (floorHeatingModehView.btnState.Text == modeStr[i]) + { + //鏄剧ず涔嬪墠鐨勯�変腑鐘舵�� + checkBtn.IsSelected = false; + modeTypeView.btnCheckIcon.IsSelected = true; + checkBtn = modeTypeView.btnCheckIcon; + checkBtn.Tag = modeTypeView.btnClick.Tag.ToString(); + } + //鏄熸湡鐨勭偣鍑讳簨浠� + modeTypeView.btnClick.MouseUpEventHandler += (sender1, e1) => + { + checkBtn.IsSelected = false; + modeTypeView.btnCheckIcon.IsSelected = true; + checkBtn = modeTypeView.btnCheckIcon; + checkBtn.Tag = modeTypeView.btnClick.Tag.ToString(); + }; + + } + modeView.btnConfirm.MouseUpEventHandler += (sender1, e1) => + { + if (checkBtn.Tag.ToString() == "unknown") + { + return; + } + + Dictionary<string, string> dic = new Dictionary<string, string>(); + LogicMethod.dictionary(dic, "key", "mode"); + string keyVlaue = "mode"; + LogicMethod.dictionary(dic, "value", GetModeValueString(checkBtn.Tag.ToString(), "FloorHeating")); + floorHeatingModehView.btnState.Text = checkBtn.Tag.ToString(); selectedState = device.functionType + "_mode"; AddDictionaryData(dicSateteList, keyVlaue, dic); RemView(frame); @@ -162,8 +487,9 @@ }; if (edit) { - GetEditState(device, index, curtainSwitchView.btnState, null, null, null); + GetEditState(device, index, floorHeatingSwitchVie.btnState, temperatureView.btnState, floorHeatingModehView.btnState, null); } + #endregion } break; @@ -213,23 +539,83 @@ #endregion } - private string GetModeValueString(string text) + /// <summary> + /// 鑾峰彇妯″紡/椋庨�熼敭鍊� + /// </summary> + /// <param name="text"></param> + /// <param name="type"></param> + /// <returns></returns> + private string GetModeValueString(string text, string type) { - string modeStr = ""; - if (text == Language.StringByID(StringId.coolLogic)) + string str = ""; + switch (type) { - modeStr = "cool"; + case "mode": + { + if (text == Language.StringByID(StringId.coolLogic)) + { + str = "cool"; + } + else if (text == Language.StringByID(StringId.heatingLogic)) + { + str = "heat"; + } + else if (text == Language.StringByID(StringId.autoLogic)) + { + str = "auto"; + } + else if (text == Language.StringByID(StringId.dehumidifyLogic)) + { + str = "dry"; + } + } + break; + case "fan": + { + if (text == Language.StringByID(StringId.HighWindSpeed)) + { + str = "high"; + } + else if (text == Language.StringByID(StringId.MiddleWindSpeed)) + { + str = "medium"; + } + else if (text == Language.StringByID(StringId.LowWindSpeed)) + { + str = "low"; + } + else if (text == Language.StringByID(StringId.Auto)) + { + str = "auto"; + } + } + break; + case "FloorHeating": + { + if (text == Language.StringByID(StringId.dayMode)) + { + str = "day"; + } + else if (text == Language.StringByID(StringId.nightMode)) + { + str = "night"; + } + else if (text == Language.StringByID(StringId.leaveMode)) + { + str = "away"; + } + else if (text == Language.StringByID(StringId.ordinaryMode)) + { + str = "normal"; + } + else if (text == Language.StringByID(StringId.timeMode)) + { + str = "timer"; + } + } + break; } - else if (text == Language.StringByID(StringId.heatingLogic)) { - modeStr = "heat"; - } - else if (text == Language.StringByID(StringId.autoLogic)) { - modeStr = "auto"; - } - else if (text == Language.StringByID(StringId.dehumidifyLogic)) { - modeStr = "dry"; - } - return modeStr; + return str; } /// <summary> ///寮�鍏�=鐣岄潰 @@ -239,7 +625,7 @@ /// <param name="index"></param> /// <param name="edit"></param> /// <param name="intView">閫変腑View鐨勬暟閲�</param> - private void SwitchView(FrameLayout fLayout, Entity.Function device, int index, bool edit,int intView) + private void SwitchView(FrameLayout fLayout, Entity.Function device, int index, bool edit, int intView) { #region 鐣岄潰 ///寮�鍏� @@ -268,7 +654,7 @@ /// <param name="index"></param> /// <param name="edit"></param> /// <param name="intView">閫変腑View鐨勬暟閲�</param> - private void SwitchBrightnessView(FrameLayout fLayout, Entity.Function device, int index, bool edit,int intView) + private void SwitchBrightnessView(FrameLayout fLayout, Entity.Function device, int index, bool edit, int intView) { #region 鐣岄潰 ///寮�鍏� @@ -278,9 +664,9 @@ ///浜害 LogicView.FunTypeView brightnessView = new LogicView.FunTypeView(); brightnessView.frameLayout.Y = lightSwitchView.frameLayout.Bottom; - if (device.functionType == FunctionType.TrietexCurtain || device.functionType == FunctionType.RollerCurtain) + if (device.functionType == FunctionType.MotorCurtain || device.functionType == FunctionType.RollingShutter) { - + brightnessView.btnText.TextID = StringId.percentum; } else @@ -378,7 +764,6 @@ } - /// <summary> /// 浜害/鐧惧垎姣�=鍔熻兘涓嬩竴绾х晫闈� /// </summary> @@ -502,7 +887,7 @@ case FunctionType.Dimmer: case FunctionType.RGB: case FunctionType.RGBW: - case FunctionType.CCT: + case FunctionType.ColorTemperature: { foreach (var dic in dicList) { @@ -558,8 +943,9 @@ } } break; - case FunctionType.TrietexCurtain: - case FunctionType.RollerCurtain: { + case FunctionType.MotorCurtain: + case FunctionType.RollingShutter: + { foreach (var dic in dicList) { @@ -597,6 +983,175 @@ } } + } + break; + case FunctionType.AC: + { + foreach (var dic in dicList) + { + string value = dic["value"]; + switch (dic["key"]) + { + case "on_off": + { + switch (value) + { + case "on": + { + button1.Text = Language.StringByID(StringId.onLogic); + } + break; + case "off": + { + button1.Text = Language.StringByID(StringId.offLogic); + } + break; + } + } + break; + case "set_temp": + { + button2.Text = value + "鈩�"; + } + break; + case "mode": + { + switch (value) + { + case "cool": + { + button3.Text = Language.StringByID(StringId.coolLogic); + } + break; + case "heat": + { + button3.Text = Language.StringByID(StringId.heatingLogic); + } + break; + case "auto": + { + button3.Text = Language.StringByID(StringId.autoLogic); + } + break; + case "dry": + { + button3.Text = Language.StringByID(StringId.dehumidifyLogic); + } + break; + } + + + + } + break; + case "fan": + { + switch (value) + { + case "high": + { + button4.Text = Language.StringByID(StringId.HighWindSpeed); + } + break; + case "medium": + { + button4.Text = Language.StringByID(StringId.MiddleWindSpeed); + } + break; + case "low": + { + button4.Text = Language.StringByID(StringId.LowWindSpeed); + } + break; + case "auto": + { + button4.Text = Language.StringByID(StringId.Auto); + } + break; + } + + + } + break; + + + } + + } + + } + break; + case FunctionType.FloorHeating: + { + + foreach (var dic in dicList) + { + string value = dic["value"]; + switch (dic["key"]) + { + case "on_off": + { + switch (value) + { + case "on": + { + button1.Text = Language.StringByID(StringId.onLogic); + } + break; + case "off": + { + button1.Text = Language.StringByID(StringId.offLogic); + } + break; + } + } + break; + case "set_temp": + { + button2.Text = value + "鈩�"; + } + break; + case "mode": + { + switch (value) + { + case "day": + { + button3.Text = Language.StringByID(StringId.dayMode); + } + break; + case "night": + { + button3.Text = Language.StringByID(StringId.nightMode); + } + break; + + case "away": + { + button3.Text = Language.StringByID(StringId.leaveMode); + } + break; + case "normal": + { + button3.Text = Language.StringByID(StringId.ordinaryMode); + } + break; + case "timer": + { + button3.Text = Language.StringByID(StringId.timeMode); + } + break; + } + + + + } + break; + + } + + } + } break; } @@ -665,6 +1220,6 @@ } - + } } -- Gitblit v1.8.0