#include "ViewManager.h" #include #include #include "MyNetworkApi.h" #include "JueJInSettingFrame.h" #include "../common_nopch/Win32Util.h" #include #include "MyConfigUtil.h" IMPLEMENT_VARIANT_OBJECT(MyColorText) IMPLEMENT_VARIANT_OBJECT(MyButton) ViewManager::ViewManager() { this->topWidgets = new TopWidgets(); this->tickWidgets = new TickWidgets(); this->moneyWidgets = new MoneyWidgets(); this->positionWidgets = new PositionWidgets(); this->sellWidgets = new SellWidgets(); } wxPanel* ViewManager::createSplitLine(wxWindow* parent) { wxPanel* splitterLine = new wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); splitterLine->SetBackgroundColour(wxColour(225, 225, 225)); return splitterLine; } void ViewManager::initView(wxWindow* window) { window->SetBackgroundColour(wxColor(255, 255, 255)); wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); wxSize size = window->GetSize(); cout << "size:" << size.GetWidth() << endl; wxPanel* topPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, PANNEL_TOP_HEIGHT)); wxPanel* tickPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, size.GetWidth() < 100 ? PANNEL_TICK_HEIGHT : size.GetWidth() * 2 / 3)); wxPanel* moneyPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, PANNEL_MONEY_HEIGHT)); wxPanel* positionPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, -1)); wxPanel* sellPanel = new wxPanel(window, wxID_ANY, wxDefaultPosition, wxSize(-1, PANNEL_SELL_HEIGHT)); initMenu((wxFrame*)window); sizer->Add(topPanel, 0, wxEXPAND | wxLEFT | wxRIGHT, 2); sizer->Add(createSplitLine(window), 0, wxEXPAND); sizer->Add(tickPanel, 0, wxEXPAND | wxLEFT | wxRIGHT, 2); sizer->Add(createSplitLine(window), 0, wxEXPAND); sizer->Add(moneyPanel, 0, wxEXPAND | wxLEFT | wxRIGHT, 2); sizer->Add(createSplitLine(window), 0, wxEXPAND); sizer->Add(positionPanel, 1, wxEXPAND | wxLEFT | wxRIGHT, 2); sizer->Add(createSplitLine(window), 0, wxEXPAND); sizer->Add(sellPanel, 0, wxEXPAND | wxLEFT | wxRIGHT, 2); sizer->Add(createSplitLine(window), 0, wxEXPAND); window->SetSizer(sizer); this->initTopView(topPanel); this->initTickView(tickPanel); this->initMoneyView(moneyPanel); this->initPositionView(positionPanel); this->initSellView(sellPanel); } void ViewManager::ShowJueJinSetting(wxCommandEvent& event) { JueJInSettingFrame* jueJinFrame = new JueJInSettingFrame("¾ò½ð²ÎÊýÉèÖÃ"); jueJinFrame->ShowModal(); } void ViewManager::initMenu(wxFrame* window) { // ³õʼ»¯²Ëµ¥ menuBar = new wxMenuBar(); // ´´½¨Îļþ²Ëµ¥ wxMenu* menuSetting = new wxMenu(); menuSetting->Append(10012, "&¾ò½ð²ÎÊýÉèÖÃ"); menuSetting->AppendSeparator(); // ½«Îļþ²Ëµ¥Ìí¼Óµ½²Ëµ¥À¸ menuBar->Append(menuSetting, "&ÉèÖÃ"); // ½«²Ëµ¥À¸ÉèÖÃΪ´°¿ÚµÄ²Ëµ¥À¸ window->SetMenuBar(menuBar); window->Bind(wxEVT_MENU, &ViewManager::ShowJueJinSetting, this, 10012); } void ViewManager::initTopView(wxPanel* pancel) { wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); this->topWidgets->refreshBtn = new wxButton(pancel, wxID_ANY, "Ë¢ÐÂ", wxDefaultPosition, wxSize(50, -1)); this->topWidgets->msgLabel = new wxStaticText(pancel, wxID_ANY, "ÌáʾÓïÌáʾÓï", wxDefaultPosition); this->topWidgets->codeEdit = new wxTextCtrl(pancel, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 25)); this->topWidgets->backTestDate = new wxTextCtrl(pancel, wxID_ANY); this->topWidgets->btnBackTest = new wxButton(pancel, wxID_ANY, "¿ªÊ¼»Ø²â"); topWidgets->codeInfoLabel = new wxRichTextCtrl(pancel, wxID_ANY, "", wxDefaultPosition, wxSize(-1, 90), wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE); wxFont font = topWidgets->codeInfoLabel->GetFont(); font.SetPointSize(10); topWidgets->codeInfoLabel->SetFont(font); wxBoxSizer* infoSizer = new wxBoxSizer(wxHORIZONTAL); infoSizer->Add(topWidgets->codeInfoLabel, 1, wxEXPAND); // °ó¶¨Ê¼þ this->topWidgets->refreshBtn->Bind(wxEVT_BUTTON, &ViewManager::OnRefresh, this); sizer->Add(this->topWidgets->codeEdit, 0, wxALL, 2); sizer->Add(this->topWidgets->btnAddZX, 0, wxALL, 2); sizer->Add(this->topWidgets->msgLabel, 1, wxALIGN_CENTER_VERTICAL); sizer->Add(topWidgets->backTestDate, 0, wxALIGN_CENTER_VERTICAL); sizer->Add(topWidgets->btnBackTest, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 2); sizer->Add(this->topWidgets->refreshBtn, 0, wxALL, 2); wxBoxSizer* rootSizer = new wxBoxSizer(wxVERTICAL); rootSizer->Add(infoSizer, 0, wxEXPAND, 2); rootSizer->Add(sizer, 0, wxEXPAND, 2); pancel->SetSizer(rootSizer); } class wxChartsPresentationDatasetTheme10 : public wxChartsDatasetTheme { public: wxChartsPresentationDatasetTheme10() { SetLineChartDatasetOptions(wxLineChartDatasetOptions( wxColor(220, 0, 0), wxColor(255, 255, 255), // wxColor(220, 220, 220, 0x33) wxColor(220, 0, 0, 0) )); } }; void ViewManager::initTickView(wxPanel* panel) { tickWidgets->tickChart = new TickChart(panel, wxID_ANY, 60, TIME_SPACE_BAR, "09:25:00", "15:00:00"); wxBoxSizer* panelSizer = new wxBoxSizer(wxVERTICAL); panelSizer->Add(tickWidgets->tickChart, 1, wxEXPAND); panel->SetSizer(panelSizer); } void ViewManager::initMoneyView(wxPanel* panel) { //wxStaticText* positionLabel;//³Ö²Ö½ð¶î wxStaticText* frozenLabel; //¶³½á½ð¶î wxStaticText* totalLabel; // ÕË»§×ܽð¶î wxStaticText* todayCommissionLabel;// ½ñÈÕÊÖÐø·Ñ wxStaticText* todayProfitLabel;// Ó¯Àû½ð¶î wxStaticText* todayProfitRateLabel;// ½ñÈÕÓ¯Àû±È wxStaticText* totalProfitLabel;// ÀÛ¼ÆÓ¯Àû // wxGridSizer* rootSizer = new wxGridSizer(2, 4, 10, 20); wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "¿ÉÓÃ×ʽð£º")); moneyWidgets->availableLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->availableLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "³Ö²Ö×ʽð£º")); moneyWidgets->positionLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->positionLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "¶³½á×ʽð£º")); moneyWidgets->frozenLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->frozenLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "ÕË»§×ܽð¶î£º")); moneyWidgets->totalLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->totalLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "½ñÈÕÊÖÐø·Ñ£º")); moneyWidgets->todayCommissionLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->todayCommissionLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "½ñÈÕÓ¯¿÷£º")); moneyWidgets->todayProfitLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->todayProfitLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "½ñÈÕÓ¯¿÷±È£º")); moneyWidgets->todayProfitRateLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->todayProfitRateLabel); rootSizer->Add(sizer, 0, wxEXPAND); sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(new wxStaticText(panel, wxID_ANY, "ÀÛ¼ÆÓ¯¿÷£º")); moneyWidgets->totalProfitLabel = new wxStaticText(panel, wxID_ANY, "--"); sizer->Add(moneyWidgets->totalProfitLabel); rootSizer->Add(sizer, 0, wxEXPAND); panel->SetSizer(rootSizer); } class ButtonRenderer : public wxDataViewCustomRenderer { private: MyButton info; public: ButtonRenderer(const wxString& varianttype = "wxObject") : wxDataViewCustomRenderer(varianttype, wxDATAVIEW_CELL_ACTIVATABLE) { } virtual bool Render(wxRect cell, wxDC* dc, int state) { // ÉèÖûæÖư´Å¥µÄλÖúʹóС wxRect buttonRect(cell.GetPosition(), wxSize(40, 20)); dc->SetTextForeground(info.getTextColor()); // »æÖư´Å¥µÄÍâ¿ò dc->SetPen(info.getBgColor()); dc->SetBrush(info.getBgColor()); dc->DrawRectangle(buttonRect); // »æÖư´Å¥µÄÎı¾ dc->DrawLabel(info.getText(), buttonRect, wxALIGN_CENTER); return false; } // µã»÷ʼþ´¦Àí·½·¨ bool ActivateCell(const wxRect& WXUNUSED(cell), wxDataViewModel* WXUNUSED(model), const wxDataViewItem& WXUNUSED(item), unsigned int WXUNUSED(col), const wxMouseEvent* mouseEvent) override { // ´¦Àíµã»÷ʼþ if (mouseEvent->LeftDown()) { try { thread t(Win32Util::addToTHS, info.getCode().ToStdString()); t.detach(); } catch (...) { } } return false; // ·µ»Ø true ±íʾÒѾ­´¦ÀíÁ˵ã»÷ʼþ } virtual wxSize GetSize() const { // ·µ»Ø°´Å¥µÄ´óС return wxSize(40, 20); } virtual bool SetValue(const wxVariant& value) { info << value; return true; } virtual bool GetValue(wxVariant& value) const { return true; } }; class ColorTextRenderer : public wxDataViewCustomRenderer { private: MyColorText colorText; public: ColorTextRenderer(const wxString& varianttype = wxS("wxObject")) : wxDataViewCustomRenderer(varianttype, wxDATAVIEW_CELL_ACTIVATABLE) { } virtual bool Render(wxRect cell, wxDC* dc, int state) { dc->SetTextForeground(colorText.getColor()); // »æÖư´Å¥µÄÍâ¿ò dc->SetPen(wxColour(225, 225, 225)); dc->SetBrush(wxColour(225, 225, 225)); // »æÖư´Å¥µÄÎı¾ dc->DrawLabel(colorText.getText(), cell, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); return false; } virtual wxSize GetSize() const { // ·µ»Ø°´Å¥µÄ´óС return wxSize(-1, -1); } virtual bool SetValue(const wxVariant& value) wxOVERRIDE { cout << value.GetType() << endl; //colorText = (ColorText) value.GetType(); colorText << value; return true; } virtual bool GetValue(wxVariant& value) const wxOVERRIDE { return true; } wxString GetAccessibleDescription() const wxOVERRIDE { return wxEmptyString; } }; void ViewManager::initPositionView(wxPanel* panel) { MyDataViewListCtrl* listCtrl = new MyDataViewListCtrl( panel, wxID_ANY, wxDefaultPosition, wxSize(-1, -1), wxLC_REPORT | wxBORDER_NONE); // ÉèÖÃÕûÌåµÄ×ÖÌå´óС wxFont font = listCtrl->GetFont(); font.SetPointSize(10); listCtrl->SetFont(font); const int COL_COUNT = 13; std::string headers[COL_COUNT] = { "Ãû³Æ","ÕÇ·ù","Õý¹ÉÕÇ·ù","Õý¹ÉÂòÒ»","³Ö²Ö½ð¶î","Ó¯¿÷±È","µ¥±ÊÂô¶î","ÏÖ¼Û","³É±¾¼Û","¸ü¶à","³Ö²Ö","Ó¯¿÷","Õý¹ÉÃû³Æ" }; list widths = MyConfigUtil::getPositionColumnWidth(); for (int i = 0; i < COL_COUNT; i++) { int width = -1; if (widths.size() > i) { list::iterator e = widths.begin(); std::advance(e, i); width = *e; } cout << "³Ö²ÖÁпí¶È£º" << i << "-" << width << endl; if (i != 9) { auto ctr = new ColorTextRenderer(); listCtrl->AppendColumn(new wxDataViewColumn(headers[i], ctr, i, width < 0 ? 50 : width, i == 0 ? wxALIGN_LEFT : wxALIGN_RIGHT, wxDATAVIEW_COL_RESIZABLE)); } else { auto bc = new ButtonRenderer(); listCtrl->AppendColumn(new wxDataViewColumn(headers[i], bc, i, width < 0 ? 50 : width, i == 0 ? wxALIGN_LEFT : wxALIGN_RIGHT, wxDATAVIEW_COL_RESIZABLE)); } } listCtrl->HandleDataUpdate(); positionWidgets->listCtrlReport = listCtrl; wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(positionWidgets->listCtrlReport, 1, wxEXPAND); panel->SetSizer(sizer); } void ViewManager::initSellView(wxPanel* panel) { const int moneys[] = { 80000,60000,40000,20000,15000,10000,8000,5000,3000,2000 }; //-------°´Å¥²Ù×÷ÇøÓò const int COLUMN_SPACE = 8; auto btnSizer = new wxBoxSizer(wxHORIZONTAL); wxPanel* btnPannel = new wxPanel(panel, wxID_ANY, wxDefaultPosition, wxSize(-1, 70)); btnPannel->SetSizer(btnSizer); sellWidgets->buyLock = new wxCheckBox(btnPannel, wxID_ANY, "ÂòËø¶¨"); sellWidgets->buyMoney = new wxTextCtrl(btnPannel, wxID_ANY, "", wxDefaultPosition, wxSize(90, -1), wxTE_PROCESS_ENTER); sellWidgets->sellLock = new wxCheckBox(btnPannel, wxID_ANY, "ÂôËø¶¨"); sellWidgets->sellMoney = new wxTextCtrl(btnPannel, wxID_ANY, "", wxDefaultPosition, wxSize(90, -1), wxTE_PROCESS_ENTER); auto bv = new wxBoxSizer(wxVERTICAL); bv->Add(sellWidgets->buyLock, 0, wxTOP, 5); bv->AddStretchSpacer(); bv->Add(sellWidgets->buyMoney, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, 5); bv = new wxBoxSizer(wxVERTICAL); bv->Add(sellWidgets->sellLock, 0, wxTOP, 5); bv->AddStretchSpacer(); bv->Add(sellWidgets->sellMoney, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE); // ¿ªÆô/¹Ø±Õ½»Ò× sellWidgets->openTrade = new wxButton(btnPannel, wxID_ANY, "¿ªÆô½»Ò×", wxDefaultPosition, wxSize(80, -1)); sellWidgets->closeTrade = new wxButton(btnPannel, wxID_ANY, "¹Ø±Õ½»Ò×", wxDefaultPosition, wxSize(80, -1)); bv = new wxBoxSizer(wxVERTICAL); bv->Add(sellWidgets->openTrade, 0); bv->AddStretchSpacer(); bv->Add(sellWidgets->closeTrade, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE); // ÏëÂòµ¥ sellWidgets->addWantBuy = new wxButton(btnPannel, wxID_ANY, "¼ÓÏë", wxDefaultPosition, wxSize(40, -1)); sellWidgets->removeWantBuy = new wxButton(btnPannel, wxID_ANY, "ÒÆÏë", wxDefaultPosition, wxSize(40, -1)); sellWidgets->wantBuyList = new wxButton(btnPannel, wxID_ANY, "Ïëµ¥", wxDefaultPosition, wxSize(40, -1)); bv = new wxBoxSizer(wxVERTICAL); bv->Add(sellWidgets->addWantBuy, 0); bv->AddStretchSpacer(); bv->Add(sellWidgets->removeWantBuy, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE); btnSizer->Add(sellWidgets->wantBuyList, 0, wxEXPAND | wxLEFT, 3); // Âô³ö°´Å¥ sellWidgets->sellBtn = new wxButton(btnPannel, wxID_ANY, "Âô³ö", wxDefaultPosition, wxSize(80, -1)); wxFont font(15, sellWidgets->sellBtn->GetFont().GetFamily(), wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD); sellWidgets->sellBtn->SetFont(font); btnSizer->Add(sellWidgets->sellBtn, 0, wxEXPAND | wxLEFT, 10); // ×Ô¶¯³·µ¥/²ÎÊýÉèÖà sellWidgets->autoCancel = new wxCheckBox(btnPannel, wxID_ANY, "×Ô¶¯³·µ¥"); sellWidgets->setting = new wxButton(btnPannel, wxID_ANY, "²ÎÊýÉèÖÃ", wxDefaultPosition, wxSize(80, -1)); bv = new wxBoxSizer(wxVERTICAL); bv->Add(sellWidgets->autoCancel, 0); bv->AddStretchSpacer(); bv->Add(sellWidgets->setting, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE); // Âò¼Û/Âô¼ÛÉèÖà 0-¼Û¸ñÁý×Ó 1-µøÍ£¼Û 2-ÕÇÍ£¼Û 3-ÏÖ¼Û 4-Âò5¼Û const wxString prices_buy[] = { "Áý×Ó¼Û", "µøÍ£¼Û","ÕÇÍ£¼Û","ÏÖ¼Û","Âò5¼Û" }; const wxString prices_sell[] = { "Áý×Ó¼Û", "µøÍ£¼Û","ÕÇÍ£¼Û","ÏÖ¼Û","Âô5¼Û" }; sellWidgets->sellPrice = new wxChoice(btnPannel, wxID_ANY, wxDefaultPosition, wxSize(90, -1)); sellWidgets->buyPrice = new wxChoice(btnPannel, wxID_ANY, wxDefaultPosition, wxSize(90, -1)); for (int i = 0; i < 5; i++) { sellWidgets->sellPrice->Append(prices_sell[i]); sellWidgets->buyPrice->Append(prices_buy[i]); } sellWidgets->sellPrice->SetSelection(0); sellWidgets->buyPrice->SetSelection(2); bv = new wxBoxSizer(wxVERTICAL); bv->Add(new wxStaticText(btnPannel, wxID_ANY, "Âô¼ÛÉèÖÃ"), 0); bv->AddStretchSpacer(); bv->Add(sellWidgets->sellPrice, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, 10); bv = new wxBoxSizer(wxVERTICAL); bv->Add(new wxStaticText(btnPannel, wxID_ANY, "Âò¼ÛÉèÖÃ"), 0); bv->AddStretchSpacer(); bv->Add(sellWidgets->buyPrice, 0); btnSizer->Add(bv, 0, wxEXPAND | wxLEFT, COLUMN_SPACE); sellWidgets->showAllPosition = new wxCheckBox(btnPannel, wxID_ANY, "ÏÔʾÎÞ³Ö²Ö"); sellWidgets->showAllPosition->SetValue(TRUE); btnSizer->Add(sellWidgets->showAllPosition, 0, wxLEFT, COLUMN_SPACE); // ÂòÈë btnSizer->AddStretchSpacer(); sellWidgets->buyBtn = new wxButton(btnPannel, wxID_ANY, "ÂòÈë", wxDefaultPosition, wxSize(80, -1)); sellWidgets->buyBtn->SetFont(font); btnSizer->Add(sellWidgets->buyBtn, 0, wxEXPAND | wxLEFT, COLUMN_SPACE); //------- Âô½ð¶îÇøÓò const int sellNumCount = sizeof(moneys) / sizeof(moneys[0]); for (int i = 0; i < sellNumCount; i++) { sellWidgets->sellNums.push_back(new wxButton(panel, wxID_ANY, std::to_string(moneys[i]), wxDefaultPosition, wxSize(-1, 50))); } auto sellNumsSizer = new wxBoxSizer(wxHORIZONTAL); for (std::list::iterator e = sellWidgets->sellNums.begin(); e != sellWidgets->sellNums.end(); e++) { (*e)->SetMinSize(wxSize(40,50)); sellNumsSizer->Add(*e, 1, wxEXPAND | wxALL, 2); } auto rootSizer = new wxBoxSizer(wxVERTICAL); rootSizer->Add(btnPannel, 0, wxEXPAND | wxTOP, 5); rootSizer->Add(sellNumsSizer, 1, wxEXPAND | wxTOP, 5); panel->SetSizer(rootSizer); } void ViewManager::OnRefresh(wxCommandEvent& event) { MyNetworkApi::get_all_positions(); }