⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 categoryselect.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.**** This file may be distributed and/or modified under the terms of the** GNU General Public License version 2 as published by the Free Software** Foundation and appearing in the file LICENSE.GPL included in the** packaging of this file.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.**** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include <qtopia/categories.h>#include <qtopia/private/palmtoprecord.h>#include <qtopia/qpeapplication.h>#include <qdir.h>#include <qmessagebox.h>#include <qlayout.h>#include <qtoolbutton.h>#include <qfile.h>#include <qpushbutton.h>#include <qobject.h>#include "categoryedit_p.h"#include "categoryselect.h"#include <stdlib.h>/*! \enum CategorySelect::SelectorWidget  Chooses a type of widget to use as the selection widget.  \value ComboBox  \value ListView*//*!  \class CategorySelect  \brief The CategorySelect widget allows users to select Categories with a  combobox interface.  CategorySelect is useful to provide a QComboBox of Categories for  filtering (such as in the Contacts table view) or to allow the user  to select multiple Categories. The allCategories variable sets  whether the CategorySelect is in filtering or selecting mode.  In filtering mode, the All and Unfiled categories are added. The  In selecting mode, the CategorySelect may either be a QComboBox and  a QToolButton or a QListView with checkable items depending on the  screen size.  CategorySelect automatically updates itself if Categories has been  changed elsewhere in the environment.  Signals and slots are provided to notify the application of the users  selections.  A QToolButton is also provided so that users can edit the  Categories manually.  \ingroup qtopiaemb*/class CategoryComboPrivate{public:    CategoryComboPrivate() { }    QArray<int> mAppCats;    QString mStrAppName;    QString mStrVisibleName;    Categories mCats;};CategoryCombo::CategoryCombo( QWidget *parent, const char *name , int width)    : QComboBox( parent, name ){    QSizePolicy p = sizePolicy();    p.setHorData(QSizePolicy::Expanding);    setSizePolicy(p);    d = new CategoryComboPrivate();    if (width)      setFixedWidth(width);}void CategoryCombo::initCombo( const QArray<int> &recCats,			       const QString &appName ){    initCombo( recCats, appName, appName );}void CategoryCombo::initCombo( const QArray<int> &recCats,			       const QString &appName,			       const QString &visibleName ){    d->mStrAppName = appName;    d->mStrVisibleName = visibleName;    clear();    QStringList slApp;    bool loadOk = d->mCats.load( categoryFileName() );    QObject::connect( this, SIGNAL(activated(int)),		      this, SLOT(slotValueChanged(int)) );    slApp = d->mCats.labels( d->mStrAppName, TRUE, Categories::UnfiledLabel );    d->mAppCats = d->mCats.ids( d->mStrAppName, slApp);    int i,	j,	saveMe,	recCount;    QStringList::Iterator it;    // now add in all the items...    recCount = recCats.count();    saveMe = -1;    if ( recCount > 1 && loadOk ) {	it = slApp.begin();	for ( j = 0; j< (int)(slApp.count()-1); ++it, j++ ) {	    // grr... we have to go through and compare...	    if ( j < int(d->mAppCats.size()) ) {		for ( i = 0; i < recCount; i++ ) {		    if ( recCats[i] == d->mAppCats[j] ) {			(*it).append( tr(" (multi.)","short 'multiple'") );			if ( saveMe < 0 )			    saveMe = j;			// no need to continue through the list.			break;		    }		}	    }	    insertItem( *it );	}	insertItem( *it );    } else	insertStringList( slApp );    if ( recCount > 0 && loadOk ) {	for ( i = 0; i < int(d->mAppCats.size()); i++ ) {	    if ( d->mAppCats[i] == recCats[0] ) {		setCurrentItem( i );		break;	    }	}    } else {	setCurrentItem( slApp.count()-1 );  // unfiled    }}// this is a new function by SHARP instead of initCombo()QArray<int> CategoryCombo::initComboWithRefind( const QArray<int> &recCats,			       const QString &appName){    QString visibleName = appName;    d->mStrAppName = appName;    d->mStrVisibleName = visibleName;    clear();    QStringList slApp;    QArray<int> results;    QObject::disconnect( this, SIGNAL(activated(int)),		      this, SLOT(slotValueChanged(int)) );    QObject::connect( this, SIGNAL(activated(int)),		      this, SLOT(slotValueChanged(int)) );    bool loadOk = d->mCats.load( categoryFileName() );    slApp = d->mCats.labels( d->mStrAppName, TRUE, Categories::UnfiledLabel );    d->mAppCats = d->mCats.ids( d->mStrAppName, slApp);    // addition part    // make new recCats    if (loadOk){      int i,j;      int value;      int rCount = recCats.count();      int mCount = d->mAppCats.count();      for (i=0; i<rCount; i++){	value = 0;	for (j=0; j<mCount; j++){	  if (recCats[i] == d->mAppCats[j]){	    value = recCats[i];	    break;	  }	}	if (value != 0){	  int tmp = results.size();	  results.resize( tmp + 1 );	  results[ tmp ] = value;	}      }    }    else{      results = recCats.copy();    }    // addition end    int i,	j,	saveMe,	recCount;    QStringList::Iterator it;    // now add in all the items...    recCount = results.count();    saveMe = -1;    if ( recCount > 1 && loadOk ) {	it = slApp.begin();	for ( j = 0; j< (int)(slApp.count()-1); ++it, j++ ) {	    // grr... we have to go through and compare...	    if ( j < int(d->mAppCats.size()) ) {		for ( i = 0; i < recCount; i++ ) {		    if ( results[i] == d->mAppCats[j] ) {			(*it).append( tr(" (multi.)","short 'multiple'") );			if ( saveMe < 0 )			    saveMe = j;			// no need to continue through the list.			break;		    }		}	    }	    insertItem( *it );	}	insertItem( *it );    } else	insertStringList( slApp );    if ( recCount > 0 && loadOk ) {	for ( i = 0; i < int(d->mAppCats.size()); i++ ) {	    if ( d->mAppCats[i] == results[0] ) {		setCurrentItem( i );		break;	    }	}    } else    {	setCurrentItem( slApp.count()-1 );  // unfiled    }/*    QObject::connect( this, SIGNAL(activated(int)),		      this, SLOT(slotValueChanged(int)) );*/    return results;}CategoryCombo::~CategoryCombo(){    delete d;}int CategoryCombo::currentCategory() const{    int i = currentItem();    int r;    if ( i == (int)d->mAppCats.count() )	r = -1;    else if ( i > (int)d->mAppCats.count() )  // only happen on "All"	r = -2;    else	r =  d->mAppCats[i];    return r;}void CategoryCombo::setCurrentCategory( int newCatUid ){    if ( newCatUid == -1 ) {	setCurrentItem( d->mAppCats.count() );    } else if ( newCatUid == -2 ) {	setCurrentItem( d->mAppCats.count()+1 );    } else {	int i;	for ( i = 0; i < int(d->mAppCats.size()); i++ ) {	    if ( d->mAppCats[i] == newCatUid )		setCurrentItem( i );	}    }}void CategoryCombo::setCurrentText( const QString &str ){    int i;    int stop;    stop = count();    for ( i = 0; i < stop; i++ ) {	if ( text( i ) == str ) {	    setCurrentItem( i );	    break;	}    }}void CategoryCombo::slotValueChanged( int ){    emit sigCatChanged( currentCategory() );}class CategorySelectPrivate : public QObject{    Q_OBJECTpublic:    CategorySelectPrivate( QObject *parent, bool all )	: QObject(parent, "CategorySelectPrivate" ), mRec(),	  usingAll( all ), mVisibleName(), editMode( FALSE ),	  canEdit( TRUE ), type( CategorySelect::ComboBox ), container( 0 ),	  layout(0), fixedWidth(0), catSelector( 0 )    {	setType();    }    void setType()	{#ifndef QTOPIA_DESKTOP	    type = CategorySelect::ComboBox;#else	    if ( qApp->desktop()->height() >= 600 && !usingAll )		type = CategorySelect::ListView;	    else		type = CategorySelect::ComboBox;#endif	}    QArray<int> mRec;    bool usingAll;    QString mVisibleName;    bool editMode;    bool canEdit;    CategorySelect::SelectorWidget type;    QWidget *container;    QGridLayout *layout;    int fixedWidth;    // so far, the CheckedListView is used only for Qtopia Desktop    // but could be used for bigger PDA screen sizes    // the following methods and variables are used only when    // type == ComboBox    CheckedListView *catSelector;    QPushButton *editButton;    Categories cats;    QString appName;    void reloadCatSelector( const QStringList &checked )	{	    catSelector->clear();	    catSelector->addCheckableList( cats.labels( appName ) );	    catSelector->setChecked( checked );	}    void reloadCatSelector()	{	    // labels() from qtopia1	    QStringList strs = cats.globalGroup().labels( mRec );	    strs += cats.appGroupMap()[appName].labels( mRec );	    reloadCatSelector( strs );	}    void pruneDeletedCats()	{	    QArray<int> checkedCats;	    for ( int i = 0; i < (int) mRec.count();++i )		if ( cats.label( appName, mRec[i] ) != QString::null ) {		    checkedCats.resize( i+1 );		    checkedCats[i] = mRec[i];		}	    mRec = checkedCats;	}public slots:    void itemClicked( QListViewItem * )	{	    mRec = cats.ids( appName, catSelector->checked() );	}};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -