bool Panel::onTabClose( TabPtr tab ) { bool doClose = false; int cnt = Manager::instance().dock()->getContentCount( tab->getContent()->getContentID() ); ASSERT( cnt != 0 ); Content::OnCloseAction response = tab->getContent()->onClose( (cnt == 1) ); if ( response == Content::CONTENT_KEEP ) { doClose = false; } else if ( response == Content::CONTENT_HIDE ) { showTab( tab, false ); doClose = true; } else if ( response == Content::CONTENT_DESTROY ) { detachTab( tab ); doClose = true; } else ASSERT( 0 ); return doClose; }
void Panel::detachTab( TabPtr tab ) { for(TabItr i = tabList_.begin(); i != tabList_.end(); ++i ) { if ( (*i) == tab ) { if ( activeTab_ == tab ) activeTab_ = 0; tab->getCWnd()->ShowWindow( SW_HIDE ); tab->getCWnd()->SetParent( 0 ); tabBar_->removeItem( tab.getObject() ); tabList_.erase( i ); for( i = tabList_.begin(); i != tabList_.end(); ++i ) { if ( tabBar_->contains( (*i).getObject() ) ) { setActiveTab( *i ); break; } } if ( i == tabList_.end() ) setActiveTab( 0 ); break; } } }
bool Panel::load( DataSectionPtr section ) { lastX_ = section->readInt( "lastX", lastX_ ); lastY_ = section->readInt( "lastY", lastY_ ); isExpanded_ = section->readBool( "expanded", isExpanded_ ); expandedSize_ = section->readInt( "expandedSize", expandedSize_ ); isFloating_ = section->readBool( "floating", isFloating_ ); std::vector<DataSectionPtr> tabs; section->openSections( "Tab", tabs ); if ( tabs.empty() ) return false; activeTab_ = 0; TabPtr firstTab = 0; for( std::vector<DataSectionPtr>::iterator i = tabs.begin(); i != tabs.end(); ++i ) { std::string contentID = (*i)->readString( "contentID" ); if ( contentID.empty() ) continue; TabPtr newTab = new Tab( this, contentID ); if ( !newTab->getContent() ) continue; newTab->setVisible( (*i)->readBool( "visible", true ) ); // ignoring if loading a tab returns false newTab->load( *i ); addTab( newTab ); newTab->getCWnd()->ShowWindow( SW_HIDE ); if ( !firstTab && !!activeTab_ ) firstTab = activeTab_; } if ( firstTab ) setActiveTab( firstTab ); if ( activeTab_ ) { updateTabBar(); if ( isExpanded_ ) activeTab_->getCWnd()->ShowWindow( SW_SHOW ); else activeTab_->getCWnd()->ShowWindow( SW_HIDE ); } int w; int h; getPreferredSize( w, h ); SetWindowPos( 0, 0, 0, section->readInt( "lastWidth", w ), section->readInt( "lastHeight", h ), SWP_NOMOVE | SWP_NOZORDER ); return true; }
void Panel::addTab( const std::string contentID ) { TabPtr newTab = new Tab( this, contentID ); tabList_.push_back( newTab ); tabBar_->insertItem( newTab->getTabDisplayString(), newTab->getIcon(), newTab.getObject() ); newTab->show( true ); setActiveTab( newTab ); }
void Panel::insertTempTab( TabPtr tab ) { if ( activeTab_ && isExpanded_ ) activeTab_->getCWnd()->ShowWindow( SW_HIDE ); tempTab_ = tab; tabBar_->insertItem( tab->getTabDisplayString(), tab->getIcon(), tab.getObject() ); updateTabBar(); recalcSize(); UpdateWindow(); }
void Panel::addTab( TabPtr tab ) { tab->getCWnd()->SetParent( this ); tabList_.push_back( tab ); if ( tab->isVisible() ) { tabBar_->insertItem( tab->getTabDisplayString(), tab->getIcon(), tab.getObject() ); setActiveTab( tab ); } }
ContentPtr Panel::cloneTab( ContentPtr content, int x, int y ) { if ( !content ) return 0; content = content->clone(); TabPtr tab = new Tab( this, content ); tab->show( true ); addTab( tab ); CRect rect; GetWindowRect( &rect ); Manager::instance().dock()->dockTab( this, tab, 0, FLOATING, rect.left, rect.top, x, y ); return content; }
bool Panel::tabContains( TabPtr t, ContentPtr content ) { Content* tcontent = t->getContent().getObject(); if ( !tcontent ) return 0; return tcontent == content || ( tcontent->getContentID() == ContentContainer::contentID && ((ContentContainer*)tcontent)->contains( content ) ); }
// Gui Shortcut alt-letters //....................................................................................... void CGui::GuiShortcut(WND_Types wnd, int tab, int subtab) { if (subtab == -1 && (!app->bGuiFocus || pSet->inMenu != wnd)) subtab = -2; // cancel subtab cycling if (!app->bGuiFocus) if (app->edMode != ED_PrvCam) { app->bGuiFocus = !app->bGuiFocus; app->UpdVisGui(); } //isFocGui = true; pSet->isMain = false; pSet->inMenu = wnd; TabPtr mWndTabs = 0; std::vector<TabControl*>* subt = 0; switch (wnd) { case WND_Track: mWndTabs = app->mWndTabsTrack; subt = &vSubTabsTrack; break; case WND_Edit: mWndTabs = app->mWndTabsEdit; subt = &vSubTabsEdit; break; case WND_Help: mWndTabs = app->mWndTabsHelp; subt = &vSubTabsHelp; break; case WND_Options: mWndTabs = app->mWndTabsOpts; subt = &vSubTabsOpts; break; } if (wnd != WND_Edit) app->mWndPick->setVisible(false); toggleGui(false); size_t t = mWndTabs->getIndexSelected(); mWndTabs->setIndexSelected(tab); if (!subt) return; TabControl* tc = (*subt)[tab]; if (!tc) return; int cnt = tc->getItemCount(); if (t == tab && subtab == -1) // cycle subpages if same tab { if (app->shift) tc->setIndexSelected( (tc->getIndexSelected()-1+cnt) % cnt ); else tc->setIndexSelected( (tc->getIndexSelected()+1) % cnt ); } if (subtab > -1) tc->setIndexSelected( std::min(cnt-1, subtab) ); }
void Panel::setActiveTab( TabPtr tab ) { if ( activeTab_ ) activeTab_->getCWnd()->ShowWindow( SW_HIDE ); activeTab_ = tab; updateTabBar(); if ( tab ) { if ( isExpanded_ ) tab->getCWnd()->ShowWindow( SW_SHOW ); tabBar_->setCurItem( activeTab_.getObject() ); tab->getCWnd()->SetFocus(); } recalcSize(); paintCaptionBar(); }
void Panel::showTab( TabPtr tab, bool show ) { TabItr i; for( i = tabList_.begin(); i != tabList_.end(); ++i ) if ( (*i) == tab ) break; if ( i == tabList_.end() ) return; if ( show ) { if ( !tabBar_->contains( tab.getObject() ) ) { tab->setVisible( true ); tabBar_->insertItem( tab->getTabDisplayString(), tab->getIcon(), tab.getObject() ); } setActiveTab( tab ); } else { if ( tabBar_->contains( tab.getObject() ) ) { tab->show( false ); tabBar_->removeItem( tab.getObject() ); } if ( activeTab_ == tab ) { for( i = tabList_.begin(); i != tabList_.end(); ++i ) { if ( tabBar_->contains( (*i).getObject() ) ) { setActiveTab( (*i) ); break; } } } } updateTabBar(); if ( tabBar_->itemCount() == 0 ) Manager::instance().dock()->showPanel( this, false ); }
int Panel::tabContains( TabPtr t, const std::string contentID ) { Content* tcontent = t->getContent().getObject(); if ( !tcontent ) return 0; int cnt = 0; if ( contentID.compare( tcontent->getContentID() ) == 0 ) ++cnt; else if ( tcontent->getContentID() == ContentContainer::contentID ) cnt += ((ContentContainer*)tcontent)->contains( contentID ); return cnt; }
void App::channelChanged(ICS::Channel *channel, float currentValue, float previousValue) { if (currentValue != 1.f) return; #define action(a) (channel->getNumber() == a) // change tabs //---------------------------------------------------------------------------------------- // tweak if (mWndTweak->getVisible()) { TabPtr tab = gui->tabTweak; if (!shift && tab->getIndexSelected() == 0) tab = gui->tabEdCar; // car edit sections if (action(A_PrevTab)) { // prev gui subtab int num = tab->getItemCount(); tab->setIndexSelected( (tab->getIndexSelected() - 1 + num) % num ); } else if (action(A_NextTab)) { // next gui subtab int num = tab->getItemCount(); tab->setIndexSelected( (tab->getIndexSelected() + 1) % num ); } if (tab == gui->tabEdCar) // focus ed { pSet->car_ed_tab = tab->getIndexSelected(); MyGUI::InputManager::getInstance().resetKeyFocusWidget(); MyGUI::InputManager::getInstance().setKeyFocusWidget(gui->edCar[tab->getIndexSelected()]); } } // change gui tabs else if (isFocGui && !pSet->isMain) { MyGUI::TabPtr tab = 0; MyGUI::TabControl* sub = 0; switch (pSet->inMenu) { case MNU_Replays: tab = mWndTabsRpl; break; case MNU_Help: tab = mWndTabsHelp; break; case MNU_Options: tab = mWndTabsOpts; sub = gui->vSubTabsOpts[tab->getIndexSelected()]; break; default: tab = mWndTabsGame; sub = gui->vSubTabsGame[tab->getIndexSelected()]; break; } if (tab) if (shift) { if (sub) // prev, next subtab { bool chng = false; if (action(A_PrevTab)) { int num = sub->getItemCount(); chng = true; sub->setIndexSelected( (sub->getIndexSelected() - 1 + num) % num ); }else if (action(A_NextTab)) { int num = sub->getItemCount(); chng = true; sub->setIndexSelected( (sub->getIndexSelected() + 1) % num ); } if (chng && !sub->eventTabChangeSelect.empty()) sub->eventTabChangeSelect(sub, sub->getIndexSelected()); } } else // prev, next tab { int num = tab->getItemCount()-1, i = tab->getIndexSelected(), n = 0; bool chng = false; if (action(A_PrevTab)) { do{ if (i==1) i = num; else --i; ++n; } while (n < num && tab->getButtonWidthAt(i) == 1); chng = true; }else if (action(A_NextTab)) { do{ if (i==num) i = 1; else ++i; ++n; } while (n < num && tab->getButtonWidthAt(i) == 1); chng = true; } if (chng) { tab->setIndexSelected(i); gcom->tabMainMenu(tab,i); return; } } } // change graphs type else if (!isFocGui && pSet->show_graphs) { int& v = (int&)pSet->graphs_type; int vo = v; if (action(A_PrevTab)) v = (v-1 + Gh_ALL) % Gh_ALL; if (action(A_NextTab)) v = (v+1) % Gh_ALL; if (vo != v) { gui->cmbGraphs->setIndexSelected(v); gui->comboGraphs(gui->cmbGraphs, v); if (v == 4) iUpdTireGr = 1; //upd now } } //---------------------------------------------------------------------------------------- // Gui on/off or close wnds if (action(A_ShowOptions) && !alt) { Wnd wnd = mWndNetEnd; if (wnd && wnd->getVisible()) { wnd->setVisible(false); // hide netw end return; } else { wnd = mWndChampEnd; if (wnd && wnd->getVisible()) wnd->setVisible(false); // hide champs end wnd = mWndChallEnd; if (wnd && wnd->getVisible()) wnd->setVisible(false); // chall gui->toggleGui(true); return; } } // new game - Reload not in multiplayer if (action(A_RestartGame) && !mClient) { bPerfTest = ctrl; // ctrl-F5 start perf test if (bPerfTest) { pSet->gui.track = "Test10-FlatPerf"; pSet->gui.track_user = false; } iPerfTestStage = PT_StartWait; NewGame(); return; } // new game - fast (same track & cars) if (action(A_ResetGame) && !mClient) { for (int c=0; c < carModels.size(); ++c) { CarModel* cm = carModels[c]; if (cm->pCar) cm->pCar->bResetPos = true; if (cm->iLoopLastCam != -1 && cm->fCam) { cm->fCam->setCamera(cm->iLoopLastCam); //o restore cm->iLoopLastCam = -1; } cm->First(); cm->ResetChecks(); cm->iWonPlace = 0; cm->iWonPlaceOld = 0; cm->iWonMsgTime = 0.f; } pGame->timer.Reset(-1); pGame->timer.pretime = mClient ? 2.0f : pSet->game.pre_time; // same for all multi players carIdWin = 1; // ghost.Clear(); // } // Screen shot if (action(A_Screenshot)) mWindow->writeContentsToTimestampedFile(PATHMANAGER::Screenshots() + "/", ".jpg"); }
bool App::keyPressed(const SDL_KeyboardEvent &arg) { SDL_Scancode skey = arg.keysym.scancode; #define key(a) SDL_SCANCODE_##a /// Preview camera --------------------- if (edMode == ED_PrvCam) { switch (skey) { case key(ESCAPE): // exit case key(F7): togPrvCam(); break; case key(RETURN): // save screen { int u = pSet->allow_save ? pSet->gui.track_user : 1; rt[RTs-1].tex->writeContentsToFile(gcom->pathTrk[u] + pSet->gui.track + "/preview/view.jpg"); gcom->listTrackChng(gcom->trkList,0); // upd gui img gui->Status("Preview saved", 1,1,0); } break; case key(F12): // screenshot mWindow->writeContentsToTimestampedFile(PATHMANAGER::Screenshots() + "/", ".jpg"); return true; } return true; } // main menu keys Widget* wf = InputManager::getInstance().getKeyFocusWidget(); bool edFoc = wf && wf->getTypeName() == "EditBox"; if (pSet->isMain && bGuiFocus) { switch (skey) { case key(UP): case key(KP_8): pSet->inMenu = (pSet->inMenu-1+WND_ALL)%WND_ALL; gui->toggleGui(false); return true; case key(DOWN): case key(KP_2): pSet->inMenu = (pSet->inMenu+1)%WND_ALL; gui->toggleGui(false); return true; case key(RETURN): pSet->isMain = false; gui->toggleGui(false); return true; } } if (!pSet->isMain && bGuiFocus) { switch (skey) { case key(BACKSPACE): if (pSet->isMain) break; if (bGuiFocus) { if (edFoc) break; pSet->isMain = true; gui->toggleGui(false); } return true; } } // change gui tabs TabPtr tab = 0; TabControl* sub = 0; int iTab1 = 1; if (bGuiFocus && !pSet->isMain) switch (pSet->inMenu) { case WND_Track: tab = mWndTabsTrack; sub = gui->vSubTabsTrack[tab->getIndexSelected()]; break; case WND_Edit: tab = mWndTabsEdit; sub = gui->vSubTabsEdit[tab->getIndexSelected()]; break; case WND_Help: tab = sub = gui->vSubTabsHelp[1]; iTab1 = 0; break; case WND_Options: tab = mWndTabsOpts; sub = gui->vSubTabsOpts[tab->getIndexSelected()]; break; } bool bRoad = edMode == ED_Road && road && bEdit(); // global keys //------------------------------------------------------------------------------------------------------------------------------ switch (skey) { case key(ESCAPE): // quit if (pSet->escquit) { mShutDown = true; } return true; case key(F1): case key(GRAVE): if (ctrl) // context help (show for cur mode) { if (bMoveCam) gui->GuiShortcut(WND_Help, 1, 0); else switch (edMode) { case ED_Smooth: case ED_Height: case ED_Filter: case ED_Deform: gui->GuiShortcut(WND_Help, 1, 3); break; case ED_Road: gui->GuiShortcut(WND_Help, 1, 5); break; case ED_Start: gui->GuiShortcut(WND_Help, 1, 6); break; case ED_Fluids: gui->GuiShortcut(WND_Help, 1, 7); break; case ED_Objects: gui->GuiShortcut(WND_Help, 1, 8); break; default: gui->GuiShortcut(WND_Help, 1, 0); break; } } else // Gui mode, Options gui->toggleGui(true); return true; case key(F12): // screenshot mWindow->writeContentsToTimestampedFile(PATHMANAGER::Screenshots() + "/", ".jpg"); return true; // save, reload, update case key(F4): SaveTrack(); return true; case key(F5): LoadTrack(); return true; case key(F8): UpdateTrack(); return true; case key(F9): // blendmap if (alt) gui->ckAutoBlendmap.Invert(); else bTerUpdBlend = true; return true; // prev num tab (layers,grasses,models) case key(1): if (alt && !bRoad) { gui->NumTabNext(-1); return true; } break; // next num tab case key(2): if (alt && !bRoad) { gui->NumTabNext(1); return true; } break; case key(F2): // +-rt num if (alt) { pSet->num_mini = (pSet->num_mini - 1 + RTs+2) % (RTs+2); UpdMiniVis(); } else if (bGuiFocus && tab && !pSet->isMain) if (shift) // prev gui subtab { if (sub) { int num = sub->getItemCount(); sub->setIndexSelected( (sub->getIndexSelected() - 1 + num) % num ); } } else // prev gui tab { int num = tab->getItemCount()-1, i = tab->getIndexSelected(); if (i==iTab1) i = num; else --i; tab->setIndexSelected(i); if (iTab1==1) gcom->tabMainMenu(tab,i); } break; case key(F3): // tabs,sub if (alt) { pSet->num_mini = (pSet->num_mini + 1) % (RTs+2); UpdMiniVis(); } else if (bGuiFocus && tab && !pSet->isMain) if (shift) // next gui subtab { if (sub) { int num = sub->getItemCount(); sub->setIndexSelected( (sub->getIndexSelected() + 1) % num ); } } else // next gui tab { int num = tab->getItemCount()-1, i = tab->getIndexSelected(); if (i==num) i = iTab1; else ++i; tab->setIndexSelected(i); if (iTab1==1) gcom->tabMainMenu(tab,i); } break; case key(RETURN): // load track if (bGuiFocus) if (mWndTabsTrack->getIndexSelected() == 1 && !pSet->isMain && pSet->inMenu == WND_Track) gui->btnNewGame(0); break; // WireFrame F11 case key(F11): gui->ckWireframe.Invert(); return true; // Show Stats ctrl-I case key(I): if (ctrl) { gui->ckInputBar.Invert(); return true; } break; // Top view alt-Z case key(Z): if (alt) { gui->toggleTopView(); return true; } break; // load next track F6 case key(F6): if (pSet->check_load) { gui->iLoadNext = shift ? -1 : 1; return true; } break; } // GUI keys in edits --------------------- if (bGuiFocus && mGui && !alt && !ctrl) { InputManager::getInstance().injectKeyPress(KeyCode::Enum(mInputWrapper->sdl2OISKeyCode(arg.keysym.sym)), 0); return true; } /// Road keys * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * if (bRoad) { if (iSnap > 0 && !alt) switch (skey) { case key(1): road->AddRoll(-1,angSnap,alt); break; case key(2): road->AddRoll( 1,angSnap,alt); break; case key(3): road->AddYaw(-1,angSnap,alt); break; case key(4): road->AddYaw( 1,angSnap,alt); break; } switch (skey) { // choose 1 case key(SPACE): if (ctrl) road->CopyNewPoint(); else road->ChoosePoint(); break; // multi sel case key(BACKSPACE): if (alt) road->SelAll(); else if (ctrl) road->SelClear(); else road->SelAddPoint(); break; // ter on first,last case key(HOME): case key(KP_7): if (alt) road->MirrorSel(shift); else if (ctrl) road->FirstPoint(); else road->ToggleOnTerrain(); break; // cols case key(END): case key(KP_1): if (ctrl) road->LastPoint(); else road->ToggleColumns(); break; // prev,next case key(PAGEUP): case key(KP_9): if (shift) road->SelAddPoint(); road->PrevPoint(); break; case key(PAGEDOWN): case key(KP_3): if (shift) road->SelAddPoint(); road->NextPoint(); break; // del case key(DELETE): case key(KP_PERIOD): case key(KP_5): if (ctrl) road->DelSel(); else road->Delete(); break; // ins case key(INSERT): case key(KP_0): if (ctrl && !shift && !alt) { if (road->CopySel()) gui->Status("Copy",0.6,0.8,1.0); } else if (!ctrl && shift && !alt) road->Paste(); else if ( ctrl && shift && !alt) road->Paste(true); else { road->newP.pos.x = road->posHit.x; road->newP.pos.z = road->posHit.z; if (!sc->ter) road->newP.pos.y = road->posHit.y; //road->newP.aType = AT_Both; road->Insert(shift ? INS_Begin : ctrl ? INS_End : alt ? INS_CurPre : INS_Cur); } break; case key(0): if (ctrl) { road->Set1stChk(); break; } case key(EQUALS): road->ChgMtrId(1); break; case key(9): case key(MINUS): road->ChgMtrId(-1); break; case key(1): if (alt) if (shift) road->AngZero(); else road->ChgAngType(-1); break; case key(2): if (alt) road->ChgAngType(1); break; case key(7): road->ToggleLoopChk(); break; case key(8): road->ToggleOnPipe(); break; case key(5): iSnap = (iSnap-1+ciAngSnapsNum)%ciAngSnapsNum; angSnap = crAngSnaps[iSnap]; break; case key(6): iSnap = (iSnap+1)%ciAngSnapsNum; angSnap = crAngSnaps[iSnap]; break; case key(U): AlignTerToRoad(); break; // looped todo: finish set.. case key(N): road->isLooped = !road->isLooped; road->recalcTangents(); road->RebuildRoad(true); break; } } // ter brush shape if (edMode < ED_Road && !alt) switch (skey) { case key(K): if (ctrl) { mBrShape[curBr] = (EBrShape)((mBrShape[curBr]-1 + BRS_ALL) % BRS_ALL); updBrush(); } break; case key(L): if (ctrl) { mBrShape[curBr] = (EBrShape)((mBrShape[curBr]+1) % BRS_ALL); updBrush(); } break; case key(N): case key(COMMA): mBrOct[curBr] = std::max(1, mBrOct[curBr]-1); updBrush(); break; case key(M): case key(PERIOD): mBrOct[curBr] = std::min(7, mBrOct[curBr]+1); updBrush(); break; } // ter brush presets ---- if (edMode < ED_Road && alt && skey >= key(1) && skey <= key(0) && !bMoveCam) { // TODO int id = skey - key(1); if (shift) id += 10; SetBrushPreset(id); } // Fluids ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ if (edMode == ED_Fluids) { int fls = sc->fluids.size(); const std::vector<FluidParams>& dfl = data->fluids->fls; switch (skey) { // ins case key(INSERT): case key(KP_0): if (road && road->bHitTer) { FluidBox fb; fb.name = "water blue"; fb.pos = road->posHit; fb.rot = Vector3(0.f, 0.f, 0.f); fb.size = Vector3(50.f, 20.f, 50.f); fb.tile = Vector2(0.01f, 0.01f); sc->fluids.push_back(fb); sc->UpdateFluidsId(); iFlCur = sc->fluids.size()-1; bRecreateFluids = true; } break; } if (fls > 0) switch (skey) { // first, last case key(HOME): case key(KP_7): iFlCur = 0; UpdFluidBox(); break; case key(END): case key(KP_1): if (fls > 0) iFlCur = fls-1; UpdFluidBox(); break; // prev,next case key(PAGEUP): case key(KP_9): if (fls > 0) { iFlCur = (iFlCur-1+fls)%fls; } UpdFluidBox(); break; case key(PAGEDOWN): case key(KP_3): if (fls > 0) { iFlCur = (iFlCur+1)%fls; } UpdFluidBox(); break; // del case key(DELETE): case key(KP_PERIOD): case key(KP_5): if (fls == 1) sc->fluids.clear(); else sc->fluids.erase(sc->fluids.begin() + iFlCur); iFlCur = std::max(0, std::min(iFlCur, (int)sc->fluids.size()-1)); bRecreateFluids = true; break; // prev,next type case key(9): case key(MINUS): { FluidBox& fb = sc->fluids[iFlCur]; fb.id = (fb.id-1 + dfl.size()) % dfl.size(); fb.name = dfl[fb.id].name; bRecreateFluids = true; } break; case key(0): case key(EQUALS): { FluidBox& fb = sc->fluids[iFlCur]; fb.id = (fb.id+1) % dfl.size(); fb.name = dfl[fb.id].name; bRecreateFluids = true; } break; } } // Objects | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | if (edMode == ED_Objects) { int objs = sc->objects.size(), objAll = vObjNames.size(); switch (skey) { case key(SPACE): iObjCur = -1; PickObject(); UpdObjPick(); break; // prev,next type case key(9): case key(MINUS): SetObjNewType((iObjTNew-1 + objAll) % objAll); break; case key(0): case key(EQUALS): SetObjNewType((iObjTNew+1) % objAll); break; // ins case key(INSERT): case key(KP_0): if (ctrl) // copy selected { if (!vObjSel.empty()) { vObjCopy.clear(); for (std::set<int>::iterator it = vObjSel.begin(); it != vObjSel.end(); ++it) { vObjCopy.push_back(sc->objects[*it]); } gui->Status("Copy",0.6,0.8,1.0); } } else if (shift) // paste copied { if (!vObjCopy.empty()) { vObjSel.clear(); // unsel Object o = objNew; for (int i=0; i < vObjCopy.size(); ++i) { objNew = vObjCopy[i]; AddNewObj(false); vObjSel.insert(sc->objects.size()-1); // add it to sel } objNew = o; UpdObjSel(); UpdObjPick(); } } else if (road && road->bHitTer) // insert new { AddNewObj(); //iObjCur = sc->objects.size()-1; // auto select inserted- UpdObjPick(); } break; // sel case key(BACKSPACE): if (alt) // select all for (int i=0; i < objs; ++i) vObjSel.insert(i); else if (ctrl) vObjSel.clear(); // unsel all else if (iObjCur > -1) if (vObjSel.find(iObjCur) == vObjSel.end()) vObjSel.insert(iObjCur); // add to sel else vObjSel.erase(iObjCur); // unselect UpdObjSel(); break; } ::Object* o = iObjCur == -1 ? &objNew : ((iObjCur >= 0 && objs > 0 && iObjCur < objs) ? &sc->objects[iObjCur] : 0); switch (skey) { // first, last case key(HOME): case key(KP_7): iObjCur = 0; UpdObjPick(); break; case key(END): case key(KP_1): if (objs > 0) iObjCur = objs-1; UpdObjPick(); break; // prev,next case key(PAGEUP): case key(KP_9): if (objs > 0) { iObjCur = (iObjCur-1+objs)%objs; } UpdObjPick(); break; case key(PAGEDOWN): case key(KP_3): if (objs > 0) { iObjCur = (iObjCur+1)%objs; } UpdObjPick(); break; // del case key(DELETE): case key(KP_PERIOD): case key(KP_5): if (iObjCur >= 0 && objs > 0) { ::Object& o = sc->objects[iObjCur]; mSceneMgr->destroyEntity(o.ent); mSceneMgr->destroySceneNode(o.nd); if (objs == 1) sc->objects.clear(); else sc->objects.erase(sc->objects.begin() + iObjCur); iObjCur = std::min(iObjCur, (int)sc->objects.size()-1); UpdObjPick(); } break; // move,rot,scale case key(1): if (!shift) objEd = EO_Move; else if (o) { if (iObjCur == -1) // reset h { o->pos[2] = 0.f; o->SetFromBlt(); UpdObjPick(); } else if (road) // move to ter { const Vector3& v = road->posHit; o->pos[0] = v.x; o->pos[1] =-v.z; o->pos[2] = v.y + objNew.pos[2]; o->SetFromBlt(); UpdObjPick(); } } break; case key(2): if (!shift) objEd = EO_Rotate; else if (o) // reset rot { o->rot = QUATERNION<float>(0,1,0,0); o->SetFromBlt(); UpdObjPick(); } break; case key(3): if (!shift) objEd = EO_Scale; else if (o) // reset scale { o->scale = Vector3::UNIT_SCALE * (ctrl ? 0.5f : 1.f); o->nd->setScale(o->scale); UpdObjPick(); } break; } } // Rivers ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (edMode == ED_Rivers) { // todo } /// Common Keys ************************************************************************************************************ if (alt) switch (skey) { case key(Q): gui->GuiShortcut(WND_Track, 1); return true; // Q Track case key(O): gui->GuiShortcut(WND_Track, 2); return true; // O Tools case key(J): gui->GuiShortcut(WND_Track, 3); return true; // J Warnings case key(S): gui->GuiShortcut(WND_Edit, 1); return true; // S Sun case key(H): gui->GuiShortcut(WND_Edit, 2); return true; // H Heightmap case key(D): gui->GuiShortcut(WND_Edit, 2,0); return true; // D -Brushes case key(T): gui->GuiShortcut(WND_Edit, 3); return true; // T Layers (Terrain) case key(B): gui->GuiShortcut(WND_Edit, 3,0); return true; // B -Blendmap case key(P): gui->GuiShortcut(WND_Edit, 3,1); return true; // P -Particles case key(U): gui->GuiShortcut(WND_Edit, 3,2); return true; // U -Surfaces case key(G): gui->GuiShortcut(WND_Edit, 4); return true; // G Grasses case key(V): gui->GuiShortcut(WND_Edit, 5); return true; // V Vegetation case key(M): gui->GuiShortcut(WND_Edit, 5,1); return true; // M -Models case key(R): gui->GuiShortcut(WND_Edit, 6); return true; // R Road case key(X): gui->GuiShortcut(WND_Edit, 7); return true; // X Objects case key(C): gui->GuiShortcut(WND_Options, 1); return true; // C Screen //case key(N): gui->GuiShortcut(WND_Options, 1,1); return true; // N --Vegetation ! case key(E): gui->GuiShortcut(WND_Options, 2); return true; // E View /Settings case key(K): gui->GuiShortcut(WND_Options, 2,3); return true; // K -Tweak case key(I): gui->GuiShortcut(WND_Help, 1); return true; // I Input/help } else switch (skey) { case key(TAB): // Camera / Edit mode if (!bGuiFocus && !alt) { bMoveCam = !bMoveCam; UpdVisGui(); UpdFluidBox(); UpdObjPick(); } break; // toggle fog, veget, weather case key(G): gui->ckFog.Invert(); break; case key(V): bTrGrUpd = true; break; case key(I): gui->ckWeather.Invert(); break; // terrain case key(D): if (bEdit()){ SetEdMode(ED_Deform); curBr = 0; updBrush(); UpdEditWnds(); } break; case key(S): if (bEdit()){ SetEdMode(ED_Smooth); curBr = 1; updBrush(); UpdEditWnds(); } break; case key(E): if (bEdit()){ SetEdMode(ED_Height); curBr = 2; updBrush(); UpdEditWnds(); } break; case key(F): if (bEdit()){ SetEdMode(ED_Filter); curBr = 3; updBrush(); UpdEditWnds(); } else // focus on find edit (global) if (ctrl && gcom->edTrkFind /*&& bGuiFocus && !pSet->isMain && pSet->inMenu == WND_Edit && mWndTabsEdit->getIndexSelected() == 1*/) { gui->GuiShortcut(WND_Track, 1); // Track tab InputManager::getInstance().resetKeyFocusWidget(); InputManager::getInstance().setKeyFocusWidget(gcom->edTrkFind); return true; } break; // road case key(R): if (bEdit()){ SetEdMode(ED_Road); UpdEditWnds(); } break; case key(B): if (road) { road->UpdPointsH(); road->RebuildRoad(true); } break; case key(T): if (mWndRoadStats) mWndRoadStats->setVisible(!mWndRoadStats->getVisible()); break; case key(M): if (edMode == ED_Road && road) road->ToggleMerge(); break; // start pos case key(Q): if (bEdit()){ SetEdMode(ED_Start); UpdEditWnds(); } break; case key(SPACE): if (edMode == ED_Start && road) road->iDir *= -1; break; // prv cam case key(F7): togPrvCam(); break; // fluids case key(W): if (bEdit()){ SetEdMode(ED_Fluids); UpdEditWnds(); } break; case key(F10): SaveWaterDepth(); break; // objects case key(C): if (edMode == ED_Objects) { objSim = !objSim; ToggleObjSim(); } break; case key(X): if (bEdit()){ SetEdMode(ED_Objects); UpdEditWnds(); } break; // rivers ///case key(A): if (bEdit()){ SetEdMode(ED_Rivers); UpdEditWnds(); } break; } return true; }