📄 fileselector.cpp
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS. All rights reserved.**** This file is part of the Qtopia Environment.** ** 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.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** 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.************************************************************************/#define QTOPIA_INTERNAL_FS_SEL#include "global.h"#include "fileselector.h"#include "fileselector_p.h"#include "resource.h"#include "config.h"#include "applnk.h"#include "storage.h"#include "qpemenubar.h"#ifdef Q_WS_QWS#include "qcopchannel_qws.h"#endif#include "applnk.h"#include "qpeapplication.h"#include "categorymenu.h"#include "categoryselect.h"#include "mimetype.h"#include "categories.h"#include "qpemessagebox.h"#ifdef QTOPIA_PHONE# include <qtopia/categorydialog.h>#endif#include <stdlib.h>#include <qwidgetstack.h>#include <qtimer.h>#include <qdir.h>#include <qwidget.h>#include <qregexp.h>#include <qpopupmenu.h>#include <qtoolbutton.h>#include <qpushbutton.h>#include <qheader.h>#include <qpainter.h>#include <qtooltip.h>#include <qlistbox.h>#include <qwhatsthis.h>#include <qlabel.h>#include <qlayout.h>#include <qaction.h>QIconSet qtopia_internal_loadIconSet( const QString &pix );class TypeFilter : public QHBox{ Q_OBJECTpublic: enum WidgetType { ComboBox, ListBox }; TypeFilter( WidgetType t, QWidget *parent, const char *name=0 ) : QHBox( parent, name ), type(t) { if (type == ComboBox) { combo = new QComboBox(this); combo->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred) ); connect( combo, SIGNAL(activated(int)), this, SLOT(selectType(int)) ); } else { list = new QListBox(this); connect( list, SIGNAL(selected(int)), this, SLOT(selectType(int)) ); } } void reread( DocLnkSet &files, const QString &filter ); void clear() { if (type == ComboBox) combo->clear(); else list->clear(); } uint count() { if (type == ComboBox) return combo->count(); else return list->count(); } void setCurrentItem(int i) { if (type == ComboBox) combo->setCurrentItem(i); else list->setCurrentItem(i); } void insertItem( const QString &s ) { if (type == ComboBox) combo->insertItem(s); else list->insertItem(s); } void insertStringList( const QStringList &s ) { if (type == ComboBox) combo->insertStringList(s); else list->insertStringList(s); } QString currentText() const { if (type == ComboBox) return combo->currentText(); else return list->currentText(); } QString text(int i) const { if (type == ComboBox) return combo->text(i); else return list->text(i); }signals: void selected( const QString & );protected slots: void selectType( int idx ) { emit selected( typelist[idx] ); }protected: QStringList typelist; QString prev; QComboBox *combo; QListBox *list; WidgetType type;};void TypeFilter::reread( DocLnkSet &files, const QString &filter ){ typelist.clear(); QStringList filters = QStringList::split( ';', filter ); int pos = filter.find( '/' ); //### do for each filter if ( filters.count() == 1 && pos >= 0 && filter[pos+1] != '*' ) { typelist.append( filter ); QString minor = filter.mid( pos+1 ); minor[0] = minor[0].upper(); clear(); insertItem( tr("%1 files").arg(minor) ); setCurrentItem(0); setEnabled( FALSE ); return; } QListIterator<DocLnk> dit( files.children() ); for ( ; dit.current(); ++dit ) { if ( !typelist.contains( (*dit)->type() ) ) typelist.append( (*dit)->type() ); } QStringList types; QStringList::ConstIterator it; for (it = typelist.begin(); it!=typelist.end(); ++it) { QString t = *it; if ( t.left(12) == "application/" ) { MimeType mt(t); const AppLnk* app = mt.application(); if ( app ) t = app->name(); else t = t.mid(12); } else { QString major, minor; int pos = t.find( '/' ); if ( pos >= 0 ) { major = t.left( pos ); minor = t.mid( pos+1 ); } if ( minor.find( "x-" ) == 0 ) minor = minor.mid( 2 ); minor[0] = minor[0].upper(); major[0] = major[0].upper(); if ( filters.count() > 1 ) t = tr("%1 %2", "minor mimetype / major mimetype").arg(minor).arg(major); else t = minor; } types += tr("%1 files").arg(t); } for (it = filters.begin(); it!=filters.end(); ++it) { typelist.append( *it ); int pos = (*it).find( '/' ); if ( pos >= 0 ) { QString maj = (*it).left( pos ); maj[0] = maj[0].upper(); types << tr("All %1 files").arg(maj); } } if ( filters.count() > 1 ) { typelist.append( filter ); types << tr("All files"); } prev = currentText(); clear(); insertStringList(types); for (int i=0; i<(int)count(); i++) { if ( text(i) == prev ) { setCurrentItem(i); break; } } if ( prev.isNull() ) setCurrentItem(count()-1); setEnabled( TRUE );}//===========================================================================static QColor mixColors(const QColor& a, const QColor& b, int pcth){ int pcthb = 100 - pcth; return QColor( (a.red() * pcth + b.red() * pcthb) / 100, (a.green() * pcth + b.green() * pcthb) / 100, (a.blue() * pcth + b.blue() * pcthb) / 100);}FileSelectorItem::FileSelectorItem( QListView *parent, const DocLnk &f ) : QListViewItem( parent ), fl( f ){ setText( 0, f.name() ); setPixmap( 0, f.pixmap() );}FileSelectorItem::~FileSelectorItem(){}void FileSelectorItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int align ){ QColorGroup mycg(cg); if ((itemPos() / height()) & 1) { QBrush sb = ((FileSelectorView*)listView())->altBrush(); mycg.setBrush(QColorGroup::Base, sb); } QListViewItem::paintCell(p, mycg, column, width, align);}FileSelectorView::FileSelectorView( QWidget *parent, const char *name ) : QListView( parent, name ){ setAllColumnsShowFocus( TRUE ); addColumn( tr( "Name" ) ); setColumnWidthMode( 0, QListView::Manual ); header()->hide(); paletteChange(palette());}FileSelectorView::~FileSelectorView(){}void FileSelectorView::keyPressEvent( QKeyEvent *e ){ QString txt = e->text(); if (e->key() == Key_Space) emit returnPressed( currentItem() ); else if ( !txt.isNull() && txt[0] > ' ' && e->key() < 0x1000 ) e->ignore(); else QListView::keyPressEvent(e);}QBrush FileSelectorView::altBrush() const{ return stripebrush;}void FileSelectorView::paletteChange( const QPalette &p ){ stripebrush = mixColors(colorGroup().base(), colorGroup().highlight(), 90); QListView::paletteChange(p);}class NewDocItem : public FileSelectorItem{public: NewDocItem( QListView *parent, const DocLnk &f ) : FileSelectorItem( parent, f ) { setText( 0, FileSelector::tr("New") ); QImage img( Resource::loadImage( "new" ) ); QPixmap pm; pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ); setPixmap( 0, pm ); } QString key ( int, bool ) const { return QString("\n"); } void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ) { QFont oldFont = p->font(); QFont newFont = p->font(); newFont.setWeight( QFont::Bold ); p->setFont( newFont ); FileSelectorItem::paintCell( p, cg, column, width, alignment ); p->setFont( oldFont ); } int width( const QFontMetrics &fm, const QListView *v, int c ) const { return FileSelectorItem::width( fm, v, c )*4/3; // allow for bold font }};//===========================================================================/*! \class FileSelector fileselector.h \brief The FileSelector widget allows the user to select DocLnk objects. This class presents a file selection dialog to the user. This widget is usually the first widget seen in a \link docwidget.html document-oriented application\endlink. The developer will most often create this widget in combination with a <a href="qwidgetstack.html"> QWidgetStack</a> and the appropriate editor and/or viewer widget for their application. This widget should be shown first and the user can the select which document they wish to operate on. Please refer to the implementation of texteditor for an example of how to tie these classes together. Use setNewVisible() depending on whether the application can be used to create new files or not. Use setCloseVisible() depending on whether the user may leave the dialog without creating or selecting a document or not. The number of files in the view is available from fileCount(). To force the view to be updated call reread(). If the user presses the 'New' button the newSelected() signal is emitted. If the user selects an existing file the fileSelected() signal is emitted. The selected file's \link doclnk.html DocLnk\endlink is available from the selected() function. If the file selector is no longer necessary the closeMe() signal is emitted. The typeChanged() and categoryChanged() signals are emitted when either a different file type or category are selected. Note that in Qtopia 1.5.0, there were no selectors for this, so these signals are never emitted on that platform. \ingroup qtopiaemb \sa FileManager*//*! \fn void FileSelector::typeChanged(void) This signal is emitted when a different file type is selected.*//*! \fn void FileSelector::categoryChanged(void) This signal is emitted when a different category is selected.*//*! Constructs a FileSelector with mime filter \a f. The standard Qt \a parent and \a name parameters are passed to the parent widget. If \a newVisible is TRUE, the widget has a button to allow the user the create "new" documents; this is useful for applications that can create and edit documents but not suitable for applications that only provide viewing. \a closeVisible is deprecated \sa DocLnkSet::DocLnkSet()*/FileSelector::FileSelector( const QString &f, QWidget *parent, const char *name, bool newVisible, bool closeVisible ) : QVBox( parent, name ), filter( f ){#define VIEW_ID 1#define MESSAGE_ID 2 setMargin( 0 ); setSpacing( 0 ); d = new FileSelectorPrivate(); d->showNew = newVisible; d->catId = -2; // All files d->files = 0; d->rereadTimer = new QTimer( this ); connect( d->rereadTimer, SIGNAL(timeout()), this, SLOT(slotReread()) ); d->needReread = TRUE;#ifndef QTOPIA_PHONE d->toolbar = new QHBox( this ); d->toolbar->setBackgroundMode( PaletteButton ); // same colour as toolbars d->toolbar->setSpacing( 0 ); d->toolbar->hide(); QWidget *spacer = new QWidget( d->toolbar ); spacer->setBackgroundMode( PaletteButton ); QToolButton *tb = new QToolButton( d->toolbar ); tb->setIconSet( qtopia_internal_loadIconSet( "close" ) ); connect( tb, SIGNAL( clicked() ), this, SIGNAL( closeMe() ) ); buttonClose = tb; tb->setFixedSize( 18, 20 ); // tb->sizeHint() ); tb->setAutoRaise( TRUE ); QToolTip::add( tb, tr( "Close the File Selector" ) ); QPEMenuToolFocusManager::manager()->addWidget( tb );#endif#ifdef QTOPIA_PHONE d->widgetStack = new QWidgetStack( this ); d->widgetStack->addWidget( view = new FileSelectorView( d->widgetStack, "fileview" ), VIEW_ID );#else view = new FileSelectorView( this, "fileview" );#endif view->setSorting(-1); view->setFrameStyle( QFrame::NoFrame ); QPEApplication::setStylusOperation( view->viewport(), QPEApplication::RightOnHold ); connect( view, SIGNAL( mouseButtonClicked(int,QListViewItem*,const QPoint&,int) ), this, SLOT( fileClicked(int,QListViewItem*,const QPoint&,int) ) ); connect( view, SIGNAL( mouseButtonPressed(int,QListViewItem*,const QPoint&,int) ), this, SLOT( filePressed(int,QListViewItem*,const QPoint&,int) ) ); connect( view, SIGNAL( returnPressed(QListViewItem*) ), this, SLOT( fileClicked(QListViewItem*) ) ); connect( view, SIGNAL( currentChanged(QListViewItem*) ), this, SLOT( currentChanged(QListViewItem*) ) );#ifndef QTOPIA_PHONE setFocusProxy( view );#endif #ifdef QTOPIA_PHONE d->widgetStack->addWidget( d->message = new QLabel( d->widgetStack ), MESSAGE_ID );#endif#ifndef QTOPIA_PHONE QHBox *hb = new QHBox( this );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -