📄 categoryselect.cpp
字号:
/*! \overload This constructor accepts an array \a vl of integers representing Categories. \a visibleName is the string used when the name of this widget is required to be displayed. \a width is an integer used as the fixed width of the widget.*/CategorySelect::CategorySelect( const QArray<int> &vl, const QString &appName, const QString &visibleName, QWidget *parent, const char *name , int width) : QHBox( parent, name ), cmbCat( 0 ), cmdCat( 0 ), d( 0 ){ init(width); setCategories( vl, appName, visibleName );}/*! \overload This constructor accepts an array \a vl of integers representing Categories. \a appName is used as the visible name string.*/CategorySelect::CategorySelect( const QArray<int> &vl, const QString &appName, QWidget *parent, const char *name ,int width) : QHBox( parent, name ), cmbCat( 0 ), cmdCat( 0 ), d( 0 ){ init(width); setCategories( vl, appName, appName );}/*! Constructs a category selector with parent \a parent, name \a name and fixed width \a width. This constructor is provided to make integration with Qt Designer easier.*/CategorySelect::CategorySelect( QWidget *parent, const char *name,int width) : QHBox( parent, name ), cmbCat( 0 ), cmdCat( 0 ), d( 0 ){ init(width);}/*! Destructs a CategorySelect widget.*/CategorySelect::~CategorySelect(){}class EditDlg : public QDialog{ Q_OBJECTpublic: EditDlg(QWidget *parent, const char *name, bool modal, const QArray<int> &vlRecs, const QString &appName, const QString &visibleName) : QDialog(parent, name, modal) { setCaption( tr("Edit Categories") ); QVBoxLayout *vb = new QVBoxLayout( this ); ce = new CategoryEdit( vlRecs, appName, visibleName, this ); vb->addWidget( ce ); } QArray<int> newCategories() { return ce->newCategories(); };protected: void accept() { if ( !ce->tryAccept() ) return; QDialog::accept(); }private: CategoryEdit *ce;};/*! This slot is called when the user pushes the button to edit Categories.*/void CategorySelect::slotDialog(){ EditDlg editDlg( this, "categories", TRUE, d->mRec, mStrAppName, d->mVisibleName ); // No tr#ifndef QTOPIA_DESKTOP editDlg.showMaximized(); // need to add OKAY, CANCEL button#endif d->editMode = TRUE; if ( editDlg.exec() ) { d->mRec = editDlg.newCategories(); cmbCat->initCombo( d->mRec, mStrAppName, d->mVisibleName ); if ( d->usingAll ) cmbCat->insertItem( tr( "All" ), cmbCat->count() ); }}/*! This slot is called when the available Categories have been changed.*/void CategorySelect::categoriesChanged(){ if ( d->editMode ) { //only one can edit at a time, so if we're the one we can ignore this signal // as it will be handled in slotDialog d->editMode = FALSE; } else { if ( d->type == ComboBox ) { int prevCat = cmbCat->currentCategory(); cmbCat->initComboWithRefind( d->mRec, mStrAppName ); if ( d->usingAll ) { cmbCat->insertItem( tr( "All" ), cmbCat->count() ); } cmbCat->setCurrentCategory( prevCat ); // Test if category is still valid. If it isn't we need to inform our parent about a selection change if ( cmbCat->currentCategory() != prevCat ) { cmbCat->setCurrentCategory(-1); emit signalSelected( cmbCat->currentCategory() ); } } else { QStringList current = d->catSelector->checked(); d->cats.load( categoryFileName() ); d->pruneDeletedCats(); d->reloadCatSelector( current ); } }}/*! This slot is called when a new Category is available.*/void CategorySelect::slotNewCat( int newUid ){ if ( newUid != -1 ) { bool alreadyIn = false; for ( uint it = 0; it < d->mRec.count(); ++it ) { if ( d->mRec[(int)it] == newUid ) { alreadyIn = true; break; } } if ( !alreadyIn ) { d->mRec.resize( 1 ); d->mRec[ 0 ] = newUid; } } else d->mRec.resize(0); // now Unfiled. emit signalSelected( currentCategory() );}/*! \overload Resets the CategorySelect to select the \a vlCats for the Categories assoicated with \a appName. This function should only be called if <i>filtering</i> on Categories and not selecting and therefore possibly allowing the user to edit Categories.*/QString CategorySelect::setCategories( const QArray<int> &rec, const QString &appName ){ return setCategories( rec, appName, appName );}/*! Resets the CategorySelect to select the \a vlCats for the Categories assoicated with \a appName and displays the \a visibleName if the user is selecting and therefore editing new Categories. */QString CategorySelect::setCategories( const QArray<int> &rec, const QString &appName, const QString &visibleName ){ d->mVisibleName = visibleName; mStrAppName = appName; d->appName = appName; if ( d->type == ComboBox ) d->mRec = cmbCat->initComboWithRefind( rec, appName ); else { d->mRec = rec.copy(); d->reloadCatSelector(); } return Qtopia::Record::idsToString(d->mRec);}#ifdef QTOPIA_DESKTOPvoid CategorySelect::init(int width, bool usingAll ){#elsevoid CategorySelect::init(int width){ const bool usingAll = FALSE;#endif if ( d ) { delete d->layout; delete d->container; d->usingAll = usingAll; d->setType(); } else { d = new CategorySelectPrivate( this, usingAll ); } d->container = new QWidget( this, "CategorySelect container" ); // No tr if ( d->type == ComboBox ) { d->layout = new QGridLayout( d->container ); delete cmbCat; cmbCat = new CategoryCombo( d->container, "category combo", width); // No tr d->layout->addWidget( cmbCat, 0, 0 ); QObject::connect( cmbCat, SIGNAL(sigCatChanged(int)), this, SLOT(slotNewCat(int)) ); if ( d->canEdit ) { cmdCat = new QToolButton( d->container, "category button" ); // No tr d->layout->addWidget( cmdCat, 0, 1 ); cmdCat->setTextLabel( "...", FALSE ); cmdCat->setFocusPolicy( TabFocus ); cmdCat->setFixedHeight( cmbCat->sizeHint().height() ); cmdCat->setUsesTextLabel( true ); QObject::connect( cmdCat, SIGNAL(clicked()), this, SIGNAL(editCategoriesClicked()) ); QObject::connect( cmdCat, SIGNAL(clicked()), this, SLOT(slotDialog()) ); } } else { d->layout = new QGridLayout( d->container, 2, 2 ); d->cats.load( categoryFileName() ); d->catSelector = (CheckedListView *) new QListView( d->container, "catSelector" ); d->catSelector->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); d->catSelector->addColumn( tr("Categories") ); d->catSelector->setSelectionMode( QListView::NoSelection ); d->layout->addMultiCellWidget( d->catSelector, 0, 0, 0, 1 ); QSpacerItem *horiSpacer = new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Expanding ); d->layout->addItem( horiSpacer, 1, 0 ); d->editButton = new QPushButton( tr("Edit Categories"), d->container ); d->layout->addWidget( d->editButton, 1, 1 ); connect( d->catSelector, SIGNAL( clicked( QListViewItem *) ), d, SLOT( itemClicked( QListViewItem *) ) ); connect( d->catSelector, SIGNAL( spacePressed( QListViewItem *) ), d, SLOT( itemClicked( QListViewItem *) ) ); connect( d->editButton, SIGNAL( clicked() ), this, SIGNAL( editCategoriesClicked() ) );#ifndef QTOPIA_DESKTOP connect( d->editButton, SIGNAL( clicked() ), SLOT( slotDialog() ) );#endif }#ifndef QTOPIA_DESKTOP connect(qApp, SIGNAL( categoriesChanged() ), this, SLOT( categoriesChanged() ) );#endif d->fixedWidth = width;}/*! Return the value of the currently selected category. */int CategorySelect::currentCategory() const{ if ( d->type == ComboBox ) return cmbCat->currentCategory(); return currentCategories()[0];}void CategorySelect::setCurrentCategory( int newCatUid ){ if ( d->type == ComboBox ) cmbCat->setCurrentCategory( newCatUid ); else d->catSelector->setChecked( d->cats.label( mStrAppName, newCatUid ) );}/*! Returns a shallow copy of the categories in this CategorySelect. */const QArray<int> &CategorySelect::currentCategories() const{ return d->mRec;}/*! Hides the edit section of the CategorySelect widget if \a remove is TRUE. */void CategorySelect::setRemoveCategoryEdit( bool remove ){ d->canEdit = !remove; if ( !cmdCat ) return; if ( remove ) { cmdCat->setEnabled( FALSE ); cmdCat->hide(); } else { cmdCat->setEnabled( TRUE ); cmdCat->show(); }}/*! Changes this CategorySelect to the All category if \a all is TRUE. */void CategorySelect::setAllCategories( bool all ){ // if showing all category, then that means the // user isn't just selecting bool createCmb = FALSE; bool reinit = FALSE; if ( !d->usingAll && all && d->catSelector ) { createCmb = TRUE; reinit = TRUE; } else if ( d->usingAll && !all && !d->catSelector ) reinit = TRUE; if ( reinit ) {#ifdef QTOPIA_DESKTOP init( d->fixedWidth, all );#else init( d->fixedWidth ); d->usingAll = all;#endif setCategories( d->mRec, d->appName, d->mVisibleName ); } if ( cmdCat ) { if ( all ) { cmbCat->insertItem( tr( "All" ), cmbCat->count() ); cmbCat->setCurrentItem( cmbCat->count() - 1 ); } else if ( !createCmb && cmbCat->text( cmbCat->count()-1) == tr("All") ) { cmbCat->removeItem( cmbCat->count() - 1 ); } } d->usingAll = all;}// 01.12.21 added/*! Sets the fixed width of the widget to \a width. */void CategorySelect::setFixedWidth(int width){ if ( d->type == ComboBox ) { width -= cmdCat->width(); cmbCat->setFixedWidth(width); } else d->catSelector->setFixedWidth( width ); d->fixedWidth = width;}#include "categoryselect.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -