void Editor::slot_ObjectList_MenuRequest( const QPoint& p ) { if(ui.widgetListObj->itemAt(p) == nullptr) return; static QMenu mainMenu; static bool firstExex = true; static QAction* actionDelObj = nullptr; if(firstExex) { firstExex = false; actionDelObj = mainMenu.addAction("Delete"); static QMenu* menuAddComp = mainMenu.addMenu("Add Component"); static QVector<QMenu*> listMenuCompPack; auto ci = CGame::GetComponentClassHead(); while(ci) { for(auto iter = listMenuCompPack.begin(); iter != listMenuCompPack.end(); iter++) { if(ci->packName() == (*iter)->title()) { if(ci->showInEd()) (*iter)->addAction(ci->className()); goto SEC1; } } if(ci->showInEd()) { QMenu* newMenu = menuAddComp->addMenu(ci->packName()); newMenu->addAction(ci->className()); listMenuCompPack.push_back(newMenu); } SEC1: ci = ci->next(); } } QAction* actionRet = mainMenu.exec(ui.widgetListObj->mapToGlobal(p)); if(actionRet) { if(actionRet == actionDelObj) { CGameObject* obj = CGame::GetObjByIndex(ui.widgetListObj->currentRow()); obj->destroy(); delete ui.widgetListObj->takeItem(ui.widgetListObj->currentRow()); Editor::SelectObj(nullptr); } else { CGameObject* obj = CGame::GetObjByIndex(ui.widgetListObj->currentRow()); obj->addComponent(actionRet->text().toAscii().data()); Editor::SelectObj(obj); } CGame::EDTick(); } }
char cmd_copymove1(uchar copymode, uchar shiftPressed) { char *name; char e; FileInfo* f; char sourceFile[256]; char mask[11]; char forMask[11]; char type; uint i; if(shiftPressed) { // Копируем имя c первой панели (без пути) f = getSelNoBack(); if(!f) return 0; // Файл не выбран, выходим без ошибки unpackName(cmdLine, f->fname); } else { // Копируем путь со второй панели i = strlen(panelB.path1); if(i >= 254) return ERR_RECV_STRING; // Так как прибавим 2 символа cmdLine[0] = '/'; strcpy(cmdline+1, panelB.path1); if(i != 0) strcpy(cmdline+i+1, "/"); } // Позволяем пользователю изменить путь или имя if(!inputBox(copymode ? " kopirowatx " : " pereimenowatx/peremestitx ") && cmdline[0]!=0) return 0; // Преобразование относительного пути в абсолютный if(!absolutePath(cmdline)) return ERR_RECV_STRING; // Используется ли маска? mask[0] = 0; name = getname(cmdline); if(name[0] != 0) { // Сохраняем маску packName(mask, name); // Убираем из пути маску dropPathInt(cmdLine, 0); } else { // Если в ком строке что то есть, а имя не выделено, значит ком строка оканчивается на /. // Этот символ надо удалить if(cmdline[0] != 0 && name[0] == 0) name[-1] = 0; } // Ищем первый файл type = getFirstSelected(sourceFile); if(type == 0) return 0; // Нет выбранных файлов for(;;) { // Преобразование относительного пути в абсолютный if(!absolutePath(sourceFile)) { e = ERR_RECV_STRING; break; } // Добавляем имя packName(forMask, getname(sourceFile)); if(mask[0]) applyMask(forMask, mask); if(catPathAndUnpack(cmdline, forMask)) return ERR_RECV_STRING; // Самого в мебя не копируем и не переименовываем if(0!=strcmp(sourceFile, cmdline)) { // Выполнение операции if(copymode) { if(type==2) { e = cmd_copyFolder(sourceFile, cmdline); } else { e = cmd_copyFile(sourceFile, cmdline); } } else { // Простое окно drawWindow(" pereimenowanie/pereme}enie "); drawWindowText(0, 1, "iz:"); drawWindowText(4, 1, sourceFile); drawWindowText(0, 2, "w:"); drawWindowText(4, 2, cmdline); drawAnyKeyButton(); // Прерывание if(fs_bioskey(1) == KEY_ESC) { e = ERR_USER; break; } e = fs_move(sourceFile, cmdline); } if(e) break; } // Убираем из пути имя файла dropPathInt(cmdLine, 0); // Следующий выбранный файл type = getNextSelected(sourceFile); if(type == 0) { e=0; break; } } // конец цикла // При переносе файла надо обновить обе панели // А при копировании список файов используется под буфер getFiles(); dupFiles(1); return e; }