From 3ef188e6075649f4c72e3e7588d8966e1071f2ff Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 05 七月 2024 15:50:40 +0800
Subject: [PATCH] update .gitignore

---
 DelegateQueue/MainFrame.cpp |  260 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 166 insertions(+), 94 deletions(-)

diff --git a/DelegateQueue/MainFrame.cpp b/DelegateQueue/MainFrame.cpp
index cbcf277..c58d98f 100644
--- a/DelegateQueue/MainFrame.cpp
+++ b/DelegateQueue/MainFrame.cpp
@@ -31,6 +31,10 @@
 	CLICK_TYPE_QUEUE,
 };
 
+struct ViewDetailData {
+	string code;
+};
+
 
 // 委托信息数据
 class DelegateInfoRenderer : public wxDataViewCustomRenderer
@@ -44,7 +48,7 @@
 	map<wxString, wxRect> cancelBtnRectMap;
 	map<wxString, wxRect> queueRectMap;
 	map<wxString, wxRect> gridPostionMap;
-	
+
 public:
 	/*static void addDelegateInfo(DelegateInfo info) {
 		delegateMap[info.id] = info;
@@ -55,8 +59,8 @@
 
 	wxString floatToString(float value) {
 		std::ostringstream ss;
-		 ss << std::fixed << std::setprecision(2) << std::round(value * 100) / 100;
-		 return ss.str();
+		ss << std::fixed << std::setprecision(2) << std::round(value * 100) / 100;
+		return ss.str();
 	}
 
 	void loadContent() {
@@ -72,8 +76,8 @@
 			colorInfo0.color = *wxRED;
 			delegateColors.push_back(colorInfo0);
 		}
-		
-			
+
+
 		delegateInfoStr.Append("笔 ");
 
 		ColorIndexInfo colorInfo1;
@@ -85,10 +89,18 @@
 			delegateColors.push_back(colorInfo1);
 		}
 
-		
+
 		delegateInfoStr.Append("/").Append("封单").Append(delegateInfo.buy1_money);
 
-		delegateInfoStr.Append(" 【比例: ").Append(floatToString(delegateInfo.trade_progress_percent)).Append("%").Append("】,");
+		delegateInfoStr.Append(" 【比例: ");
+
+		ColorIndexInfo colorInfo2;
+		colorInfo2.start_index = delegateInfoStr.Length();
+		delegateInfoStr.Append(floatToString(delegateInfo.trade_progress_percent)).Append("%");
+		colorInfo2.end_index = delegateInfoStr.Length() - 1;
+		colorInfo2.color = wxColor(206, 14, 95);
+		delegateColors.push_back(colorInfo2);
+		delegateInfoStr.Append("】,");
 
 		delegateInfoStr.Append("已成大单").Append(to_string(delegateInfo.big_num_count)).Append("笔").Append(delegateInfo.big_num_money).Append("  ");
 
@@ -108,13 +120,25 @@
 		delegateInfoStr.Append("笔").Append(delegateInfo.not_deal_big_num_money_after).Append(",");
 
 
-		delegateInfoStr.Append("涨停价:").Append(floatToString(delegateInfo.limit_up_price)).Append("元").Append(",");
-		delegateInfoStr.Append(delegateInfo.block);
+		delegateInfoStr.Append("涨停价:");
+		ColorIndexInfo colorInfo3;
+
+		colorInfo3.start_index = delegateInfoStr.Length();
+		delegateInfoStr.Append(floatToString(delegateInfo.limit_up_price)).Append("元");
+		colorInfo3.end_index = delegateInfoStr.Length();
+		if (delegateInfo.limit_up_price < 3) {
+			colorInfo3.color = *wxRED;
+			delegateColors.push_back(colorInfo3);
+		}
+		delegateInfoStr.Append(",");
+		delegateInfoStr.Append(delegateInfo.block).Append(",");
+
+		delegateInfoStr.Append(" 涨停时间:").Append(delegateInfo.limit_up_time);
 	}
 
 	float parseMoneyAsW(wxString st) {
-		wxString money= st;
-		if (st.Find("万")>=0) {
+		wxString money = st;
+		if (st.Find("万") >= 0) {
 			money = st.Mid(0, st.Find("万"));
 			double d;
 			money.ToDouble(&d);
@@ -124,7 +148,7 @@
 			money = st.Mid(0, st.Find("亿"));
 			double d;
 			money.ToDouble(&d);
-			return d*10000;
+			return d * 10000;
 		}
 		else {
 			double d;
@@ -136,35 +160,39 @@
 	void drawOperateLine(wxDC* dc, int startx, int starty, int line_width) {
 		//绘制红点
 		/*  wxFont font(dc->GetFont().GetPixelSize(), wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT), wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);*/
