From 8342e147cf4a8a2c00dc256376286ea832d28355 Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Sat, 10 Jan 2026 21:34:21 -0800 Subject: [PATCH] Added RemoveFromSelection action. --- common/camera.cpp | 6 +- common/camera.h | 19 ----- common/lc_model.cpp | 166 +++++++++++++++----------------------- common/lc_model.h | 9 +-- common/lc_modelaction.cpp | 157 ++++++++++++++++++++++------------- common/lc_modelaction.h | 13 ++- common/lc_view.cpp | 12 ++- common/light.cpp | 4 +- common/light.h | 7 -- common/object.h | 1 - common/piece.h | 7 -- 11 files changed, 192 insertions(+), 209 deletions(-) diff --git a/common/camera.cpp b/common/camera.cpp index 97dbcb69..0f90296a 100644 --- a/common/camera.cpp +++ b/common/camera.cpp @@ -594,7 +594,7 @@ void lcCamera::DrawInterface(lcContext* Context, const lcScene& Scene) const } else { - if (IsSelected(LC_CAMERA_SECTION_POSITION)) + if (IsSelected()) { Context->SetLineWidth(2.0f * LineWidth); if (IsFocused(LC_CAMERA_SECTION_POSITION)) @@ -610,7 +610,7 @@ void lcCamera::DrawInterface(lcContext* Context, const lcScene& Scene) const Context->DrawIndexedPrimitives(GL_LINES, 40, GL_UNSIGNED_SHORT, 0); - if (IsSelected(LC_CAMERA_SECTION_TARGET)) + if (IsSelected()) { Context->SetLineWidth(2.0f * LineWidth); if (IsFocused(LC_CAMERA_SECTION_TARGET)) @@ -626,7 +626,7 @@ void lcCamera::DrawInterface(lcContext* Context, const lcScene& Scene) const Context->DrawIndexedPrimitives(GL_LINES, 24, GL_UNSIGNED_SHORT, 40 * 2); - if (IsSelected(LC_CAMERA_SECTION_UPVECTOR)) + if (IsSelected()) { Context->SetLineWidth(2.0f * LineWidth); if (IsFocused(LC_CAMERA_SECTION_UPVECTOR)) diff --git a/common/camera.h b/common/camera.h index f9d82f70..c99192e6 100644 --- a/common/camera.h +++ b/common/camera.h @@ -99,25 +99,6 @@ public: return (mState & LC_CAMERA_SELECTION_MASK) != 0; } - bool IsSelected(quint32 Section) const override - { - switch (Section) - { - case LC_CAMERA_SECTION_POSITION: - return (mState & LC_CAMERA_POSITION_SELECTED) != 0; - break; - - case LC_CAMERA_SECTION_TARGET: - return (mState & LC_CAMERA_TARGET_SELECTED) != 0; - break; - - case LC_CAMERA_SECTION_UPVECTOR: - return (mState & LC_CAMERA_UPVECTOR_SELECTED) != 0; - break; - } - return false; - } - void SetSelected(bool Selected) override { if (Selected) diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 23fe8f1d..8ee98140 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -1230,7 +1230,7 @@ void lcModel::Paste(bool PasteToCurrentStep) SaveCheckpoint(tr("Pasting")); if (SelectedObjects.size() == 1) - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, SelectedObjects.front(), LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), SelectedObjects.front(), LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); // ClearSelectionAndSetFocus(SelectedObjects[0], LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); else SetSelectionAndFocus(SelectedObjects, nullptr, 0, false); @@ -1733,11 +1733,11 @@ void lcModel::SubModelAddBoundingBoxPoints(const lcMatrix44& WorldMatrix, std::v Piece->SubModelAddBoundingBoxPoints(WorldMatrix, Points); } -void lcModel::RecordSelectionAction(lcModelActionSelectionMode ModelActionSelectionMode, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode) +void lcModel::RecordSelectionAction(lcModelActionSelectionMode ModelActionSelectionMode, const std::vector& Objects, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode) { std::unique_ptr ModelActionSelection = std::make_unique(ModelActionSelectionMode, mCurrentStep); - if (ModelActionSelection->Initialize(this, FocusObject, FocusSection, SelectionMode)) + if (ModelActionSelection->Initialize(this, Objects, FocusObject, FocusSection, SelectionMode)) mActionSequence.emplace_back(std::move(ModelActionSelection)); } @@ -1748,7 +1748,7 @@ void lcModel::RunSelectionAction(const lcModelActionSelection* ModelActionSelect auto LoadSelection = [this, ModelActionSelection]() { - auto [SelectedObjects, FocusObject, FocusSection] = ModelActionSelection->GetSelection(mPieces, mCameras, mLights); + auto [SelectedObjects, FocusObject, FocusSection] = ModelActionSelection->GetPreviousSelection(this); SetSelectionAndFocus(SelectedObjects, FocusObject, FocusSection, false); }; @@ -1782,7 +1782,7 @@ void lcModel::RunSelectionAction(const lcModelActionSelection* ModelActionSelect SelectGroup(Piece->GetTopGroup(), Step, true); std::vector Pieces = GetSelectionModePieces(ModelActionSelection->GetSelectionMode(), Piece, Step); - SelectObjects(Pieces, Step); + SelectObjects(Pieces, Step, true); } } } @@ -1811,7 +1811,34 @@ void lcModel::RunSelectionAction(const lcModelActionSelection* ModelActionSelect else LoadSelection(); break; - + + case lcModelActionSelectionMode::RemoveFromSelection: + if (Apply) + { + std::vector Objects = ModelActionSelection->GetNewObjects(this); + + for (lcObject* Object : Objects) + { + if (!Object->IsSelected()) + continue; + + Object->SetSelected(false); + + if (Object->IsPiece()) + { + lcPiece* Piece = dynamic_cast(Object); + + SelectGroup(Piece->GetTopGroup(), Step, false); + + std::vector Pieces = GetSelectionModePieces(ModelActionSelection->GetSelectionMode(), Piece, Step); + SelectObjects(Pieces, Step, false); + } + } + } + else + LoadSelection(); + break; + case lcModelActionSelectionMode::Set: LoadSelection(); break; @@ -2294,9 +2321,9 @@ void lcModel::GroupSelection() BeginActionSequence(); - RecordSelectionAction(lcModelActionSelectionMode::Restore, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::Restore, std::vector(), nullptr, 0, lcSelectionMode::Single); RecordGroupPiecesAction(lcModelActionGroupPiecesMode::Group, Dialog.mName); - RecordSelectionAction(lcModelActionSelectionMode::Save, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::Save, std::vector(), nullptr, 0, lcSelectionMode::Single); EndActionSequence(tr("Group")); } @@ -2328,9 +2355,9 @@ void lcModel::UngroupSelection() BeginActionSequence(); - RecordSelectionAction(lcModelActionSelectionMode::Restore, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::Restore, std::vector(), nullptr, 0, lcSelectionMode::Single); RecordGroupPiecesAction(lcModelActionGroupPiecesMode::Ungroup, QString()); - RecordSelectionAction(lcModelActionSelectionMode::Save, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::Save, std::vector(), nullptr, 0, lcSelectionMode::Single); EndActionSequence(tr("Ungroup")); } @@ -2656,7 +2683,7 @@ lcPiece* lcModel::AddPiece(PieceInfo* Info, quint32 Section) } gMainWindow->UpdateTimeline(false, false); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, Piece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), Piece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); // ClearSelectionAndSetFocus(Piece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); SaveCheckpoint(tr("Adding Piece")); @@ -3216,7 +3243,7 @@ void lcModel::MoveSelectionToModel(lcModel* Model) SaveCheckpoint(tr("New Model")); gMainWindow->UpdateTimeline(false, false); // ClearSelectionAndSetFocus(ModelPiece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, ModelPiece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), ModelPiece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); } void lcModel::InlineSelectedModels() @@ -4439,28 +4466,35 @@ std::vector lcModel::GetSelectionModePieces(lcSelectionMode Selection void lcModel::ClearSelection() { BeginActionSequence(); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelection, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelection, std::vector(), nullptr, 0, lcSelectionMode::Single); EndActionSequence(tr("Selection")); } void lcModel::ClearSelectionAndSetFocus(lcObject* Object, quint32 Section, lcSelectionMode SelectionMode) { BeginActionSequence(); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, Object, Section, SelectionMode); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), Object, Section, SelectionMode); EndActionSequence(tr("Selection")); } void lcModel::SelectAllPieces() { BeginActionSequence(); - RecordSelectionAction(lcModelActionSelectionMode::SelectAllPieces, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::SelectAllPieces, std::vector(), nullptr, 0, lcSelectionMode::Single); EndActionSequence(tr("Selection")); } void lcModel::InvertPieceSelection() { BeginActionSequence(); - RecordSelectionAction(lcModelActionSelectionMode::InvertPieceSelection, nullptr, 0, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::InvertPieceSelection, std::vector(), nullptr, 0, lcSelectionMode::Single); + EndActionSequence(tr("Selection")); +} + +void lcModel::RemoveFromSelection(const std::vector& Objects, lcSelectionMode SelectionMode) +{ + BeginActionSequence(); + RecordSelectionAction(lcModelActionSelectionMode::RemoveFromSelection, Objects, nullptr, 0, SelectionMode); EndActionSequence(tr("Selection")); } @@ -4476,19 +4510,18 @@ void lcModel::DeselectAllObjects() Light->SetSelected(false); } -void lcModel::SelectObjects(const std::vector& Objects, lcStep Step) +void lcModel::SelectObjects(const std::vector& Objects, lcStep Step, bool Select) { - for (lcObject* Object : Objects) - { - const bool WasSelected = Object->IsSelected(); - Object->SetSelected(true); - - if (Object->IsPiece()) - { - if (!WasSelected) - SelectGroup(((lcPiece*)Object)->GetTopGroup(), Step, true); - } - } + for (lcObject* Object : Objects) + { + if (Object->IsSelected() == Select) + continue; + + Object->SetSelected(Select); + + if (Object->IsPiece()) + SelectGroup(dynamic_cast(Object)->GetTopGroup(), Step, Select); + } } void lcModel::SelectGroup(lcGroup* TopGroup, lcStep Step, bool Select) @@ -4596,75 +4629,6 @@ void lcModel::AddToSelection(const std::vector& Objects, bool EnableS } } -void lcModel::RemoveFromSelection(const std::vector& Objects) -{ - for (lcObject* SelectedObject : Objects) - { - const bool WasSelected = SelectedObject->IsSelected(); - SelectedObject->SetSelected(false); - - if (WasSelected && SelectedObject->IsPiece()) - { - lcPiece* Piece = (lcPiece*)SelectedObject; - - if (gMainWindow->GetSelectionMode() == lcSelectionMode::Single) - SelectGroup(Piece->GetTopGroup(), mCurrentStep, false); - else - { - std::vector Pieces = GetSelectionModePieces(gMainWindow->GetSelectionMode(), Piece, mCurrentStep); - - for (lcObject* Object : Pieces) - { - if (Object->IsSelected()) - { - Object->SetSelected(false); - SelectGroup(((lcPiece*)Object)->GetTopGroup(), mCurrentStep, false); - } - } - } - } - } - - gMainWindow->UpdateSelectedObjects(true); - UpdateAllViews(); -} - -void lcModel::RemoveFromSelection(const lcObjectSection& ObjectSection) -{ - lcObject* SelectedObject = ObjectSection.Object; - - if (!SelectedObject) - return; - - const bool WasSelected = SelectedObject->IsSelected(); - - SelectedObject->SetSelected(false); - - if (SelectedObject->IsPiece() && WasSelected) - { - lcPiece* Piece = (lcPiece*)SelectedObject; - - if (gMainWindow->GetSelectionMode() == lcSelectionMode::Single) - SelectGroup(Piece->GetTopGroup(), mCurrentStep, false); - else - { - std::vector Pieces = GetSelectionModePieces(gMainWindow->GetSelectionMode(), Piece, mCurrentStep); - - for (lcObject* Object : Pieces) - { - if (Object->IsSelected()) - { - Object->SetSelected(false); - SelectGroup(((lcPiece*)Object)->GetTopGroup(), mCurrentStep, false); - } - } - } - } - - gMainWindow->UpdateSelectedObjects(true); - UpdateAllViews(); -} - void lcModel::HideSelectedPieces() { BeginActionSequence(); @@ -4903,7 +4867,7 @@ void lcModel::FindReplacePiece(bool SearchForward, bool FindAll, bool Replace) SetSelectionAndFocus(Selection, nullptr, 0, false); else // ClearSelectionAndSetFocus(Focus, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, Focus, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), Focus, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); if (ReplacedCount) { @@ -5092,7 +5056,7 @@ void lcModel::InsertPieceToolClicked(const std::vector& Piece EndObjectEditAction(std::move(PieceIndices)); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, Piece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), Piece, LC_PIECE_SECTION_POSITION, lcSelectionMode::Single); EndActionSequence(tr("Add Piece")); @@ -5114,7 +5078,7 @@ void lcModel::InsertCameraToolClicked(const lcVector3& Position) EndObjectEditAction({ mCameras.size() - 1 }); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, Camera, LC_CAMERA_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), Camera, LC_CAMERA_SECTION_POSITION, lcSelectionMode::Single); EndActionSequence(tr("Add Camera")); } @@ -5155,7 +5119,7 @@ void lcModel::InsertLightToolClicked(const lcVector3& Position, lcLightType Ligh EndObjectEditAction({ mLights.size() - 1 }); - RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, Light, LC_LIGHT_SECTION_POSITION, lcSelectionMode::Single); + RecordSelectionAction(lcModelActionSelectionMode::ClearSelectionAndSetFocus, std::vector(), Light, LC_LIGHT_SECTION_POSITION, lcSelectionMode::Single); EndActionSequence(ActionName); } diff --git a/common/lc_model.h b/common/lc_model.h index 79f60fb7..6da1b7b5 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -327,12 +327,11 @@ public: void ClearSelectionAndSetFocus(lcObject* Object, quint32 Section, lcSelectionMode SelectionMode); void SelectAllPieces(); void InvertPieceSelection(); - // to update: + void RemoveFromSelection(const std::vector& Objects, lcSelectionMode SelectionMode); + // to update: void FocusOrDeselectObject(const lcObjectSection& ObjectSection); void SetSelectionAndFocus(const std::vector& Selection, lcObject* Focus, quint32 Section, bool EnableSelectionMode); void AddToSelection(const std::vector& Objects, bool EnableSelectionMode, bool UpdateInterface); - void RemoveFromSelection(const std::vector& Objects); - void RemoveFromSelection(const lcObjectSection& ObjectSection); void HideSelectedPieces(); void HideUnselectedPieces(); @@ -406,7 +405,7 @@ public: protected: void DeleteModel(); - void RecordSelectionAction(lcModelActionSelectionMode ModelActionSelectionMode, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode); + void RecordSelectionAction(lcModelActionSelectionMode ModelActionSelectionMode, const std::vector& Objects, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode); void RunSelectionAction(const lcModelActionSelection* ModelActionSelection, bool Apply); void BeginObjectEditAction(lcModelActionObjectEditMode ModelActionObjectEditMode, const lcCamera* Camera); void EndObjectEditAction(std::vector&& ObjectIndices = std::vector(), std::vector&& GroupIndices = std::vector()); @@ -430,7 +429,7 @@ protected: std::vector GetSelectionModePieces(lcSelectionMode SelectionMode, const lcPiece* SelectedPiece, lcStep Step) const; void DeselectAllObjects(); - void SelectObjects(const std::vector& Objects, lcStep Step); + void SelectObjects(const std::vector& Objects, lcStep Step, bool Select); void SelectGroup(lcGroup* TopGroup, lcStep Step, bool Select); size_t AddPiece(lcPiece* Piece); diff --git a/common/lc_modelaction.cpp b/common/lc_modelaction.cpp index e38a81a3..347942a6 100644 --- a/common/lc_modelaction.cpp +++ b/common/lc_modelaction.cpp @@ -173,13 +173,13 @@ bool lcModelAction::LoadHistoryBuffer(const QByteArray& Buffer, lcModel* Model, return false; const std::unique_ptr& Light = Lights[LightIndex]; - + if (!Light->LoadUndoData(Stream, Model)) return false; } - } - - return true; + } + + return true; } lcModelActionSelection::lcModelActionSelection(lcModelActionSelectionMode Mode, lcStep Step) @@ -187,25 +187,64 @@ lcModelActionSelection::lcModelActionSelection(lcModelActionSelectionMode Mode, { } -bool lcModelActionSelection::Initialize(const lcModel* Model, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode) +bool lcModelActionSelection::Initialize(const lcModel* Model, const std::vector& Objects, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode) { - if (!HasChanges(Model, FocusObject, FocusSection)) + if (!HasChanges(Model, Objects, FocusObject, FocusSection)) return false; - + mSelectionMode = SelectionMode; - SaveSelection(Model); + SavePreviousSelection(Model); + SaveNewObjects(Objects, Model); SaveNewFocusObject(Model, FocusObject, FocusSection); return true; } -bool lcModelActionSelection::HasChanges(const lcModel* Model, lcObject* FocusObject, uint32_t FocusSection) const +size_t lcModelActionSelection::GetObjectIndex(const lcObject* Object, const lcModel* Model) +{ + switch (Object->GetType()) + { + case lcObjectType::Piece: + { + const std::vector>& Pieces = Model->GetPieces(); + + for (size_t PieceIndex = 0; PieceIndex < Pieces.size(); PieceIndex++) + if (Pieces[PieceIndex].get() == Object) + return PieceIndex; + } + break; + + case lcObjectType::Camera: + { + const std::vector>& Cameras = Model->GetCameras(); + + for (size_t CameraIndex = 0; CameraIndex < Cameras.size(); CameraIndex++) + if (Cameras[CameraIndex].get() == Object) + return CameraIndex; + } + break; + + case lcObjectType::Light: + { + const std::vector>& Lights = Model->GetLights(); + + for (size_t LightIndex = 0; LightIndex < Lights.size(); LightIndex++) + if (Lights[LightIndex].get() == Object) + return LightIndex; + } + break; + } + + return SIZE_T_MAX; +} + +bool lcModelActionSelection::HasChanges(const lcModel* Model, const std::vector& Objects, lcObject* FocusObject, uint32_t FocusSection) const { const std::vector>& Pieces = Model->GetPieces(); const std::vector>& Cameras = Model->GetCameras(); const std::vector>& Lights = Model->GetLights(); - + switch (mMode) { case lcModelActionSelectionMode::ClearSelection: @@ -243,16 +282,23 @@ bool lcModelActionSelection::HasChanges(const lcModel* Model, lcObject* FocusObj return false; + case lcModelActionSelectionMode::RemoveFromSelection: + for (lcObject* Object : Objects) + if (Object->IsSelected()) + return true; + + return false; + case lcModelActionSelectionMode::Set: case lcModelActionSelectionMode::Save: case lcModelActionSelectionMode::Restore: break; } - return true; + return true; } -void lcModelActionSelection::SaveSelection(const lcModel* Model) +void lcModelActionSelection::SavePreviousSelection(const lcModel* Model) { const std::vector>& Pieces = Model->GetPieces(); const std::vector>& Cameras = Model->GetCameras(); @@ -312,61 +358,54 @@ void lcModelActionSelection::SaveSelection(const lcModel* Model) } } +void lcModelActionSelection::SaveNewObjects(const std::vector& Objects, const lcModel* Model) +{ + mNewObjects.clear(); + mNewObjects.reserve(Objects.size()); + + for (lcObject* Object : Objects) + mNewObjects.emplace_back(GetObjectIndex(Object, Model), Object->GetType()); +} + void lcModelActionSelection::SaveNewFocusObject(const lcModel* Model, lcObject* FocusObject, uint32_t FocusSection) { if (!FocusObject) return; - + mNewFocusSection = FocusSection; mNewFocusObjectType = FocusObject->GetType(); + mNewFocusIndex = GetObjectIndex(FocusObject, Model); +} + +std::vector lcModelActionSelection::GetNewObjects(const lcModel* Model) const +{ + const std::vector>& Pieces = Model->GetPieces(); + const std::vector>& Cameras = Model->GetCameras(); + const std::vector>& Lights = Model->GetLights(); + std::vector Objects; - switch (FocusObject->GetType()) + for (auto [ObjectIndex, ObjectType] : mNewObjects) { - case lcObjectType::Piece: + switch (ObjectType) { - const std::vector>& Pieces = Model->GetPieces(); - - for (size_t PieceIndex = 0; PieceIndex < Pieces.size(); PieceIndex++) - { - if (Pieces[PieceIndex].get() == FocusObject) - { - mNewFocusIndex = PieceIndex; - break; - } - } + case lcObjectType::Piece: + if (ObjectIndex < Pieces.size()) + Objects.push_back(Pieces[ObjectIndex].get()); + break; + + case lcObjectType::Camera: + if (ObjectIndex < Cameras.size()) + Objects.push_back(Cameras[ObjectIndex].get()); + break; + + case lcObjectType::Light: + if (ObjectIndex < Lights.size()) + Objects.push_back(Lights[ObjectIndex].get()); + break; } - break; - - case lcObjectType::Camera: - { - const std::vector>& Cameras = Model->GetCameras(); - - for (size_t CameraIndex = 0; CameraIndex < Cameras.size(); CameraIndex++) - { - if (Cameras[CameraIndex].get() == FocusObject) - { - mNewFocusIndex = CameraIndex; - break; - } - } - } - break; - - case lcObjectType::Light: - { - const std::vector>& Lights = Model->GetLights(); - - for (size_t LightIndex = 0; LightIndex < Lights.size(); LightIndex++) - { - if (Lights[LightIndex].get() == FocusObject) - { - mNewFocusIndex = LightIndex; - break; - } - } - } - break; } + + return Objects; } lcObject* lcModelActionSelection::GetNewFocusObject(const lcModel* Model) const @@ -404,8 +443,12 @@ lcObject* lcModelActionSelection::GetNewFocusObject(const lcModel* Model) const return nullptr; } -std::tuple, lcObject*, uint32_t> lcModelActionSelection::GetSelection(const std::vector>& Pieces, const std::vector>& Cameras, const std::vector>& Lights) const +std::tuple, lcObject*, uint32_t> lcModelActionSelection::GetPreviousSelection(const lcModel* Model) const { + const std::vector>& Pieces = Model->GetPieces(); + const std::vector>& Cameras = Model->GetCameras(); + const std::vector>& Lights = Model->GetLights(); + std::vector SelectedObjects; lcObject* FocusObject = nullptr; diff --git a/common/lc_modelaction.h b/common/lc_modelaction.h index d406600e..0fa507cd 100644 --- a/common/lc_modelaction.h +++ b/common/lc_modelaction.h @@ -25,6 +25,7 @@ enum class lcModelActionSelectionMode ClearSelectionAndSetFocus, SelectAllPieces, InvertPieceSelection, + RemoveFromSelection, Set, Save, Restore @@ -36,7 +37,7 @@ public: lcModelActionSelection(lcModelActionSelectionMode Mode, lcStep Step); virtual ~lcModelActionSelection() = default; - bool Initialize(const lcModel* Model, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode); + bool Initialize(const lcModel* Model, const std::vector& Objects, lcObject* FocusObject, uint32_t FocusSection, lcSelectionMode SelectionMode); lcModelActionSelectionMode GetMode() const { @@ -58,12 +59,15 @@ public: return mNewFocusSection; } + std::vector GetNewObjects(const lcModel* Model) const; lcObject* GetNewFocusObject(const lcModel* Model) const; - std::tuple, lcObject*, uint32_t> GetSelection(const std::vector>& Pieces, const std::vector>& Cameras, const std::vector>& Lights) const; + std::tuple, lcObject*, uint32_t> GetPreviousSelection(const lcModel* Model) const; protected: - bool HasChanges(const lcModel* Model, lcObject* FocusObject, uint32_t FocusSection) const; - void SaveSelection(const lcModel* Model); + static size_t GetObjectIndex(const lcObject* Object, const lcModel* Model); + bool HasChanges(const lcModel* Model, const std::vector& Objects, lcObject* FocusObject, uint32_t FocusSection) const; + void SavePreviousSelection(const lcModel* Model); + void SaveNewObjects(const std::vector& Objects, const lcModel* Model); void SaveNewFocusObject(const lcModel* Model, lcObject* FocusObject, uint32_t FocusSection); std::vector mPreviousSelectedPieces; @@ -73,6 +77,7 @@ protected: uint32_t mPreviousFocusSection = 0; lcObjectType mPreviousFocusObjectType = (lcObjectType)0; + std::vector> mNewObjects; size_t mNewFocusIndex = SIZE_MAX; uint32_t mNewFocusSection = 0; lcObjectType mNewFocusObjectType = (lcObjectType)0; diff --git a/common/lc_view.cpp b/common/lc_view.cpp index 6789891a..a997a32f 100644 --- a/common/lc_view.cpp +++ b/common/lc_view.cpp @@ -2423,7 +2423,7 @@ void lcView::StopTracking(bool Accept) if (mMouseModifiers & Qt::ControlModifier) ActiveModel->AddToSelection(Objects, true, true); else if (mMouseModifiers & Qt::ShiftModifier) - ActiveModel->RemoveFromSelection(Objects); + ActiveModel->RemoveFromSelection(Objects, lcSelectionMode::Single); else ActiveModel->SetSelectionAndFocus(Objects, nullptr, 0, true); } @@ -2575,7 +2575,10 @@ void lcView::OnButtonDown(lcTrackButton TrackButton) if (mMouseModifiers & Qt::ControlModifier) ActiveModel->FocusOrDeselectObject(ObjectSection); else if (mMouseModifiers & Qt::ShiftModifier) - ActiveModel->RemoveFromSelection(ObjectSection); + { + if (ObjectSection.Object) + ActiveModel->RemoveFromSelection({ ObjectSection.Object }, gMainWindow->GetSelectionMode()); + } else ActiveModel->ClearSelectionAndSetFocus(ObjectSection.Object, ObjectSection.Section, gMainWindow->GetSelectionMode()); @@ -2739,7 +2742,10 @@ void lcView::OnLeftButtonDoubleClick() if (mMouseModifiers & Qt::ControlModifier) ActiveModel->FocusOrDeselectObject(ObjectSection); else if (mMouseModifiers & Qt::ShiftModifier) - ActiveModel->RemoveFromSelection(ObjectSection); + { + if (ObjectSection.Object) + ActiveModel->RemoveFromSelection({ ObjectSection.Object }, gMainWindow->GetSelectionMode()); + } else ActiveModel->ClearSelectionAndSetFocus(ObjectSection.Object, ObjectSection.Section, gMainWindow->GetSelectionMode()); } diff --git a/common/light.cpp b/common/light.cpp index 40eef7e2..5c4666d4 100644 --- a/common/light.cpp +++ b/common/light.cpp @@ -905,7 +905,7 @@ void lcLight::SetupLightMatrix(lcContext* Context) const const lcPreferences& Preferences = lcGetPreferences(); const float LineWidth = Preferences.mLineWidth; - if (IsSelected(LC_LIGHT_SECTION_POSITION)) + if (IsSelected()) { const lcVector4 SelectedColor = lcVector4FromColor(Preferences.mObjectSelectedColor); const lcVector4 FocusedColor = lcVector4FromColor(Preferences.mObjectFocusedColor); @@ -1066,7 +1066,7 @@ void lcLight::DrawTarget(lcContext* Context) const const lcPreferences& Preferences = lcGetPreferences(); const float LineWidth = Preferences.mLineWidth; - if (IsSelected(LC_LIGHT_SECTION_TARGET)) + if (IsSelected()) { const lcVector4 SelectedColor = lcVector4FromColor(Preferences.mObjectSelectedColor); const lcVector4 FocusedColor = lcVector4FromColor(Preferences.mObjectFocusedColor); diff --git a/common/light.h b/common/light.h index 4ad7f45f..9db0056c 100644 --- a/common/light.h +++ b/common/light.h @@ -81,13 +81,6 @@ public: return mSelected; } - bool IsSelected(quint32 Section) const override - { - Q_UNUSED(Section); - - return mSelected; - } - void SetSelected(bool Selected) override { mSelected = Selected; diff --git a/common/object.h b/common/object.h index 27e189d3..652c9640 100644 --- a/common/object.h +++ b/common/object.h @@ -88,7 +88,6 @@ public: } virtual bool IsSelected() const = 0; - virtual bool IsSelected(quint32 Section) const = 0; virtual void SetSelected(bool Selected) = 0; virtual bool IsFocused() const = 0; virtual bool IsFocused(quint32 Section) const = 0; diff --git a/common/piece.h b/common/piece.h index 476c1fb0..1db62daf 100644 --- a/common/piece.h +++ b/common/piece.h @@ -41,13 +41,6 @@ public: return mSelected; } - bool IsSelected(quint32 Section) const override - { - Q_UNUSED(Section); - - return mSelected; - } - void SetSelected(bool Selected) override { mSelected = Selected;