Skip to content

Commit be6594d

Browse files
authored
QtFred layer dropdowns in object dialogs (#7385)
* layer dropdowns in object dialogs * fix rebase issue * silence Claude
1 parent 46d136c commit be6594d

21 files changed

Lines changed: 336 additions & 49 deletions

qtfred/src/mission/dialogs/JumpNodeEditorDialogModel.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,4 +376,26 @@ bool JumpNodeEditorDialogModel::getHidden() const
376376
return _hidden;
377377
}
378378

379+
SCP_string JumpNodeEditorDialogModel::getLayer() const
380+
{
381+
if (_currentlySelectedNodeIndex < 0)
382+
return "";
383+
int objnum = getSelectedJumpNodeObjnum(_currentlySelectedNodeIndex);
384+
if (objnum < 0)
385+
return "";
386+
return _viewport->getObjectLayerName(objnum);
387+
}
388+
389+
void JumpNodeEditorDialogModel::setLayer(const SCP_string& v)
390+
{
391+
if (_currentlySelectedNodeIndex < 0)
392+
return;
393+
int objnum = getSelectedJumpNodeObjnum(_currentlySelectedNodeIndex);
394+
if (objnum < 0)
395+
return;
396+
_viewport->moveObjectToLayer(objnum, v);
397+
set_modified();
398+
_editor->missionChanged();
399+
}
400+
379401
} // namespace fso::fred::dialogs

qtfred/src/mission/dialogs/JumpNodeEditorDialogModel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class JumpNodeEditorDialogModel : public AbstractDialogModel {
3535
void setHidden(bool v);
3636
bool getHidden() const;
3737

38+
SCP_string getLayer() const;
39+
void setLayer(const SCP_string& v);
40+
3841
signals:
3942
void jumpNodeMarkingChanged();
4043

qtfred/src/mission/dialogs/PropEditorDialogModel.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,35 @@ void PropEditorDialogModel::setFlagState(size_t index, int state) {
280280
}
281281
}
282282

