SVN commit 648659 by pino: port the TextLabelWizard to the new QWizard, hopefully should work as before M +0 -4 CMakeLists.txt M +36 -42 modes/label.cc M +2 -2 modes/label.h M +2 -0 modes/linkslabel.cpp M +5 -0 modes/linkslabel.h M +139 -24 modes/textlabelwizard.cc M +16 -5 modes/textlabelwizard.h D modes/textlabelwizardbase.ui --- trunk/KDE/kdeedu/kig/CMakeLists.txt #648658:648659 @@ -119,10 +119,6 @@ kig/kig_view.cpp ) -kde4_add_ui3_files(kigpart_PART_SRCS - modes/textlabelwizardbase.ui -) - kde4_add_ui_files(kigpart_PART_SRCS modes/typeswidget.ui modes/edittypewidget.ui --- trunk/KDE/kdeedu/kig/modes/label.cc #648658:648659 @@ -211,7 +211,6 @@ argcalcer->calc( mdoc.document() ); updateLinksLabel(); - updateWiz(); break; } default: @@ -300,7 +299,8 @@ cancelConstruction(); } -static uint percentCount( const QString& s ) +// also used in textlabelwizard.cc +uint percentCount( const QString& s ) { // QRegExp re( QString::fromUtf8( "%[0-9]" ) ); QRegExp re( QString::fromUtf8( "%[\\d]+" ) ); @@ -314,13 +314,13 @@ return percentcount; } -void TextLabelModeBase::finishPressed() +bool TextLabelModeBase::canFinish() { - bool needframe = d->wiz->needFrameCheckBox->isChecked(); - QString s = d->wiz->labelTextInput->text(); + bool finish = true; + QString s = d->wiz->text(); assert( percentCount( s ) == d->args.size() ); - if ( d->wiz->currentPage() == d->wiz->enter_text_page ) + if ( d->wiz->currentId() == TextLabelWizard::TextPageId ) assert( d->args.size() == 0 ); bool finished = true; @@ -328,20 +328,31 @@ finished &= ( *i != 0 ); if ( ! finished ) + { KMessageBox::sorry( mdoc.widget(), i18n( "There are '%n' parts in the text that you have not selected a " "value for. Please remove them or select enough arguments." ) ); - else - { - finish( d->mcoord, s, d->args, needframe, d->locationparent ); - killMode(); + finished = false; }; + + return finish; } -void TextLabelModeBase::updateWiz() +void TextLabelModeBase::finishPressed() { - QString s = d->wiz->labelTextInput->text(); - uint percentcount = percentCount( s ); + if ( !canFinish() ) + return; + + bool needframe = d->wiz->field( "wantframe" ).toBool(); + QString s = d->wiz->text(); + + finish( d->mcoord, s, d->args, needframe, d->locationparent ); + killMode(); +} + +bool TextLabelModeBase::percentCountChanged( uint percentcount ) +{ + bool finish = true; if ( d->lpc > percentcount ) { d->args = argvect( d->args.begin(), d->args.begin() + percentcount ); @@ -351,37 +362,24 @@ d->args.resize( percentcount, 0 ); }; - if ( percentcount == 0 && ! s.isEmpty() ) + if ( percentcount != 0 ) { - d->wiz->setNextEnabled( d->wiz->enter_text_page, false ); - d->wiz->setFinishEnabled( d->wiz->enter_text_page, true ); - d->wiz->setAppropriate( d->wiz->select_arguments_page, false ); - } - else - { - d->wiz->setAppropriate( d->wiz->select_arguments_page, !s.isEmpty() ); - d->wiz->setNextEnabled( d->wiz->enter_text_page, ! s.isEmpty() ); - d->wiz->setFinishEnabled( d->wiz->enter_text_page, false ); bool finished = true; for ( argvect::iterator i = d->args.begin(); i != d->args.end(); ++i ) finished &= ( *i != 0 ); - assert( percentCount( s ) == d->args.size() ); - - d->wiz->setFinishEnabled( d->wiz->select_arguments_page, finished ); + assert( percentcount == d->args.size() ); + finish = finished; }; d->lpc = percentcount; -} -void TextLabelModeBase::labelTextChanged() -{ - updateWiz(); + return finish; } void TextLabelModeBase::updateLinksLabel() { - LinksLabel::LinksLabelEditBuf buf = d->wiz->myCustomWidget1->startEdit(); - QString s = d->wiz->labelTextInput->text(); + LinksLabel::LinksLabelEditBuf buf = d->wiz->linksLabel()->startEdit(); + QString s = d->wiz->text(); // QRegExp re( "%[0-9]" ); QRegExp re( "%[\\d]+" ); int prevpos = 0; @@ -400,7 +398,7 @@ // fetch the text part... QString subs = s.mid( prevpos, pos - prevpos ); // and add it... - d->wiz->myCustomWidget1->addText( subs, buf ); + d->wiz->linksLabel()->addText( subs, buf ); }; // we always need a link part... QString linktext( "%1" ); @@ -415,7 +413,7 @@ // otherwise, we show a stub... linktext = i18n( "argument %1", count + 1 ); - d->wiz->myCustomWidget1->addLink( linktext, buf ); + d->wiz->linksLabel()->addLink( linktext, buf ); // set pos and prevpos to the next char after the last match, so // we don't enter infinite loops... // pos += 2; @@ -425,10 +423,9 @@ }; if ( prevpos != s.length() ) - d->wiz->myCustomWidget1->addText( s.mid( prevpos ), buf ); + d->wiz->linksLabel()->addText( s.mid( prevpos ), buf ); - d->wiz->myCustomWidget1->applyEdit( buf ); - d->wiz->relayoutArgsPage(); + d->wiz->linksLabel()->applyEdit( buf ); d->wiz->resize( d->wiz->size() ); } @@ -458,16 +455,13 @@ if ( d->mwawd == SelectingLocation ) { d->mwawd = RequestingText; - updateWiz(); d->wiz->show(); - // shouldn't be necessary, but seems to be anyway.. :( - updateWiz(); }; } void TextLabelModeBase::setText( const QString& s ) { - d->wiz->labelTextInput->setText( s ); + d->wiz->setText( s ); } void TextLabelModeBase::setPropertyObjects( const argvect& props ) @@ -628,7 +622,7 @@ void TextLabelModeBase::setFrame( bool f ) { - d->wiz->needFrameCheckBox->setChecked( f ); + d->wiz->setField( "wantframe", f ); } void TextLabelModeBase::setLocationParent( ObjectCalcer* o ) --- trunk/KDE/kdeedu/kig/modes/label.h #648658:648659 @@ -52,9 +52,10 @@ void finishPressed(); void enterTextPageEntered(); void selectArgumentsPageEntered(); - void labelTextChanged(); void linkClicked( int ); void redrawScreen( KigWidget* w ); + bool percentCountChanged( uint percentcount ); + bool canFinish(); protected: typedef std::vector argvect; @@ -101,7 +102,6 @@ */ typedef enum { SelectingLocation, RequestingText, SelectingArgs, ReallySelectingArgs } wawdtype; - void updateWiz(); void updateLinksLabel(); }; --- trunk/KDE/kdeedu/kig/modes/linkslabel.cpp #648658:648659 @@ -131,4 +131,6 @@ std::for_each( p->urllabels.begin(), p->urllabels.end(), mem_fun( &QWidget::show ) ); std::for_each( p->labels.begin(), p->labels.end(), mem_fun( &QWidget::show ) ); + + emit changed(); } --- trunk/KDE/kdeedu/kig/modes/linkslabel.h #648658:648659 @@ -74,6 +74,11 @@ */ void linkClicked( int i ); + /** + * the structure of links and texts was changed + */ + void changed(); + private slots: void urlClicked(); --- trunk/KDE/kdeedu/kig/modes/textlabelwizard.cc #648658:648659 @@ -21,60 +21,162 @@ #include "label.h" #include "linkslabel.h" +#include +#include #include #include +#include #include +#include +// defined in label.cc +extern uint percentCount( const QString& s ); + +class TextPage : public QWizardPage +{ +public: + TextPage( QWidget* parent, TextLabelModeBase* mode ); + + QTextEdit* mtext; + +private: + TextLabelModeBase* mmode; +}; + +TextPage::TextPage( QWidget* parent, TextLabelModeBase* mode ) + : QWizardPage( parent ), mmode( mode ) +{ + setTitle( i18n( "Enter Label Text" ) ); + setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + setFinalPage( true ); + + QVBoxLayout* lay = new QVBoxLayout( this ); + lay->setMargin( 0 ); + QLabel* label = new QLabel( this ); + lay->addWidget( label ); + label->setText( + i18n( "Enter the text for your label here and press \"Next\".\n" + "If you want to show variable parts, then put %1, %2, ... " + "at the appropriate places (e.g. \"This segment is %1 units " + "long.\").", QString( "%1" ), QString( "%2" ) ) ); // grrr i18n() + label->setAlignment( Qt::AlignTop ); + label->setWordWrap( true ); + mtext = new QTextEdit( this ); + lay->addWidget( mtext ); + QCheckBox* wantframe = new QCheckBox( this ); + lay->addWidget( wantframe ); + wantframe->setText( i18n( "Show text in a frame" ) ); + + registerField( "wantframe", wantframe ); + + connect( mtext, SIGNAL( textChanged() ), parent, SLOT( textChanged() ) ); +} + + +class ArgsPage : public QWizardPage +{ +public: + ArgsPage( QWidget* parent, TextLabelModeBase* mode ); + + virtual bool validatePage(); + + LinksLabel* mlinks; + +private: + TextLabelModeBase* mmode; +}; + +ArgsPage::ArgsPage( QWidget* parent, TextLabelModeBase* mode ) + : QWizardPage( parent ), mmode( mode ) +{ + setTitle( i18n( "Select Arguments" ) ); + setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + setFinalPage( true ); + + QVBoxLayout* lay = new QVBoxLayout( this ); + lay->setMargin( 0 ); + QLabel* label = new QLabel( this ); + lay->addWidget( label ); + label->setText( + i18n( "Now select the argument(s) you need. For every argument, " + "click on it, select an object and a property in the Kig " + "window, and click finish when you are done..." ) ); + label->setWordWrap( true ); + mlinks = new LinksLabel( this ); + lay->addWidget( mlinks ); + + connect( mlinks, SIGNAL( changed() ), this, SIGNAL( completeChanged() ) ); +} + +bool ArgsPage::validatePage() +{ + return mmode->canFinish(); +} + + TextLabelWizard::TextLabelWizard( QWidget* parent, TextLabelModeBase* mode ) - : TextLabelWizardBase( parent, "TextLabelWizard" ), mmode( mode ) + : QWizard( parent ), mmode( mode ) { setModal( false ); - connect( labelTextInput, SIGNAL( textChanged() ), - SLOT( textChanged() ) ); - connect( myCustomWidget1, SIGNAL( linkClicked( int ) ), + setObjectName( QLatin1String( "TextLabelWizard" ) ); + setWindowTitle( KDialog::makeStandardCaption( i18n( "Construct Label" ) ) ); + setOption( HaveHelpButton ); + setOption( HaveFinishButtonOnEarlyPages ); + + mtextPage = new TextPage( this, mmode ); + setPage( TextPageId, mtextPage ); + margsPage = new ArgsPage( this, mmode ); + setPage( ArgsPageId, margsPage ); + + connect( this, SIGNAL( helpRequested() ), this, + SLOT( slotHelpClicked() ) ); + connect( linksLabel(), SIGNAL( linkClicked( int ) ), SLOT( linkClicked( int ) ) ); - connect( this, SIGNAL( helpClicked() ), - this, SLOT( slotHelpClicked() ) ); - labelTextInput->setFocus(); + connect( this, SIGNAL( currentIdChanged( int ) ), + this, SLOT( currentIdChanged( int ) ) ); + + mtextPage->mtext->setFocus(); } TextLabelWizard::~TextLabelWizard() { } -void TextLabelWizard::back() +LinksLabel* TextLabelWizard::linksLabel() { - if ( currentPage() == select_arguments_page ) - { - mmode->enterTextPageEntered(); - } - TextLabelWizardBase::back(); + return margsPage->mlinks; } -void TextLabelWizard::next() +QString TextLabelWizard::text() const { - if ( currentPage() == enter_text_page ) - { - mmode->selectArgumentsPageEntered(); - } - TextLabelWizardBase::next(); + return mtextPage->mtext->toPlainText(); } +void TextLabelWizard::setText( const QString& newtext ) +{ + mtextPage->mtext->setPlainText( newtext ); +} + void TextLabelWizard::reject() { - TextLabelWizardBase::reject(); + QWizard::reject(); mmode->cancelPressed(); } void TextLabelWizard::accept() { + QWizard::accept(); mmode->finishPressed(); } void TextLabelWizard::textChanged() { - mmode->labelTextChanged(); + uint percentcount = percentCount( text() ); + bool finish = mmode->percentCountChanged( percentcount ); + (void)finish; + button( QWizard::FinishButton )->setEnabled( percentcount == 0 ); + button( QWizard::NextButton )->setEnabled( percentcount > 0 ); } void TextLabelWizard::linkClicked( int which ) @@ -82,10 +184,23 @@ mmode->linkClicked( which ); } -void TextLabelWizard::relayoutArgsPage() +void TextLabelWizard::currentIdChanged( int id ) { - vboxLayout1->activate(); - repaint(); + switch ( id ) + { + case TextPageId: + mmode->enterTextPageEntered(); + // simulate a text change + textChanged(); + break; + case ArgsPageId: + mmode->selectArgumentsPageEntered(); + break; + case -1: // no id - skip it + break; + default: + ; + } } void TextLabelWizard::slotHelpClicked() --- trunk/KDE/kdeedu/kig/modes/textlabelwizard.h #648658:648659 @@ -18,29 +18,40 @@ #ifndef KIG_MODES_TEXTLABELWIZARD_H #define KIG_MODES_TEXTLABELWIZARD_H -#include "textlabelwizardbase.h" +#include +class ArgsPage; +class LinksLabel; class TextLabelModeBase; +class TextPage; -class TextLabelWizard : public TextLabelWizardBase +class TextLabelWizard : public QWizard { Q_OBJECT public: TextLabelWizard( QWidget* parent, TextLabelModeBase* mode ); ~TextLabelWizard(); - void back(); - void next(); + static const int TextPageId = 0; + static const int ArgsPageId = 1; + + LinksLabel* linksLabel(); + QString text() const; + void setText( const QString& newtext ); + +public slots: void reject(); void accept(); - void relayoutArgsPage(); private slots: void textChanged(); void linkClicked( int which ); + void currentIdChanged( int id ); void slotHelpClicked(); private: TextLabelModeBase* mmode; + TextPage* mtextPage; + ArgsPage* margsPage; }; #endif // TEXTLABELWIZARD_H