diff options
Diffstat (limited to 'src/dialogs/editratingdialog.cpp')
-rw-r--r-- | src/dialogs/editratingdialog.cpp | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/src/dialogs/editratingdialog.cpp b/src/dialogs/editratingdialog.cpp new file mode 100644 index 0000000..bab6e1b --- /dev/null +++ b/src/dialogs/editratingdialog.cpp @@ -0,0 +1,243 @@ +/*************************************************************************** +* Copyright (C) 2005 by Jason Kivlighn * +* [email protected] * +* * +* 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 "editratingdialog.h" + +#include <tdelocale.h> + +#include <tqvariant.h> +#include <tqpushbutton.h> +#include <tqlabel.h> +#include <tqcombobox.h> +#include <knuminput.h> +#include <tqheader.h> +#include <tdelistview.h> +#include <tqtextedit.h> +#include <tqlineedit.h> +#include <tqlayout.h> +#include <tqtooltip.h> +#include <tqwhatsthis.h> +#include <tqpainter.h> +#include <tqvbox.h> + +#include <tdepopupmenu.h> +#include <tdelocale.h> +#include <kiconloader.h> +#include <kdebug.h> + +#include "datablocks/rating.h" +#include "datablocks/elementlist.h" +#include "datablocks/mixednumber.h" + +#include "widgets/ratingwidget.h" + +class RatingCriteriaListView : public TDEListView +{ +public: + RatingCriteriaListView( TQWidget *parent = 0, const char *name = 0 ) : TDEListView(parent,name){} + + void rename( TQListViewItem *it, int c ) + { + if ( c == 1 ) + it->setPixmap(c,TQPixmap()); + + TDEListView::rename(it,c); + } +}; + + +EditRatingDialog::EditRatingDialog( const ElementList &criteriaList, const Rating &rating, TQWidget* parent, const char* name ) + : KDialogBase( parent, name, true, i18n( "Rating" ), + KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok ) +{ + init(criteriaList); + loadRating(rating); +} + +/* + * Constructs a EditRatingDialog as a child of 'parent', with the + * name 'name' and widget flags set to 'f'. + */ +EditRatingDialog::EditRatingDialog( const ElementList &criteriaList, TQWidget* parent, const char* name ) + : KDialogBase( parent, name, true, i18n( "Rating" ), + KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok ) +{ + init(criteriaList); +} + +void EditRatingDialog::init( const ElementList &criteriaList ) +{ + TQVBox *page = makeVBoxMainWidget(); + + layout2 = new TQHBox( page ); + + raterLabel = new TQLabel( layout2, "raterLabel" ); + raterEdit = new TQLineEdit( layout2, "raterEdit" ); + + layout8 = new TQHBox( page ); + + criteriaLabel = new TQLabel( layout8, "criteriaLabel" ); + + criteriaComboBox = new TQComboBox( FALSE, layout8, "criteriaComboBox" ); + criteriaComboBox->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, (TQSizePolicy::SizeType)0, 0, 0, criteriaComboBox->sizePolicy().hasHeightForWidth() ) ); + criteriaComboBox->setEditable( TRUE ); + criteriaComboBox->lineEdit()->disconnect( criteriaComboBox ); //so hitting enter doesn't enter the item into the box + + starsLabel = new TQLabel( layout8, "starsLabel" ); + + starsWidget = new RatingWidget( 5, layout8, "starsWidget" ); + + addButton = new TQPushButton( layout8, "addButton" ); + + removeButton = new TQPushButton( layout8, "removeButton" ); + + criteriaListView = new RatingCriteriaListView( page, "criteriaListView" ); + criteriaListView->addColumn( i18n( "Criteria" ) ); + criteriaListView->addColumn( i18n( "Stars" ) ); + criteriaListView->setSizePolicy( TQSizePolicy( (TQSizePolicy::SizeType)7, (TQSizePolicy::SizeType)7, 0, 0, criteriaListView->sizePolicy().hasHeightForWidth() ) ); + criteriaListView->setSorting(-1); + criteriaListView->setItemsRenameable( true ); + criteriaListView->setRenameable( 0, true ); + criteriaListView->setRenameable( 1, true ); + + commentsLabel = new TQLabel( page, "commentsLabel" ); + + commentsEdit = new TQTextEdit( page, "commentsEdit" ); + + languageChange(); + resize( TQSize(358, 331).expandedTo(minimumSizeHint()) ); + clearWState( WState_Polished ); + + connect( criteriaListView, TQ_SIGNAL(itemRenamed(TQListViewItem*,const TQString &,int)), this, TQ_SLOT(itemRenamed(TQListViewItem*,const TQString &,int)) ); + connect( addButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotAddRatingCriteria()) ); + connect( removeButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotRemoveRatingCriteria()) ); + + TDEIconLoader il; + TDEPopupMenu *kpop = new TDEPopupMenu( criteriaListView ); + kpop->insertItem( il.loadIcon( "editshred", TDEIcon::NoGroup, 16 ), i18n( "&Delete" ), this, TQ_SLOT( slotRemoveRatingCriteria() ), Key_Delete ); + + for ( ElementList::const_iterator criteria_it = criteriaList.begin(); criteria_it != criteriaList.end(); ++criteria_it ) { + criteriaComboBox->insertItem( ( *criteria_it ).name ); + //criteriaComboBox->completionObject()->addItem( ( *criteria_it ).name ); + } + + ratingID = -1; +} + +/* + * Destroys the object and frees any allocated resources + */ +EditRatingDialog::~EditRatingDialog() +{ + // no need to delete child widgets, TQt does it all for us +} + +/* + * Sets the strings of the subwidgets using the current + * language. + */ +void EditRatingDialog::languageChange() +{ + criteriaLabel->setText( i18n( "Criteria:" ) ); + starsLabel->setText( i18n( "Stars:" ) ); + addButton->setText( i18n( "Add" ) ); + removeButton->setText( i18n( "&Delete" ) ); + criteriaListView->header()->setLabel( 0, i18n( "Criteria" ) ); + criteriaListView->header()->setLabel( 1, i18n( "Stars" ) ); + commentsLabel->setText( i18n( "Comments:" ) ); + raterLabel->setText( i18n( "Rater:" ) ); +} + +void EditRatingDialog::itemRenamed(TQListViewItem* it, const TQString &, int c) +{ + if ( c == 1 ) { + bool ok = false; + MixedNumber stars_mn = MixedNumber::fromString(it->text(c),&ok); + if ( ok && !it->text(c).isEmpty() ) { + double stars = TQMAX(0,TQMIN(stars_mn.toDouble(),5)); //force to between 0 and 5 + TQPixmap starsPic = Rating::starsPixmap( stars ); + it->setPixmap(c,starsPic); + it->setText(2,TQString::number(stars)); + } + else { + double stars = it->text(2).toDouble(); //col 2 holds the old value, which we'll set it back to + TQPixmap starsPic = Rating::starsPixmap( stars ); + it->setPixmap(c,starsPic); + } + + it->setText(c,TQString::null); + } +} + +Rating EditRatingDialog::rating() const +{ + Rating r; + + for ( TQListViewItem *it = criteriaListView->firstChild(); it; it = it->nextSibling() ) { + RatingCriteria rc; + rc.name = it->text(0); + rc.stars = it->text(2).toDouble(); + r.append( rc ); + } + + r.comment = commentsEdit->text(); + r.rater = raterEdit->text(); + + r.id = ratingID; + + return r; +} + +void EditRatingDialog::loadRating( const Rating &rating ) +{ + for ( RatingCriteriaList::const_iterator rc_it = rating.ratingCriteriaList.begin(); rc_it != rating.ratingCriteriaList.end(); ++rc_it ) { + addRatingCriteria(*rc_it); + } + + raterEdit->setText(rating.rater); + commentsEdit->setText(rating.comment); + + ratingID = rating.id; +} + +void EditRatingDialog::slotAddRatingCriteria() +{ + RatingCriteria r; + r.name = criteriaComboBox->lineEdit()->text().stripWhiteSpace(); + if ( r.name.isEmpty() ) + return; + + r.stars = starsWidget->text().toDouble(); + + addRatingCriteria(r); + + criteriaComboBox->lineEdit()->clear(); + starsWidget->clear(); + + criteriaComboBox->lineEdit()->setFocus(); +} + +void EditRatingDialog::addRatingCriteria( const RatingCriteria &rc ) +{ + TQListViewItem * it = new TQListViewItem(criteriaListView,rc.name); + + TQPixmap stars = Rating::starsPixmap(rc.stars); + if ( !stars.isNull() ) //there aren't zero stars + it->setPixmap(1,stars); + + it->setText(2,TQString::number(rc.stars)); +} + +void EditRatingDialog::slotRemoveRatingCriteria() +{ + delete criteriaListView->selectedItem(); +} + +#include "editratingdialog.moc" |