-		
+
 
 
 
 		// 绘制名字
-		wxString codeName = "";
-		codeName.Append(delegateInfo.code).Append("(").Append(delegateInfo.codeName).Append(")");
+		wxString codeInfo = "";
+		codeInfo.Append(delegateInfo.code).Append("(").Append(delegateInfo.codeName).Append(")");
 
-		WidgetsRenderUtil::drawText(dc, codeName, wxPoint(startx, starty + 3),line_width, TEXT_LINE_HEIGHT);
+		codeInfo.Append("  ").Append(delegateInfo.zyltgb);
 
 
 		if (delegateInfo.pay_attention) {
-			wxSize textSize = dc->GetTextExtent(codeName);
-			WidgetsRenderUtil::drawText(dc, "****", wxPoint(startx + textSize.GetWidth() + 5*DPI/100, starty + 5*DPI/100), line_width, TEXT_LINE_HEIGHT, std::list<ColorIndexInfo>(), *wxRED);
+			WidgetsRenderUtil::drawText(dc, codeInfo, wxPoint(startx, starty + 3), line_width, TEXT_LINE_HEIGHT, std::list<ColorIndexInfo>(), *wxRED);
+			wxSize textSize = dc->GetTextExtent(codeInfo);
+			WidgetsRenderUtil::drawText(dc, "****", wxPoint(startx + textSize.GetWidth() + 5 * DPI / 100, starty + 5 * DPI / 100), line_width, TEXT_LINE_HEIGHT, std::list<ColorIndexInfo>(), *wxRED);
+		}
+		else {
+			WidgetsRenderUtil::drawText(dc, codeInfo, wxPoint(startx, starty + 3), line_width, TEXT_LINE_HEIGHT);
 		}
 		// 绘制按钮
 		dc->SetPen(wxColour(225, 225, 225));
 		dc->SetBrush(wxColour(225, 225, 225));
 
-		int btnWidth = 50*DPI/100;
-		int btnHeight = 25*DPI/100;
-		int padding = 10*DPI/100;
+		int btnWidth = 50 * DPI / 100;
+		int btnHeight = 25 * DPI / 100;
+		int padding = 10 * DPI / 100;
 		viewBtnRectMap[delegateInfo.id] = wxRect({ startx + line_width - btnWidth, starty, btnWidth, btnHeight });
 
 		WidgetsRenderUtil::drawBtn(dc, "查看", viewBtnRectMap[delegateInfo.id], *wxWHITE, wxColour(0, 150, 136));
 
 		// 相邻的撤单错位显示
-		cancelBtnRectMap[delegateInfo.id] = wxRect({ startx + line_width - viewBtnRectMap[delegateInfo.id].GetWidth() - btnWidth - padding - (delegateInfo.index%2==0?0: btnWidth + 5*DPI/100), starty, btnWidth, btnHeight });
-		cout << "撤单位置渲染:"<< delegateInfo.index << " - "<< cancelBtnRectMap[delegateInfo.id].x << ":" << cancelBtnRectMap[delegateInfo.id].y <<endl;
+		cancelBtnRectMap[delegateInfo.id] = wxRect({ startx + line_width - viewBtnRectMap[delegateInfo.id].GetWidth() - btnWidth - padding - (delegateInfo.index % 2 == 0 ? 0 : btnWidth + 5 * DPI / 100), starty, btnWidth, btnHeight });
+		cout << "撤单位置渲染:" << delegateInfo.index << " - " << cancelBtnRectMap[delegateInfo.id].x << ":" << cancelBtnRectMap[delegateInfo.id].y << endl;
 		WidgetsRenderUtil::drawBtn(dc, "撤单", cancelBtnRectMap[delegateInfo.id], *wxWHITE, wxColour(255, 87, 34));
 	}
 
