void ezQtTypeWidget::UpdatePropertyMetaState() { ezPropertyMetaState* pMeta = ezPropertyMetaState::GetSingleton(); ezMap<ezString, ezPropertyUiState> PropertyStates; pMeta->GetPropertyState(m_Items, PropertyStates); for (auto it = m_PropertyWidgets.GetIterator(); it.IsValid(); ++it) { auto itData = PropertyStates.Find(it.Key()); const bool bReadOnly = (it.Value().m_pWidget->GetProperty()->GetFlags().IsSet(ezPropertyFlags::ReadOnly)) || (it.Value().m_pWidget->GetProperty()->GetAttributeByType<ezReadOnlyAttribute>() != nullptr); ezPropertyUiState::Visibility state = ezPropertyUiState::Default; bool bIsDefaultValue = true; if (itData.IsValid()) { state = itData.Value().m_Visibility; bIsDefaultValue = itData.Value().m_bIsDefaultValue; } if (it.Value().m_pLabel) { it.Value().m_pLabel->setVisible(state != ezPropertyUiState::Invisible); it.Value().m_pLabel->setEnabled(!bReadOnly && state != ezPropertyUiState::Disabled); it.Value().m_pLabel->SetIsDefault(bIsDefaultValue); if (itData.IsValid() && !itData.Value().m_sNewLabelText.IsEmpty()) { const char* szLabelText = itData.Value().m_sNewLabelText; it.Value().m_pLabel->setText(QString::fromUtf8(ezTranslate(szLabelText))); it.Value().m_pLabel->setToolTip(QString::fromUtf8(ezTranslateTooltip(szLabelText))); } else { bool temp = ezTranslatorLogMissing::s_bActive; ezTranslatorLogMissing::s_bActive = false; // unless there is a specific override, we want to show the exact property name // also we don't want to force people to add translations for each and every property name it.Value().m_pLabel->setText(QString::fromUtf8(ezTranslate(it.Value().m_sOriginalLabelText.GetData()))); // though do try to get a tooltip for the property // this will not log an error message, if the string is not translated it.Value().m_pLabel->setToolTip(QString::fromUtf8(ezTranslateTooltip(it.Value().m_sOriginalLabelText.GetData()))); ezTranslatorLogMissing::s_bActive = temp; } } it.Value().m_pWidget->setVisible(state != ezPropertyUiState::Invisible); it.Value().m_pWidget->setEnabled(!bReadOnly && state != ezPropertyUiState::Disabled); it.Value().m_pWidget->SetIsDefault(bIsDefaultValue); } }
void ezQtPropertyWidget::PropertyChangedHandler(const ezPropertyEvent& ed) { if (m_bUndead) return; switch (ed.m_Type) { case ezPropertyEvent::Type::SingleValueChanged: { ezStringBuilder sTemp; sTemp.Format("Change Property '{0}'", ezTranslate(ed.m_pProperty->GetPropertyName())); m_pObjectAccessor->StartTransaction(sTemp); ezStatus res; for (const auto& sel : *ed.m_pItems) { res = m_pObjectAccessor->SetValue(sel.m_pObject, ed.m_pProperty, ed.m_Value, sel.m_Index); if (res.m_Result.Failed()) break; } if (res.m_Result.Failed()) m_pObjectAccessor->CancelTransaction(); else m_pObjectAccessor->FinishTransaction(); ezQtUiServices::GetSingleton()->MessageBoxStatus(res, "Changing the property failed."); } break; case ezPropertyEvent::Type::BeginTemporary: { ezStringBuilder sTemp; sTemp.Format("Change Property '{0}'", ezTranslate(ed.m_pProperty->GetPropertyName())); m_pObjectAccessor->BeginTemporaryCommands(sTemp); } break; case ezPropertyEvent::Type::EndTemporary: { m_pObjectAccessor->FinishTemporaryCommands(); } break; case ezPropertyEvent::Type::CancelTemporary: { m_pObjectAccessor->CancelTemporaryCommands(); } break; } }
void ezQtPropertyTypeWidget::OnInit() { if (m_pGroup) { m_pGroup->SetTitle(ezTranslate(m_pProp->GetPropertyName())); m_pGrid->SetCollapseState(m_pGroup); connect(m_pGroup, &ezQtGroupBoxBase::CollapseStateChanged, m_pGrid, &ezQtPropertyGridWidget::OnCollapseStateChanged); } }
void ezQtPropertyPointerWidget::OnInit() { m_pGroup->SetTitle(ezTranslate(m_pProp->GetPropertyName())); m_pGrid->SetCollapseState(m_pGroup); connect(m_pGroup, &ezQtGroupBoxBase::CollapseStateChanged, m_pGrid, &ezQtPropertyGridWidget::OnCollapseStateChanged); // Add Buttons auto pAttr = m_pProp->GetAttributeByType<ezContainerAttribute>(); m_pAddButton->setVisible(!pAttr || pAttr->CanAdd()); m_pDeleteButton->setVisible(!pAttr || pAttr->CanDelete()); m_pAddButton->Init(m_pGrid, m_pObjectAccessor, m_pType, m_pProp); m_pGrid->GetDocument()->GetObjectManager()->m_StructureEvents.AddEventHandler( ezMakeDelegate(&ezQtPropertyPointerWidget::StructureEventHandler, this)); }
void ezQtPropertyContainerWidget::OnInit() { m_pGroup->SetTitle(ezTranslate(m_pProp->GetPropertyName())); const ezContainerAttribute* pArrayAttr = m_pProp->GetAttributeByType<ezContainerAttribute>(); if (!pArrayAttr || pArrayAttr->CanAdd()) { m_pAddButton = new ezQtAddSubElementButton(); m_pAddButton->Init(m_pGrid, m_pObjectAccessor, m_pType, m_pProp); m_pGroup->GetHeader()->layout()->addWidget(m_pAddButton); } m_pGrid->SetCollapseState(m_pGroup); connect(m_pGroup, &ezQtGroupBoxBase::CollapseStateChanged, m_pGrid, &ezQtPropertyGridWidget::OnCollapseStateChanged); }
void ezQtPropertyTypeContainerWidget::UpdateElement(ezUInt32 index) { Element& elem = m_Elements[index]; ezHybridArray<ezPropertySelection, 8> SubItems; // To be in line with all other ezQtPropertyWidget the container element will // be given a selection in the form of this is the parent object, this is the property and in this // specific case this is the index you are working on. So SubItems only decorates the items with the correct index. for (const auto& item : m_Items) { ezPropertySelection sel; sel.m_pObject = item.m_pObject; sel.m_Index = m_Keys[index]; SubItems.PushBack(sel); } { // To get the correct name we actually need to resolve the selection to the actual objects // they are pointing to. ezHybridArray<ezPropertySelection, 8> ResolvedObjects; for (const auto& item : SubItems) { ezUuid ObjectGuid = m_pObjectAccessor->Get<ezUuid>(item.m_pObject, m_pProp, item.m_Index); ezPropertySelection sel; sel.m_pObject = m_pObjectAccessor->GetObject(ObjectGuid); ResolvedObjects.PushBack(sel); } const ezRTTI* pCommonType = ezQtPropertyWidget::GetCommonBaseType(ResolvedObjects); { // Label ezStringBuilder sTitle; sTitle.Format("[{0}] - {1}", m_Keys[index].ConvertTo<ezString>(), ezTranslate(pCommonType->GetTypeName())); elem.m_pSubGroup->SetTitle(sTitle); } { // Icon ezStringBuilder sIconName; sIconName.Set(":/TypeIcons/", pCommonType->GetTypeName()); elem.m_pSubGroup->SetIcon(ezQtUiServices::GetCachedIconResource(sIconName.GetData())); } } m_pGrid->SetCollapseState(elem.m_pSubGroup); elem.m_pWidget->SetSelection(SubItems); }
ezQtLogPanel::ezQtLogPanel() : ezQtApplicationPanel("Panel.Log") , m_SingletonRegistrar(this) { setupUi(this); setWindowIcon(ezQtUiServices::GetCachedIconResource(":/GuiFoundation/Icons/Log.png")); setWindowTitle(QString::fromUtf8(ezTranslate("Panel.Log"))); EditorLog->GetSearchWidget()->setPlaceholderText(QStringLiteral("Search Editor Log")); EngineLog->GetSearchWidget()->setPlaceholderText(QStringLiteral("Search Engine Log")); ezGlobalLog::AddLogWriter(ezMakeDelegate(&ezQtLogPanel::LogWriter, this)); ezEditorEngineProcessConnection::s_Events.AddEventHandler(ezMakeDelegate(&ezQtLogPanel::EngineProcessMsgHandler, this)); QSettings Settings; Settings.beginGroup(QLatin1String("LogPanel")); { splitter->restoreState(Settings.value("Splitter", splitter->saveState()).toByteArray()); } Settings.endGroup(); }
ezQtShortcutEditorDlg::ezQtShortcutEditorDlg(QWidget* parent) : QDialog(parent) { setupUi(this); EZ_VERIFY(connect(Shortcuts, SIGNAL(itemSelectionChanged()), this, SLOT(SlotSelectionChanged())) != nullptr, "signal/slot connection failed"); m_iSelectedAction = -1; KeyEditor->setEnabled(false); ezMap<ezString, ezMap<ezString, ezInt32>> SortedItems; { auto itActions = ezActionManager::GetActionIterator(); while (itActions.IsValid()) { if (itActions.Value()->m_Type == ezActionType::Action) { SortedItems[itActions.Value()->m_sCategoryPath][itActions.Value()->m_sActionName] = m_ActionDescs.GetCount(); m_ActionDescs.PushBack(itActions.Value()); } itActions.Next(); } } { ezQtScopedBlockSignals bs(Shortcuts); ezQtScopedUpdatesDisabled ud(Shortcuts); Shortcuts->setAlternatingRowColors(true); Shortcuts->setEditTriggers(QAbstractItemView::EditTrigger::NoEditTriggers); Shortcuts->setExpandsOnDoubleClick(true); ezStringBuilder sTemp; for (auto it = SortedItems.GetIterator(); it.IsValid(); ++it) { auto pParent = new QTreeWidgetItem(); pParent->setData(0, Qt::DisplayRole, it.Key().GetData()); Shortcuts->addTopLevelItem(pParent); pParent->setExpanded(true); pParent->setFirstColumnSpanned(true); pParent->setFlags(Qt::ItemFlag::ItemIsEnabled); QFont font = pParent->font(0); font.setBold(true); pParent->setFont(0, font); for (auto it2 : it.Value()) { const auto& item = m_ActionDescs[it2.Value()]; auto pItem = new QTreeWidgetItem(pParent); /// \todo Instead of removing &, replace it by underlined text (requires formatted text output) sTemp = ezTranslate(item->m_sActionName); sTemp.ReplaceAll("&", ""); pItem->setData(0, Qt::UserRole, it2.Value()); pItem->setData(0, Qt::DisplayRole, item->m_sActionName.GetData()); pItem->setData(1, Qt::DisplayRole, sTemp.GetData()); pItem->setData(2, Qt::DisplayRole, item->m_sShortcut.GetData()); pItem->setData(3, Qt::DisplayRole, ezTranslateTooltip(item->m_sActionName)); if (item->m_sShortcut == item->m_sDefaultShortcut) pItem->setBackground(2, QBrush()); else pItem->setBackgroundColor(2, Qt::darkYellow); sTemp.Set("Default: ", item->m_sDefaultShortcut.IsEmpty() ? "<none>" : item->m_sDefaultShortcut); pItem->setToolTip(2, QString::fromUtf8(sTemp.GetData())); } } Shortcuts->resizeColumnToContents(0); Shortcuts->resizeColumnToContents(2); } ButtonAssign->setEnabled(false); ButtonRemove->setEnabled(false); ButtonReset->setEnabled(false); }