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

📄 kiconloaderdialog.cpp

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 CPP
字号:
// -*- C++ -*-////  kiconloaderdialog////  Copyright (C) 1997 Christoph Neerfeld//  email:  Christoph.Neerfeld@home.ivm.de or chris@kde.org////  This program is free software; you can redistribute it and/or modify//  it under the terms of the GNU Library General Public License as published by//  the Free Software Foundation; either version 2 of the License, or//  (at your option) any later version.////  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 Library General Public License for more details.////  You should have received a copy of the GNU Library General Public License//  along with this program; if not, write to the Free Software//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.//#include <qapplication.h>#include <qdir.h>#include <qpainter.h>#include <qwmatrix.h>#include "kiconloaderdialog.h"#include "kiconloaderdialog.h"#include <kpixmap.h>#include <klocale.h>#define klocale KApplication::getKApplication()->getLocale()//----------------------------------------------------------------------//---------------  KICONLOADERCANVAS   ---------------------------------//----------------------------------------------------------------------KIconLoaderCanvas::KIconLoaderCanvas (QWidget *parent, const char *name )  :QTableView( parent, name ){  max_width = 0;  max_height = 0;  setFrameStyle(Panel | Sunken);  setTableFlags(Tbl_autoScrollBars);  pixmap_list.setAutoDelete(TRUE);  name_list.setAutoDelete(TRUE);  sel_id = 0;  timer = new QTimer( this );  connect( timer, SIGNAL( timeout() ), SLOT( process() ) );}KIconLoaderCanvas::~KIconLoaderCanvas(){  delete timer;  name_list.clear();  pixmap_list.clear(); }void KIconLoaderCanvas::loadDir( QString dirname, QString filter ){  if ( timer->isActive() )    {      timer->stop();      QApplication::restoreOverrideCursor();    }  dir_name = dirname;  QDir d(dir_name);  name_list.clear();  pixmap_list.clear();  if( !filter.isEmpty() )    {      d.setNameFilter(filter);    }  if( d.exists() )    {      file_list = *d.entryList( QDir::Files | QDir::Readable, QDir::Name );      QApplication::setOverrideCursor( waitCursor );      curr_indx = 0;      sel_id = 0;      max_width  = 16;      max_height = 16;      setTopLeftCell(0,0);      timer->start( 0, true );    }  else    {      setNumCols( 0 );      setNumRows( 0 );      max_width = 20;      max_height = 20;      setCellWidth(max_width+4);      setCellHeight(max_height+4);      repaint();    }}void KIconLoaderCanvas::process(){  KPixmap *new_xpm = 0;  const char *current = file_list.at( curr_indx );  for( int i = 0; i < 10 && current != 0; i++, curr_indx++ )    {      new_xpm = new KPixmap;      new_xpm->load( dir_name + '/' + current, 0, KPixmap::LowColor );      if( new_xpm->isNull() )        {          delete new_xpm;          continue;        }      if( new_xpm->width() > 60 || new_xpm->height() > 60 )        { // scale pixmap to a size of 60*60          QWMatrix m;          float scale;          if( new_xpm->width() > new_xpm->height() )            scale = 60 / (float) new_xpm->width();	  else	    scale = 60 / (float) new_xpm->height();	  m.scale( scale, scale );	       QPixmap tmp_xpm = new_xpm->xForm(m);	       new_xpm->resize( tmp_xpm.width(), tmp_xpm.height() );	       bitBlt( new_xpm, 0, 0, &tmp_xpm );	       if ( tmp_xpm.mask() )		   new_xpm->setMask( *tmp_xpm.mask() );	 }       max_width  = ( max_width  > new_xpm->width()  ? max_width  : new_xpm->width() );       max_height = ( max_height > new_xpm->height() ? max_height : new_xpm->height() );       name_list.append(current);       pixmap_list.append(new_xpm);       current = file_list.next();    }  if ( !current )    {      QApplication::restoreOverrideCursor();      file_list.clear();    }  else      timer->start( 0, true );  // progressive display is nicer if these don't change too often  max_width  = ( max_width + 7 ) / 8 * 8;  max_height = ( max_height + 7 ) / 8 * 8;  if( name_list.count() == 0 )    {      setNumCols( 0 );      setNumRows( 0 );      max_width = 20;      max_height = 20;      setCellWidth(max_width+4);      setCellHeight(max_height+4);      repaint();    }  else    {      setNumCols( width() / (max_width+4) );      setNumRows( name_list.count() / numCols() + 1 );      setCellWidth(max_width+4);      setCellHeight(max_height+4);      if ( rowIsVisible( curr_indx / numCols() ) )	  repaint();    }}void KIconLoaderCanvas::paintCell( QPainter *p, int r, int c ){  int item_nr = r * numCols() + c;  if( item_nr >= (int) pixmap_list.count() || item_nr < 0 )    {      return;    }  QPixmap *pixmap = pixmap_list.at(item_nr);  if( !pixmap )    return;  int w = cellWidth();  int h = cellHeight();  int pw = pixmap->width();  int ph = pixmap->height();  int x = (w-pw)/2;  int y = (h-ph)/2;  p->drawPixmap( x, y, *pixmap );  if( item_nr == sel_id )    p->drawRect( 0, 0, cellWidth(), cellHeight() );}void KIconLoaderCanvas::mouseMoveEvent( QMouseEvent *e){  if( (e->pos().x() > numCols() * cellWidth()) || (e->pos().y() > numRows() * cellHeight()) )    {      emit nameChanged("");      return;    }  int item_nr = findRow(e->pos().y()) * numCols() + findCol(e->pos().x());  if( item_nr >= (int) name_list.count() || item_nr < 0 )    {      emit nameChanged("");      return;    }  QString name = name_list.at(item_nr);  emit nameChanged( (const char *) name );}void KIconLoaderCanvas::mousePressEvent( QMouseEvent *e){  if( name_list.count () == 0 )    return;  int i = sel_id;  sel_id = findRow(e->pos().y()) * numCols() + findCol(e->pos().x());  updateCell( i / numCols(), i % numCols() );  updateCell( findRow(e->pos().y()), findCol(e->pos().x()) );}void KIconLoaderCanvas::mouseDoubleClickEvent( QMouseEvent * ){  emit doubleClicked();}void KIconLoaderCanvas::resizeEvent( QResizeEvent * e){  if( !isVisible() )    return;  setNumCols( width() / (max_width+4) );  setNumRows( name_list.count() / numCols() + 1 );  QTableView::resizeEvent(e);  repaint(TRUE);}void KIconLoaderCanvas::cancelLoad(){  if ( timer->isActive() )    {      timer->stop();      QApplication::restoreOverrideCursor();      emit interrupted();    }}//----------------------------------------------------------------------//---------------  KICONLOADERDIALOG   ---------------------------------//----------------------------------------------------------------------void KIconLoaderDialog::init(){  setCaption(klocale->translate("Select Icon"));  //---  i_filter = new QLineEdit(this);  i_filter->setGeometry(310, 8, 150, 24);  //---  l_filter = new QLabel( klocale->translate("Filter:"), this );  l_filter->setGeometry( 310 - 50, 8, 40, 24 );  //---  canvas = new KIconLoaderCanvas(this);  canvas->setGeometry(10, 38, 450, 124);  //---  l_name = new QLabel("", this);  l_name->setGeometry(10, 165, 110, 24);  //---  cb_dirs = new QComboBox(FALSE, this);  cb_dirs->setGeometry(10, 8, 230, 24);  //---  ok = new QPushButton( klocale->translate("OK"), this );  cancel = new QPushButton( klocale->translate("Cancel"), this );  ok->setGeometry(65, 200, 80, 30);  cancel->setGeometry(325, 200, 80, 30);  connect( ok, SIGNAL(clicked()), this, SLOT(accept()) );  connect( cancel, SIGNAL(clicked()), this, SLOT(reject()) );  connect( canvas, SIGNAL(nameChanged(const char *)), l_name, SLOT(setText(const char *)) );  connect( canvas, SIGNAL(doubleClicked()), this, SLOT(accept()) );  connect( canvas, SIGNAL(interrupted()), this, SLOT(needReload()) );  connect( i_filter, SIGNAL(returnPressed()), this, SLOT(filterChanged()) );  connect( cb_dirs, SIGNAL(activated(const char *)), this, SLOT(dirChanged(const char*)) );  setDir(icon_loader->getDirList());  resize( 470, 350 );  setMinimumSize( 470, 250 );}KIconLoaderDialog::KIconLoaderDialog ( QWidget *parent, const char *name )  : QDialog( parent, name, TRUE ){  icon_loader = KApplication::getKApplication()->getIconLoader();  init();}KIconLoaderDialog::KIconLoaderDialog ( KIconLoader *loader, QWidget *parent, const char *name )  : QDialog( parent, name, TRUE ){  icon_loader = loader;  init();}KIconLoaderDialog::~KIconLoaderDialog(){  disconnect( ok );  disconnect( cancel );  disconnect( canvas );}void KIconLoaderDialog::reject(){  canvas->cancelLoad();   QDialog::reject();}void KIconLoaderDialog::needReload(){  i_filter->setText("");}int KIconLoaderDialog::exec(QString filter){  setResult( 0 );  if( filter != i_filter->text() )    {      canvas->loadDir( cb_dirs->currentText(), filter );      i_filter->setText( filter );    }  show();  return result();}void KIconLoaderDialog::resizeEvent( QResizeEvent * ){  int w = width();  int h = height();  canvas->resize( w - 20, h - 106 );  l_name->resize( canvas->width(), 24 );  l_name->move( 10, 38 + canvas->height() );  i_filter->move( w - 160, 8 );  l_filter->move( w - 200, 8 );  cb_dirs->resize( canvas->width() - i_filter->width() - l_filter->width() - 18, 24 );  ok->move( 65, h - 40  );  cancel->move( w - 145, h - 40 );}void KIconLoaderDialog::filterChanged(){  canvas->loadDir( cb_dirs->currentText(), i_filter->text() );}void KIconLoaderDialog::dirChanged(const char * dir){  canvas->loadDir( dir, i_filter->text() );}QPixmap KIconLoaderDialog::selectIcon( QString &name, const QString &filter){  QPixmap pixmap;  QString pix_name, old_filter;  old_filter = i_filter->text();  if( old_filter.isEmpty() )    old_filter = filter;  if( exec(old_filter) )  {      if( (pix_name = canvas->getCurrent()) )	  pixmap = icon_loader->loadIcon( pix_name );  }  name = pix_name;  return pixmap;}KIconLoaderButton::KIconLoaderButton( QWidget *_parent ) : QPushButton( _parent ){    iconStr = "";    connect( this, SIGNAL( clicked() ), this, SLOT( slotChangeIcon() ) );    iconLoader = kapp->getIconLoader();    loaderDialog = new KIconLoaderDialog();}KIconLoaderButton::KIconLoaderButton( KIconLoader *_icon_loader, QWidget *_parent ) : QPushButton( _parent ){    iconStr = "";    connect( this, SIGNAL( clicked() ), this, SLOT( slotChangeIcon() ) );    loaderDialog = new KIconLoaderDialog( _icon_loader );    iconLoader = _icon_loader;}void KIconLoaderButton::slotChangeIcon(){    QString name;    QPixmap pix = loaderDialog->selectIcon( name, "*" );    if( !pix.isNull() )    {	setPixmap(pix);	iconStr = name.data();	emit iconChanged( iconStr );    }    }void KIconLoaderButton::setIcon( const char *_icon ){    iconStr = _icon;    // A Hack, since it uses loadApplicationIcon!!!    setPixmap( KApplication::getKApplication()->getIconLoader()->loadApplicationIcon( iconStr ) );}KIconLoaderButton::~KIconLoaderButton() {    if ( loaderDialog )	delete loaderDialog;}#include "kiconloaderdialog.moc"

⌨️ 快捷键说明

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