@@ -179,7 +207,7 @@
 		//gc->SetFont(font,*wxRED);
 
 
-		wxSize queueSize(43*DPI/100, 22*DPI/100);
+		wxSize queueSize(43 * DPI / 100, 22 * DPI / 100);
 
 		// 绘制背景颜色
 		wxRect queueRect = wxRect(start, wxSize(line_width, queueSize.y));
@@ -190,7 +218,7 @@
 		queueRectMap[delegateInfo.id] = queueRect;
 
 
-		int padding = 5*DPI/100;
+		int padding = 5 * DPI / 100;
 		int countPerLine = (line_width - padding) / (queueSize.x + padding);
 
 
@@ -275,12 +303,12 @@
 
 	virtual bool Render(wxRect cell, wxDC* dc, int state)
 	{
-		cout <<"内存地址:"<< this << endl;
+		cout << "内存地址:" << this << endl;
 		dc->Clear();
-		dc->SetUserScale(1,1);
+		dc->SetUserScale(1, 1);
 
-		
-		
+
+
 		gridPostionMap[delegateInfo.id] = wxRect(cell.GetPosition(), cell.GetSize());
 
 		//// 设置绘制按钮的位置和大小
@@ -292,14 +320,14 @@
 
 		loadContent();
 
-		int start_y = cell.GetPosition().y + 3*DPI/100;
+		int start_y = cell.GetPosition().y + 3 * DPI / 100;
 		int start_x = cell.GetPosition().x;
 		// 绘制操作区域
 		drawOperateLine(dc, start_x, start_y, cell.GetSize().GetWidth());
 
 		// 绘制简介区
 		int infoWidth = cell.GetSize().GetWidth();
-		int infoHeight = WidgetsRenderUtil::drawText(dc, delegateInfoStr, wxPoint(start_x, start_y + 25*DPI/100), infoWidth, TEXT_LINE_HEIGHT, delegateColors);
+		int infoHeight = WidgetsRenderUtil::drawText(dc, delegateInfoStr, wxPoint(start_x, start_y + 25 * DPI / 100), infoWidth, TEXT_LINE_HEIGHT, delegateColors);
 		// 绘制队列,给文字信息留3排左右的位置
 
 		drawDelegateQueue(dc, wxPoint(start_x, TEXT_LINE_HEIGHT * 3 + start_y + 30 * DPI / 100), infoWidth);
@@ -309,25 +337,25 @@
 	}
 
 	void cancelOrder(string code) {
-	 string results =	MyNetworkApi::cancel_order(code);
-	 auto doc = JsonUtil::parseUTF16(results);
-	 if (doc.IsObject()) {
-	 
-		 if (doc[L"code"].GetInt() == 0) {
-			 showMsg(wxString(delegateInfo.codeName).Append(":撤单提交成功").ToStdString(), MSG_TYPE_INFO);
-			 MainFrame* mainFrame = getWindowFrame();
-			 if (mainFrame) {
-				 mainFrame->requestDelegatedInfoList();
-			 }
-		 }
-		 else {
-			 showMsg(wxString(doc[L"msg"].GetString()).ToStdString(), MSG_TYPE_WARNING);
-		 }
-	 }
-	 else {
-		 showMsg("网络请求失败", MSG_TYPE_ERROR);
-	 }
-	
+		string results = MyNetworkApi::cancel_order(code);
+		auto doc = JsonUtil::parseUTF16(results);
+		if (doc.IsObject()) {
+
+			if (doc[L"code"].GetInt() == 0) {
+				showMsg(wxString(delegateInfo.codeName).Append(":撤单提交成功").ToStdString(), MSG_TYPE_INFO);
+				MainFrame* mainFrame = getWindowFrame();
+				if (mainFrame) {
+					mainFrame->requestDelegatedInfoList();
+				}
+			}
+			else {
+				showMsg(wxString(doc[L"msg"].GetString()).ToStdString(), MSG_TYPE_WARNING);
+			}
+		}
+		else {
+			showMsg("网络请求失败", MSG_TYPE_ERROR);
+		}
+
 	}
 
 
