forked from Mirrors/openclonk
Qt Editor: Fix some crashes and errors when switching between object and definition selection
parent
2e412d1668
commit
ec6998e530
|
@ -34,7 +34,12 @@ void C4ConsoleQtDefinitionListModel::DefListNode::SortByName()
|
||||||
[](const std::unique_ptr<DefListNode> & a, const std::unique_ptr<DefListNode> & b) -> bool
|
[](const std::unique_ptr<DefListNode> & a, const std::unique_ptr<DefListNode> & b) -> bool
|
||||||
{ return a->name.Compare(b->name) < 0; });
|
{ return a->name.Compare(b->name) < 0; });
|
||||||
// sort children recursively
|
// sort children recursively
|
||||||
for (auto & child : items) child->SortByName();
|
int32_t idx = 0;
|
||||||
|
for (auto & child : items)
|
||||||
|
{
|
||||||
|
child->SortByName();
|
||||||
|
child->idx = idx++; // re-assign indices to reflect new sorting
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Defintion view model */
|
/* Defintion view model */
|
||||||
|
@ -110,6 +115,7 @@ void C4ConsoleQtDefinitionListModel::ReInit()
|
||||||
root.reset(tmp.release());
|
root.reset(tmp.release());
|
||||||
new_root = root.get();
|
new_root = root.get();
|
||||||
}
|
}
|
||||||
|
root->parent = nullptr;
|
||||||
// Sort everything by display name (recursively)
|
// Sort everything by display name (recursively)
|
||||||
root->SortByName();
|
root->SortByName();
|
||||||
// Model reset to invalidate all indexes
|
// Model reset to invalidate all indexes
|
||||||
|
@ -189,6 +195,7 @@ QModelIndex C4ConsoleQtDefinitionListModel::parent(const QModelIndex &index) con
|
||||||
|
|
||||||
QModelIndex C4ConsoleQtDefinitionListModel::GetModelIndexByItem(C4Def *def) const
|
QModelIndex C4ConsoleQtDefinitionListModel::GetModelIndexByItem(C4Def *def) const
|
||||||
{
|
{
|
||||||
|
LogF("looking for def %s", def->GetName());
|
||||||
// Just search tree
|
// Just search tree
|
||||||
DefListNode *node = root.get();
|
DefListNode *node = root.get();
|
||||||
while (node)
|
while (node)
|
||||||
|
@ -212,7 +219,13 @@ QModelIndex C4ConsoleQtDefinitionListModel::GetModelIndexByItem(C4Def *def) cons
|
||||||
}
|
}
|
||||||
// Def found in tree?
|
// Def found in tree?
|
||||||
if (node)
|
if (node)
|
||||||
|
{
|
||||||
|
LogF("found at %d", (int)node->idx);
|
||||||
return createIndex(node->idx, 0, node);
|
return createIndex(node->idx, 0, node);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
LogF("not found");
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,6 @@ class C4ConsoleQtDefinitionListModel : public QAbstractItemModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
class QItemSelectionModel *selection_model;
|
|
||||||
QTreeView *view;
|
|
||||||
mutable int32_t last_row_count;
|
mutable int32_t last_row_count;
|
||||||
|
|
||||||
// Tree structure of definition list
|
// Tree structure of definition list
|
||||||
|
|
|
@ -238,7 +238,9 @@ C4ConsoleQtNewScenarioDlg::C4ConsoleQtNewScenarioDlg(class QMainWindow *parent_w
|
||||||
adjustSize();
|
adjustSize();
|
||||||
setMinimumSize(size());
|
setMinimumSize(size());
|
||||||
ui.filenameEdit->setText(::Config.General.UserDataPath);
|
ui.filenameEdit->setText(::Config.General.UserDataPath);
|
||||||
|
QItemSelectionModel *m = ui.definitionTreeView->selectionModel();
|
||||||
ui.definitionTreeView->setModel(&def_file_model);
|
ui.definitionTreeView->setModel(&def_file_model);
|
||||||
|
delete m;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool C4ConsoleQtNewScenarioDlg::SaveScenario(C4Group &grp)
|
bool C4ConsoleQtNewScenarioDlg::SaveScenario(C4Group &grp)
|
||||||
|
|
|
@ -855,6 +855,7 @@ QWidget *C4PropertyDelegateEnum::CreateEditor(const C4PropertyDelegateFactory *p
|
||||||
if (!editor->updating) this->UpdateOptionIndex(editor, newval); });
|
if (!editor->updating) this->UpdateOptionIndex(editor, newval); });
|
||||||
editor->updating = false;
|
editor->updating = false;
|
||||||
editor->option_box->setModel(CreateOptionModel());
|
editor->option_box->setModel(CreateOptionModel());
|
||||||
|
editor->option_box->model()->setParent(editor->option_box);
|
||||||
return editor;
|
return editor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -510,14 +510,20 @@ bool C4ConsoleGUIState::CreateConsoleWindow(C4AbstractApp *app)
|
||||||
// View models
|
// View models
|
||||||
property_model.reset(new C4ConsoleQtPropListModel(property_delegate_factory.get()));
|
property_model.reset(new C4ConsoleQtPropListModel(property_delegate_factory.get()));
|
||||||
property_delegate_factory->SetPropertyModel(property_model.get());
|
property_delegate_factory->SetPropertyModel(property_model.get());
|
||||||
|
QItemSelectionModel *m = ui.propertyTable->selectionModel();
|
||||||
ui.propertyTable->setModel(property_model.get());
|
ui.propertyTable->setModel(property_model.get());
|
||||||
|
delete m;
|
||||||
property_model->SetSelectionModel(ui.propertyTable->selectionModel());
|
property_model->SetSelectionModel(ui.propertyTable->selectionModel());
|
||||||
object_list_model.reset(new C4ConsoleQtObjectListModel());
|
object_list_model.reset(new C4ConsoleQtObjectListModel());
|
||||||
|
m = ui.objectListView->selectionModel();
|
||||||
ui.objectListView->setModel(object_list_model.get());
|
ui.objectListView->setModel(object_list_model.get());
|
||||||
|
delete m;
|
||||||
window->connect(ui.objectListView->selectionModel(), &QItemSelectionModel::selectionChanged, window.get(), &C4ConsoleQtMainWindow::OnObjectListSelectionChanged);
|
window->connect(ui.objectListView->selectionModel(), &QItemSelectionModel::selectionChanged, window.get(), &C4ConsoleQtMainWindow::OnObjectListSelectionChanged);
|
||||||
definition_list_model.reset(new C4ConsoleQtDefinitionListModel());
|
definition_list_model.reset(new C4ConsoleQtDefinitionListModel());
|
||||||
property_delegate_factory->SetDefinitionListModel(definition_list_model.get());
|
property_delegate_factory->SetDefinitionListModel(definition_list_model.get());
|
||||||
|
m = ui.creatorTreeView->selectionModel();
|
||||||
ui.creatorTreeView->setModel(definition_list_model.get());
|
ui.creatorTreeView->setModel(definition_list_model.get());
|
||||||
|
delete m;
|
||||||
window->connect(ui.creatorTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, window.get(), &C4ConsoleQtMainWindow::OnCreatorSelectionChanged);
|
window->connect(ui.creatorTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, window.get(), &C4ConsoleQtMainWindow::OnCreatorSelectionChanged);
|
||||||
window->connect(ui.creatorTreeView->selectionModel(), &QItemSelectionModel::currentChanged, window.get(), &C4ConsoleQtMainWindow::OnCreatorCurrentChanged);
|
window->connect(ui.creatorTreeView->selectionModel(), &QItemSelectionModel::currentChanged, window.get(), &C4ConsoleQtMainWindow::OnCreatorCurrentChanged);
|
||||||
window->connect(ui.propertyTable->selectionModel(), &QItemSelectionModel::currentChanged, window.get(), [this]() {
|
window->connect(ui.propertyTable->selectionModel(), &QItemSelectionModel::currentChanged, window.get(), [this]() {
|
||||||
|
@ -745,7 +751,7 @@ void C4ConsoleGUIState::OnCreatorSelectionChanged(const QItemSelection & selecte
|
||||||
for (const QModelIndex &item : deselected_indexes)
|
for (const QModelIndex &item : deselected_indexes)
|
||||||
if ((def = definition_list_model->GetDefByModelIndex(item)))
|
if ((def = definition_list_model->GetDefByModelIndex(item)))
|
||||||
::Console.EditCursor.RemoveFromSelection(def);
|
::Console.EditCursor.RemoveFromSelection(def);
|
||||||
auto selected_indexes = deselected.indexes();
|
auto selected_indexes = selected.indexes();
|
||||||
for (const QModelIndex &item : selected_indexes)
|
for (const QModelIndex &item : selected_indexes)
|
||||||
if ((def = definition_list_model->GetDefByModelIndex(item)))
|
if ((def = definition_list_model->GetDefByModelIndex(item)))
|
||||||
::Console.EditCursor.AddToSelection(def);
|
::Console.EditCursor.AddToSelection(def);
|
||||||
|
@ -753,17 +759,7 @@ void C4ConsoleGUIState::OnCreatorSelectionChanged(const QItemSelection & selecte
|
||||||
// Switching to def selection mode: Remove any non-defs from selection
|
// Switching to def selection mode: Remove any non-defs from selection
|
||||||
if (!selected.empty())
|
if (!selected.empty())
|
||||||
{
|
{
|
||||||
C4EditCursorSelection sel_copy = ::Console.EditCursor.GetSelection();
|
ui.objectListView->selectionModel()->clearSelection();
|
||||||
for (C4Value & v : sel_copy)
|
|
||||||
{
|
|
||||||
C4PropList *p = v.getPropList();
|
|
||||||
if (!p) continue;
|
|
||||||
if (p->GetObject() || !p->GetDef())
|
|
||||||
{
|
|
||||||
QModelIndex desel_index = object_list_model->GetModelIndexByItem(p);
|
|
||||||
if (desel_index.isValid()) ui.objectListView->selectionModel()->select(desel_index, QItemSelectionModel::Deselect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ...and switch to creator mode
|
// ...and switch to creator mode
|
||||||
::Console.EditCursor.SetMode(C4CNS_ModeCreateObject);
|
::Console.EditCursor.SetMode(C4CNS_ModeCreateObject);
|
||||||
}
|
}
|
||||||
|
@ -784,18 +780,7 @@ void C4ConsoleGUIState::OnObjectListSelectionChanged(const QItemSelection & sele
|
||||||
// Switching to object/effect selection mode: Remove any non-objects/effects from selection
|
// Switching to object/effect selection mode: Remove any non-objects/effects from selection
|
||||||
if (!selected.empty())
|
if (!selected.empty())
|
||||||
{
|
{
|
||||||
C4EditCursorSelection sel_copy = ::Console.EditCursor.GetSelection();
|
ui.creatorTreeView->selectionModel()->clearSelection();
|
||||||
for (C4Value & v : sel_copy)
|
|
||||||
{
|
|
||||||
C4PropList *p = v.getPropList();
|
|
||||||
if (!p) continue;
|
|
||||||
C4Def *def = p->GetDef();
|
|
||||||
if (def && !p->GetObject() && !p->GetEffect())
|
|
||||||
{
|
|
||||||
QModelIndex desel_index = definition_list_model->GetModelIndexByItem(def);
|
|
||||||
if (desel_index.isValid()) ui.creatorTreeView->selectionModel()->select(desel_index, QItemSelectionModel::Deselect);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// ...and switch to editing mode
|
// ...and switch to editing mode
|
||||||
::Console.EditCursor.SetMode(C4CNS_ModeEdit);
|
::Console.EditCursor.SetMode(C4CNS_ModeEdit);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue