bool Board::canMoveBing(int moveid, int, int row, int col) { GetRowCol(row1, col1, moveid); int r = relation(row1, col1, row, col); // 首先判断兵只能走一步 if (r != 1 && r != 10) { return false; } if (isBottomSide(moveid)) { // 下面一方的棋子 if (row > row1) { // 如果目标行大于原始行,相当于并在后退 return false; } if (row1 >= 5 && row == row1) { // 还没有过河就想横着走 return false; } } else { // 上面一方的棋子 if (row1 > row) { // 如果目标行小于原始行,相当于兵在后退 return false; } if (row <= 4 && row == row1) { // 还没有过河就想横着走 return false; } } return true; }
bool Board::canMoveXiang(int moveid, int, int row, int col) { GetRowCol(row1, col1, moveid); int r = relation(row1, col1, row, col); if (r != 22) { // 象走田,所以r应该等于22 return false; } // 看象眼有没有棋子 int rEye = (row + row1) / 2; int cEye = (col + col1) / 2; if (getStoneId(rEye, cEye) != -1) { return false; } // 判断是否在棋盘的下方 if (isBottomSide(moveid)) { if (row < 4) { return false; } } else { if (row > 5) { return false; } } return true; }
/// Get the overall rect of the given item bool InstanceCtrl::GetItemRect( VisualCoord item, wxRect& rect, bool view_relative ) { if (item.groupIndex < GetCount()) { int row, col; if (!GetRowCol(item, row, col)) return false; GroupVisual & gv = m_groups[item.groupIndex]; wxSize bsz = GetWindowBorderSize(); int x = col * (m_itemWidth + m_spacing) + m_spacing + bsz.GetWidth() / 2; int y = gv.y_position + gv.row_ys[row] + m_spacing; if (view_relative) { int startX, startY; int xppu, yppu; GetScrollPixelsPerUnit(& xppu, & yppu); GetViewStart(& startX, & startY); x = x - startX * xppu; y = y - startY * yppu; } rect.x = x; rect.y = y; rect.width = m_itemWidth; rect.height = GetItemHeight(item); return true; } return false; }
bool Board::canMoveShi(int moveid, int, int row, int col) { // 移动步长一个格子对角线 GetRowCol(row1, col1, moveid); int r = relation(row1, col1, row, col); if (r != 11) { return false; } if (col < 3 || col > 5) { return false; } if (isBottomSide(moveid)) { if (row < 7) { return false; } } else { if (row > 2) { return false; } } return true; }
bool Board::canMoveJiang(int moveid, int killid, int row, int col) { // 可直接吃对方将 if (killid != -1 && _s[killid]._type == Stone::JIANG) { return canMoveChe(moveid, killid, row, col); } GetRowCol(row1, col1, moveid); int r = relation(row1, col1, row, col); if (r != 1 || r != 10) { return false; } if (col < 3 || col > 5) { return false; } if (isBottomSide(moveid)) { if (row < 7) { return false; } } else { if (row > 2) { return false; } } return true; }
void InstanceCtrl::SetIntendedColumn ( VisualCoord coord ) { int row, col; if( GetRowCol(coord, row, col) ) m_intended_column = col; else m_intended_column = 0; }
bool Board::canMoveChe(int moveid, int, int row, int col) { GetRowCol(row1, col1, moveid); int ret = getStoneCountAtLine(row1, col1, row, col); if (ret == 0) { // 在一行,并且中间没有棋子 return true; } return false; }
void Board::saveStep(int moveid, int killid, int row, int col, QVector<Step*>& steps) { GetRowCol(row1, col1, moveid); Step* step = new Step; step->_colFrom = col1; step->_colTo = col; step->_rowFrom = row1; step->_rowTo = row; step->_moveid = moveid; step->_killid = killid; steps.append(step); }
// Selects the object or child. wxAccStatus GridAx::Select(int childId, wxAccSelectionFlags selectFlags) { int row; int col; if (GetRowCol(childId, row, col)) { if (selectFlags & wxACC_SEL_TAKESELECTION) { mGrid->SetGridCursor(row, col); } mGrid->SelectBlock(row, col, row, col, selectFlags & wxACC_SEL_ADDSELECTION); } return wxACC_OK; }
bool Board::canMovePao(int moveid, int killid, int row, int col) { GetRowCol(row1, col1, moveid); int ret = getStoneCountAtLine(row, col, row1, col1); if (killid != -1) { // 如果炮要吃对方的棋子 if (ret == 1) { // 中间有一个棋子,可以走 return true; } } else { // 如果炮不吃棋子 if (ret == 0) { // 中间没有棋子,可以走 return true; } } return false; }
// Returns the rectangle for this object (id = 0) or a child element (id > 0). // rect is in screen coordinates. wxAccStatus GridAx::GetLocation(wxRect & rect, int elementId) { wxRect r; int row; int col; if (GetRowCol(elementId, row, col)) { rect = mGrid->CellToRect(row, col); rect.SetPosition(mGrid->GetGridWindow()->ClientToScreen(rect.GetPosition())); } else { rect = mGrid->GetRect(); rect.SetPosition(mGrid->GetParent()->ClientToScreen(rect.GetPosition())); } return wxACC_OK; }
// Gets the name of the specified object. wxAccStatus GridAx::GetName(int childId, wxString *name) { int row; int col; if (GetRowCol(childId, row, col)) { wxString n = mGrid->GetColLabelValue(col); wxString v = mGrid->GetCellValue(row, col); if (v.IsEmpty()) { v = _("Empty"); } // Hack to provide a more intelligible response TimeEditor *d = (TimeEditor *)mGrid->GetDefaultEditorForType(GRID_VALUE_TIME); TimeEditor *c = (TimeEditor *)mGrid->GetCellEditor(row, col); if (c && d && c == d) { double value; v.ToDouble(&value); TimeTextCtrl tt(mGrid, wxID_ANY, wxT(""), value, c->GetRate(), wxPoint(10000, 10000), // create offscreen wxDefaultSize, true); tt.SetFormatString(tt.GetBuiltinFormat(c->GetFormat())); v = tt.GetTimeString(); } if (c) c->DecRef(); if (d) d->DecRef(); *name = n + wxT(" ") + v; } return wxACC_OK; }
// Gets the name of the specified object. wxAccStatus GridAx::GetName(int childId, wxString *name) { int row; int col; if (GetRowCol(childId, row, col)) { wxString n = mGrid->GetColLabelValue(col); wxString v = mGrid->GetCellValue(row, col); if (v.IsEmpty()) { v = _("Empty"); } // Hack to provide a more intelligible response NumericEditor *dt = static_cast<NumericEditor *>(mGrid->GetDefaultEditorForType(GRID_VALUE_TIME)); NumericEditor *df = static_cast<NumericEditor *>(mGrid->GetDefaultEditorForType(GRID_VALUE_FREQUENCY)); NumericEditor *c = static_cast<NumericEditor *>(mGrid->GetCellEditor(row, col)); if (c && dt && df && ( c == dt || c == df)) { double value; v.ToDouble(&value); NumericConverter converter(c == dt ? NumericConverter::TIME : NumericConverter::FREQUENCY, c->GetFormat(), value, c->GetRate() ); v = converter.GetString(); } if (c) c->DecRef(); if (dt) dt->DecRef(); if (df) df->DecRef(); *name = n + wxT(" ") + v; } return wxACC_OK; }
int ods_formula_node::EvaluateCELL(IODSCellEvaluator* poEvaluator) { CPLAssert( eNodeType == SNT_OPERATION ); CPLAssert( eOp == ODS_CELL ); CPLAssert(nSubExprCount == 1); CPLAssert(papoSubExpr[0]->eNodeType == SNT_CONSTANT ); CPLAssert(papoSubExpr[0]->field_type == ODS_FIELD_TYPE_STRING ); if (poEvaluator == NULL) { CPLError(CE_Failure, CPLE_AppDefined, "No cell evaluator provided"); return FALSE; } int nRow = 0,nCol = 0; if (!GetRowCol(papoSubExpr[0]->string_value, nRow, nCol)) return FALSE; std::vector<ods_formula_node> aoOutValues; if (poEvaluator->EvaluateRange(nRow, nCol, nRow, nCol, aoOutValues) && aoOutValues.size() == 1) { if (aoOutValues[0].eNodeType == SNT_CONSTANT) { FreeSubExpr(); eNodeType = aoOutValues[0].eNodeType; field_type = aoOutValues[0].field_type; int_value = aoOutValues[0].int_value; float_value = aoOutValues[0].float_value; string_value = aoOutValues[0].string_value ? CPLStrdup(aoOutValues[0].string_value) : NULL; return TRUE; } } return FALSE; }
// Returns a state constant. wxAccStatus GridAx::GetState(int childId, long *state) { int flag = wxACC_STATE_SYSTEM_FOCUSABLE | wxACC_STATE_SYSTEM_SELECTABLE; int col; int row; if (!GetRowCol(childId, row, col)) { *state = 0; return wxACC_FAIL; } #if defined(__WXMSW__) flag |= wxACC_STATE_SYSTEM_FOCUSED | wxACC_STATE_SYSTEM_SELECTED; if (mGrid->IsReadOnly(row, col)) { flag = wxACC_STATE_SYSTEM_UNAVAILABLE; } #endif #if defined(__WXMAC__) if (mGrid->IsInSelection(row, col)) { flag |= wxACC_STATE_SYSTEM_SELECTED; } if (mGrid->GetGridCursorRow() == row && mGrid->GetGridCursorCol() == col) { flag |= wxACC_STATE_SYSTEM_FOCUSED; } if (mGrid->IsReadOnly(row, col)) { flag |= wxACC_STATE_SYSTEM_UNAVAILABLE; } #endif *state = flag; return wxACC_OK; }
bool Board::canMoveMa(int moveid, int, int row, int col) { GetRowCol(row1, col1, moveid); int r = relation(row1, col1, row, col); // 首先判断马要走马字 if (r != 12 && r != 21) { return false; } // 判断有没有蹩马腿的情况 if (r == 12) { // 列相差等于2 if (getStoneId(row1, (col + col1) / 2) != -1) { return false; } } else { // 行相差等于2 if (getStoneId((row + row1) / 2, col1) != -1) { return false; } } return true; }
//FIXME: doing this for every single change seems like a waste :/ // Also, pure fail :D void InstanceCtrl::ReloadAll() { // nuke all... lol m_groups.Clear(); int totalitems = m_instList->size(); /// sort items into groups std::map<InstanceGroup *, InstanceItemArray> sorter; for (int i = 0; i < totalitems ; i++) { auto inst = m_instList->operator[](i); InstanceGroup *group = m_instList->GetInstanceGroup(inst); if (sorter.count(group)) { auto & list = sorter[group]; list.Add(InstanceVisual(inst, i)); } else { InstanceItemArray arr; arr.Add(InstanceVisual(inst, i)); sorter[group] = arr; } } m_itemIndexes.resize(totalitems); // sort items in each group auto iter = sorter.begin(); while (iter != sorter.end()) { InstanceGroup* group = (*iter).first; GroupVisual grpv(group); grpv.items = (*iter).second; switch (settings->GetInstSortMode()) { case Sort_Name: grpv.items.Sort(NameSort); break; case Sort_LastLaunch: grpv.items.Sort(LastLaunchSort); break; } m_groups.Add(grpv); iter++; } // sort the groups and construct a mapping from IDs to indexes m_groups.Sort(NameSort); for(int i = 0; i < m_groups.size(); i++) { GroupVisual & grp = m_groups[i]; grp.SetIndex(i); for(int j = 0; j < grp.items.size(); j++) { InstanceVisual & iv = grp.items[j]; int ID = iv.GetID(); m_itemIndexes[ID] = VisualCoord(i,j); } } int selectedIdx = m_instList->GetSelectedIndex(); if(selectedIdx == -1) { if(m_focusItem == m_selectedItem) m_focusItem.makeVoid(); m_selectedItem.makeVoid(); } else { VisualCoord selectedIndex = m_itemIndexes[selectedIdx]; if(m_focusItem == m_selectedItem) m_focusItem = selectedIndex; m_selectedItem = selectedIndex; } // Disable group headers in single column mode. Groups are still there, but their existence is hidden. if (GetWindowStyle() & wxINST_SINGLE_COLUMN) { for (int i = 0; i < m_groups.size(); i++) { m_groups[i].no_header = true; m_groups[i].always_show = true; } } // everything got changed (probably not, but we can't know that). Redo all of the layout stuff. ReflowAll(); SetupScrollbars(); Refresh(); // and reset the intended navigation column int row, col; GetRowCol(m_selectedItem, row, col); m_intended_column = col; }
int ods_formula_node::EvaluateListArgOp(IODSCellEvaluator* poEvaluator) { CPLAssert( eNodeType == SNT_OPERATION ); CPLAssert( eOp >= ODS_SUM && eOp <= ODS_COUNTA ); CPLAssert(nSubExprCount == 1); CPLAssert(papoSubExpr[0]->eNodeType == SNT_OPERATION ); CPLAssert(papoSubExpr[0]->eOp == ODS_LIST ); std::vector<double> adfVal; int i; int nCount = 0, nCountA = 0; for(i=0;i<papoSubExpr[0]->nSubExprCount;i++) { if (papoSubExpr[0]->papoSubExpr[i]->eNodeType == SNT_OPERATION && papoSubExpr[0]->papoSubExpr[i]->eOp == ODS_CELL_RANGE) { CPLAssert (papoSubExpr[0]->papoSubExpr[i]->nSubExprCount == 2); CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[0]->eNodeType == SNT_CONSTANT); CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[0]->field_type == ODS_FIELD_TYPE_STRING); CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[1]->eNodeType == SNT_CONSTANT); CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[1]->field_type == ODS_FIELD_TYPE_STRING); if (poEvaluator == NULL) { CPLError(CE_Failure, CPLE_AppDefined, "No cell evaluator provided"); return FALSE; } const char* psz1 = papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[0]->string_value; const char* psz2 = papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[1]->string_value; int nRow1 = 0,nCol1 = 0; if (!GetRowCol(psz1, nRow1, nCol1)) return FALSE; int nRow2 = 0,nCol2 = 0; if (!GetRowCol(psz2, nRow2, nCol2)) return FALSE; std::vector<ods_formula_node> aoOutValues; if (poEvaluator->EvaluateRange(nRow1, nCol1, nRow2, nCol2, aoOutValues)) { for(size_t j = 0; j < aoOutValues.size(); j++) { if (aoOutValues[j].eNodeType == SNT_CONSTANT) { if (aoOutValues[j].field_type == ODS_FIELD_TYPE_INTEGER) { adfVal.push_back(aoOutValues[j].int_value); nCount ++; nCountA ++; } else if (aoOutValues[j].field_type == ODS_FIELD_TYPE_FLOAT) { adfVal.push_back(aoOutValues[j].float_value); nCount ++; nCountA ++; } else if (aoOutValues[j].field_type == ODS_FIELD_TYPE_STRING) { nCountA ++; } } } } } else { if (!(papoSubExpr[0]->papoSubExpr[i]->Evaluate(poEvaluator))) return FALSE; CPLAssert (papoSubExpr[0]->papoSubExpr[i]->eNodeType == SNT_CONSTANT ); if (papoSubExpr[0]->papoSubExpr[i]->field_type == ODS_FIELD_TYPE_INTEGER) { adfVal.push_back(papoSubExpr[0]->papoSubExpr[i]->int_value); nCount ++; nCountA ++; } else if (papoSubExpr[0]->papoSubExpr[i]->field_type == ODS_FIELD_TYPE_FLOAT) { adfVal.push_back(papoSubExpr[0]->papoSubExpr[i]->float_value); nCount ++; nCountA ++; } else if (eOp == ODS_COUNT || eOp == ODS_COUNTA) { if (papoSubExpr[0]->papoSubExpr[i]->field_type == ODS_FIELD_TYPE_STRING) nCountA ++; } else { CPLError(CE_Failure, CPLE_NotSupported, "Bad argument type for %s", ODSGetOperatorName(eOp)); return FALSE; } } } if (eOp == ODS_COUNT) { eNodeType = SNT_CONSTANT; field_type = ODS_FIELD_TYPE_INTEGER; int_value = nCount; FreeSubExpr(); return TRUE; } if (eOp == ODS_COUNTA) { eNodeType = SNT_CONSTANT; field_type = ODS_FIELD_TYPE_INTEGER; int_value = nCountA; FreeSubExpr(); return TRUE; } double dfVal = 0; switch(eOp) { case ODS_SUM: { for(i=0;i<(int)adfVal.size();i++) { dfVal += adfVal[i]; } break; } case ODS_AVERAGE: { for(i=0;i<(int)adfVal.size();i++) { dfVal += adfVal[i]; } dfVal /= adfVal.size(); break; } case ODS_MIN: { dfVal = (adfVal.size() == 0) ? 0 :adfVal[0]; for(i=1;i<(int)adfVal.size();i++) { if (adfVal[i] < dfVal) dfVal = adfVal[i]; } break; } case ODS_MAX: { dfVal = (adfVal.size() == 0) ? 0 :adfVal[0]; for(i=1;i<(int)adfVal.size();i++) { if (adfVal[i] > dfVal) dfVal = adfVal[i]; } break; } default: break; } eNodeType = SNT_CONSTANT; field_type = ODS_FIELD_TYPE_FLOAT; float_value = dfVal; FreeSubExpr(); return TRUE; }