@@ -345,11 +373,32 @@
 		}
 	}
 
-	void showMsg(string msg,MsgTypeEnum type) {
+	void showMsg(string msg, MsgTypeEnum type) {
 		MainFrame* mainFrame = getWindowFrame();
 		if (mainFrame)
 		{
 			mainFrame->showMsg(msg, type);
+		}
+	}
+
+	/// <summary>
+	/// 查看详情
+	/// </summary>
+	/// <param name="code"></param>
+	static void viewDetail(wxString code) {
+		try {
+			Win32Util::addToTHS(code.ToStdString());
+			list<HWND> hwnds = Win32Util::searchWindow("看盘副屏");
+			if (hwnds.size() > 0) {
+				for (list<HWND>::iterator e = hwnds.begin(); e != hwnds.end(); ++e) {
+					HWND hwnd = *e;
+					ViewDetailData* data = new ViewDetailData();
+					data->code = code.ToStdString();
+					SendMessage(hwnd, WM_USER + 1024, 0, reinterpret_cast<LPARAM>(&data));
+				}
+			}
+		}
+		catch (...) {
 		}
 	}
 
@@ -362,13 +411,13 @@
 			switch (clickType)
 			{
 			case CLICK_TYPE_CANCEL_BUY:
-			
+
 				cancelOrder(delegateInfo.code.ToStdString());
 				break;
 			case CLICK_TYPE_VIEW_DETAIL:
-			
 				try {
-					Win32Util::addToTHS(delegateInfo.code.ToStdString());
+					thread t(viewDetail, delegateInfo.code);
+					t.detach();
 				}
 				catch (string msg) {
 					wxMessageBox(msg.c_str());
@@ -377,12 +426,12 @@
 			default:
 				break;
 			}
-		} 
+		}
 		if (mouseEvent->LeftDClick()) {
 			BtnClickType clickType = getClickType(mouseEvent->GetX(), mouseEvent->GetY());
 			if (clickType == CLICK_TYPE_QUEUE)
 			{
-			
+
 				WindowPosSize r = MyConfigUtil::getTradeQueueWindowPos();
 				if (r.x == -1 && r.y == -1 && r.width == -1 && r.height == -1) {
 					// 默认的尺寸与位置
@@ -390,11 +439,11 @@
 					RECT rect;
 					Win32Util::getWindowRect(framePos, &rect);
 
-					TradeQueueFrame* tradeQueueFrame = new TradeQueueFrame(delegateInfo.codeName, delegateInfo.code, wxPoint(rect.left, rect.top), wxSize(350,400));
+					TradeQueueFrame* tradeQueueFrame = new TradeQueueFrame(delegateInfo.codeName, delegateInfo.code, wxPoint(rect.left, rect.top), wxSize(350, 400));
 					tradeQueueFrame->Show(true);
 				}
 				else {
-					TradeQueueFrame* tradeQueueFrame = new TradeQueueFrame(delegateInfo.codeName, delegateInfo.code, wxPoint(r.x,r.y), wxSize(r.width, r.height));
+					TradeQueueFrame* tradeQueueFrame = new TradeQueueFrame(delegateInfo.codeName, delegateInfo.code, wxPoint(r.x, r.y), wxSize(r.width, r.height));
 					tradeQueueFrame->Show(true);
 				}
 				// 默认查看
@@ -406,7 +455,7 @@
 				}
 
 
-			
+
 			}
 		}
 