283+
SCP_string PropEditorDialogModel::getLayer() const
284+
{
285+
SCP_string result;
286+
bool first = true;
287+
for (auto obj_idx : _selectedPropObjects) {
288+
if (!query_valid_object(obj_idx) || Objects[obj_idx].type != OBJ_PROP)
289+
continue;
290+
SCP_string layer = _viewport->getObjectLayerName(obj_idx);
291+
if (first) {
292+
result = layer;
293+
first = false;
294+
} else if (result != layer) {
295+
return "";
296+
}
297+
}
298+
return result;
299+
}
300+
301+
void PropEditorDialogModel::setLayer(const SCP_string& layer)
302+
{
303+
for (auto obj_idx : _selectedPropObjects) {
304+
if (!query_valid_object(obj_idx) || Objects[obj_idx].type != OBJ_PROP)
305+
continue;
306+
_viewport->moveObjectToLayer(obj_idx, layer);
307+
}
308+
set_modified();
309+
_editor->missionChanged();
310+
}
311+
283312
void PropEditorDialogModel::selectNextProp() {
284313
if (!hasValidSelection()) {
285314
if (hasAnyPropsInMission()) {

qtfred/src/mission/dialogs/PropEditorDialogModel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class PropEditorDialogModel : public AbstractDialogModel {
2828
void selectNextProp();
2929
void selectPreviousProp();
3030

31+
SCP_string getLayer() const;
32+
void setLayer(const SCP_string& layer);
33+
3134
signals:
3235
void modelDataChanged();
3336

qtfred/src/mission/dialogs/ShipEditor/ShipEditorDialogModel.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,26 @@ void ShipEditorDialogModel::initializeData()
518518
arrivalPaths.clear();
519519
departurePaths.clear();
520520
}
521+
522+
// Compute common layer across all marked ships/players
523+
{
524+
_m_layer = "";
525+
bool first = true;
526+
for (auto* ptr = GET_FIRST(&obj_used_list); ptr != END_OF_LIST(&obj_used_list); ptr = GET_NEXT(ptr)) {
527+
if (((ptr->type == OBJ_SHIP) || (ptr->type == OBJ_START)) &&
528+
ptr->flags[Object::Object_Flags::Marked]) {
529+
SCP_string layer = _viewport->getObjectLayerName(OBJ_INDEX(ptr));
530+
if (first) {
531+
_m_layer = layer;
532+
first = false;
533+
} else if (_m_layer != layer) {
534+
_m_layer = "";
535+
break;
536+
}
537+
}
538+
}
539+
}
540+
521541
modelChanged();
522542
}
523543

@@ -898,6 +918,30 @@ int ShipEditorDialogModel::getTeam() const
898918
return _m_team;
899919
}
900920

921+
SCP_string ShipEditorDialogModel::getLayer() const
922+
{
923+
return _m_layer;
924+
}
925+
926+
void ShipEditorDialogModel::setLayer(const SCP_string& layer)
927+
{
928+
if (_m_layer == layer)
929+
return;
930+
_m_layer = layer;
931+
932+
for (auto objp = GET_FIRST(&obj_used_list); objp != END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp)) {
933+
if (objp->flags[Object::Object_Flags::Marked]) {
934+
if (objp->type == OBJ_SHIP || objp->type == OBJ_START) {
935+
int obj_idx = OBJ_INDEX(objp);
936+
_viewport->moveObjectToLayer(obj_idx, layer);
937+
}
938+
}
939+
}
940+
set_modified();
941+
_editor->missionChanged();
942+
modelChanged();
943+
}
944+
901945
void ShipEditorDialogModel::setCargo(const SCP_string& m_cargo)
902946
{
903947
if (_m_cargo1 == m_cargo)

qtfred/src/mission/dialogs/ShipEditor/ShipEditorDialogModel.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ShipEditorDialogModel : public AbstractDialogModel {
2424
SCP_string _m_callsign;
2525
int _m_ship_class;
2626
int _m_team;
27+
SCP_string _m_layer;
2728
int _m_arrival_location;
2829
int _m_departure_location;
2930
int _m_ai_class;
@@ -94,6 +95,9 @@ class ShipEditorDialogModel : public AbstractDialogModel {
9495
void setTeam(const int);
9596
int getTeam() const;
9697

98+
void setLayer(const SCP_string& layer);
99+
SCP_string getLayer() const;
100+
97101
void setCargo(const SCP_string&);
98102
SCP_string getCargo() const;
99103

qtfred/src/mission/dialogs/WaypointEditorDialogModel.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,44 @@ const SCP_vector<std::pair<SCP_string, int>>& WaypointEditorDialogModel::getWayp
243243
return _waypointPathList;
244244
}
245245

246+
SCP_string WaypointEditorDialogModel::getLayer() const
247+
{
248+
if (_editor->cur_waypoint_list == nullptr)
249+
return "";
250+
251+
int listIndex = find_index_of_waypoint_list(_editor->cur_waypoint_list);
252+
SCP_string result;
253+
bool first = true;
254+
255+
for (auto* ptr = GET_FIRST(&obj_used_list); ptr != END_OF_LIST(&obj_used_list); ptr = GET_NEXT(ptr)) {
256+
if (ptr->type == OBJ_WAYPOINT && calc_waypoint_list_index(ptr->instance) == listIndex) {
257+
SCP_string layer = _viewport->getObjectLayerName(OBJ_INDEX(ptr));
258+
if (first) {
259+
result = layer;
260+
first = false;
261+
} else if (result != layer) {
262+
return "";
263+
}
264+
}
265+
}
266+
return result;
267+
}
268+
269+
void WaypointEditorDialogModel::setLayer(const SCP_string& layer)
270+
{
271+
if (_editor->cur_waypoint_list == nullptr)
272+
return;
273+
274+
int listIndex = find_index_of_waypoint_list(_editor->cur_waypoint_list);
275+
for (auto* ptr = GET_FIRST(&obj_used_list); ptr != END_OF_LIST(&obj_used_list); ptr = GET_NEXT(ptr)) {
276+
if (ptr->type == OBJ_WAYPOINT && calc_waypoint_list_index(ptr->instance) == listIndex) {
277+
_viewport->moveObjectToLayer(OBJ_INDEX(ptr), layer);
278+
}
279+
}
280+
set_modified();
281+
_editor->missionChanged();
282+
}
283+
246284
bool WaypointEditorDialogModel::getNoDrawLines() const { return _noDrawLines; }
247285
void WaypointEditorDialogModel::setNoDrawLines(bool val) { modify(_noDrawLines, val); }
248286

qtfred/src/mission/dialogs/WaypointEditorDialogModel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ class WaypointEditorDialogModel: public AbstractDialogModel {
3131
bool isEnabled() const;
3232
const SCP_vector<std::pair<SCP_string, int>>& getWaypointPathList() const;
3333

34+
SCP_string getLayer() const;
35+
void setLayer(const SCP_string& layer);
36+
3437
signals:
3538
void waypointPathMarkingChanged();
3639

qtfred/src/ui/dialogs/JumpNodeEditorDialog.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void JumpNodeEditorDialog::updateJumpNodeListComboBox()
5656
void JumpNodeEditorDialog::updateUi()
5757
{
5858
util::SignalBlockers blockers(this);
59-
59+
6060
ui->nameLineEdit->setText(QString::fromStdString(_model->getName()));
6161
ui->displayNameLineEdit->setText(QString::fromStdString(_model->getDisplayName()));
6262
ui->modelFileLineEdit->setText(QString::fromStdString(_model->getModelFilename()));
@@ -67,6 +67,12 @@ void JumpNodeEditorDialog::updateUi()
6767
ui->alphaSpinBox->setValue(_model->getColorA());
6868

6969
ui->hiddenByDefaultCheckBox->setChecked(_model->getHidden());
70+
71+
ui->layerCombo->clear();
72+
for (const auto& name : _viewport->getLayerNames()) {
73+
ui->layerCombo->addItem(QString::fromStdString(name), QString::fromStdString(name));
74+
}
75+
ui->layerCombo->setCurrentIndex(ui->layerCombo->findData(QString::fromStdString(_model->getLayer())));
7076
}
7177

7278
void JumpNodeEditorDialog::enableOrDisableControls()
@@ -81,6 +87,7 @@ void JumpNodeEditorDialog::enableOrDisableControls()
8187
ui->blueSpinBox->setEnabled(enable);
8288
ui->alphaSpinBox->setEnabled(enable);
8389
ui->hiddenByDefaultCheckBox->setEnabled(enable);
90+
ui->layerCombo->setEnabled(enable);
8491
}
8592

8693
void JumpNodeEditorDialog::on_selectJumpNodeComboBox_currentIndexChanged(int index)
@@ -131,4 +138,11 @@ void JumpNodeEditorDialog::on_hiddenByDefaultCheckBox_toggled(bool checked)
131138
_model->setHidden(checked);
132139
}
133140

134-
} // namespace fso::fred::dialogs
141+
void JumpNodeEditorDialog::on_layerCombo_currentIndexChanged(int index)
142+
{
143+
if (index < 0)
144+
return;
145+
_model->setLayer(ui->layerCombo->itemData(index).toString().toUtf8().constData());
146+
}
147+
148+
} // namespace fso::fred::dialogs

qtfred/src/ui/dialogs/JumpNodeEditorDialog.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class JumpNodeEditorDialog : public QDialog {
2626
void on_blueSpinBox_valueChanged(int value);
2727
void on_alphaSpinBox_valueChanged(int value);
2828
void on_hiddenByDefaultCheckBox_toggled(bool checked);
29+
void on_layerCombo_currentIndexChanged(int index);
2930

3031
private: // NOLINT(readability-redundant-access-specifiers)
3132
EditorViewport* _viewport;

0 commit comments

Comments
 (0)