From 8d5792379f08075ed65fcadc2eeecc55467e341f Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期三, 21 九月 2022 14:29:50 +0800 Subject: [PATCH] 备份 --- HDL_ON/UI/UI2/FuntionControlView/Acst/AcstParentPage.cs | 480 +++++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 344 insertions(+), 136 deletions(-) diff --git a/HDL_ON/UI/UI2/FuntionControlView/Acst/AcstParentPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Acst/AcstParentPage.cs index 582e49d..1f6ad58 100644 --- a/HDL_ON/UI/UI2/FuntionControlView/Acst/AcstParentPage.cs +++ b/HDL_ON/UI/UI2/FuntionControlView/Acst/AcstParentPage.cs @@ -1,4 +1,5 @@ 锘縰sing System; +using System.Collections.Generic; using HDL_ON.Entity; using Shared; @@ -12,39 +13,151 @@ /// </summary> public class AcstParentPage : FrameLayout { + static AcstParentPage basePage; + VerticalScrolViewLayout bodyView; + + #region 澶╂皵鎺т欢 + Button btnOutdoorTemp; + Button btnWeather; + TextButton btnHumidityValues; + TextButton btnPm25Values; + #endregion + + #region 浼犳劅鍣ㄣ�佽�楃數閲忕粍浠� + SensorDiyView sensorDiyView_Temp; + SensorDiyView sensorDiyView_Humi; + SensorDiyView sensorDiyView_Pm25; + SensorDiyView sensorDiyView_Co2; + SensorDiyView sensorDiyView_Tvoc; + SensorDiyView sensorDiyView_EleDay; + SensorDiyView sensorDiyView_EleMonth; + SensorDiyView sensorDiyView_EleTotal; + #endregion + /// <summary> + /// 瀛愭帶鍖哄煙鍒楄〃 + /// </summary> + Dictionary<string, AcstSubControlView> subViewList; + + + public override void RemoveFromParent() + { + base.RemoveFromParent(); + basePage = null; + } + Function function; /// <summary> /// 褰撳墠鏃舵棰滆壊 /// </summary> uint curColor = CSS.CSS_Color.MainColor; + string imageFolder = "blue"; + public AcstParentPage() { + basePage = this; this.function = FunctionList.List.GetAcstParentList()[0]; this.BackgroundColor = CSS.CSS_Color.BackgroundColor; bodyView = new VerticalScrolViewLayout(); this.AddChidren(bodyView); - - - - + subViewList = new Dictionary<string, AcstSubControlView>(); } - + /// <summary> + /// 鏇存柊澶╂皵淇℃伅 + /// </summary> public void InitGetWeatherAction() { - MainPage.CityWeatherAction = () => { - + MainPage.CityWeatherAction = () => + { + Application.RunOnMainThread(() => + { + btnOutdoorTemp.Text = MainPage.cityInfo.temperature + "掳"; + btnWeather.Text = MainPage.cityInfo.weather; + btnHumidityValues.Text = MainPage.cityInfo.humidity + "%"; + btnHumidityValues.Width = btnHumidityValues.GetTextWidth() + Application.GetRealWidth(10); + btnPm25Values.Text = MainPage.cityInfo.pm25; + btnPm25Values.Width = btnPm25Values.GetTextWidth() + Application.GetRealWidth(10); + }); }; + } + /// <summary> + /// 浼犳劅鍣ㄣ�佽�楃數閲忕粍浠� + /// </summary> + public static void UpdateAcstParentInfo(Function temp) + { + if (basePage == null) + { + return; + } + if (basePage.sensorDiyView_Temp != null) + basePage.sensorDiyView_Temp.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.room_temp.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_Humi != null) + basePage.sensorDiyView_Humi.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.room_humidity.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_Pm25 != null) + basePage.sensorDiyView_Pm25.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.pm25.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_Co2 != null) + basePage.sensorDiyView_Co2.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.co2.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_Tvoc != null) + basePage.sensorDiyView_Tvoc.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.tvoc.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_EleDay != null) + basePage.sensorDiyView_EleDay.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.day_electricity.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_EleMonth != null) + basePage.sensorDiyView_EleMonth.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.month_electricity.ToString()).curValue.ToString()); + if (basePage.sensorDiyView_EleTotal != null) + basePage.sensorDiyView_EleTotal.UpdateValue(temp.GetAttribute(AcstParent_AttrEnum.total_electricity.ToString()).curValue.ToString()); + } + + /// <summary> + /// 鏇存柊瀛愭帶淇℃伅 + /// </summary> + /// <param name="temp"></param> + public static void UpdateAcstSubInfo(Function temp) + { + if(basePage == null) + { + return; + } + Application.RunOnMainThread(() => { + var view = basePage.subViewList[temp.sid]; + if(view!= null) + { + view.btnSubHumidityValues.Text = temp.GetAttrState(AcstSub_AttrEnum.room_humidity.ToString()) + "%"; + view.btnSubTempValues.Text = temp.GetAttrState(AcstSub_AttrEnum.room_humidity.ToString()) + "%"; + view.btnSubPower.IsSelected = temp.GetAttrState(AcstSub_AttrEnum.on_off.ToString()) == "on"; + } + }); } public void LoadPage() { + var curTime = DateTime.Now; + string helloText = "涓婂崍濂�"; + if (curTime.Hour >= 8 && curTime.Hour < 12) + { + helloText = "涓婂崍濂�"; + curColor = CSS.CSS_Color.MainColor; + imageFolder = "blue"; + } + else if (curTime.Hour >= 12 && curTime.Hour < 18) + { + helloText = "涓嬪崍濂�"; + curColor = 0xFFE7914F; + imageFolder = "orange"; + } + else + { + helloText = "鏅氫笂濂�"; + curColor = 0xFF9175F3; + imageFolder = "purple"; + } + #region 澶撮儴淇℃伅鍖哄煙 FrameLayout topView = new FrameLayout() { Height = Application.GetRealHeight(181), BackgroundColor = 0xFFb0eafa, + BackgroundImagePath = $"FunctionIcon/Acst/{imageFolder}/TopViewBg.png", }; bodyView.AddChidren(topView); @@ -53,7 +166,6 @@ Y = Application.GetRealHeight(32), Width = Application.GetRealWidth(100), Height = Application.GetRealHeight(34), - BackgroundColor = 0x33333333, }; topView.AddChidren(backView); @@ -77,25 +189,14 @@ Width = Application.GetRealWidth(200), Height = Application.GetRealHeight(38), TextSize = 20, + Text = helloText, TextColor = 0xFFFFFFFF, TextAlignment = TextAlignment.CenterLeft, }; topView.AddChidren(btnHelloText); - var curTime = DateTime.Now; - if (curTime.Hour >= 8 && curTime.Hour < 12) - { - btnHelloText.Text = "涓婂崍濂�"; - } - else if (curTime.Hour >= 12 && curTime.Hour < 18) - { - btnHelloText.Text = "涓嬪崍濂�"; - } - else - { - btnHelloText.Text = "鏅氫笂濂�"; - } - var btnOutdoorTemp = new Button() + + btnOutdoorTemp = new Button() { X = Application.GetRealWidth(25), Y = Application.GetRealHeight(90), @@ -108,7 +209,7 @@ }; topView.AddChidren(btnOutdoorTemp); - var btnWeather = new Button() + btnWeather = new Button() { X = btnOutdoorTemp.Right, Y = Application.GetRealHeight(95), @@ -120,8 +221,6 @@ TextAlignment = TextAlignment.CenterLeft, }; topView.AddChidren(btnWeather); - - var environmentalView = new FrameLayout() @@ -141,7 +240,7 @@ }; environmentalView.AddChidren(btnHumidityIcon); - var btnHumidityValues = new TextButton() + btnHumidityValues = new TextButton() { X = btnHumidityIcon.Right + Application.GetRealWidth(4), Gravity = Gravity.CenterVertical, @@ -163,7 +262,7 @@ }; environmentalView.AddChidren(btnPm25Icon); - var btnPm25Values = new TextButton() + btnPm25Values = new TextButton() { X = btnPm25Icon.Right + Application.GetRealWidth(4), Gravity = Gravity.CenterVertical, @@ -197,7 +296,7 @@ Gravity = Gravity.Center, Width = Application.GetRealWidth(343), Height = Application.GetRealHeight(72), - BackgroundColor = 0x22222222, + BackgroundImagePath = $"FunctionIcon/Acst/{imageFolder}/MsgViewBg.png", }; infoView.AddChidren(infoContentView); @@ -236,25 +335,26 @@ }; infoContentView.AddChidren(sensorListView); + if (tempObj != null) { - new SensorDiyView(sensorListView, curColor, tempObj.curValue.ToString() + "掳", "娓╁害"); + sensorDiyView_Temp = new SensorDiyView(sensorListView, curColor, tempObj.curValue.ToString() + "掳", "娓╁害"); } if (humiObj != null) { - new SensorDiyView(sensorListView, curColor, humiObj.curValue.ToString() + "%", "婀垮害"); + sensorDiyView_Humi = new SensorDiyView(sensorListView, curColor, humiObj.curValue.ToString() + "%", "婀垮害"); } if (pm25Obj != null) { - new SensorDiyView(sensorListView, curColor, pm25Obj.curValue.ToString(), "PM2.5"); + sensorDiyView_Pm25 = new SensorDiyView(sensorListView, curColor, pm25Obj.curValue.ToString(), "PM2.5"); } if (co2Obj != null) { - new SensorDiyView(sensorListView, curColor, co2Obj.curValue.ToString(), "CO2"); + sensorDiyView_Co2 = new SensorDiyView(sensorListView, curColor, co2Obj.curValue.ToString(), "CO2"); } if (tvocObj != null) { - new SensorDiyView(sensorListView, curColor, tvocObj.curValue.ToString(), "TVOC"); + sensorDiyView_Tvoc = new SensorDiyView(sensorListView, curColor, tvocObj.curValue.ToString(), "TVOC"); } #endregion @@ -285,15 +385,15 @@ infoContentView.AddChidren(energyListView); if (dayObj != null) { - new SensorDiyView(energyListView, curColor, dayObj.curValue.ToString(), "浠婃棩鑰楃數"); + sensorDiyView_EleDay = new SensorDiyView(energyListView, curColor, dayObj.curValue.ToString(), "浠婃棩鑰楃數"); } if (monthObj != null) { - new SensorDiyView(energyListView, curColor, monthObj.curValue.ToString(), "鏈湀鑰楃數"); + sensorDiyView_EleMonth = new SensorDiyView(energyListView, curColor, monthObj.curValue.ToString(), "鏈湀鑰楃數"); } if (totalObj != null) { - new SensorDiyView(energyListView, curColor, totalObj.curValue.ToString(), "鎬昏�楃數閲�"); + sensorDiyView_EleTotal = new SensorDiyView(energyListView, curColor, totalObj.curValue.ToString(), "鎬昏�楃數閲�"); } var btnChangeClick = new Button(); @@ -325,17 +425,19 @@ var subTitleView = new FrameLayout() { - Height = Application.GetRealHeight(54), + Height = Application.GetRealHeight(54-11), }; bodyView.AddChidren(subTitleView); var btnCollection = new Button() { X = Application.GetRealWidth(6), - Gravity = Gravity.CenterVertical, + Y = Application.GetRealHeight(10), Width = Application.GetRealWidth(39), - Height = Application.GetRealHeight(39), - UnSelectedImagePath = "Function/Acst/CollectionIcon_bule.png", + Height = Application.GetRealWidth(39), + IsSelected = function.collect, + UnSelectedImagePath = "FunctionIcon/Acst/grey/CollectionIcon.png", + SelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/CollectionIcon.png", }; subTitleView.AddChidren(btnCollection); @@ -347,6 +449,7 @@ TextColor = 0xFF242424, TextAlignment = TextAlignment.CenterLeft, IsBold = true, + Height = Application.GetRealHeight(54), }; subTitleView.AddChidren(btnTitleText); @@ -358,95 +461,28 @@ }; bodyView.AddChidren(subFunctionListView); - foreach(var sub in FunctionList.List.GetAcstSubList()) + + subFunctionListView.AddChidren(new Button { Width = Application.GetRealWidth(9) }); + foreach (var sub in FunctionList.List.GetAcstSubList()) { - if(subFunctionCount > 0 && subFunctionCount % 2 == 0) + if (subViewList.ContainsKey(sub.sid)) + { + continue; + } + + if (subFunctionCount > 0 && subFunctionCount % 2 == 0) { subFunctionListView = new HorizontalScrolViewLayout() { - Height = Application.GetRealHeight(88), + Height = Application.GetRealHeight(93), }; bodyView.AddChidren(subFunctionListView); + subFunctionListView.AddChidren(new Button { Width = Application.GetRealWidth(9) }); } - subFunctionListView.AddChidren(new Button { Width = Application.GetRealWidth(16) }); + AcstSubControlView subFunctionView = new AcstSubControlView(sub, subFunctionListView,imageFolder); - var subFunctionView = new FrameLayout() { - Width = Application.GetRealWidth(164), - Height = Application.GetRealHeight(72), - BackgroundColor = CSS.CSS_Color.MainBackgroundColor, - }; - subFunctionListView.AddChidren(subFunctionView); - - var btnRoomInfo = new Button() - { - X = Application.GetRealWidth(18), - Height = Application.GetRealHeight(40), - TextAlignment = TextAlignment.CenterLeft, - TextColor = 0xFF1b3053, - TextSize = 13, - Text = sub.GetRoomListName(), - }; - subFunctionView.AddChidren(btnRoomInfo); - - - var btnSubTempIcon = new Button() - { - X = Application.GetRealWidth(16), - Y = Application.GetRealHeight(47), - Width = Application.GetMinRealAverage(11), - Height = Application.GetMinRealAverage(11), - UnSelectedImagePath = "FunctionIcon/CAC/HvacCacTempIcon.png", - }; - subFunctionView.AddChidren(btnSubTempIcon); - var btnSubTempValues = new TextButton() - { - X = btnSubTempIcon.Right, - Y = Application.GetRealHeight(45), - Height = Application.GetRealHeight(14), - Width = Application.GetRealWidth(22), - TextColor =0xFF1b3035, - TextSize = 10, - Text = sub.GetAttrState(AcstSub_AttrEnum.room_temp.ToString()) + "掳C", - TextAlignment = TextAlignment.CenterLeft, - }; - subFunctionView.AddChidren(btnSubTempValues); - - Button btnSubHumidityIcon = new Button() - { - X = btnSubTempValues.Right + Application.GetRealWidth(5), - Y = Application.GetRealHeight(47), - Width = Application.GetMinRealAverage(11), - Height = Application.GetMinRealAverage(11), - UnSelectedImagePath = "FunctionIcon/CAC/HvacCacHumidityIcon.png", - }; - subFunctionView.AddChidren(btnSubHumidityIcon); - - var btnSubHumidityValues = new TextButton() - { - X = btnSubHumidityIcon.Right, - Y = Application.GetRealHeight(45), - Height = Application.GetRealHeight(14), - Width = Application.GetRealWidth(22), - TextColor = 0xFF1b3053, - TextSize = 10, - Text = sub.GetAttrState(AcstSub_AttrEnum.room_humidity.ToString()) + "%", - TextAlignment = TextAlignment.CenterLeft, - }; - subFunctionView.AddChidren(btnSubHumidityValues); - - - var btnSubPower = new Button() - { - X = Application.GetRealWidth(121), - Gravity = Gravity.CenterVertical, - Width = Application.GetRealWidth(28), - Height = Application.GetRealWidth(28), - BackgroundColor = curColor, - Text = "寮�鍏�", - TextAlignment = TextAlignment.Center, - }; - subFunctionView.AddChidren(btnSubPower); + subViewList.Add(sub.sid, subFunctionView); @@ -455,19 +491,10 @@ #endregion - - - - - - - - bodyView.AddChidren(new Button() { Height = Application.GetRealHeight(72), }); - #region 搴曢儴鎺у埗鏍� var bottomView = new FrameLayout() @@ -484,14 +511,54 @@ Gravity = Gravity.CenterVertical, Width = Application.GetRealWidth(38), Height = Application.GetRealWidth(38), - BackgroundColor = curColor, - Text = "妯″紡", + UnSelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/ModeCoolIcon2.png", + SelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/ModeCoolIcon2.png", TextAlignment = TextAlignment.Center, }; bottomView.AddChidren(btnModeControl); btnModeControl.MouseUpEventHandler = (sender, e) => { + Dialog dialog = new Dialog(); + var dialogView = new FrameLayout(); + dialog.AddChidren(dialogView); + dialogView.MouseUpEventHandler = (sender, e) => { + dialog.Close(); + }; + + var dialogContentView = new FrameLayout() { + X = Application.GetRealWidth(34), + Y = Application.GetRealHeight(291), + Width = Application.GetRealWidth(144), + Height = Application.GetRealHeight(291), + BackgroundImagePath = "FunctionIcon/Acst/BgChooseMode.png", + }; + dialogView.AddChidren(dialogContentView); + + var titleView = new FrameLayout() { + X = Application.GetRealWidth(2), + Y = Application.GetRealHeight(3), + Width = Application.GetRealWidth(144), + Height = Application.GetRealHeight(44), + }; + dialogContentView.AddChidren(titleView); + var btnTitleText = new Button() + { + X = Application.GetRealWidth(16), + Width = Application.GetRealWidth(100), + Text = "閫夋嫨妯″紡", + TextSize = 16, + TextColor = CSS.CSS_Color.FirstLevelTitleColor, + IsBold = true, + TextAlignment = TextAlignment.CenterLeft, + }; + titleView.AddChidren(btnTitleText); + + + + + + dialog.Show(); }; var btnPowerControl = new Button() @@ -499,8 +566,8 @@ Gravity = Gravity.Center, Width = Application.GetRealWidth(38), Height = Application.GetRealWidth(38), - BackgroundColor = curColor, - Text = "寮�鍏�", + UnSelectedImagePath = "FunctionIcon/Acst/grey/PowerOffIcon.png", + SelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/PowerOnIcon.png", TextAlignment = TextAlignment.Center, }; bottomView.AddChidren(btnPowerControl); @@ -512,8 +579,8 @@ X = Application.GetRealWidth(249), Width = Application.GetRealWidth(38), Height = Application.GetRealWidth(38), - BackgroundColor = curColor, - Text = "鍦烘櫙", + UnSelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/SceneSleepIcon2.png", + SelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/SceneSleepIcon2.png", TextAlignment = TextAlignment.Center, }; bottomView.AddChidren(btnWorkSceneControl); @@ -537,7 +604,9 @@ } - + /// <summary> + /// 浼犳劅鍣ㄦ暟鎹粍浠� + /// </summary> public class SensorDiyView { private FrameLayout contentView; @@ -547,6 +616,9 @@ public SensorDiyView(HorizontalScrolViewLayout view,uint color,string value,string text) { + ///榛樿Tag 涓轰紶杩涙潵鐨凾ext + Tag = text; + contentView = new FrameLayout() { Width = Application.GetRealWidth(60), @@ -582,4 +654,140 @@ btnText.Text = value; } } + + /// <summary> + /// 瀛愭帶鍗$墖缁勪欢 + /// </summary> + public class AcstSubControlView + { + public TextButton btnSubTempValues; + public TextButton btnSubHumidityValues; + public Button btnSubPower; + + public AcstSubControlView(Function sub, HorizontalScrolViewLayout subFunctionListView,string imageFolder) + { + var subFunctionView = new FrameLayout() + { + Width = Application.GetRealWidth(177), + Height = Application.GetRealHeight(93), + BackgroundImagePath = "FunctionIcon/Acst/grey/BgSubControlView.png", + }; + subFunctionListView.AddChidren(subFunctionView); + + var btnRoomInfo = new Button() + { + X = Application.GetRealWidth(18 + 7), + Y = Application.GetRealHeight(11), + Height = Application.GetRealHeight(40), + TextAlignment = TextAlignment.CenterLeft, + TextColor = 0xFF1b3053, + TextSize = 13, + Text = sub.GetRoomListName(), + }; + subFunctionView.AddChidren(btnRoomInfo); + + var btnSubTempIcon = new Button() + { + X = Application.GetRealWidth(16 + 7), + Y = Application.GetRealHeight(47 + 11), + Width = Application.GetMinRealAverage(11), + Height = Application.GetMinRealAverage(11), + UnSelectedImagePath = "FunctionIcon/CAC/HvacCacTempIcon.png", + }; + subFunctionView.AddChidren(btnSubTempIcon); + + btnSubTempValues = new TextButton() + { + X = btnSubTempIcon.Right, + Y = Application.GetRealHeight(45 + 11), + Height = Application.GetRealHeight(14), + Width = Application.GetRealWidth(22), + TextColor = 0xFF1b3035, + TextSize = 10, + Text = sub.GetAttrState(AcstSub_AttrEnum.room_temp.ToString()) + "掳C", + TextAlignment = TextAlignment.CenterLeft, + }; + subFunctionView.AddChidren(btnSubTempValues); + + Button btnSubHumidityIcon = new Button() + { + X = btnSubTempValues.Right + Application.GetRealWidth(5), + Y = Application.GetRealHeight(47 + 11), + Width = Application.GetMinRealAverage(11), + Height = Application.GetMinRealAverage(11), + UnSelectedImagePath = "FunctionIcon/CAC/HvacCacHumidityIcon.png", + }; + subFunctionView.AddChidren(btnSubHumidityIcon); + + btnSubHumidityValues = new TextButton() + { + X = btnSubHumidityIcon.Right, + Y = Application.GetRealHeight(45 + 11), + Height = Application.GetRealHeight(14), + Width = Application.GetRealWidth(22), + TextColor = 0xFF1b3053, + TextSize = 10, + Text = sub.GetAttrState(AcstSub_AttrEnum.room_humidity.ToString()) + "%", + TextAlignment = TextAlignment.CenterLeft, + }; + subFunctionView.AddChidren(btnSubHumidityValues); + + btnSubPower = new Button() + { + X = Application.GetRealWidth(121 + 7), + Gravity = Gravity.CenterVertical, + Width = Application.GetRealWidth(28), + Height = Application.GetRealWidth(28), + UnSelectedImagePath = "FunctionIcon/Acst/grey/PowerOffIcon.png", + SelectedImagePath = $"FunctionIcon/Acst/{imageFolder}/PowerIcon.png", + TextAlignment = TextAlignment.Center, + }; + subFunctionView.AddChidren(btnSubPower); + + } + } + + + public class IconButton : FrameLayout + { + FrameLayout view; + + public Button btnIcon; + + public Button btnText; + + public IconButton(string iconPath,string iconPath2,string text,uint color,bool isSelect) + { + view = this; + view.Width = Application.GetRealWidth(144); + view.Height = Application.GetRealHeight(44); + + btnIcon = new Button() + { + X = Application.GetRealWidth(16), + Gravity = Gravity.CenterHorizontal, + Width = Application.GetRealWidth(24), + Height = Application.GetRealWidth(24), + UnSelectedImagePath = iconPath, + SelectedImagePath = iconPath2, + IsSelected = isSelect, + }; + view.AddChidren(btnIcon); + + btnText = new Button() + { + X = btnIcon.Right + Application.GetRealWidth(12), + Width = Application.GetRealWidth(90), + TextAlignment = TextAlignment.CenterLeft, + Text = text, + TextSize = 14, + TextColor = CSS.CSS_Color.FirstLevelTitleColor, + SelectedTextColor = color, + IsSelected = isSelect, + }; + view.AddChidren(btnText); + + + } + } } -- Gitblit v1.8.0