@@ -435,7 +484,8 @@
 
 MainFrame::MainFrame(const wxString& title, wxPoint position, wxSize size) :wxFrame(NULL, wxID_ANY, title, position, size) {
 
-	
+	// 置顶
+	SetWindowStyle(GetWindowStyle() | wxSTAY_ON_TOP);
 	// 初始化
 	killed = false;
 	Bind(wxEVT_CLOSE_WINDOW, &MainFrame::OnClose, this);
@@ -445,20 +495,19 @@
 
 	SetTransparent(225);
 
-	SetWindowStyle(GetWindowStyle() | wxSTAY_ON_TOP);
 
 	wxPanel* panel = new wxPanel(this, wxID_ANY);
 
 	// 创建 wxDataViewListCtrl 控件
-	 m_listCtrl = new wxDataViewListCtrl(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,  wxDV_SINGLE| wxDV_NO_HEADER);
-	 m_listCtrl->SetBackgroundColour(wxColor(242, 242, 242));
-	 // 绑定没行的选中事件
-	 m_listCtrl->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MainFrame::OnSelectionChanged, this);
+	m_listCtrl = new wxDataViewListCtrl(panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_SINGLE | wxDV_NO_HEADER);
+	m_listCtrl->SetBackgroundColour(wxColor(242, 242, 242));
+	// 绑定没行的选中事件
+	m_listCtrl->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &MainFrame::OnSelectionChanged, this);
 
 
 	// 添加列
 	auto bc = new DelegateInfoRenderer();
-	wxDataViewColumn *delegateColumn =  new wxDataViewColumn("委托信息", bc, 0, ROW_WIDTH_DELEGATE_INFO, wxALIGN_LEFT);
+	wxDataViewColumn* delegateColumn = new wxDataViewColumn("委托信息", bc, 0, ROW_WIDTH_DELEGATE_INFO, wxALIGN_LEFT);
 	m_listCtrl->AppendColumn(delegateColumn);
 
 
@@ -468,22 +517,26 @@
 	wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
 
 	// 提示信息
-	msgCtrl = new wxStaticText(panel,wxID_ANY,"");
+	msgCtrl = new wxStaticText(panel, wxID_ANY, "");
 
-	wxButton *openTradeQueueBtn =new wxButton(panel, wxID_ANY,"查看全部");
+	wxButton* openTradeQueueBtn = new wxButton(panel, wxID_ANY, "查看全部");
 
-	wxBoxSizer *topSizer=new wxBoxSizer(wxHORIZONTAL);
+
+	avaiableMoneyLabel = new wxStaticText(panel, wxID_ANY, "0.00", wxDefaultPosition, wxSize(80 * DPI / 100, -1));
+
+	wxBoxSizer* topSizer = new wxBoxSizer(wxHORIZONTAL);
 
 	topSizer->Add(msgCtrl, 1, wxEXPAND);
+	topSizer->Add(avaiableMoneyLabel, 0, wxEXPAND | wxALL, 3);
 	topSizer->Add(openTradeQueueBtn, 0);
 
 
-	sizer->Add(topSizer, 0, wxEXPAND | wxLEFT|wxTOP|wxRIGHT, 5);
+	sizer->Add(topSizer, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, 5);
 	sizer->Add(m_listCtrl, 1, wxEXPAND | wxALL, 5);
 	panel->SetSizerAndFit(sizer);
 
 
-	openTradeQueueBtn->Bind(wxEVT_BUTTON, &MainFrame::OnButtonOpenTradeQueueClick,this);
+	openTradeQueueBtn->Bind(wxEVT_BUTTON, &MainFrame::OnButtonOpenTradeQueueClick, this);
 
 
 	std::thread t1(startRequestDelegatedInfoListTask, this);
@@ -515,9 +568,9 @@
 }
 
 
