From c1d681f496f2e1c53f88472d803e3c95fab521af Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期四, 29 七月 2021 09:46:16 +0800
Subject: [PATCH] 萤石测试通过
---
HDL_ON/UI/UI2/1-HomePage/HomePage.cs | 290 +++++++++++++++++++++++++++------------------------------
1 files changed, 136 insertions(+), 154 deletions(-)
diff --git a/HDL_ON/UI/UI2/1-HomePage/HomePage.cs b/HDL_ON/UI/UI2/1-HomePage/HomePage.cs
index 1badfb1..189c239 100644
--- a/HDL_ON/UI/UI2/1-HomePage/HomePage.cs
+++ b/HDL_ON/UI/UI2/1-HomePage/HomePage.cs
@@ -161,7 +161,7 @@
topView.AddChidren(btnLinkStateTip);
//鏇存柊閾炬帴鐘舵�乮con棰滆壊
CheckLinkStatus();//2020-12-22
- //LoadEvent_CheckLinkStatus();
+
btnResidenceName = new Button()
{
@@ -194,25 +194,53 @@
#region 鐜鏁版嵁
var tempSensorList = FunctionList.List.GetEnvirSensorsList().FindAll((obj) => obj.spk == SPK.SensorTemperature);
var humiSensorList = FunctionList.List.GetEnvirSensorsList().FindAll((obj) => obj.spk == SPK.SensorHumidity);
+ var enviList = FunctionList.List.GetEnvirSensorsList().FindAll((obj) => obj.spk == SPK.SensorEnvironment);
+ foreach (var enviTemp in enviList)
+ {
+ var humiAttr = enviTemp.attributes.Find((obj) => obj.key == "humidity");
+ if (humiAttr != null)
+ {
+ var newTemp = new Function()
+ {
+ name = enviTemp.name,
+ sid = enviTemp.sid,
+ deviceId = enviTemp.deviceId,
+ attributes = new List<FunctionAttributes> { new FunctionAttributes { key = "value", state = humiAttr.state, curValue = humiAttr.curValue } },
+ };
+ humiSensorList.Add(newTemp);
+ }
+ var tempAttr = enviTemp.attributes.Find((obj) => obj.key == "temperature");
+ if (tempAttr != null)
+ {
+ var newTemp = new Function()
+ {
+ name = enviTemp.name,
+ sid = enviTemp.sid,
+ deviceId = enviTemp.deviceId,
+ attributes = new List<FunctionAttributes> { new FunctionAttributes { key = "value", state = tempAttr.state, curValue = tempAttr.curValue } },
+ };
+ tempSensorList.Add(newTemp);
+ }
+ }
var btnEnvirValuesTitle = new Button() {
X = Application.GetRealWidth(12),
Gravity = Gravity.CenterVertical,
TextColor = CSS_Color.MainBackgroundColor,
TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
- TextID = StringId.InOutdoor,
+ TextID = StringId.Outdoor,
TextAlignment = TextAlignment.CenterLeft,
};
if (tempSensorList.Count > 0 || humiSensorList.Count > 0)
{
- btnEnvirValuesTitle.Width = Application.GetRealWidth(8)+ btnEnvirValuesTitle.GetTextWidth();
+ btnEnvirValuesTitle.TextID = StringId.InOutdoor;
}
+ btnEnvirValuesTitle.Width = Application.GetRealWidth(8) + btnEnvirValuesTitle.GetTextWidth();
environmentalView.AddChidren(btnEnvirValuesTitle);
Button btnTempIcon = new Button()
{
- X = btnEnvirValuesTitle.Right,//+ Application.GetRealWidth(4),
- //X = Application.GetRealWidth(12),
+ X = btnEnvirValuesTitle.Right,
Gravity = Gravity.CenterVertical,
Width = Application.GetMinRealAverage(16),
Height = Application.GetMinRealAverage(16),
@@ -239,23 +267,29 @@
TextColor = CSS_Color.MainBackgroundColor,
TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
TextAlignment = TextAlignment.CenterLeft,
- Text = "/--掳",
+ Text = ""
};
if (tempSensorList.Count > 0)
{
+ btnIndoorTempValues.Text = "/--掳";
double tempTotalValues = 0;
+ double tempTotalCount = 0;
foreach (var temp in tempSensorList)
{
double tempValue = 0;
double.TryParse(temp.GetAttrState(FunctionAttributeKey.Value), out tempValue);
- tempTotalValues += tempValue;
+ if (tempValue > 0)
+ {
+ tempTotalValues += tempValue;
+ tempTotalCount++;
+ }
}
if (tempTotalValues > 0)
{
- btnIndoorTempValues.Text = "/" + tempTotalValues + "掳";
+ btnIndoorTempValues.Text = "/" + (tempTotalValues/ tempTotalCount).ToString("0.0") + "掳";
}
- btnIndoorTempValues.Width = btnIndoorTempValues.GetTextWidth();
}
+ btnIndoorTempValues.Width = btnIndoorTempValues.GetTextWidth();
environmentalView.AddChidren(btnIndoorTempValues);
Button btnHumidityIcon = new Button()
@@ -287,23 +321,29 @@
TextColor = CSS_Color.MainBackgroundColor,
TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
TextAlignment = TextAlignment.CenterLeft,
- Text = "/--%",
+ Text = ""
};
if (tempSensorList.Count > 0)
{
+ btnIndoorHumiValues.Text = "/--%";
double humiTotalValues = 0;
+ double humiTotalCount = 0;
foreach (var humi in humiSensorList)
{
double humiValue = 0;
double.TryParse(humi.GetAttrState(FunctionAttributeKey.Value), out humiValue);
- humiTotalValues += humiValue;
+ if (humiValue > 0)
+ {
+ humiTotalValues += humiValue;
+ humiTotalCount++;
+ }
}
if (humiTotalValues > 0)
{
- btnIndoorHumiValues.Text = "/" + humiTotalValues + "%";
+ btnIndoorHumiValues.Text = "/" + (humiTotalValues / humiTotalCount).ToString("0") + "%";
}
- btnIndoorHumiValues.Width = btnIndoorHumiValues.GetTextWidth();
}
+ btnIndoorHumiValues.Width = btnIndoorHumiValues.GetTextWidth();
environmentalView.AddChidren(btnIndoorHumiValues);
Button btnPm25Icon = new Button()
@@ -461,86 +501,86 @@
#if DEBUG
- FunctionList.List.Functions.Add(new Function() { spk = SPK.PjtIr, name = "娴嬭瘯鎶曞奖浠�",
- attributes = new List<FunctionAttributes>() {
- new FunctionAttributes(){ key = "on_off",curValue= "on",state = "on" },
- new FunctionAttributes(){ key = "computer",value = new List<string>(){"鐢佃剳" } },
- new FunctionAttributes(){ key = "video",value = new List<string>(){"瑙嗛" } },
- new FunctionAttributes(){ key = "source",value = new List<string>(){"淇″彿婧�" } },
- new FunctionAttributes(){ key = "zoom+",value = new List<string>(){"鍙樼劍+" } },
- new FunctionAttributes(){ key = "zoom-",value = new List<string>(){"鍙樼劍-" } },
- new FunctionAttributes(){ key = "page+",value = new List<string>(){"鐢婚潰+" } },
- new FunctionAttributes(){ key = "page-",value = new List<string>(){"鐢婚潰-" } },
- new FunctionAttributes(){ key = "menu",value = new List<string>(){"鑿滃崟" } },
- new FunctionAttributes(){ key = "ok",value = new List<string>(){"纭" } },
- new FunctionAttributes(){ key = "up",value = new List<string>(){"涓�" } },
- new FunctionAttributes(){ key = "left",value = new List<string>(){"宸�" } },
- new FunctionAttributes(){ key = "right",value = new List<string>(){"鍙�" } },
- new FunctionAttributes(){ key = "down",value = new List<string>(){"涓�" } },
- new FunctionAttributes(){ key = "exit",value = new List<string>(){"閫�鍑�" } },
- new FunctionAttributes(){ key = "volume+",value = new List<string>(){"闊抽噺+" } },
- new FunctionAttributes(){ key = "volume-",value = new List<string>(){"闊抽噺-" } },
- new FunctionAttributes(){ key = "mute",value = new List<string>(){"闈欓煶" } },
- new FunctionAttributes(){ key = "auto",value = new List<string>(){"鑷姩" } },
- new FunctionAttributes(){ key = "pause",value = new List<string>(){"鏆傚仠" } },
- }
- });
+ //FunctionList.List.Functions.Add(new Function() { spk = SPK.PjtIr, name = "娴嬭瘯鎶曞奖浠�",
+ // attributes = new List<FunctionAttributes>() {
+ // new FunctionAttributes(){ key = "on_off",curValue= "on",state = "on" },
+ // new FunctionAttributes(){ key = "computer",value = new List<string>(){"鐢佃剳" } },
+ // new FunctionAttributes(){ key = "video",value = new List<string>(){"瑙嗛" } },
+ // new FunctionAttributes(){ key = "source",value = new List<string>(){"淇″彿婧�" } },
+ // new FunctionAttributes(){ key = "zoom+",value = new List<string>(){"鍙樼劍+" } },
+ // new FunctionAttributes(){ key = "zoom-",value = new List<string>(){"鍙樼劍-" } },
+ // new FunctionAttributes(){ key = "page+",value = new List<string>(){"鐢婚潰+" } },
+ // new FunctionAttributes(){ key = "page-",value = new List<string>(){"鐢婚潰-" } },
+ // new FunctionAttributes(){ key = "menu",value = new List<string>(){"鑿滃崟" } },
+ // new FunctionAttributes(){ key = "ok",value = new List<string>(){"纭" } },
+ // new FunctionAttributes(){ key = "up",value = new List<string>(){"涓�" } },
+ // new FunctionAttributes(){ key = "left",value = new List<string>(){"宸�" } },
+ // new FunctionAttributes(){ key = "right",value = new List<string>(){"鍙�" } },
+ // new FunctionAttributes(){ key = "down",value = new List<string>(){"涓�" } },
+ // new FunctionAttributes(){ key = "exit",value = new List<string>(){"閫�鍑�" } },
+ // new FunctionAttributes(){ key = "volume+",value = new List<string>(){"闊抽噺+" } },
+ // new FunctionAttributes(){ key = "volume-",value = new List<string>(){"闊抽噺-" } },
+ // new FunctionAttributes(){ key = "mute",value = new List<string>(){"闈欓煶" } },
+ // new FunctionAttributes(){ key = "auto",value = new List<string>(){"鑷姩" } },
+ // new FunctionAttributes(){ key = "pause",value = new List<string>(){"鏆傚仠" } },
+ // }
+ //});
- FunctionList.List.Functions.Add(new Function()
- {
- spk = SPK.StbIr,
- name = "娴嬭瘯鏈洪《鐩�",
- attributes = new List<FunctionAttributes>() {
- new FunctionAttributes(){ key = "on_off",curValue= "on",state = "on" },
- new FunctionAttributes(){ key = "computer",value = new List<string>(){"鐢佃剳" } },
- new FunctionAttributes(){ key = "video",value = new List<string>(){"瑙嗛" } },
- new FunctionAttributes(){ key = "source",value = new List<string>(){"淇″彿婧�" } },
- new FunctionAttributes(){ key = "zoom+",value = new List<string>(){"鍙樼劍+" } },
- new FunctionAttributes(){ key = "zoom-",value = new List<string>(){"鍙樼劍-" } },
- new FunctionAttributes(){ key = "page+",value = new List<string>(){"鐢婚潰+" } },
- new FunctionAttributes(){ key = "page-",value = new List<string>(){"鐢婚潰-" } },
- new FunctionAttributes(){ key = "menu",value = new List<string>(){"鑿滃崟" } },
- new FunctionAttributes(){ key = "ok",value = new List<string>(){"纭" } },
- new FunctionAttributes(){ key = "up",value = new List<string>(){"涓�" } },
- new FunctionAttributes(){ key = "left",value = new List<string>(){"宸�" } },
- new FunctionAttributes(){ key = "right",value = new List<string>(){"鍙�" } },
- new FunctionAttributes(){ key = "down",value = new List<string>(){"涓�" } },
- new FunctionAttributes(){ key = "exit",value = new List<string>(){"閫�鍑�" } },
- new FunctionAttributes(){ key = "volume+",value = new List<string>(){"闊抽噺+" } },
- new FunctionAttributes(){ key = "volume-",value = new List<string>(){"闊抽噺-" } },
- new FunctionAttributes(){ key = "mute",value = new List<string>(){"闈欓煶" } },
- new FunctionAttributes(){ key = "auto",value = new List<string>(){"鑷姩" } },
- new FunctionAttributes(){ key = "pause",value = new List<string>(){"鏆傚仠" } },
- }
- });
+ //FunctionList.List.Functions.Add(new Function()
+ //{
+ // spk = SPK.StbIr,
+ // name = "娴嬭瘯鏈洪《鐩�",
+ // attributes = new List<FunctionAttributes>() {
+ // new FunctionAttributes(){ key = "on_off",curValue= "on",state = "on" },
+ // new FunctionAttributes(){ key = "computer",value = new List<string>(){"鐢佃剳" } },
+ // new FunctionAttributes(){ key = "video",value = new List<string>(){"瑙嗛" } },
+ // new FunctionAttributes(){ key = "source",value = new List<string>(){"淇″彿婧�" } },
+ // new FunctionAttributes(){ key = "zoom+",value = new List<string>(){"鍙樼劍+" } },
+ // new FunctionAttributes(){ key = "zoom-",value = new List<string>(){"鍙樼劍-" } },
+ // new FunctionAttributes(){ key = "page+",value = new List<string>(){"鐢婚潰+" } },
+ // new FunctionAttributes(){ key = "page-",value = new List<string>(){"鐢婚潰-" } },
+ // new FunctionAttributes(){ key = "menu",value = new List<string>(){"鑿滃崟" } },
+ // new FunctionAttributes(){ key = "ok",value = new List<string>(){"纭" } },
+ // new FunctionAttributes(){ key = "up",value = new List<string>(){"涓�" } },
+ // new FunctionAttributes(){ key = "left",value = new List<string>(){"宸�" } },
+ // new FunctionAttributes(){ key = "right",value = new List<string>(){"鍙�" } },
+ // new FunctionAttributes(){ key = "down",value = new List<string>(){"涓�" } },
+ // new FunctionAttributes(){ key = "exit",value = new List<string>(){"閫�鍑�" } },
+ // new FunctionAttributes(){ key = "volume+",value = new List<string>(){"闊抽噺+" } },
+ // new FunctionAttributes(){ key = "volume-",value = new List<string>(){"闊抽噺-" } },
+ // new FunctionAttributes(){ key = "mute",value = new List<string>(){"闈欓煶" } },
+ // new FunctionAttributes(){ key = "auto",value = new List<string>(){"鑷姩" } },
+ // new FunctionAttributes(){ key = "pause",value = new List<string>(){"鏆傚仠" } },
+ // }
+ //});
- FunctionList.List.Functions.Add(new Function()
- {
- spk = SPK.TvIr,
- name = "娴嬭瘯鐢佃",
- attributes = new List<FunctionAttributes>() {
- new FunctionAttributes(){ key = "on_off",curValue= "on",state = "on" },
- new FunctionAttributes(){ key = "computer",value = new List<string>(){"鐢佃剳" } },
- new FunctionAttributes(){ key = "video",value = new List<string>(){"瑙嗛" } },
- new FunctionAttributes(){ key = "source",value = new List<string>(){"淇″彿婧�" } },
- new FunctionAttributes(){ key = "zoom+",value = new List<string>(){"鍙樼劍+" } },
- new FunctionAttributes(){ key = "zoom-",value = new List<string>(){"鍙樼劍-" } },
- new FunctionAttributes(){ key = "page+",value = new List<string>(){"鐢婚潰+" } },
- new FunctionAttributes(){ key = "page-",value = new List<string>(){"鐢婚潰-" } },
- new FunctionAttributes(){ key = "menu",value = new List<string>(){"鑿滃崟" } },
- new FunctionAttributes(){ key = "ok",value = new List<string>(){"纭" } },
- new FunctionAttributes(){ key = "up",value = new List<string>(){"涓�" } },
- new FunctionAttributes(){ key = "left",value = new List<string>(){"宸�" } },
- new FunctionAttributes(){ key = "right",value = new List<string>(){"鍙�" } },
- new FunctionAttributes(){ key = "down",value = new List<string>(){"涓�" } },
- new FunctionAttributes(){ key = "exit",value = new List<string>(){"閫�鍑�" } },
- new FunctionAttributes(){ key = "volume+",value = new List<string>(){"闊抽噺+" } },
- new FunctionAttributes(){ key = "volume-",value = new List<string>(){"闊抽噺-" } },
- new FunctionAttributes(){ key = "mute",value = new List<string>(){"闈欓煶" } },
- new FunctionAttributes(){ key = "auto",value = new List<string>(){"鑷姩" } },
- new FunctionAttributes(){ key = "pause",value = new List<string>(){"鏆傚仠" } },
- }
- });
+ //FunctionList.List.Functions.Add(new Function()
+ //{
+ // spk = SPK.TvIr,
+ // name = "娴嬭瘯鐢佃",
+ // attributes = new List<FunctionAttributes>() {
+ // new FunctionAttributes(){ key = "on_off",curValue= "on",state = "on" },
+ // new FunctionAttributes(){ key = "computer",value = new List<string>(){"鐢佃剳" } },
+ // new FunctionAttributes(){ key = "video",value = new List<string>(){"瑙嗛" } },
+ // new FunctionAttributes(){ key = "source",value = new List<string>(){"淇″彿婧�" } },
+ // new FunctionAttributes(){ key = "zoom+",value = new List<string>(){"鍙樼劍+" } },
+ // new FunctionAttributes(){ key = "zoom-",value = new List<string>(){"鍙樼劍-" } },
+ // new FunctionAttributes(){ key = "page+",value = new List<string>(){"鐢婚潰+" } },
+ // new FunctionAttributes(){ key = "page-",value = new List<string>(){"鐢婚潰-" } },
+ // new FunctionAttributes(){ key = "menu",value = new List<string>(){"鑿滃崟" } },
+ // new FunctionAttributes(){ key = "ok",value = new List<string>(){"纭" } },
+ // new FunctionAttributes(){ key = "up",value = new List<string>(){"涓�" } },
+ // new FunctionAttributes(){ key = "left",value = new List<string>(){"宸�" } },
+ // new FunctionAttributes(){ key = "right",value = new List<string>(){"鍙�" } },
+ // new FunctionAttributes(){ key = "down",value = new List<string>(){"涓�" } },
+ // new FunctionAttributes(){ key = "exit",value = new List<string>(){"閫�鍑�" } },
+ // new FunctionAttributes(){ key = "volume+",value = new List<string>(){"闊抽噺+" } },
+ // new FunctionAttributes(){ key = "volume-",value = new List<string>(){"闊抽噺-" } },
+ // new FunctionAttributes(){ key = "mute",value = new List<string>(){"闈欓煶" } },
+ // new FunctionAttributes(){ key = "auto",value = new List<string>(){"鑷姩" } },
+ // new FunctionAttributes(){ key = "pause",value = new List<string>(){"鏆傚仠" } },
+ // }
+ //});
#endif
}
@@ -946,13 +986,8 @@
LoadEvent_ControlCurtain(function, btnCurtainClose, btnCurtainOpen);
}
- else if (function.spk == SPK.ElectricTV || function.spk == SPK.TvIr
- ||function.spk == SPK.StbIr || function.spk == SPK.PjtIr)
+ else if (SPK.NotStatusSpkList.Contains(function.spk))
{
-
- //btnIcon.UnSelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_blue.png";
- //btnIcon.SelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_white.png";
-
Button btnPower;
btnPower = new Button()
{
@@ -961,6 +996,7 @@
Width = Application.GetRealWidth(32),
Height = Application.GetRealWidth(32),
UnSelectedImagePath = "Public/PowerClose.png",
+ SelectedImagePath = "Public/PowerOpen.png",
};
view.AddChidren(btnPower);
LoadEvent_ControlTV(function, btnPower);
@@ -1056,62 +1092,8 @@
};
view.AddChidren(btnSwitch);
-
btnIcon.UnSelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_blue.png";
btnIcon.SelectedImagePath = $"FunctionIcon/Icon/HomeIcon/{function.IconName}_white.png";
-
- //switch (function.Spk_Prefix)
- //{
- // //todo 澧炲姞璁惧锛屼富椤垫敹钘忓浘鏍�
- // case FunctionCategory.Light:
- // #region 鐏厜 Light
- // btnIcon.UnSelectedImagePath = "FunctionIcon/Light/LightIcon.png";
- // btnIcon.SelectedImagePath = "FunctionIcon/Light/LightOnIcon.png";
- // UpdataFunctionStates(function);
- // #endregion
- // break;
- // case FunctionCategory.AC:
- // #region 绌鸿皟 AC
- // btnIcon.UnSelectedImagePath = "FunctionIcon/AC/AcIcon.png";
- // btnIcon.SelectedImagePath = "FunctionIcon/AC/AcOnIcon.png";
- // #endregion
- // break;
- // case FunctionCategory.FloorHeat:
- // #region 鍦扮儹
- // btnIcon.UnSelectedImagePath = "FunctionIcon/FloorHeating/FloorHeatingIcon.png";
- // btnIcon.SelectedImagePath = "FunctionIcon/FloorHeating/FloorHeatingOnIcon.png";
- // #endregion
- // break;
- // case FunctionCategory.Electric:
- // switch (function.spk)
- // {
- // case SPK.ElectricSocket:
- // btnIcon.UnSelectedImagePath = "FunctionIcon/Socket/SocketIcon.png";
- // btnIcon.SelectedImagePath = "FunctionIcon/Socket/SocketOnIcon.png";
- // break;
- // case SPK.ElectricFan:
- // btnIcon.UnSelectedImagePath = "FunctionIcon/Electrical/FanIcon.png";
- // btnIcon.SelectedImagePath = "FunctionIcon/Electrical/FanOnIcon.png";
- // break;
- // case SPK.ElectricTuyaAirCleaner:
- // btnIcon.SelectedImagePath = "FunctionIcon/HomePageIcon/AirCleanerIcon.png";
- // btnIcon.UnSelectedImagePath = "FunctionIcon/HomePageIcon/AirCleanerIconOn.png";
- // break;
- // case SPK.ElectricTuyaFan:
- // btnIcon.SelectedImagePath = "FunctionIcon/HomePageIcon/FanIcon.png";
- // btnIcon.UnSelectedImagePath = "FunctionIcon/HomePageIcon/FanIconOn.png";
- // break;
- // case SPK.ElectricTuyaWaterValve:
- // btnIcon.SelectedImagePath = "FunctionIcon/HomePageIcon/WaterValveIcon.png";
- // btnIcon.UnSelectedImagePath = "FunctionIcon/HomePageIcon/WaterValveIconOn.png";
- // break;
- // case SPK.ElectricTuyaWeepRobot:
- // btnIcon.SelectedImagePath = "FunctionIcon/HomePageIcon/WeepRobotIcon.png";
- // btnIcon.UnSelectedImagePath = "FunctionIcon/HomePageIcon/WeepRobotIconOn.png";
- // break;
- // }
- // break;
- //}
LoadEvent_SwitchFunction(function, btnSwitch);
}
//鍙栨秷鏀惰棌浜嬩欢
@@ -1136,8 +1118,8 @@
btnName.MouseUpEventHandler = skipControlPageEvent;
btnIcon.MouseUpEventHandler = skipControlPageEvent;
btnState.MouseUpEventHandler = skipControlPageEvent;
- //鐢佃涓嶉渶瑕佹洿鏂扮姸鎬�
- if(function.spk!= SPK.ElectricTV && function.spk != SPK.StbIr && function.spk != SPK.PjtIr)
+ //涓嶉渶瑕佹洿鏂扮姸鎬佺殑鍔ㄨ兘鍒楄〃
+ if(!SPK.NotStatusSpkList.Contains(function.spk))
{
UpdataFunctionStates(function);
}
@@ -1183,7 +1165,7 @@
Width = Application.GetRealWidth(32),
UnSelectedImagePath = "Public/FuncInfoSetIcon_white.png",
};
- if (!DB_ResidenceData.Instance.CurrentRegion.isOtherShare)
+ if (scene.userId == UserInfo.Current.ID)
{
view.AddChidren(btnSettingIcon);
}
--
Gitblit v1.8.0