diff --git a/keduvocdocument/CMakeLists.txt b/keduvocdocument/CMakeLists.txt index 891022f..dc1f83b 100644 --- a/keduvocdocument/CMakeLists.txt +++ b/keduvocdocument/CMakeLists.txt @@ -1,202 +1,205 @@ if (BUILD_TESTING) add_subdirectory(autotests) add_subdirectory(tests) endif() ########### next target ############### include(ECMSetupVersion) ecm_setup_version(5.0.0 VARIABLE_PREFIX KDEEDU VERSION_HEADER "${CMAKE_BINARY_DIR}/keduvocdocument/keduvocdocument_version.h" PACKAGE_VERSION_FILE "${CMAKE_BINARY_DIR}/KEduVocDocumentVersion.cmake") include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) set(keduvocdocument_LIB_SRCS keduvocdocument.cpp keduvocidentifier.cpp keduvocexpression.cpp keduvoctranslation.cpp keduvoccontainer.cpp keduvoclesson.cpp keduvocleitnerbox.cpp keduvoctext.cpp keduvocarticle.cpp keduvocconjugation.cpp keduvocpersonalpronoun.cpp keduvocdeclension.cpp keduvocwordtype.cpp keduvockvtmlcompability.cpp keduvockvtml2writer.cpp keduvoccsvwriter.cpp keduvoccontainermodel.cpp keduvoclessonmodel.cpp keduvocreadonlycontainermodel.cpp keduvocvocabularymodel.cpp keduvocwordclassmodel.cpp keduvoccontainermimedata.cpp keduvocvocabularymimedata.cpp keduvocvocabularyfilter.cpp keduvoctranslator.cpp keduvocvocabularydelegate.cpp keduvocvocabularyheaderview.cpp keduvocvocabularycolumnsdialog.cpp keduvoccontainerview.cpp keduvocvocabularyview.cpp keduvocwordtypeview.cpp keduvoclessonview.cpp keduvocaudiowidget.cpp keduvocmultiplechoicewidget.cpp keduvoccomparisonwidget.cpp keduvocdeclension.cpp + keduvocconjugation.cpp readerwriters/dummyreader.cpp readerwriters/failedreader.cpp readerwriters/keduvockvtmlreader.cpp readerwriters/keduvockvtml2reader.cpp readerwriters/keduvoccsvreader.cpp readerwriters/keduvocpaukerreader.cpp readerwriters/keduvocvokabelnreader.cpp readerwriters/keduvocwqlreader.cpp readerwriters/keduvocxdxfreader.cpp readerwriters/readermanager.cpp sharedkvtmlfiles.cpp ) ki18n_wrap_ui(keduvocdocument_LIB_SRCS keduvocaudiowidget.ui keduvocmultiplechoicewidget.ui keduvoccomparisonwidget.ui keduvocdeclensionwidget.ui + keduvocconjugationwidget.ui ) include(ECMGenerateHeaders) ecm_generate_headers( KdeEdu_HEADERS HEADER_NAMES KEduVocDocument KEduVocIdentifier KEduVocExpression KEduVocText KEduVocArticle KEduVocConjugation KEduVocLesson KEduVocLeitnerBox KEduVocContainer KEduVocWordFlags KEduVocMultipleChoice KEduVocTranslation KEduVocWordtype KEduVocPersonalPronoun SharedKVTMLFiles KEduVocDeclension KEduVocKVTML2Writer KEduVocContainerModel KEduVocLessonModel KEduVocReadOnlyContainerModel KEduVocVocabularyModel KEduVocWordClassModel KEduVocContainerMimeData KEduVocVocabularyMimeData KEduVocVocabularyFilter KEduVocTranslator KEduVocVocabularyDelegate KEduVocVocabularyHeaderView KEduVocVocabularyColumnsDialog KEduVocContainerView KEduVocVocabularyView KEduVocWordTypeView KEduVocLessonView KEduVocAudioWidget KEduVocMultipleChoiceWidget KEduVocComparisonWidget KEduVocDeclensionWidget + KEduVocConjugationWidget REQUIRED_HEADERS KdeEdu_HEADERS ) add_library(KEduVocDocument SHARED ${keduvocdocument_LIB_SRCS}) generate_export_header(KEduVocDocument BASE_NAME KEduVocDocument) # vHanda: Add library alias? target_link_libraries(KEduVocDocument PUBLIC Qt5::Xml Qt5::Gui Qt5::Core Qt5::Widgets Qt5::DBus Qt5::Multimedia PRIVATE KF5::I18n KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::KIONTLM KF5::Archive KF5::Completion KF5::WidgetsAddons KF5::SonnetCore KF5::SonnetUi KF5::Notifications KF5::XmlGui ) # vHanda: Add Export Name? set_target_properties(KEduVocDocument PROPERTIES VERSION ${KDEEDU_VERSION_STRING} SOVERSION ${KDEEDU_SOVERSION} ) target_include_directories(KEduVocDocument INTERFACE "$") #Library for non-api unittests add_library(keduvocdocument_static STATIC ${keduvocdocument_LIB_SRCS}) set_target_properties(keduvocdocument_static PROPERTIES COMPILE_FLAGS -DKEDUVOCDOCUMENT_STATIC_DEFINE) target_link_libraries(keduvocdocument_static PUBLIC KF5::KIOCore Qt5::Xml Qt5::Core Qt5::Gui Qt5::Widgets Qt5::DBus Qt5::Multimedia PRIVATE KF5::I18n KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::KIONTLM KF5::Archive KF5::Completion KF5::WidgetsAddons KF5::SonnetCore KF5::SonnetUi KF5::Notifications KF5::XmlGui ) # if we want to set our own version instead of following kde generic #set(LIB_KEDUVOCDOCUMENT_VERSION "5.0.0") #set(LIB_KEDUVOCDOCUMENT_SOVERSION "5") #set_target_properties(keduvocdocument # PROPERTIES VERSION ${LIB_KEDUVOCDOCUMENT_VERSION} # SOVERSION ${LIB_KEDUVOCDOCUMENT_SOVERSION} #) install(TARGETS KEduVocDocument EXPORT LibKEduVocDocumentTargets ${INSTALL_TARGETS_DEFAULT_ARGS}) ########### install files ############### install(FILES ${CMAKE_CURRENT_BINARY_DIR}/keduvocdocument_export.h ${KdeEdu_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/libkeduvocdocument COMPONENT Devel ) diff --git a/keduvocdocument/keduvocconjugationwidget.cpp b/keduvocdocument/keduvocconjugationwidget.cpp new file mode 100644 index 0000000..c2a4ebe --- /dev/null +++ b/keduvocdocument/keduvocconjugationwidget.cpp @@ -0,0 +1,279 @@ +/*************************************************************************** + Copyright 2008 Frederik Gladhorn + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "keduvocconjugationwidget.h" + +#include "ui_keduvocconjugationwidget.h" + + +#include +#include +#include +#include + +using namespace Editor; + +class KEduVocConjugationWidget::Private +{ +public: + Private(); + + /** + * Fill the line edits + */ + void updateEntries(); + + QString m_lastTenseSelection; + int m_identifier; + KEduVocExpression* m_entry; + KEduVocDocument* m_doc; + + /** + * All line edits and labels, index corresponding to KEduVocWordFlag::indexOf + */ + QMap< KEduVocWordFlags, QLineEdit* > m_conjugationLineEdits; + + Ui::KEduVocConjugationWidget * m_ui; +}; + +KEduVocConjugationWidget::Private::Private() +{ + m_doc = 0; + m_entry = 0; + m_identifier = -1; + m_ui = new Ui::KEduVocConjugationWidget(); +} + +KEduVocConjugationWidget::KEduVocConjugationWidget( QWidget *parent ) + : QWidget( parent ) + , d( new Private ) +{ + d->m_ui->setupUi(this); + + connect( d->m_ui->nextTenseButton, &QPushButton::clicked, this, &KEduVocConjugationWidget::slotNextTense ); + connect( d->m_ui->tenseComboBox, static_cast ( &KComboBox::activated ), this, &KEduVocConjugationWidget::slotTenseSelected ); + connect( d->m_ui->tenseComboBox->lineEdit(), SIGNAL( editingFinished() ), SLOT( tenseEditingFinished() ) ); + + d->m_conjugationLineEdits[ KEduVocWordFlag::First | KEduVocWordFlag::Singular ] + = d->m_ui->singularFirstPersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Second | KEduVocWordFlag::Singular ] + = d->m_ui->singularSecondPersonLineEdit; + + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | KEduVocWordFlag::Singular ] + = d->m_ui->singularThirdMalePersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | KEduVocWordFlag::Singular ] + = d->m_ui->singularThirdFemalePersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | KEduVocWordFlag::Singular ] + = d->m_ui->singularThirdNeutralPersonLineEdit; + + d->m_conjugationLineEdits[ KEduVocWordFlag::First | KEduVocWordFlag::Dual ] + = d->m_ui->dualFirstPersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Second | KEduVocWordFlag::Dual ] + = d->m_ui->dualSecondPersonLineEdit; + + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | KEduVocWordFlag::Dual ] + = d->m_ui->dualThirdMalePersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | KEduVocWordFlag::Dual ] + = d->m_ui->dualThirdFemalePersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | KEduVocWordFlag::Dual ] + = d->m_ui->dualThirdNeutralPersonLineEdit; + + d->m_conjugationLineEdits[ KEduVocWordFlag::First | KEduVocWordFlag::Plural ] + = d->m_ui->pluralFirstPersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Second | KEduVocWordFlag::Plural ] + = d->m_ui->pluralSecondPersonLineEdit; + + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | KEduVocWordFlag::Plural ] + = d->m_ui->pluralThirdMalePersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | KEduVocWordFlag::Plural ] + = d->m_ui->pluralThirdFemalePersonLineEdit; + d->m_conjugationLineEdits[ KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | KEduVocWordFlag::Plural ] + = d->m_ui->pluralThirdNeutralPersonLineEdit; + + foreach( const KEduVocWordFlags & index, d->m_conjugationLineEdits.keys() ) { + connect( d->m_conjugationLineEdits.value( index ), SIGNAL( textChanged( const QString& ) ), SLOT( textChanged( const QString& ) ) ); + } +} + +KEduVocConjugationWidget::~KEduVocConjugationWidget() +{ + delete d; +} + +void KEduVocConjugationWidget::textChanged( const QString& text ) +{ + int valueIndex = d->m_conjugationLineEdits.values().indexOf( qobject_cast ( sender() ) ); + int key = d->m_conjugationLineEdits.keys().value( valueIndex ); + d->m_entry->translation( d->m_identifier )->conjugation( d->m_ui->tenseComboBox->currentText() ).setConjugation( text, (KEduVocWordFlag::Flags)key ); +} + + +void KEduVocConjugationWidget::slotTenseSelected( int sel ) +{ + Q_UNUSED(sel); + updateEntries(); +} + + +void KEduVocConjugationWidget::updateEntries() +{ + d->m_lastTenseSelection = d->m_ui->tenseComboBox->currentText(); + KEduVocConjugation& conjugation = d->m_entry->translation( d->m_identifier )->conjugation( d->m_lastTenseSelection ); + foreach( KEduVocWordFlags flags, d->m_conjugationLineEdits.keys() ) { + QString text; + if( conjugation.keys().contains( flags ) ) { + text = conjugation.conjugation( flags ).text(); + } + + d->m_conjugationLineEdits[ flags ]->setText( text ); + } +} + +void KEduVocConjugationWidget::setTranslation( KEduVocExpression * entry, int identifier ) +{ + d->m_ui->tenseComboBox->clear(); + d->m_ui->tenseComboBox->completionObject()->clear(); + + d->m_entry = entry; + d->m_identifier = identifier; + + if( !d->m_doc || !entry ) { + setEnabled(false); + return; + } + + // init tenses per language + d->m_ui->tenseComboBox->addItems( d->m_doc->identifier( identifier ).tenseList() ); + d->m_ui->tenseComboBox->completionObject()->insertItems( d->m_doc->identifier( identifier ).tenseList() ); + if( d->m_ui->tenseComboBox->contains( d->m_lastTenseSelection ) ) { + d->m_ui->tenseComboBox->setCurrentItem( d->m_lastTenseSelection ); + } else { + d->m_ui->tenseComboBox->setCurrentIndex( 0 ); + } + + setEnabled(true); + if( entry->translation( d->m_identifier )->wordType() + && entry->translation( d->m_identifier )->wordType()->wordType() & KEduVocWordFlag::Verb ) { + updateVisiblePersons(); + updateEntries(); + } +} + +void KEduVocConjugationWidget::setDocument( KEduVocDocument * doc ) +{ + d->m_doc = doc; + d->m_ui->tenseComboBox->clear(); + d->m_ui->tenseComboBox->completionObject()->clear(); +} + +void KEduVocConjugationWidget::slotNextTense() +{ + if( d->m_ui->tenseComboBox->currentIndex() + 1 < d->m_ui->tenseComboBox->count() ) { + d->m_ui->tenseComboBox->setCurrentIndex( d->m_ui->tenseComboBox->currentIndex() + 1 ); + } else { + d->m_ui->tenseComboBox->setCurrentIndex( 0 ); + } + updateEntries(); +} + +void KEduVocConjugationWidget::updateVisiblePersons() +{ + if( d->m_identifier < 0 ) { + showWidgets( false, false, false, false, false, false, falsev); + return; + } + + bool dualVisible = d->m_doc->identifier( d->m_identifier ).personalPronouns().dualExists(); + bool maleFemaleDifferent = d->m_doc->identifier( d->m_identifier ).personalPronouns().maleFemaleDifferent(); + bool neutralExists = d->m_doc->identifier( d->m_identifier ).personalPronouns().neutralExists(); + + showWidgets( true, true, dualVisible, true, maleFemaleDifferent, maleFemaleDifferent, neutralExists || ( !maleFemaleDifferent ) ); + + // set up the personal pronouns + KEduVocPersonalPronoun pron = d->m_doc->identifier( d->m_identifier ).personalPronouns(); + + d->m_ui->singularFirstPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::First | KEduVocWordFlag::Singular ) ); + d->m_ui->singularSecondPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Second | KEduVocWordFlag::Singular ) ); + d->m_ui->singularThirdMalePersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | KEduVocWordFlag::Singular ) ); + d->m_ui->singularThirdFemalePersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | KEduVocWordFlag::Singular ) ); + d->m_ui->singularThirdNeutralPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | KEduVocWordFlag::Singular ) ); + + d->m_ui->dualFirstPersonLabel->setText( pron.personalPronoun(KEduVocWordFlag::First | KEduVocWordFlag::Dual ) ); + d->m_ui->dualSecondPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Second | KEduVocWordFlag::Dual ) ); + d->m_ui->dualThirdMalePersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | KEduVocWordFlag::Dual ) ); + d->m_ui->dualThirdFemalePersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | KEduVocWordFlag::Dual ) ); + d->m_ui->dualThirdNeutralPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | KEduVocWordFlag::Dual ) ); + + d->m_ui->pluralFirstPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::First | KEduVocWordFlag::Plural ) ); + d->m_ui->pluralSecondPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Second | KEduVocWordFlag::Plural ) ); + d->m_ui->pluralThirdMalePersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | KEduVocWordFlag::Plural ) ); + d->m_ui->pluralThirdFemalePersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | KEduVocWordFlag::Plural ) ); + d->m_ui->pluralThirdNeutralPersonLabel->setText( pron.personalPronoun( KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | KEduVocWordFlag::Plural ) ); +} + +void KEduVocConjugationWidget::showWidgets( bool tenses, bool singular, bool dual, bool plural, bool maleVisible, bool femaleVisible, bool neuterVisible ) +{ + d->m_ui->tenselabel->setVisible( tenses ); + d->m_ui->tenseComboBox->setVisible( tenses ); + d->m_ui->nextTenseButton->setVisible( tenses ); + + d->m_ui->singularLabel->setVisible( singular ); + d->m_ui->singularFirstPersonLabel->setVisible( singular ); + d->m_ui->singularFirstPersonLineEdit->setVisible( singular ); + d->m_ui->singularSecondPersonLabel->setVisible( singular ); + d->m_ui->singularSecondPersonLineEdit->setVisible( singular ); + + d->m_ui->singularThirdMalePersonLabel->setVisible( singular && maleVisible ); + d->m_ui->singularThirdMalePersonLineEdit->setVisible( singular && maleVisible ); + d->m_ui->singularThirdFemalePersonLabel->setVisible( singular && femaleVisible ); + d->m_ui->singularThirdFemalePersonLineEdit->setVisible( singular && femaleVisible ); + d->m_ui->singularThirdNeutralPersonLabel->setVisible( singular && neuterVisible ); + d->m_ui->singularThirdNeutralPersonLineEdit->setVisible( singular && neuterVisible ); + + d->m_ui->dualLabel->setVisible( dual ); + d->m_ui->dualFirstPersonLabel->setVisible( dual ); + d->m_ui->dualFirstPersonLineEdit->setVisible( dual ); + d->m_ui->dualSecondPersonLabel->setVisible( dual ); + d->m_ui->dualSecondPersonLineEdit->setVisible( dual ); + + d->m_ui->dualThirdMalePersonLabel->setVisible( dual && maleVisible ); + d->m_ui->dualThirdMalePersonLineEdit->setVisible( dual && maleVisible ); + d->m_ui->dualThirdFemalePersonLabel->setVisible( dual && femaleVisible ); + d->m_ui->dualThirdFemalePersonLineEdit->setVisible( dual && femaleVisible ); + d->m_ui->dualThirdNeutralPersonLabel->setVisible( dual && neuterVisible ); + d->m_ui->dualThirdNeutralPersonLineEdit->setVisible( dual && neuterVisible ); + + d->m_ui->pluralLabel->setVisible( plural ); + d->m_ui->pluralFirstPersonLabel->setVisible( plural ); + d->m_ui->pluralFirstPersonLineEdit->setVisible( plural ); + d->m_ui->pluralSecondPersonLabel->setVisible( plural ); + d->m_ui->pluralSecondPersonLineEdit->setVisible( plural ); + + d->m_ui->pluralThirdMalePersonLabel->setVisible( plural && maleVisible ); + d->m_ui->pluralThirdMalePersonLineEdit->setVisible( plural && maleVisible ); + d->m_ui->pluralThirdFemalePersonLabel->setVisible( plural && femaleVisible ); + d->m_ui->pluralThirdFemalePersonLineEdit->setVisible( plural && femaleVisible ); + d->m_ui->pluralThirdNeutralPersonLabel->setVisible( plural && neuterVisible ); + d->m_ui->pluralThirdNeutralPersonLineEdit->setVisible( plural && neuterVisible ); +} + +void KEduVocConjugationWidget::tenseEditingFinished() +{ + const QStringList& oldTenses = d->m_doc->identifier( d->m_identifier ).tenseList(); + if( !oldTenses.contains( d->m_ui->tenseComboBox->currentText() ) ) { + // add a new tense + d->m_doc->identifier( d->m_identifier ).setTense( oldTenses.count(), d->m_ui->tenseComboBox->currentText() ); + // put it into the completion + d->m_ui->tenseComboBox->completionObject()->addItem( d->m_ui->tenseComboBox->currentText() ); + } +} \ No newline at end of file diff --git a/keduvocdocument/keduvocconjugationwidget.h b/keduvocdocument/keduvocconjugationwidget.h new file mode 100644 index 0000000..83feabd --- /dev/null +++ b/keduvocdocument/keduvocconjugationwidget.h @@ -0,0 +1,60 @@ +/*************************************************************************** + Copyright 2008 Frederik Gladhorn + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef KEDUVOCCONJUGATIONWIDGET_H +#define KEDUVOCCONJUGATIONWIDGET_H + +#include +#include + +#include + +class KEduVocExpression; +class KEduVocDocument; + +namespace Editor +{ + +class KEDUVOCDOCUMENT_EXPORT KEduVocConjugationWidget : public QWidget +{ + Q_OBJECT + +public: + explicit KEduVocConjugationWidget( QWidget *parent = 0 ); + ~KEduVocConjugationWidget(); + +public slots: + void setDocument( KEduVocDocument* doc ); + void setTranslation( KEduVocExpression* entry, int translation ); + +signals: + void sigModified(); + +private slots: + void textChanged( const QString& ); + void slotTenseSelected( int ); + void slotNextTense(); + void tenseEditingFinished(); + +private: + class Private; + Private * const d; + + void updateVisiblePersons(); + + void showWidgets( bool tenses, bool singular, bool dual, bool plural, bool maleVisible, bool femaleVisible, bool neuterVisible ); +}; + +} + +#endif diff --git a/keduvocdocument/keduvocconjugationwidget.ui b/keduvocdocument/keduvocconjugationwidget.ui new file mode 100644 index 0000000..c6e5a88 --- /dev/null +++ b/keduvocdocument/keduvocconjugationwidget.ui @@ -0,0 +1,424 @@ + + + KEduVocConjugationWidget + + + + 0 + 0 + 296 + 535 + + + + + 0 + 0 + + + + + 0 + 0 + + + + - + + + + + + Conjugation Forms + + + + + + First + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + singularFirstPersonLineEdit + + + + + + + + 0 + 0 + + + + + + + + Second + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + singularSecondPersonLineEdit + + + + + + + + 0 + 0 + + + + + + + + Third Male + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + singularThirdMalePersonLineEdit + + + + + + + + + + Third Female + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + singularThirdFemalePersonLineEdit + + + + + + + + + + Third Neutral + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + singularThirdNeutralPersonLineEdit + + + + + + + + + + First + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dualFirstPersonLineEdit + + + + + + + + + + Second + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dualSecondPersonLineEdit + + + + + + + + + + Third Male + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dualThirdMalePersonLineEdit + + + + + + + Third Female + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dualThirdFemalePersonLineEdit + + + + + + + + + + Third Neutral + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + dualThirdNeutralPersonLineEdit + + + + + + + + + + First + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + pluralFirstPersonLineEdit + + + + + + + + + + Second + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + pluralSecondPersonLineEdit + + + + + + + + + + Third Male + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + pluralThirdMalePersonLineEdit + + + + + + + + + + + + + Third Female + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + pluralThirdFemalePersonLineEdit + + + + + + + + + + + + + Third Neutral + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + pluralThirdNeutralPersonLineEdit + + + + + + + + 0 + 0 + + + + true + + + -1 + + + 20 + + + + + + + + 0 + 0 + + + + Ne&xt + + + + + + + + 0 + 0 + + + + &Tense: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + tenseComboBox + + + + + + + + 75 + true + + + + Singular + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + singularFirstPersonLineEdit + + + + + + + + 75 + true + + + + Dual + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + dualFirstPersonLineEdit + + + + + + + + 75 + true + + + + Plural + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + pluralFirstPersonLineEdit + + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + KComboBox + QComboBox +
kcombobox.h
+
+
+ + +