-void MainFrame::clearMsg( MainFrame* context)
+void MainFrame::clearMsg(MainFrame* context)
 {
-	Sleep(15* 1000);
+	Sleep(15 * 1000);
 	if (TimeUtil::getNowTimeStamp() > context->msgExpireTime) {
 		context->msgCtrl->SetLabelText("");
 	}
@@ -533,6 +586,7 @@
 
 void MainFrame::refresh()
 {
+	cout << "刷新时间:" << TimeUtil::getNowTimeStamp() << " 数量:" << delegateList.size() << endl;
 	m_listCtrl->DeleteAllItems();
 	for (list<DelegateInfo>::iterator e = delegateList.begin(); e != delegateList.end(); ++e) {
 		DelegateInfo info = *e;
@@ -541,17 +595,19 @@
 		data.push_back(info.id);
 		m_listCtrl->AppendItem(data);
 	}
+	m_listCtrl->Refresh();
 }
 
-list<DelegateInfo> MainFrame::parseDelegates(string result)
+DelegateResult MainFrame::parseDelegates(string result)
 {
 	list<DelegateInfo> fresults;
+	wxString available_money = "";
 	auto doc = JsonUtil::parseUTF16(result);
 	if (doc.IsObject() && doc[L"code"].GetInt() == 0) {
 		auto root = doc[L"data"].GetObject();
 		auto delegates = root[L"delegates"].GetArray();
-		auto money = root[L"account_available_money"].GetString();
-
+		double money = root[L"account_available_money"].GetDouble();
+		available_money = StringUtil::to_string(money);
 		for (int i = 0; i < delegates.Size(); i++) {
 			auto doc = delegates[i].GetObject();
 
@@ -582,15 +638,21 @@
 			delegateInfo.limit_up_price = doc[L"limit_up_price"].GetFloat();
 			delegateInfo.is_near_big_order = doc[L"is_near_big_order"].GetString();
 			delegateInfo.block = doc[L"block"].GetString();
+			if (doc.HasMember(L"limit_up_time")) {
+				delegateInfo.limit_up_time = doc[L"limit_up_time"].GetString();
+			}
 
-			array=doc[L"trade_queue"].GetArray();
+			array = doc[L"trade_queue"].GetArray();
 			list<TradeQueue> queueList;
 			for (int j = 0; j < array.Size(); j++) {
 				int num = array[j].GetArray()[0].GetInt();
 				int type = array[j].GetArray()[1].GetInt();
-				queueList.push_back(TradeQueue({to_string(num),type}));
+				queueList.push_back(TradeQueue({ to_string(num),type }));
 			}
 			delegateInfo.tradeQueueList = queueList;
+
+			if (doc.HasMember(L"zyltgb"))
+				delegateInfo.zyltgb = doc[L"zyltgb"].GetString();
 
 			fresults.push_back(delegateInfo);
 		}
@@ -598,45 +660,56 @@
 	else {
 		throw string("网络请求出错");
 	}
-	return fresults;
+	return DelegateResult({ fresults ,available_money });
 }
 
 void MainFrame::startRequestDelegatedInfoListTask(MainFrame* context)
 {
 	while (TRUE) {
-
-		if (context->killed) {
-			break;
-		}
 		try {
-			context->requestDelegatedInfoList();
-		}
-		catch (string st) {
+			while (TRUE) {
+				if (context->killed) {
+					break;
+				}
+				try {
+					context->requestDelegatedInfoList();
+				}
+				catch (string st) {
 
+				}
+				catch (...) {
+				}
+				Sleep(2000);
+			}
 		}
 		catch (...) {
 
-
 		}
-		Sleep(2000);
-
 	}
 }
 
 void MainFrame::requestDelegatedInfoList()
 {
 	try {
-		cout <<"请求委托列表"<< endl;
+		auto start_time = TimeUtil::getNowTimeStamp();
 		string result = MyNetworkApi::get_delegated_buy_code_infos();
 		if (killed) {
 			return;
 		}
+
+		cout << "请求委托列表耗时:" << TimeUtil::getNowTimeStamp() - start_time << endl;
+		start_time = TimeUtil::getNowTimeStamp();
+
 		auto doc = JsonUtil::parseUTF8(result);
-		auto delegateList = parseDelegates(result);
+		auto delegateResult = parseDelegates(result);
+		cout << "解析数据耗时:" << TimeUtil::getNowTimeStamp() - start_time << endl;
+		start_time = TimeUtil::getNowTimeStamp();
 		// 根据ID
 		if (this != nullptr) {
-			this->delegateList = delegateList;
+			this->delegateList = delegateResult.delegates;
+			this->avaiableMoneyLabel->SetLabelText(delegateResult.money);
 			this->refresh();
+			cout << "刷新UI耗时:" << TimeUtil::getNowTimeStamp() - start_time << endl;
 		}
 	}
 	catch (string st) {
@@ -653,8 +726,7 @@
 
 void MainFrame::OnButtonOpenTradeQueueClick(wxCommandEvent& event)
 {
-
-	if (delegateList.size()>0) {
+	if (delegateList.size() > 0) {
 		WindowPosSize r = MyConfigUtil::getTradeQueueWindowPos();
 		if (r.x == -1 && r.y == -1) {
 			r.x = 0;

--
Gitblit v1.8.0