void lcTimelineWidget::CustomMenuRequested(QPoint Pos) { QMenu* Menu = new QMenu(this); QTreeWidgetItem* TreeItem = itemAt(Pos); lcObject* FocusObject = lcGetActiveModel()->GetFocusObject(); if (FocusObject && FocusObject->IsPiece()) { lcPiece* Piece = (lcPiece*)FocusObject; if (Piece->mPieceInfo->IsModel()) { Menu->addAction(gMainWindow->mActions[LC_MODEL_EDIT_FOCUS]); Menu->addSeparator(); } } // look for step headings if (TreeItem && TreeItem->data(0, Qt::UserRole).isNull()) { { QAction* Action = new QAction(tr("Move selection here"), this); Action->setStatusTip(tr("Move the selected parts into this step")); Action->setData(qVariantFromValue((void *) TreeItem)); Action->setEnabled(selectedItems().count() != 0); connect(Action, SIGNAL(triggered()), this, SLOT(MoveSelectionTo())); Menu->addAction(Action); } { QAction* Action = new QAction(tr("Set as current step"), this); Action->setStatusTip(tr("View the model at this point in the timeline")); Action->setData(qVariantFromValue((void *) TreeItem)); connect(Action, SIGNAL(triggered()), this, SLOT(UpdateCurrentStep())); Menu->addAction(Action); } Menu->addSeparator(); } QAction* InsertStepAction = Menu->addAction(gMainWindow->mActions[LC_VIEW_TIME_INSERT]->text(), this, SLOT(InsertStep())); InsertStepAction->setStatusTip(gMainWindow->mActions[LC_VIEW_TIME_INSERT]->statusTip()); QAction* RemoveStepAction = Menu->addAction(gMainWindow->mActions[LC_VIEW_TIME_DELETE]->text(), this, SLOT(RemoveStep())); RemoveStepAction->setStatusTip(gMainWindow->mActions[LC_VIEW_TIME_DELETE]->statusTip()); Menu->addSeparator(); Menu->addAction(gMainWindow->mActions[LC_PIECE_HIDE_SELECTED]); Menu->addAction(gMainWindow->mActions[LC_PIECE_HIDE_UNSELECTED]); Menu->addAction(gMainWindow->mActions[LC_PIECE_UNHIDE_SELECTED]); Menu->addAction(gMainWindow->mActions[LC_PIECE_UNHIDE_ALL]); Menu->popup(viewport()->mapToGlobal(Pos)); }
void lcApplication::SetProject(Project* Project) { delete mProject; mProject = Project; const lcArray<View*>& Views = gMainWindow->GetViews(); for (int ViewIdx = 0; ViewIdx < Views.GetSize(); ViewIdx++) { View* View = Views[ViewIdx]; View->ClearCameras(); View->SetModel(lcGetActiveModel()); } Project->SetActiveModel(0); lcGetPiecesLibrary()->RemoveTemporaryPieces(); }
void lcTimelineWidget::RemoveStep() { QTreeWidgetItem* CurrentItem = currentItem(); if (!CurrentItem) return; if (CurrentItem->parent()) CurrentItem = CurrentItem->parent(); int Step = indexOfTopLevelItem(CurrentItem); if (Step == -1) return; lcGetActiveModel()->RemoveStep(Step + 1); }
void Project::SetActiveModel(int ModelIndex) { if (ModelIndex < 0 || ModelIndex >= mModels.GetSize()) return; for (int ModelIdx = 0; ModelIdx < mModels.GetSize(); ModelIdx++) mModels[ModelIdx]->SetActive(ModelIdx == ModelIndex); lcArray<lcModel*> UpdatedModels; UpdatedModels.AllocGrow(mModels.GetSize()); for (int ModelIdx = 0; ModelIdx < mModels.GetSize(); ModelIdx++) mModels[ModelIdx]->UpdatePieceInfo(UpdatedModels); mActiveModel = mModels[ModelIndex]; mActiveModel->UpdateInterface(); const lcArray<View*>& Views = gMainWindow->GetViews(); for (int ViewIdx = 0; ViewIdx < Views.GetSize(); ViewIdx++) Views[ViewIdx]->SetModel(lcGetActiveModel()); }
void lcTimelineWidget::Update(bool Clear, bool UpdateItems) { if (mIgnoreUpdates) return; lcModel* Model = lcGetActiveModel(); if (!Model) { mItems.clear(); clear(); return; } bool Blocked = blockSignals(true); if (Clear) { mItems.clear(); clear(); } lcStep LastStep = lcMax(Model->GetLastStep(), Model->GetCurrentStep()); for (int TopLevelItemIdx = LastStep; TopLevelItemIdx < topLevelItemCount(); ) { QTreeWidgetItem* StepItem = topLevelItem(TopLevelItemIdx); while (StepItem->childCount()) { QTreeWidgetItem* PieceItem = StepItem->child(0); lcPiece* Piece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); mItems.remove(Piece); delete PieceItem; } delete StepItem; } for (unsigned int TopLevelItemIdx = topLevelItemCount(); TopLevelItemIdx < LastStep; TopLevelItemIdx++) { QTreeWidgetItem* StepItem = new QTreeWidgetItem(this, QStringList(tr("Step %1").arg(TopLevelItemIdx + 1))); StepItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsDropEnabled); addTopLevelItem(StepItem); StepItem->setExpanded(true); } const lcArray<lcPiece*>& Pieces = Model->GetPieces(); QTreeWidgetItem* StepItem = NULL; int PieceItemIndex = 0; lcStep Step = 0; for (int PieceIdx = 0; PieceIdx != Pieces.GetSize(); PieceIdx++) { lcPiece* Piece = Pieces[PieceIdx]; while (Step != Piece->GetStepShow()) { if (StepItem) { while (PieceItemIndex < StepItem->childCount()) { QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex); lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); if (Pieces.FindIndex(RemovePiece) == -1) { mItems.remove(RemovePiece); delete PieceItem; } else { PieceItem->parent()->removeChild(PieceItem); topLevelItem(RemovePiece->GetStepShow() - 1)->addChild(PieceItem); } } } Step++; StepItem = topLevelItem(Step - 1); PieceItemIndex = 0; } QTreeWidgetItem* PieceItem = mItems.value(Piece); bool UpdateItem = UpdateItems; if (!PieceItem) { PieceItem = new QTreeWidgetItem(); PieceItem->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled); PieceItem->setData(0, Qt::UserRole, qVariantFromValue<uintptr_t>((uintptr_t)Piece)); StepItem->insertChild(PieceItemIndex, PieceItem); mItems[Piece] = PieceItem; UpdateItem = true; } else { if (PieceItemIndex >= StepItem->childCount() || PieceItem != StepItem->child(PieceItemIndex)) { QTreeWidgetItem* PieceParent = PieceItem->parent(); if (PieceParent) PieceParent->removeChild(PieceItem); StepItem->insertChild(PieceItemIndex, PieceItem); } } if (UpdateItem) { PieceItem->setText(0, Piece->mPieceInfo->m_strDescription); int ColorIndex = Piece->mColorIndex; if (!mIcons.contains(ColorIndex)) { int Size = rowHeight(indexFromItem(PieceItem)); QImage Image(Size, Size, QImage::Format_ARGB32); Image.fill(QColor::fromRgbF(1.0, 1.0, 1.0, 0.0)); float* Color = gColorList[ColorIndex].Value; QPainter Painter(&Image); Painter.setPen(Qt::NoPen); Painter.setBrush(QColor::fromRgbF(Color[0], Color[1], Color[2])); Painter.drawEllipse(QPoint(Size / 2, Size / 2), Size / 2, Size / 2); mIcons[ColorIndex] = QIcon(QPixmap::fromImage(Image)); } PieceItem->setIcon(0, mIcons[ColorIndex]); QColor Color = palette().text().color(); if (Piece->IsHidden()) Color.setAlpha(128); PieceItem->setTextColor(0, Color); } PieceItem->setSelected(Piece->IsSelected()); PieceItemIndex++; } if (Step == 0) { Step = 1; StepItem = topLevelItem(0); } while (Step <= LastStep) { while (PieceItemIndex < StepItem->childCount()) { QTreeWidgetItem* PieceItem = StepItem->child(PieceItemIndex); lcPiece* RemovePiece = (lcPiece*)PieceItem->data(0, Qt::UserRole).value<uintptr_t>(); mItems.remove(RemovePiece); delete PieceItem; } Step++; StepItem = topLevelItem(Step - 1); PieceItemIndex = 0; } blockSignals(Blocked); }
bool lcApplication::Initialize(int argc, char* argv[], const char* LibraryInstallPath, const char* LDrawPath, const char* LibraryCachePath) { char* LibPath = LIBPATH_DEFAULT; // Image output options. bool SaveImage = false; bool SaveWavefront = false; bool Save3DS = false; // bool ImageHighlight = false; int ImageWidth = lcGetProfileInt(LC_PROFILE_IMAGE_WIDTH); int ImageHeight = lcGetProfileInt(LC_PROFILE_IMAGE_HEIGHT); lcStep ImageStart = 0; lcStep ImageEnd = 0; char* ImageName = NULL; char* ProjectName = NULL; char* SaveWavefrontName = NULL; char* Save3DSName = NULL; // Parse the command line arguments. for (int i = 1; i < argc; i++) { char* Param = argv[i]; if (Param[0] == '-') { if ((strcmp(Param, "-l") == 0) || (strcmp(Param, "--libpath") == 0)) { ParseStringArgument(&i, argc, argv, &LibPath); } else if ((strcmp(Param, "-i") == 0) || (strcmp(Param, "--image") == 0)) { SaveImage = true; if ((argc > (i+1)) && (argv[i+1][0] != '-')) { i++; ImageName = argv[i]; } } else if ((strcmp(Param, "-w") == 0) || (strcmp(Param, "--width") == 0)) { ParseIntegerArgument(&i, argc, argv, &ImageWidth); } else if ((strcmp(Param, "-h") == 0) || (strcmp(Param, "--height") == 0)) { ParseIntegerArgument(&i, argc, argv, &ImageHeight); } else if ((strcmp(Param, "-f") == 0) || (strcmp(Param, "--from") == 0)) { int Step; ParseIntegerArgument(&i, argc, argv, &Step); ImageStart = Step; } else if ((strcmp(Param, "-t") == 0) || (strcmp(Param, "--to") == 0)) { int Step; ParseIntegerArgument(&i, argc, argv, &Step); ImageEnd = Step; } // else if (strcmp(Param, "--highlight") == 0) // ImageHighlight = true; else if ((strcmp(Param, "-wf") == 0) || (strcmp(Param, "--export-wavefront") == 0)) { SaveWavefront = true; if ((argc > (i+1)) && (argv[i+1][0] != '-')) { i++; SaveWavefrontName = argv[i]; } } else if ((strcmp(Param, "-3ds") == 0) || (strcmp(Param, "--export-3ds") == 0)) { Save3DS = true; if ((argc > (i+1)) && (argv[i+1][0] != '-')) { i++; Save3DSName = argv[i]; } } else if ((strcmp(Param, "-v") == 0) || (strcmp(Param, "--version") == 0)) { printf("LeoCAD Version " LC_VERSION_TEXT "\n"); printf("Compiled " __DATE__ "\n"); return false; } else if ((strcmp(Param, "-?") == 0) || (strcmp(Param, "--help") == 0)) { printf("Usage: leocad [options] [file]\n"); printf(" [options] can be:\n"); printf(" -l, --libpath <path>: Loads the Pieces Library from path.\n"); printf(" -i, --image <outfile.ext>: Saves a picture in the format specified by ext.\n"); printf(" -w, --width <width>: Sets the picture width.\n"); printf(" -h, --height <height>: Sets the picture height.\n"); printf(" -f, --from <time>: Sets the first frame or step to save pictures.\n"); printf(" -t, --to <time>: Sets the last frame or step to save pictures.\n"); // printf(" --highlight: Highlight pieces in the steps they appear.\n"); printf(" -wf, --export-wavefront <outfile.obj>: Exports the model to Wavefront format.\n"); printf(" -3ds, --export-3ds <outfile.3ds>: Exports the model to 3DS format.\n"); printf(" \n"); return false; } else printf("Unknown parameter: %s\n", Param); } else { ProjectName = Param; } } gMainWindow = new lcMainWindow(); lcLoadDefaultKeyboardShortcuts(); if (!LoadPiecesLibrary(LibPath, LibraryInstallPath, LDrawPath, LibraryCachePath)) { if (SaveImage || SaveWavefront || Save3DS) { fprintf(stderr, "ERROR: Cannot load pieces library."); return false; } if (mLibrary->LoadBuiltinPieces()) QMessageBox::information(gMainWindow, tr("LeoCAD"), tr("LeoCAD could not find a compatible Parts Library so only a small number of parts will be available.\n\n" "Please visit http://www.leocad.org for information on how to download and install a library.")); else QMessageBox::information(gMainWindow, tr("LeoCAD"), tr("LeoCAD could not load Parts Library.\n\n" "Please visit http://www.leocad.org for information on how to download and install a library.")); } gMainWindow->CreateWidgets(); // Create a new project. Project* NewProject = new Project(); SetProject(NewProject); // Load project. if (ProjectName && gMainWindow->OpenProject(ProjectName)) { if (SaveImage) { QString FileName; if (ImageName) FileName = ImageName; else FileName = ProjectName; QString Extension = QFileInfo(FileName).suffix().toLower(); if (Extension.isEmpty()) { FileName += lcGetProfileString(LC_PROFILE_IMAGE_EXTENSION); } else if (Extension != "bmp" && Extension != "jpg" && Extension != "jpeg" && Extension != "png") { FileName = FileName.left(FileName.length() - Extension.length() - 1); FileName += lcGetProfileString(LC_PROFILE_IMAGE_EXTENSION); } if (ImageEnd < ImageStart) ImageEnd = ImageStart; else if (ImageStart > ImageEnd) ImageStart = ImageEnd; if ((ImageStart == 0) && (ImageEnd == 0)) { ImageStart = ImageEnd = mProject->GetActiveModel()->GetCurrentStep(); } else if ((ImageStart == 0) && (ImageEnd != 0)) { ImageStart = ImageEnd; } else if ((ImageStart != 0) && (ImageEnd == 0)) { ImageEnd = ImageStart; } if (ImageStart > 255) ImageStart = 255; if (ImageEnd > 255) ImageEnd = 255; QString Frame; if (ImageStart != ImageEnd) { QString Extension = QFileInfo(FileName).suffix(); Frame = FileName.left(FileName.length() - Extension.length() - 1) + QLatin1String("%1.") + Extension; } else Frame = FileName; lcGetActiveModel()->SaveStepImages(Frame, ImageWidth, ImageHeight, ImageStart, ImageEnd); } if (SaveWavefront) { QString FileName; if (SaveWavefrontName) FileName = SaveWavefrontName; else FileName = ProjectName; QString Extension = QFileInfo(FileName).suffix().toLower(); if (Extension.isEmpty()) { FileName += ".obj"; } else if (Extension != "obj") { FileName = FileName.left(FileName.length() - Extension.length() - 1); FileName += ".obj"; } mProject->ExportWavefront(FileName); } if (Save3DS) { QString FileName; if (Save3DSName) FileName = Save3DSName; else FileName = ProjectName; QString Extension = QFileInfo(FileName).suffix().toLower(); if (Extension.isEmpty()) { FileName += ".3ds"; } else if (Extension != "3ds") { FileName = FileName.left(FileName.length() - Extension.length() - 1); FileName += ".3ds"; } mProject->Export3DStudio(FileName); } } if (SaveImage || SaveWavefront || Save3DS) return false; return true; }