void MenuWindow::MessageReceived(BMessage* message) { switch (message->what) { case MSG_WIN_ADD_MENU: AddMenu(message); break; case MSG_WIN_DELETE_MENU: DeleteMenu(message); break; case MSG_TEST_ITEM: TestMenu(message); break; case MSG_USER_ITEM: UserMenu(message); break; case MSG_WIN_HIDE_USER_MENUS: ToggleUserMenus(message); break; case MSG_WIN_LARGE_TEST_ICONS: ToggleTestIcons(message); break; default: BWindow::MessageReceived(message); break; } }
int main ( void ) { char cSystem = '0'; int Array1[ 10000 ], Array2[ 10000 ]; printf ( "Welcome to CS460 HW 09 solution!\n" ); for ( cSystem = UserMenu ( &cSystem ); cSystem - 48; cSystem = UserMenu ( &cSystem ) ) { switch ( cSystem - 48 ) { case 1: PopulateArray ( Array1 );//populate array break; case 2: CopyArrays ( Array1, Array2 );//copy array break; case 3: printf ( "Array 1:\n" ); DisplayArray ( Array1 );//display array1 printf ( "\nArray 2:\n" ); DisplayArray ( Array2 );//display array2 printf ( "\n" ); break; case 4: CalculateTime ( Array1 );//calculate bubble sort time break; case 5: printf ( "Quick sort time is %lf\n", QsortTime );//print QsortTime break; } } Exit (); return 0; }
static int ProcExtraFunc(uiContext d, int fnum) { extraFunc *extrafunc; extrafunc = FindExtraFunc(fnum); if (extrafunc) { switch (extrafunc->keyword) { case EXTRA_FUNC_DEFMODE: return UserMode(d, extrafunc); #ifndef NO_EXTEND_MENU case EXTRA_FUNC_DEFSELECTION: return UserSelect(d, extrafunc); case EXTRA_FUNC_DEFMENU: return UserMenu(d, extrafunc); #endif default: break; } } return NothingChangedWithBeep(d); }
int main() { //Do something int desArray[size];//Our Descending numbers to sort int myArray[size];//Array for working with stuff char choice = '0'; while (choice != '1'){ UserMenu(&choice); switch(choice){ case '2': PopulateArrayDes(myArray);break; case '3': CopyArrays(desArray,myArray);break; case '4': DisplayArray10Items(myArray);break; case '5': ShellSortAsc(myArray);break; case '6': ShellSortAsc(myArray);break; case '7': CalculateTimeSS(myArray);break; case '8': CalculateTimeSS(myArray);break; }//switch }//while ExitProg(); return 0; }
// обработка единичного меню int UserMenu::ProcessSingleMenu(DList<UserMenuItem> *Menu, int MenuPos, DList<UserMenuItem> *MenuRoot, const string& MenuFileName, const wchar_t *Title) { for (;;) { int NumLine=0, ExitCode, FuncPos[24]; UserMenuItem *CurrentMenuItem = nullptr; // очистка F-хоткеев for (size_t I=0 ; I < ARRAYSIZE(FuncPos) ; I++) FuncPos[I]=-1; string strName,strShortName; CtrlObject->Cp()->ActivePanel->GetCurName(strName,strShortName); /* $ 24.07.2000 VVM + При показе главного меню в заголовок добавляет тип - FAR/Registry */ string strMenuTitle; if (Title && *Title) { strMenuTitle = Title; } else { switch (MenuMode) { case MM_LOCAL: strMenuTitle = MSG(MLocalMenuTitle); break; case MM_GLOBAL: strMenuTitle = MSG(MMainMenuTitle); strMenuTitle += L" ("; strMenuTitle += MSG(MMainMenuGlobal); strMenuTitle += L")"; break; default: strMenuTitle = MSG(MMainMenuTitle); strMenuTitle += L" ("; strMenuTitle += MSG(MMainMenuUser); strMenuTitle += L")"; } } { VMenu UserMenu(strMenuTitle,nullptr,0,ScrY-4); UserMenu.SetFlags(VMENU_WRAPMODE); UserMenu.SetHelp(L"UserMenu"); UserMenu.SetPosition(-1,-1,0,0); UserMenu.SetBottomTitle(MSG(MMainMenuBottomTitle)); MenuNeedRefresh=true; while (!UserMenu.Done()) { if (MenuNeedRefresh) { UserMenu.Hide(); // спрячем // "изнасилуем" (перезаполним :-) NumLine=FillUserMenu(UserMenu,Menu,MenuPos,FuncPos,strName,strShortName); // заставим манагер менюхи корректно отрисовать ширину и // высоту, а заодно и скорректировать вертикальные позиции UserMenu.SetPosition(-1,-1,-1,-1); UserMenu.Show(); MenuNeedRefresh=false; } int Key=UserMenu.ReadInput(); MenuPos=UserMenu.GetSelectPos(); void* userdata = UserMenu.GetUserData(nullptr, 0, MenuPos); CurrentMenuItem = userdata? *static_cast<UserMenuItem**>(userdata):nullptr; if ((unsigned int)Key>=KEY_F1 && (unsigned int)Key<=KEY_F24) { int FuncItemPos; if ((FuncItemPos=FuncPos[Key-KEY_F1])!=-1) { UserMenu.Modal::SetExitCode(FuncItemPos); continue; } } else if (Key == L' ') // исключаем пробел из "хоткеев"! continue; switch (Key) { /* $ 24.08.2001 VVM + Стрелки вправо/влево открывают/закрывают подменю соответственно */ case KEY_RIGHT: case KEY_NUMPAD6: case KEY_MSWHEEL_RIGHT: if (CurrentMenuItem && CurrentMenuItem->Submenu) UserMenu.SetExitCode(MenuPos); break; case KEY_LEFT: case KEY_NUMPAD4: case KEY_MSWHEEL_LEFT: if (Title && *Title) UserMenu.SetExitCode(-1); break; case KEY_NUMDEL: case KEY_DEL: if (CurrentMenuItem) DeleteMenuRecord(Menu,CurrentMenuItem); break; case KEY_INS: case KEY_F4: case KEY_SHIFTF4: case KEY_NUMPAD0: { bool bNew = Key == KEY_INS || Key == KEY_NUMPAD0; if (!bNew && !CurrentMenuItem) break; EditMenu(Menu,CurrentMenuItem,bNew); break; } case KEY_CTRLUP: case KEY_RCTRLUP: case KEY_CTRLDOWN: case KEY_RCTRLDOWN: { int Pos=UserMenu.GetSelectPos(); if (Pos!=UserMenu.GetItemCount()-1 && CurrentMenuItem) { if (!((Key==KEY_CTRLUP || Key==KEY_RCTRLUP) && !Pos) && !((Key==KEY_CTRLDOWN || Key==KEY_RCTRLDOWN) && Pos==UserMenu.GetItemCount()-2)) { MenuModified = MenuNeedRefresh = true; if (Key==KEY_CTRLUP || Key==KEY_RCTRLUP) { Menu->MoveBefore(Menu->Prev(CurrentMenuItem),CurrentMenuItem); MenuPos--; } else { Menu->MoveAfter(Menu->Next(CurrentMenuItem),CurrentMenuItem); MenuPos++; } } } } break; case KEY_ALTF4: // редактировать все меню case KEY_RALTF4: { File MenuFile; (*FrameManager)[0]->Unlock(); { ConsoleTitle *OldTitle=new ConsoleTitle; SaveMenu(MenuFileName); FileEditor ShellEditor(MenuFileName,CP_UNICODE,FFILEEDIT_DISABLEHISTORY,-1,-1,nullptr); delete OldTitle; ShellEditor.SetDynamicallyBorn(false); FrameManager->EnterModalEV(); FrameManager->ExecuteModal(); FrameManager->ExitModalEV(); if (!ShellEditor.IsFileChanged() || (!MenuFile.Open(MenuFileName, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING))) { return 0; } } MenuRoot->Clear(); GetFileString GetStr(MenuFile); MenuFileToList(MenuRoot, MenuFile, GetStr); MenuFile.Close(); MenuModified=true; UserMenu.Hide(); return 0; // Закрыть меню } /* $ 28.06.2000 tran выход из пользовательского меню по ShiftF10 из любого уровня вложенности просто задаем ExitCode -1, и возвращаем FALSE - по FALSE оно и выйдет откуда угодно */ case KEY_SHIFTF10: //UserMenu.SetExitCode(-1); return EC_CLOSE_MENU; case KEY_SHIFTF2: // Показать главное меню return(EC_MAIN_MENU); case KEY_BS: // Показать меню из родительского каталога только в MM_LOCAL режиме if (MenuMode == MM_LOCAL) return EC_PARENT_MENU; default: UserMenu.ProcessInput(); if (MenuPos!=UserMenu.GetSelectPos()) { MenuPos=UserMenu.GetSelectPos(); userdata = UserMenu.GetUserData(nullptr, 0, MenuPos); CurrentMenuItem = userdata? *static_cast<UserMenuItem**>(userdata):nullptr; } if (Key == KEY_F1) MenuNeedRefresh=true; break; } // switch(Key) } // while (!UserMenu.Done()) ExitCode=UserMenu.Modal::GetExitCode(); if (ExitCode<0 || ExitCode>=NumLine || !CurrentMenuItem) return EC_CLOSE_LEVEL; // вверх на один уровень void* userdata = UserMenu.GetUserData(nullptr, 0, ExitCode); CurrentMenuItem = userdata? *static_cast<UserMenuItem**>(userdata):nullptr; if (!CurrentMenuItem) return EC_CLOSE_LEVEL; // вверх на один уровень } if (CurrentMenuItem->Submenu) { /* $ 20.08.2001 VVM + При вложенных меню показывает заголовки предыдущих */ string strSubMenuLabel = CurrentMenuItem->strLabel; SubstFileName(strSubMenuLabel,strName,strShortName,nullptr,nullptr,nullptr,nullptr,TRUE); apiExpandEnvironmentStrings(strSubMenuLabel, strSubMenuLabel); size_t pos; if (strSubMenuLabel.Pos(pos,L'&')) strSubMenuLabel.LShift(1,pos); string strSubMenuTitle; if (Title && *Title) { strSubMenuTitle = Title; strSubMenuTitle += L" -> "; strSubMenuTitle += strSubMenuLabel; } else { strSubMenuTitle = strSubMenuLabel; } /* $ 14.07.2000 VVM ! Если закрыли подменю, то остаться. Инече передать управление выше */ MenuPos = ProcessSingleMenu(CurrentMenuItem->Menu, 0, MenuRoot, MenuFileName, strSubMenuTitle); if (MenuPos!=EC_CLOSE_LEVEL) return MenuPos; MenuPos = ExitCode; continue; } /* $ 01.05.2001 IS Отключим до лучших времен */ //int LeftVisible,RightVisible,PanelsHidden=0; string strCmdLineDir; CtrlObject->CmdLine->GetCurDir(strCmdLineDir); string strOldCmdLine; CtrlObject->CmdLine->GetString(strOldCmdLine); int OldCmdLineCurPos = CtrlObject->CmdLine->GetCurPos(); int OldCmdLineLeftPos = CtrlObject->CmdLine->GetLeftPos(); intptr_t OldCmdLineSelStart, OldCmdLineSelEnd; CtrlObject->CmdLine->GetSelection(OldCmdLineSelStart,OldCmdLineSelEnd); CtrlObject->CmdLine->LockUpdatePanel(TRUE); // Цикл исполнения команд меню (CommandX) for (string *str=CurrentMenuItem->Commands.First(); str; str=CurrentMenuItem->Commands.Next(str)) { string strCommand = *str; string strListName, strAnotherListName; string strShortListName, strAnotherShortListName; if (!((!StrCmpNI(strCommand,L"REM",3) && IsSpaceOrEos(strCommand.At(3))) || !StrCmpNI(strCommand,L"::",2))) { /* Осталось корректно обработать ситуацию, например: if exist !#!\!^!.! far:edit < diff -c -p !#!\!^!.! !\!.! Т.е. сначала "вычислить" кусок "if exist !#!\!^!.!", ну а если выполнится, то делать дальше. Или еще пример, if exist ..\a.bat D:\FAR\170\DIFF.MY\mkdiff.bat !?&Номер патча?! ЭТО выполняется всегда, т.к. парсинг всей строки идет, а надо проверить фазу "if exist ..\a.bat", а уж потом делать выводы... */ //if(ExtractIfExistCommand(Command)) { /* $ 01.05.2001 IS Отключим до лучших времен */ /* if (!PanelsHidden) { LeftVisible=CtrlObject->Cp()->LeftPanel->IsVisible(); RightVisible=CtrlObject->Cp()->RightPanel->IsVisible(); CtrlObject->Cp()->LeftPanel->Hide(); CtrlObject->Cp()->RightPanel->Hide(); CtrlObject->Cp()->LeftPanel->SetUpdateMode(FALSE); CtrlObject->Cp()->RightPanel->SetUpdateMode(FALSE); PanelsHidden=TRUE; } */ //; int PreserveLFN=SubstFileName(strCommand, strName, strShortName, &strListName, &strAnotherListName, &strShortListName, &strAnotherShortListName, FALSE, strCmdLineDir); bool ListFileUsed=!strListName.IsEmpty()||!strAnotherListName.IsEmpty()||!strShortListName.IsEmpty()||!strAnotherShortListName.IsEmpty(); if (ExtractIfExistCommand(strCommand)) { PreserveLongName PreserveName(strShortName,PreserveLFN); RemoveExternalSpaces(strCommand); if (!strCommand.IsEmpty()) { bool isSilent=false; if (strCommand.At(0) == L'@') { strCommand.LShift(1); isSilent=true; } ProcessOSAliases(strCommand); // TODO: Ахтунг. В режиме isSilent имеем проблемы с командами, которые выводят что-то на экран // Здесь необходимо переделка, например, перед исполнением подсунуть временный экранный буфер, а потом его содержимое подсунуть в ScreenBuf... if (!isSilent) { CtrlObject->CmdLine->ExecString(strCommand,FALSE, 0, 0, ListFileUsed); } else { SaveScreen SaveScr; CtrlObject->Cp()->LeftPanel->CloseFile(); CtrlObject->Cp()->RightPanel->CloseFile(); Execute(strCommand,TRUE, 0, 0, 0, ListFileUsed, true); } } } } } // strCommand != "REM" if (!strListName.IsEmpty()) apiDeleteFile(strListName); if (!strAnotherListName.IsEmpty()) apiDeleteFile(strAnotherListName); if (!strShortListName.IsEmpty()) apiDeleteFile(strShortListName); if (!strAnotherShortListName.IsEmpty()) apiDeleteFile(strAnotherShortListName); } // while (1) CtrlObject->CmdLine->LockUpdatePanel(FALSE); if (!strOldCmdLine.IsEmpty()) // восстановим сохраненную командную строку { CtrlObject->CmdLine->SetString(strOldCmdLine, FrameManager->IsPanelsActive()); CtrlObject->CmdLine->SetCurPos(OldCmdLineCurPos, OldCmdLineLeftPos); CtrlObject->CmdLine->Select(OldCmdLineSelStart, OldCmdLineSelEnd); } /* $ 01.05.2001 IS Отключим до лучших времен */ /* if (PanelsHidden) { CtrlObject->Cp()->LeftPanel->SetUpdateMode(TRUE); CtrlObject->Cp()->RightPanel->SetUpdateMode(TRUE); CtrlObject->Cp()->LeftPanel->Update(UPDATE_KEEP_SELECTION); CtrlObject->Cp()->RightPanel->Update(UPDATE_KEEP_SELECTION); if (RightVisible) CtrlObject->Cp()->RightPanel->Show(); if (LeftVisible) CtrlObject->Cp()->LeftPanel->Show(); } */ /* $ 14.07.2000 VVM ! Закрыть меню */ /* $ 25.04.2001 DJ - сообщаем, что была выполнена команда (нужно перерисовать панели) */ return EC_COMMAND_SELECTED; } }
bool CommandLine::ProcessKey(const Manager::Key& Key) { auto LocalKey = Key; if ((LocalKey()==KEY_CTRLEND || LocalKey()==KEY_RCTRLEND || LocalKey()==KEY_CTRLNUMPAD1 || LocalKey()==KEY_RCTRLNUMPAD1) && (CmdStr.GetCurPos()==CmdStr.GetLength())) { if (LastCmdPartLength==-1) strLastCmdStr = CmdStr.GetString(); auto strStr = strLastCmdStr; const auto CurCmdPartLength = strStr.size(); Global->CtrlObject->CmdHistory->GetSimilar(strStr,LastCmdPartLength); if (LastCmdPartLength==-1) { strLastCmdStr = CmdStr.GetString(); LastCmdPartLength = static_cast<int>(CurCmdPartLength); } { SCOPED_ACTION(SetAutocomplete)(&CmdStr); CmdStr.SetString(strStr); CmdStr.Select(LastCmdPartLength,static_cast<int>(strStr.size())); } Show(); return true; } if (LocalKey() == KEY_UP || LocalKey() == KEY_NUMPAD8) { if (Global->CtrlObject->Cp()->LeftPanel()->IsVisible() || Global->CtrlObject->Cp()->RightPanel()->IsVisible()) return false; LocalKey=KEY_CTRLE; } else if (LocalKey() == KEY_DOWN || LocalKey() == KEY_NUMPAD2) { if (Global->CtrlObject->Cp()->LeftPanel()->IsVisible() || Global->CtrlObject->Cp()->RightPanel()->IsVisible()) return false; LocalKey=KEY_CTRLX; } // $ 25.03.2002 VVM + При погашенных панелях колесом крутим историю if (!Global->CtrlObject->Cp()->LeftPanel()->IsVisible() && !Global->CtrlObject->Cp()->RightPanel()->IsVisible()) { switch (LocalKey()) { case KEY_MSWHEEL_UP: LocalKey = KEY_CTRLE; break; case KEY_MSWHEEL_DOWN: LocalKey = KEY_CTRLX; break; case KEY_MSWHEEL_LEFT: LocalKey = KEY_CTRLS; break; case KEY_MSWHEEL_RIGHT: LocalKey = KEY_CTRLD; break; } } switch (LocalKey()) { case KEY_CTRLE: case KEY_RCTRLE: case KEY_CTRLX: case KEY_RCTRLX: { if (Global->CtrlObject->CmdHistory->IsOnTop()) { m_CurCmdStr = CmdStr.GetString(); } SCOPED_ACTION(SetAutocomplete)(&CmdStr); const auto strStr = LocalKey() == KEY_CTRLE || LocalKey() == KEY_RCTRLE? Global->CtrlObject->CmdHistory->GetPrev() : Global->CtrlObject->CmdHistory->GetNext(); SetString(Global->CtrlObject->CmdHistory->IsOnTop()? m_CurCmdStr : strStr, true); } return true; case KEY_ESC: { // $ 24.09.2000 SVS - Если задано поведение по "Несохранению при Esc", то позицию в хистори не меняем и ставим в первое положение. if (Global->Opt->CmdHistoryRule) Global->CtrlObject->CmdHistory->ResetPosition(); SetString(L"", true); return true; } case KEY_F2: { UserMenu(false); return true; } case KEY_ALTF8: case KEY_RALTF8: { history_record_type Type; string strStr; const auto SelectType = Global->CtrlObject->CmdHistory->Select(msg(lng::MHistoryTitle), L"History"sv, strStr, Type); if (SelectType == HRT_ENTER || SelectType == HRT_SHIFTETNER || SelectType == HRT_CTRLENTER || SelectType == HRT_CTRLALTENTER) { std::unique_ptr<SetAutocomplete> disable; if(SelectType != HRT_CTRLENTER) { disable = std::make_unique<SetAutocomplete>(&CmdStr); } SetString(strStr, true); if (SelectType != HRT_CTRLENTER) { ProcessKey(SelectType == HRT_CTRLALTENTER? Manager::Key(KEY_CTRLALTENTER) : (SelectType == HRT_ENTER? Manager::Key(KEY_ENTER) : Manager::Key(KEY_SHIFTENTER))); } } } return true; case KEY_ALTF10: case KEY_RALTF10: if (!Global->Opt->Tree.TurnOffCompletely) { string strStr; const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); { // TODO: здесь можно добавить проверку, что мы в корне диска и отсутствие файла Tree.Far... FolderTree::create(strStr, MODALTREE_ACTIVE, TRUE, false); } Global->CtrlObject->Cp()->RedrawKeyBar(); if (!strStr.empty()) { ActivePanel->SetCurDir(strStr,true); ActivePanel->Show(); if (ActivePanel->GetType() == panel_type::TREE_PANEL) ActivePanel->ProcessKey(Manager::Key(KEY_ENTER)); } else { // TODO: ... а здесь проверить факт изменения/появления файла Tree.Far и мы опять же в корне (чтобы лишний раз не апдейтить панель) ActivePanel->Update(UPDATE_KEEP_SELECTION); ActivePanel->Redraw(); const auto AnotherPanel = Global->CtrlObject->Cp()->PassivePanel(); if (AnotherPanel->NeedUpdatePanel(ActivePanel.get())) { AnotherPanel->Update(UPDATE_KEEP_SELECTION);//|UPDATE_SECONDARY); AnotherPanel->Redraw(); } } } return true; case KEY_ALTF11: case KEY_RALTF11: ShowViewEditHistory(); Global->CtrlObject->Cp()->Redraw(); return true; case KEY_ALTF12: case KEY_RALTF12: { history_record_type Type; GUID Guid; string strFile, strData, strStr; const auto SelectType = Global->CtrlObject->FolderHistory->Select(msg(lng::MFolderHistoryTitle), L"HistoryFolders"sv, strStr, Type, &Guid, &strFile, &strData); switch(SelectType) { case HRT_ENTER: case HRT_SHIFTETNER: case HRT_CTRLSHIFTENTER: { if (SelectType == HRT_SHIFTETNER) Global->CtrlObject->FolderHistory->SetAddMode(false,2,true); // пусть плагин сам прыгает... ;-) auto Panel = Global->CtrlObject->Cp()->ActivePanel(); if (SelectType == HRT_CTRLSHIFTENTER) Panel = Global->CtrlObject->Cp()->PassivePanel(); //Type==1 - плагиновый путь //Type==0 - обычный путь Panel->ExecShortcutFolder(std::move(strStr), Guid, strFile, strData, true); // Panel may be changed if(SelectType == HRT_CTRLSHIFTENTER) { Panel = Global->CtrlObject->Cp()->ActivePanel(); Panel->SetCurPath(); Panel = Global->CtrlObject->Cp()->PassivePanel(); } else { Panel = Global->CtrlObject->Cp()->ActivePanel(); } Panel->Redraw(); Global->CtrlObject->FolderHistory->SetAddMode(true,2,true); } break; case HRT_CTRLENTER: SetString(strStr, true); break; default: break; } } return true; case KEY_NUMENTER: case KEY_SHIFTNUMENTER: case KEY_ENTER: case KEY_SHIFTENTER: case KEY_CTRLALTENTER: case KEY_RCTRLRALTENTER: case KEY_CTRLRALTENTER: case KEY_RCTRLALTENTER: case KEY_CTRLALTNUMENTER: case KEY_RCTRLRALTNUMENTER: case KEY_CTRLRALTNUMENTER: case KEY_RCTRLALTNUMENTER: { const auto ActivePanel = Global->CtrlObject->Cp()->ActivePanel(); CmdStr.RemoveSelection(); Refresh(); const auto& strStr = CmdStr.GetString(); bool TryExecute = true; if (!strStr.empty()) { ActivePanel->SetCurPath(); if (!(Global->Opt->ExcludeCmdHistory&EXCLUDECMDHISTORY_NOTCMDLINE)) Global->CtrlObject->CmdHistory->AddToHistory(strStr, HR_DEFAULT, nullptr, {}, m_CurDir); TryExecute = !ActivePanel->ProcessPluginEvent(FE_COMMAND, UNSAFE_CSTR(strStr)); } if (TryExecute) { const auto KeyCode = LocalKey(); const auto IsNewWindow = (KeyCode & KEY_SHIFT) != 0; const auto IsRunAs = (KeyCode & KEY_CTRL || KeyCode & KEY_RCTRL) && (KeyCode & KEY_ALT || KeyCode & KEY_RALT); execute_info Info; Info.Command = strStr; Info.NewWindow = IsNewWindow; Info.RunAs = IsRunAs; SetString(L"", false); ExecString(Info); } } return true; case KEY_CTRLU: case KEY_RCTRLU: CmdStr.RemoveSelection(); Refresh(); return true; case KEY_OP_XLAT: { // 13.12.2000 SVS - ! Для CmdLine - если нет выделения, преобразуем всю строку (XLat) CmdStr.Xlat((Global->Opt->XLat.Flags&XLAT_CONVERTALLCMDLINE) != 0); // иначе неправильно работает ctrl-end strLastCmdStr = CmdStr.GetString(); LastCmdPartLength = static_cast<int>(strLastCmdStr.size()); return true; } /* дополнительные клавиши для выделения в ком строке. ВНИМАНИЕ! Для сокращения кода этот кусок должен стоять перед "default" */ case KEY_ALTSHIFTLEFT: case KEY_ALTSHIFTNUMPAD4: case KEY_RALTSHIFTLEFT: case KEY_RALTSHIFTNUMPAD4: case KEY_ALTSHIFTRIGHT: case KEY_ALTSHIFTNUMPAD6: case KEY_RALTSHIFTRIGHT: case KEY_RALTSHIFTNUMPAD6: case KEY_ALTSHIFTEND: case KEY_ALTSHIFTNUMPAD1: case KEY_RALTSHIFTEND: case KEY_RALTSHIFTNUMPAD1: case KEY_ALTSHIFTHOME: case KEY_ALTSHIFTNUMPAD7: case KEY_RALTSHIFTHOME: case KEY_RALTSHIFTNUMPAD7: LocalKey&=~(KEY_ALT|KEY_RALT); [[fallthrough]]; default: // Сбрасываем выделение на некоторых клавишах if (!Global->Opt->CmdLine.EditBlock) { static const unsigned int UnmarkKeys[]= { KEY_LEFT, KEY_NUMPAD4, KEY_CTRLS, KEY_RCTRLS, KEY_RIGHT, KEY_NUMPAD6, KEY_CTRLD, KEY_RCTRLD, KEY_CTRLLEFT, KEY_CTRLNUMPAD4, KEY_RCTRLLEFT, KEY_RCTRLNUMPAD4, KEY_CTRLRIGHT, KEY_CTRLNUMPAD6, KEY_RCTRLRIGHT, KEY_RCTRLNUMPAD6, KEY_CTRLHOME, KEY_CTRLNUMPAD7, KEY_RCTRLHOME, KEY_RCTRLNUMPAD7, KEY_CTRLEND, KEY_CTRLNUMPAD1, KEY_RCTRLEND, KEY_RCTRLNUMPAD1, KEY_HOME, KEY_NUMPAD7, KEY_END, KEY_NUMPAD1 }; if (contains(UnmarkKeys, LocalKey())) { CmdStr.RemoveSelection(); } } if (LocalKey() == KEY_CTRLD || LocalKey() == KEY_RCTRLD) LocalKey=KEY_RIGHT; if(LocalKey() == KEY_CTRLSPACE || LocalKey() == KEY_RCTRLSPACE) { SCOPED_ACTION(SetAutocomplete)(&CmdStr, true); CmdStr.AutoComplete(true,false); return true; } if (!CmdStr.ProcessKey(LocalKey)) return Global->WindowManager->Desktop()->ProcessKey(Key); LastCmdPartLength=-1; return true; } }