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