Qt Editor: Fix some crashes and errors when switching between object and definition selection

qteditor
Sven Eberhardt 2016-06-17 01:26:38 -04:00
parent 2e412d1668
commit ec6998e530
5 changed files with 27 additions and 28 deletions

View File

@ -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();
}
}

View File

@ -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

View File

@ -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)

View File

@ -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;
}

View File

@ -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);
}
@ -782,20 +778,9 @@ void C4ConsoleGUIState::OnObjectListSelectionChanged(const QItemSelection & sele
::Console.EditCursor.AddToSelection(p);
::Console.EditCursor.OnSelectionChanged(true);
// 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();
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);
}