1 #include "lc_global.h"
2 #include "lc_previewwidget.h"
3 #include "pieceinf.h"
4 #include "piece.h"
5 #include "project.h"
6 #include "lc_model.h"
7 #include "lc_library.h"
8 #include "lc_viewwidget.h"
9 #include "lc_view.h"
10
lcPreviewDockWidget(QMainWindow * Parent)11 lcPreviewDockWidget::lcPreviewDockWidget(QMainWindow* Parent)
12 : QMainWindow(Parent)
13 {
14 mPreview = new lcPreview();
15 mViewWidget = new lcViewWidget(nullptr, mPreview);
16 setCentralWidget(mViewWidget);
17 setMinimumSize(200, 200);
18
19 mLockAction = new QAction(QIcon(":/resources/action_preview_unlocked.png"),tr("Lock Preview"), this);
20 mLockAction->setCheckable(true);
21 mLockAction->setChecked(false);
22 mLockAction->setShortcut(tr("Ctrl+L"));
23 connect(mLockAction, SIGNAL(triggered()), this, SLOT(SetPreviewLock()));
24 SetPreviewLock();
25
26 mLabel = new QLabel();
27
28 mToolBar = addToolBar(tr("Toolbar"));
29 mToolBar->setObjectName("Toolbar");
30 mToolBar->setStatusTip(tr("Preview Toolbar"));
31 mToolBar->setMovable(false);
32 mToolBar->addAction(mLockAction);
33 mToolBar->addSeparator();
34 mToolBar->addWidget(mLabel);
35 if (mToolBar->isHidden())
36 mToolBar->show();
37 }
38
SetCurrentPiece(const QString & PartType,int ColorCode)39 bool lcPreviewDockWidget::SetCurrentPiece(const QString& PartType, int ColorCode)
40 {
41 if (mLockAction->isChecked())
42 return true;
43
44 mLabel->setText(tr("Loading..."));
45 if (mPreview->SetCurrentPiece(PartType, ColorCode))
46 {
47 mLabel->setText(mPreview->GetDescription());
48 return true;
49 }
50 return false;
51 }
52
UpdatePreview()53 void lcPreviewDockWidget::UpdatePreview()
54 {
55 mPreview->UpdatePreview();
56 }
57
ClearPreview()58 void lcPreviewDockWidget::ClearPreview()
59 {
60 if (mPreview->GetModel()->GetPieces().GetSize())
61 mPreview->ClearPreview();
62
63 mLabel->setText(QString());
64 }
65
SetPreviewLock()66 void lcPreviewDockWidget::SetPreviewLock()
67 {
68 bool Locked = mLockAction->isChecked();
69
70 if (Locked && mPreview->GetModel()->GetPieces().IsEmpty())
71 {
72 mLockAction->setChecked(false);
73 return;
74 }
75
76 QIcon LockIcon(Locked ? ":/resources/action_preview_locked.png" : ":/resources/action_preview_unlocked.png");
77 QString State(Locked ? tr("Unlock") : tr("Lock"));
78 QString StatusTip(tr("%1 the preview display to %2 updates").arg(State).arg(Locked ? "enable" : "disable"));
79
80 mLockAction->setToolTip(tr("%1 Preview").arg(State));
81 mLockAction->setIcon(LockIcon);
82 mLockAction->setStatusTip(StatusTip);
83 }
84
lcPreview()85 lcPreview::lcPreview()
86 : lcView(lcViewType::Preview, nullptr), mLoader(new Project(true))
87 {
88 mLoader->SetActiveModel(0);
89 mModel = mLoader->GetActiveModel();
90 }
91
SetCurrentPiece(const QString & PartType,int ColorCode)92 bool lcPreview::SetCurrentPiece(const QString& PartType, int ColorCode)
93 {
94 lcPiecesLibrary* Library = lcGetPiecesLibrary();
95 PieceInfo* Info = Library->FindPiece(PartType.toLatin1().constData(), nullptr, false, false);
96
97 if (Info)
98 {
99 for (lcPiece* ModelPiece : mModel->GetPieces())
100 {
101 if (Info == ModelPiece->mPieceInfo)
102 {
103 int ModelColorCode = ModelPiece->GetColorCode();
104 if (ModelColorCode == ColorCode)
105 return true;
106 }
107 }
108
109 mIsModel = Info->IsModel();
110 mDescription = Info->m_strDescription;
111
112 mModel->SelectAllPieces();
113 mModel->DeleteSelectedObjects();
114
115 Library->LoadPieceInfo(Info, false, true);
116 Library->WaitForLoadQueue();
117
118 mModel->SetPreviewPieceInfo(Info, lcGetColorIndex(ColorCode));
119
120 Library->ReleasePieceInfo(Info);
121 }
122 else
123 {
124 QString ModelPath = QString("%1/%2").arg(QDir::currentPath()).arg(PartType);
125
126 if (!mLoader->Load(ModelPath, false))
127 return false;
128
129 mLoader->SetActiveModel(0);
130 lcGetPiecesLibrary()->RemoveTemporaryPieces();
131 mModel = mLoader->GetActiveModel();
132 if (!mModel->GetProperties().mDescription.isEmpty())
133 mDescription = mModel->GetProperties().mDescription;
134 else
135 mDescription = PartType;
136 mIsModel = true;
137 }
138
139 ZoomExtents();
140
141 return true;
142 }
143
ClearPreview()144 void lcPreview::ClearPreview()
145 {
146 mLoader = std::unique_ptr<Project>(new Project(true/*IsPreview*/));
147 mLoader->SetActiveModel(0);
148 mModel = mLoader->GetActiveModel();
149 lcGetPiecesLibrary()->UnloadUnusedParts();
150 Redraw();
151 }
152
UpdatePreview()153 void lcPreview::UpdatePreview()
154 {
155 QString PartType;
156 int ColorCode = -1;
157
158 for (lcPiece* ModelPiece : mModel->GetPieces())
159 {
160 if (ModelPiece->mPieceInfo)
161 {
162 PartType = ModelPiece->mPieceInfo->mFileName;
163 ColorCode = ModelPiece->GetColorCode();
164 break;
165 }
166 }
167
168 ClearPreview();
169
170 if (!PartType.isEmpty() && ColorCode > -1)
171 SetCurrentPiece(PartType, ColorCode);
172 }
173