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
|
||||
{ return a->name.Compare(b->name) < 0; });
|
||||
// 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 */
|
||||
|
@ -110,6 +115,7 @@ void C4ConsoleQtDefinitionListModel::ReInit()
|
|||
root.reset(tmp.release());
|
||||
new_root = root.get();
|
||||
}
|
||||
root->parent = nullptr;
|
||||
// Sort everything by display name (recursively)
|
||||
root->SortByName();
|
||||
// Model reset to invalidate all indexes
|
||||
|
@ -189,6 +195,7 @@ QModelIndex C4ConsoleQtDefinitionListModel::parent(const QModelIndex &index) con
|
|||
|
||||
QModelIndex C4ConsoleQtDefinitionListModel::GetModelIndexByItem(C4Def *def) const
|
||||
{
|
||||
LogF("looking for def %s", def->GetName());
|
||||
// Just search tree
|
||||
DefListNode *node = root.get();
|
||||
while (node)
|
||||
|
@ -212,7 +219,13 @@ QModelIndex C4ConsoleQtDefinitionListModel::GetModelIndexByItem(C4Def *def) cons
|
|||
}
|
||||
// Def found in tree?
|
||||
if (node)
|
||||
{
|
||||
LogF("found at %d", (int)node->idx);
|
||||
return createIndex(node->idx, 0, node);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogF("not found");
|
||||
return QModelIndex();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,8 +30,6 @@ class C4ConsoleQtDefinitionListModel : public QAbstractItemModel
|
|||
{
|
||||
Q_OBJECT
|
||||
|
||||
class QItemSelectionModel *selection_model;
|
||||
QTreeView *view;
|
||||
mutable int32_t last_row_count;
|
||||
|
||||
// Tree structure of definition list
|
||||
|
|
|
@ -238,7 +238,9 @@ C4ConsoleQtNewScenarioDlg::C4ConsoleQtNewScenarioDlg(class QMainWindow *parent_w
|
|||
adjustSize();
|
||||
setMinimumSize(size());
|
||||
ui.filenameEdit->setText(::Config.General.UserDataPath);
|
||||
QItemSelectionModel *m = ui.definitionTreeView->selectionModel();
|
||||
ui.definitionTreeView->setModel(&def_file_model);
|
||||
delete m;
|
||||
}
|
||||
|
||||
bool C4ConsoleQtNewScenarioDlg::SaveScenario(C4Group &grp)
|
||||
|
|
|
@ -855,6 +855,7 @@ QWidget *C4PropertyDelegateEnum::CreateEditor(const C4PropertyDelegateFactory *p
|
|||
if (!editor->updating) this->UpdateOptionIndex(editor, newval); });
|
||||
editor->updating = false;
|
||||
editor->option_box->setModel(CreateOptionModel());
|
||||
editor->option_box->model()->setParent(editor->option_box);
|
||||
return editor;
|
||||
}
|
||||
|
||||
|
|
|
@ -510,14 +510,20 @@ bool C4ConsoleGUIState::CreateConsoleWindow(C4AbstractApp *app)
|
|||
// View models
|
||||
property_model.reset(new C4ConsoleQtPropListModel(property_delegate_factory.get()));
|
||||
property_delegate_factory->SetPropertyModel(property_model.get());
|
||||
QItemSelectionModel *m = ui.propertyTable->selectionModel();
|
||||
ui.propertyTable->setModel(property_model.get());
|
||||
delete m;
|
||||
property_model->SetSelectionModel(ui.propertyTable->selectionModel());
|
||||
object_list_model.reset(new C4ConsoleQtObjectListModel());
|
||||
m = ui.objectListView->selectionModel();
|
||||
ui.objectListView->setModel(object_list_model.get());
|
||||
delete m;
|
||||
window->connect(ui.objectListView->selectionModel(), &QItemSelectionModel::selectionChanged, window.get(), &C4ConsoleQtMainWindow::OnObjectListSelectionChanged);
|
||||
definition_list_model.reset(new C4ConsoleQtDefinitionListModel());
|
||||
property_delegate_factory->SetDefinitionListModel(definition_list_model.get());
|
||||
m = ui.creatorTreeView->selectionModel();
|
||||
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::currentChanged, window.get(), &C4ConsoleQtMainWindow::OnCreatorCurrentChanged);
|
||||
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)
|
||||
if ((def = definition_list_model->GetDefByModelIndex(item)))
|
||||
::Console.EditCursor.RemoveFromSelection(def);
|
||||
auto selected_indexes = deselected.indexes();
|
||||
auto selected_indexes = selected.indexes();
|
||||
for (const QModelIndex &item : selected_indexes)
|
||||
if ((def = definition_list_model->GetDefByModelIndex(item)))
|
||||
::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
|
||||
if (!selected.empty())
|
||||
{
|
||||
C4EditCursorSelection sel_copy = ::Console.EditCursor.GetSelection();
|
||||
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);
|
||||
}
|
||||
}
|
||||
ui.objectListView->selectionModel()->clearSelection();
|
||||
// ...and switch to creator mode
|
||||
::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
|
||||
if (!selected.empty())
|
||||
{
|
||||
C4EditCursorSelection sel_copy = ::Console.EditCursor.GetSelection();
|
||||
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);
|
||||
}
|
||||
}
|
||||
ui.creatorTreeView->selectionModel()->clearSelection();
|
||||
// ...and switch to editing mode
|
||||
::Console.EditCursor.SetMode(C4CNS_ModeEdit);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue