-rw-r--r-- | libopie2/opieui/olistview.cpp | 8 | ||||
-rw-r--r-- | libopie2/opieui/opopupmenu.cpp | 4 | ||||
-rw-r--r-- | libopie2/opieui/oselector.cpp | 2 | ||||
-rw-r--r-- | libopie2/opieui/oselector.h | 4 |
4 files changed, 9 insertions, 9 deletions
diff --git a/libopie2/opieui/olistview.cpp b/libopie2/opieui/olistview.cpp index 67b4b83..4386e0e 100644 --- a/libopie2/opieui/olistview.cpp +++ b/libopie2/opieui/olistview.cpp @@ -1,768 +1,768 @@ /* This file is part of the Opie Project =. (C) 2003-2004 Michael 'Mickey' Lauer <mickey@Vanille.de> .=l. .>+-= _;:, .> :=|. This program is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -<s. 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 library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* QT */ #include <qpixmap.h> /* OPIE */ #include <opie2/odebug.h> #include <opie2/olistview.h> using namespace Opie::Core; namespace Opie { namespace Ui { /*====================================================================================== * OListView *======================================================================================*/ OListView::OListView( QWidget *parent, const char *name, WFlags fl ) :QListView( parent, name, fl ) { //FIXME: get from global settings and calculate ==> see oglobalsettings.* m_alternateBackground = QColor( 238, 246, 255 ); m_columnSeparator = QPen( QColor( 150, 160, 170 ), 0, DotLine ); m_fullWidth = true; connect( this, SIGNAL(expanded(QListViewItem*)), SLOT(expand(QListViewItem*))); } OListView::~OListView() { } void OListView::setFullWidth( bool fullWidth ) { m_fullWidth = fullWidth; - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 header()->setStretchEnabled( fullWidth, columns()-1 ); #endif } bool OListView::fullWidth() const { return m_fullWidth; } int OListView::addColumn( const QString& label, int width ) { int result = QListView::addColumn( label, width ); - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 if (m_fullWidth) { header()->setStretchEnabled( false, columns()-2 ); header()->setStretchEnabled( true, columns()-1 ); } #endif return result; } int OListView::addColumn( const QIconSet& iconset, const QString& label, int width ) { int result = QListView::addColumn( iconset, label, width ); - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 if (m_fullWidth) { header()->setStretchEnabled( false, columns()-2 ); header()->setStretchEnabled( true, columns()-1 ); } #endif return result; } void OListView::removeColumn( int index ) { QListView::removeColumn(index); - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 if ( m_fullWidth && index == columns() ) { header()->setStretchEnabled( true, columns()-1 ); } #endif } const QColor& OListView::alternateBackground() const { return m_alternateBackground; } void OListView::setAlternateBackground( const QColor &c ) { m_alternateBackground = c; repaint(); } const QPen& OListView::columnSeparator() const { return m_columnSeparator; } void OListView::setColumnSeparator( const QPen& p ) { m_columnSeparator = p; repaint(); } void OListView::expand(QListViewItem *item) { ((OListViewItem*)item)->expand(); } OListViewItem* OListView::childFactory() { return new OListViewItem( this ); } #ifndef QT_NO_DATASTREAM void OListView::serializeTo( QDataStream& s ) const { #warning Caution... the binary format is still under construction... odebug << "storing OListView..." << oendl; // store number of columns and the labels s << columns(); for ( int i = 0; i < columns(); ++i ) s << columnText( i ); // calculate the number of top-level items to serialize int items = 0; QListViewItem* item = firstChild(); while ( item ) { item = item->nextSibling(); items++; } // store number of items and the items itself s << items; item = firstChild(); for ( int i = 0; i < items; ++i ) { s << *static_cast<OListViewItem*>( item ); item = item->nextSibling(); } odebug << "OListview stored." << oendl; } void OListView::serializeFrom( QDataStream& s ) { #warning Caution... the binary format is still under construction... odebug << "loading OListView..." << oendl; int cols; s >> cols; odebug << "read number of columns = " << cols << oendl; while ( columns() < cols ) addColumn( QString::null ); for ( int i = 0; i < cols; ++i ) { QString coltext; s >> coltext; odebug << "read text '" << coltext << "' for column " << i << "" << oendl; setColumnText( i, coltext ); } int items; s >> items; odebug << "read number of items = " << items << oendl; for ( int i = 0; i < items; ++i ) { OListViewItem* item = childFactory(); s >> *item; } odebug << "OListView loaded." << oendl; } void OListView::expand() { odebug << "OListView::expand" << oendl; QListViewItemIterator it( this ); while ( it.current() ) { it.current()->setOpen( true ); ++it; } } void OListView::collapse() { odebug << "OListView::collapse" << oendl; QListViewItemIterator it( this ); while ( it.current() ) { it.current()->setOpen( false ); ++it; } } QDataStream& operator<<( QDataStream& s, const OListView& lv ) { lv.serializeTo( s ); return s; } QDataStream& operator>>( QDataStream& s, OListView& lv ) { lv.serializeFrom( s ); return s; } #endif // QT_NO_DATASTREAM /*====================================================================================== * OListViewItem *======================================================================================*/ OListViewItem::OListViewItem(QListView *parent) : QListViewItem(parent) { init(); } OListViewItem::OListViewItem(QListViewItem *parent) : QListViewItem(parent) { init(); } OListViewItem::OListViewItem(QListView *parent, QListViewItem *after) : QListViewItem(parent, after) { init(); } OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after) : QListViewItem(parent, after) { init(); } OListViewItem::OListViewItem(QListView *parent, QString label1, QString label2, QString label3, QString label4, QString label5, QString label6, QString label7, QString label8) : QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8) { init(); } OListViewItem::OListViewItem(QListViewItem *parent, QString label1, QString label2, QString label3, QString label4, QString label5, QString label6, QString label7, QString label8) : QListViewItem(parent, label1, label2, label3, label4, label5, label6, label7, label8) { init(); } OListViewItem::OListViewItem(QListView *parent, QListViewItem *after, QString label1, QString label2, QString label3, QString label4, QString label5, QString label6, QString label7, QString label8) : QListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8) { init(); } OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after, QString label1, QString label2, QString label3, QString label4, QString label5, QString label6, QString label7, QString label8) : QListViewItem(parent, after, label1, label2, label3, label4, label5, label6, label7, label8) { init(); } OListViewItem::~OListViewItem() { } void OListViewItem::init() { m_known = false; } const QColor &OListViewItem::backgroundColor() { return isAlternate() ? static_cast<OListView*>(listView())->alternateBackground() : listView()->viewport()->colorGroup().base(); } bool OListViewItem::isAlternate() { OListView *lv = static_cast<OListView*>( listView() ); // check if the item above is an OListViewItem OListViewItem *above = static_cast<OListViewItem*>( itemAbove() ); /*if (! itemAbove()->inherits( "OListViewItem" )) return false;*/ // check if we have a valid alternate background color if (!(lv && lv->alternateBackground().isValid())) return false; m_known = above ? above->m_known : true; if (m_known) { m_odd = above ? !above->m_odd : false; } else { OListViewItem *item; bool previous = true; if (parent()) { item = static_cast<OListViewItem *>(parent()); if ( item /*&& item->inherits( "OListViewItem" )*/ ) previous = item->m_odd; item = static_cast<OListViewItem *>(parent()->firstChild()); /* if ( !item.inherits( "OListViewItem" ) item = 0; */ } else { item = static_cast<OListViewItem *>(lv->firstChild()); } while(item) { item->m_odd = previous = !previous; item->m_known = true; item = static_cast<OListViewItem *>(item->nextSibling()); /* if (!item.inherits( "OListViewItem" ) ) break; */ } } return m_odd; } void OListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) { QColorGroup _cg = cg; const QPixmap *pm = listView()->viewport()->backgroundPixmap(); if (pm && !pm->isNull()) { _cg.setBrush( QColorGroup::Base, QBrush(backgroundColor(), *pm) ); p->setBrushOrigin( -listView()->contentsX(), -listView()->contentsY() ); } else if ( isAlternate() ) { _cg.setColor( QColorGroup::Base, static_cast<OListView*>( listView() )->alternateBackground() ); } QListViewItem::paintCell( p, _cg, column, width, alignment ); //FIXME: Use styling here! const QPen& pen = static_cast<OListView*>( listView() )->columnSeparator(); p->setPen( pen ); p->drawLine( width-1, 0, width-1, height() ); } OListViewItem* OListViewItem::childFactory() { return new OListViewItem( this ); } #ifndef QT_NO_DATASTREAM void OListViewItem::serializeTo( QDataStream& s ) const { #warning Caution... the binary format is still under construction... odebug << "storing OListViewItem..." << oendl; // store item text for ( int i = 0; i < listView()->columns(); ++i ) { s << text( i ); } // calculate the number of children to serialize int items = 0; QListViewItem* item = firstChild(); while ( item ) { item = item->nextSibling(); items++; } // store number of items and the items itself s << items; item = firstChild(); for ( int i = 0; i < items; ++i ) { s << *static_cast<OListViewItem*>( item ); item = item->nextSibling(); } odebug << "OListviewItem stored." << oendl; } void OListViewItem::serializeFrom( QDataStream& s ) { #warning Caution... the binary format is still under construction... odebug << "loading OListViewItem..." << oendl; for ( int i = 0; i < listView()->columns(); ++i ) { QString coltext; s >> coltext; odebug << "read text '" << coltext << "' for column " << i << "" << oendl; setText( i, coltext ); } int items; s >> items; odebug << "read number of items = " << items << "" << oendl; for ( int i = 0; i < items; ++i ) { OListViewItem* item = childFactory(); s >> (*item); } odebug << "OListViewItem loaded." << oendl; } QDataStream& operator<<( QDataStream& s, const OListViewItem& lvi ) { lvi.serializeTo( s ); return s; } QDataStream& operator>>( QDataStream& s, OListViewItem& lvi ) { lvi.serializeFrom( s ); return s; } #endif // QT_NO_DATASTREAM /*====================================================================================== * OCheckListItem *======================================================================================*/ OCheckListItem::OCheckListItem( QCheckListItem* parent, const QString& text, Type t ) :QCheckListItem( parent, text, t ) { init(); } OCheckListItem::OCheckListItem( QListViewItem* parent, const QString& text, Type t) :QCheckListItem( parent, text, t ) { init(); } OCheckListItem::OCheckListItem( QListView* parent, const QString& text, Type t ) :QCheckListItem( parent, text, t ) { init(); } OCheckListItem::OCheckListItem( QListViewItem* parent, const QString& text, const QPixmap& p ) :QCheckListItem( parent, text, p ) { init(); } OCheckListItem::OCheckListItem( QListView* parent, const QString& text, const QPixmap& p ) :QCheckListItem( parent, text, p ) { init(); } OCheckListItem::~OCheckListItem() { } void OCheckListItem::init() { m_known = false; } const QColor &OCheckListItem::backgroundColor() { return isAlternate() ? static_cast<OListView*>(listView())->alternateBackground() : listView()->viewport()->colorGroup().base(); } bool OCheckListItem::isAlternate() { OListView *lv = static_cast<OListView*>( listView() ); // check if the item above is an OCheckListItem OCheckListItem *above = static_cast<OCheckListItem*>( itemAbove() ); /*if (! itemAbove()->inherits( "OCheckListItem" )) return false;*/ // check if we have a valid alternate background color if (!(lv && lv->alternateBackground().isValid())) return false; m_known = above ? above->m_known : true; if (m_known) { m_odd = above ? !above->m_odd : false; } else { OCheckListItem *item; bool previous = true; if (parent()) { item = static_cast<OCheckListItem *>(parent()); if ( item /*&& item->inherits( "OCheckListItem" )*/ ) previous = item->m_odd; item = static_cast<OCheckListItem *>(parent()->firstChild()); /* if ( !item.inherits( "OCheckListItem" ) item = 0; */ } else { item = static_cast<OCheckListItem *>(lv->firstChild()); } while(item) { item->m_odd = previous = !previous; item->m_known = true; item = static_cast<OCheckListItem *>(item->nextSibling()); /* if (!item.inherits( "OCheckListItem" ) ) break; */ } } return m_odd; } void OCheckListItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) { QColorGroup _cg = cg; const QPixmap *pm = listView()->viewport()->backgroundPixmap(); if (pm && !pm->isNull()) { _cg.setBrush( QColorGroup::Base, QBrush(backgroundColor(), *pm) ); p->setBrushOrigin( -listView()->contentsX(), -listView()->contentsY() ); } else if ( isAlternate() ) { _cg.setColor( QColorGroup::Base, static_cast<OListView*>( listView() )->alternateBackground() ); } QCheckListItem::paintCell( p, _cg, column, width, alignment ); //FIXME: Use styling here! const QPen& pen = static_cast<OListView*>( listView() )->columnSeparator(); p->setPen( pen ); p->drawLine( width-1, 0, width-1, height() ); } /*====================================================================================== * ONamedListView *======================================================================================*/ ONamedListView::ONamedListView( QWidget *parent, const char *name ) :OListView( parent, name ) { } ONamedListView::~ONamedListView() { } void ONamedListView::addColumns( const QStringList& columns ) { for ( QStringList::ConstIterator it = columns.begin(); it != columns.end(); ++it ) { odebug << "adding column " << *it << "" << oendl; addColumn( *it ); } } int ONamedListView::findColumn( const QString& text ) const { //FIXME: If used excessively, this will slow down performance of updates //FIXME: because of the linear search over all column texts. //FIXME: I will optimize later by using a hash map. for ( int i = 0; i < columns(); ++i ) if ( columnText( i ) == text ) return i; return -1; } ONamedListViewItem* ONamedListView::find( int column, const QString& text, int recurse ) const { return find( (ONamedListViewItem*) firstChild(), column, text, recurse ); } ONamedListViewItem* ONamedListView::find( ONamedListViewItem* item, int column, const QString& text, int recurse ) const { ONamedListViewItem* result; while ( item && item->text( column ) != text ) { odebug << "checked " << item->text( column ) << "" << oendl; if ( recurse < 0 || recurse > 0 ) { odebug << "recursion is " << recurse << " - recursing into..." << oendl; result = find( (ONamedListViewItem*) item->firstChild(), column, text, recurse-1 ); if ( result ) return result; } item = (ONamedListViewItem*) item->itemBelow(); } if ( item && item->text( column ) == text ) return item; else return 0; } ONamedListViewItem* ONamedListView::find( const QString& column, const QString& text, int recurse ) const { int col = findColumn( column ); if ( col != -1 ) return find( (ONamedListViewItem*) firstChild(), col, text, recurse ); else return 0; } ONamedListViewItem* ONamedListView::find( ONamedListViewItem* item, const QString& column, const QString& text, int recurse ) const { int col = findColumn( column ); if ( col != -1 ) return find( item, col, text, recurse ); else return 0; } /*====================================================================================== * ONamedListViewItem *======================================================================================*/ ONamedListViewItem::ONamedListViewItem( QListView* parent, const QStringList& texts ) :OListViewItem( parent ) { setText( texts ); } ONamedListViewItem::ONamedListViewItem( QListViewItem* parent, const QStringList& texts ) :OListViewItem( parent ) { setText( texts ); } ONamedListViewItem::ONamedListViewItem( QListView* parent, QListViewItem* after, const QStringList& texts ) :OListViewItem( parent, after ) { setText( texts ); } ONamedListViewItem::ONamedListViewItem( QListViewItem* parent, QListViewItem* after, const QStringList& texts ) :OListViewItem( parent, after ) { setText( texts ); } ONamedListViewItem::~ONamedListViewItem() { } void ONamedListViewItem::setText( const QStringList& texts ) { int col = 0; for ( QStringList::ConstIterator it = texts.begin(); it != texts.end(); ++it ) { odebug << "setting column " << col << " = text " << *it << "" << oendl; OListViewItem::setText( col++, *it ); } } void ONamedListViewItem::setText( const QString& column, const QString& text ) { //FIXME: If used excessively, this will slow down performance of updates //FIXME: because of the linear search over all column texts. //FIXME: I will optimize later by using a hash map. int col = ( (ONamedListView*) listView() )->findColumn( column ); if ( col != -1 ) OListViewItem::setText( col, text ); else owarn << "ONamedListViewItem::setText(): Warning! Columntext '" << column << "' not found." << oendl; } ONamedListViewItem* ONamedListViewItem::find( int column, const QString& text, int recurse ) const { return ( (ONamedListView*) listView() )->find( (ONamedListViewItem*) firstChild(), column, text, recurse ); } ONamedListViewItem* ONamedListViewItem::find( const QString& column, const QString& text, int recurse ) const { int col = ( (ONamedListView*) listView() )->findColumn( column ); if ( col != -1 ) return ( (ONamedListView*) listView() )->find( (ONamedListViewItem*) firstChild(), col, text, recurse ); else return 0; } } } diff --git a/libopie2/opieui/opopupmenu.cpp b/libopie2/opieui/opopupmenu.cpp index 50c613f..5ce048e 100644 --- a/libopie2/opieui/opopupmenu.cpp +++ b/libopie2/opieui/opopupmenu.cpp @@ -1,600 +1,600 @@ /* This file is part of the KDE libraries Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org> Copyright (C) 2002 Hamish Rodda <meddie@yoyo.its.monash.edu.au> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library 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 library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* OPIE */ #include <opie2/opopupmenu.h> #include <opie2/oconfig.h> #include <opie2/odebug.h> /* QT */ #include <qdrawutil.h> #include <qtimer.h> using namespace Opie::Core; using namespace Opie::Ui; OPopupTitle::OPopupTitle(QWidget *parent, const char *name) : QWidget(parent, name) { setMinimumSize(16, fontMetrics().height()+8); } OPopupTitle::OPopupTitle(OPixmapEffect::GradientType /* gradient */, const QColor &/* color */, const QColor &/* textColor */, QWidget *parent, const char *name) : QWidget(parent, name) { setMinimumSize(16, fontMetrics().height()+8); } OPopupTitle::OPopupTitle(const OPixmap & /* background */, const QColor &/* color */, const QColor &/* textColor */, QWidget *parent, const char *name) : QWidget(parent, name) { setMinimumSize(16, fontMetrics().height()+8); } void OPopupTitle::setTitle(const QString &text, const QPixmap *icon) { titleStr = text; if (icon) miniicon = *icon; else miniicon.resize(0, 0); int w = miniicon.width()+fontMetrics().width(titleStr); int h = QMAX( fontMetrics().height(), miniicon.height() ); setMinimumSize( w+16, h+8 ); } void OPopupTitle::setText( const QString &text ) { titleStr = text; int w = miniicon.width()+fontMetrics().width(titleStr); int h = QMAX( fontMetrics().height(), miniicon.height() ); setMinimumSize( w+16, h+8 ); } void OPopupTitle::setIcon( const QPixmap &pix ) { miniicon = pix; int w = miniicon.width()+fontMetrics().width(titleStr); int h = QMAX( fontMetrics().height(), miniicon.height() ); setMinimumSize( w+16, h+8 ); } void OPopupTitle::paintEvent(QPaintEvent *) { QRect r(rect()); QPainter p(this); - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 qApp->style().drawPrimitive(QStyle::PE_HeaderSection, &p, r, palette().active()); #else #warning OPopupMenu is not fully functional on Qt2 #endif if (!miniicon.isNull()) p.drawPixmap(4, (r.height()-miniicon.height())/2, miniicon); if (!titleStr.isNull()) { p.setPen(palette().active().text()); QFont f = p.font(); f.setBold(true); p.setFont(f); if(!miniicon.isNull()) { p.drawText(miniicon.width()+8, 0, width()-(miniicon.width()+8), height(), AlignLeft | AlignVCenter | SingleLine, titleStr); } else { p.drawText(0, 0, width(), height(), AlignCenter | SingleLine, titleStr); } } p.setPen(palette().active().highlight()); p.drawLine(0, 0, r.right(), 0); } QSize OPopupTitle::sizeHint() const { return(minimumSize()); } class OPopupMenu::OPopupMenuPrivate { public: OPopupMenuPrivate () : noMatches(false) , shortcuts(false) , autoExec(false) , lastHitIndex(-1) , m_ctxMenu(0) {} ~OPopupMenuPrivate () { delete m_ctxMenu; } QString m_lastTitle; // variables for keyboard navigation QTimer clearTimer; bool noMatches : 1; bool shortcuts : 1; bool autoExec : 1; QString keySeq; QString originalText; int lastHitIndex; // support for RMB menus on menus QPopupMenu* m_ctxMenu; static bool s_continueCtxMenuShow; static int s_highlightedItem; static OPopupMenu* s_contextedMenu; }; int OPopupMenu::OPopupMenuPrivate::s_highlightedItem(-1); OPopupMenu* OPopupMenu::OPopupMenuPrivate::s_contextedMenu(0); bool OPopupMenu::OPopupMenuPrivate::s_continueCtxMenuShow(true); OPopupMenu::OPopupMenu(QWidget *parent, const char *name) : QPopupMenu(parent, name) { d = new OPopupMenuPrivate; resetKeyboardVars(); connect(&(d->clearTimer), SIGNAL(timeout()), SLOT(resetKeyboardVars())); } OPopupMenu::~OPopupMenu() { if (OPopupMenuPrivate::s_contextedMenu == this) { OPopupMenuPrivate::s_contextedMenu = 0; OPopupMenuPrivate::s_highlightedItem = -1; } delete d; } int OPopupMenu::insertTitle(const QString &text, int id, int index) { OPopupTitle *titleItem = new OPopupTitle(); titleItem->setTitle(text); int ret = insertItem(titleItem, id, index); setItemEnabled(id, false); return ret; } int OPopupMenu::insertTitle(const QPixmap &icon, const QString &text, int id, int index) { OPopupTitle *titleItem = new OPopupTitle(); titleItem->setTitle(text, &icon); int ret = insertItem(titleItem, id, index); setItemEnabled(id, false); return ret; } void OPopupMenu::changeTitle(int id, const QString &text) { QMenuItem *item = findItem(id); if(item){ if(item->widget()) ((OPopupTitle *)item->widget())->setTitle(text); #ifndef NDEBUG else owarn << "KPopupMenu: changeTitle() called with non-title id " << id << "" << oendl; #endif } #ifndef NDEBUG else owarn << "KPopupMenu: changeTitle() called with invalid id " << id << "" << oendl; #endif } void OPopupMenu::changeTitle(int id, const QPixmap &icon, const QString &text) { QMenuItem *item = findItem(id); if(item){ if(item->widget()) ((OPopupTitle *)item->widget())->setTitle(text, &icon); #ifndef NDEBUG else owarn << "KPopupMenu: changeTitle() called with non-title id " << id << "" << oendl; #endif } #ifndef NDEBUG else owarn << "KPopupMenu: changeTitle() called with invalid id " << id << "" << oendl; #endif } QString OPopupMenu::title(int id) const { if(id == -1) // obsolete return(d->m_lastTitle); QMenuItem *item = findItem(id); if(item){ if(item->widget()) return(((OPopupTitle *)item->widget())->title()); else owarn << "OPopupMenu: title() called with non-title id " << id << "." << oendl; } else owarn << "OPopupMenu: title() called with invalid id " << id << "." << oendl; return(QString::null); } QPixmap OPopupMenu::titlePixmap(int id) const { QMenuItem *item = findItem(id); if(item){ if(item->widget()) return(((OPopupTitle *)item->widget())->icon()); else owarn << "KPopupMenu: titlePixmap() called with non-title id " << id << "." << oendl; } else owarn << "KPopupMenu: titlePixmap() called with invalid id " << id << "." << oendl; QPixmap tmp; return(tmp); } /** * This is re-implemented for keyboard navigation. */ void OPopupMenu::closeEvent(QCloseEvent*e) { if (d->shortcuts) resetKeyboardVars(); QPopupMenu::closeEvent(e); } void OPopupMenu::keyPressEvent(QKeyEvent* e) { if (!d->shortcuts) { // continue event processing by Qpopup //e->ignore(); QPopupMenu::keyPressEvent(e); return; } int i = 0; bool firstpass = true; QString keyString = e->text(); // check for common commands dealt with by QPopup int key = e->key(); if (key == Key_Escape || key == Key_Return || key == Key_Enter || key == Key_Up || key == Key_Down || key == Key_Left || key == Key_Right || key == Key_F1) { resetKeyboardVars(); // continue event processing by Qpopup //e->ignore(); QPopupMenu::keyPressEvent(e); return; } // check to see if the user wants to remove a key from the sequence (backspace) // or clear the sequence (delete) if (!d->keySeq.isNull()) { if (key == Key_Backspace) { if (d->keySeq.length() == 1) { resetKeyboardVars(); return; } // keep the last sequence in keyString keyString = d->keySeq.left(d->keySeq.length() - 1); // allow sequence matching to be tried again resetKeyboardVars(); } else if (key == Key_Delete) { resetKeyboardVars(); // clear active item setActiveItem(0); return; } else if (d->noMatches) { // clear if there are no matches resetKeyboardVars(); // clear active item setActiveItem(0); } else { // the key sequence is not a null string // therefore the lastHitIndex is valid i = d->lastHitIndex; } } else if (key == Key_Backspace && parentMenu) { // backspace with no chars in the buffer... go back a menu. hide(); resetKeyboardVars(); return; } d->keySeq += keyString; int seqLen = d->keySeq.length(); for (; i < (int)count(); i++) { // compare typed text with text of this entry int j = idAt(i); // don't search disabled entries if (!isItemEnabled(j)) continue; QString thisText; // retrieve the right text // (the last selected item one may have additional ampersands) if (i == d->lastHitIndex) thisText = d->originalText; else thisText = text(j); // if there is an accelerator present, remove it if ((int)accel(j) != 0) thisText = thisText.replace(QRegExp("&"), ""); // chop text to the search length thisText = thisText.left(seqLen); // do the search if (thisText.find(d->keySeq, 0, false) == 0) { if (firstpass) { // match setActiveItem(i); // check to see if we're underlining a different item if (d->lastHitIndex != i) // yes; revert the underlining changeItem(idAt(d->lastHitIndex), d->originalText); // set the original text if it's a different item if (d->lastHitIndex != i || d->lastHitIndex == -1) d->originalText = text(j); // underline the currently selected item changeItem(j, underlineText(d->originalText, d->keySeq.length())); // remeber what's going on d->lastHitIndex = i; // start/restart the clear timer d->clearTimer.start(5000, true); // go around for another try, to see if we can execute firstpass = false; } else { // don't allow execution return; } } // fall through to allow execution } if (!firstpass) { if (d->autoExec) { // activate anything activateItemAt(d->lastHitIndex); resetKeyboardVars(); } else if (findItem(idAt(d->lastHitIndex)) && findItem(idAt(d->lastHitIndex))->popup()) { // only activate sub-menus activateItemAt(d->lastHitIndex); resetKeyboardVars(); } return; } // no matches whatsoever, clean up resetKeyboardVars(true); //e->ignore(); QPopupMenu::keyPressEvent(e); } QString OPopupMenu::underlineText(const QString& text, uint length) { QString ret = text; for (uint i = 0; i < length; i++) { if (ret[2*i] != '&') ret.insert(2*i, "&"); } return ret; } void OPopupMenu::resetKeyboardVars(bool noMatches /* = false */) { // Clean up keyboard variables if (d->lastHitIndex != -1) { changeItem(idAt(d->lastHitIndex), d->originalText); d->lastHitIndex = -1; } if (!noMatches) { d->keySeq = QString::null; } d->noMatches = noMatches; } void OPopupMenu::setKeyboardShortcutsEnabled(bool enable) { d->shortcuts = enable; } void OPopupMenu::setKeyboardShortcutsExecute(bool enable) { d->autoExec = enable; } /** * End keyboard navigation. */ /** * RMB menus on menus */ QPopupMenu* OPopupMenu::contextMenu() { if (!d->m_ctxMenu) { d->m_ctxMenu = new QPopupMenu(this); installEventFilter(this); connect(d->m_ctxMenu, SIGNAL(aboutToHide()), this, SLOT(ctxMenuHiding())); } return d->m_ctxMenu; } void OPopupMenu::cancelContextMenuShow() { OPopupMenuPrivate::s_continueCtxMenuShow = false; } int OPopupMenu::contextMenuFocusItem() { return OPopupMenuPrivate::s_highlightedItem; } OPopupMenu* OPopupMenu::contextMenuFocus() { return OPopupMenuPrivate::s_contextedMenu; } void OPopupMenu::itemHighlighted(int /* whichItem */) { if (!d->m_ctxMenu || !d->m_ctxMenu->isVisible()) { return; } d->m_ctxMenu->hide(); showCtxMenu(mapFromGlobal(QCursor::pos())); } void OPopupMenu::showCtxMenu(QPoint pos) { OPopupMenuPrivate::s_highlightedItem = idAt(pos); if (OPopupMenuPrivate::s_highlightedItem == -1) { OPopupMenuPrivate::s_contextedMenu = 0; return; } emit aboutToShowContextMenu(this, OPopupMenuPrivate::s_highlightedItem, d->m_ctxMenu); if (!OPopupMenuPrivate::s_continueCtxMenuShow) { OPopupMenuPrivate::s_continueCtxMenuShow = true; return; } OPopupMenuPrivate::s_contextedMenu = this; d->m_ctxMenu->popup(this->mapToGlobal(pos)); connect(this, SIGNAL(highlighted(int)), this, SLOT(itemHighlighted(int))); } void OPopupMenu::ctxMenuHiding() { disconnect(this, SIGNAL(highlighted(int)), this, SLOT(itemHighlighted(int))); OPopupMenuPrivate::s_continueCtxMenuShow = true; } bool OPopupMenu::eventFilter(QObject* obj, QEvent* event) { if (d->m_ctxMenu && obj == this) { if (event->type() == QEvent::MouseButtonRelease) { if (d->m_ctxMenu->isVisible()) { return true; } } - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 else if (event->type() == QEvent::ContextMenu) #else else if ( (event->type() == QEvent::MouseButtonPress) && ( (QMouseEvent*) event )->button() == QMouseEvent::RightButton ) #endif { showCtxMenu(mapFromGlobal(QCursor::pos())); return true; } } return QWidget::eventFilter(obj, event); } void OPopupMenu::hideEvent(QHideEvent*) { if (d->m_ctxMenu) { d->m_ctxMenu->hide(); } } /** * end of RMB menus on menus support */ // Obsolete OPopupMenu::OPopupMenu(const QString& title, QWidget *parent, const char *name) : QPopupMenu(parent, name) { d = new OPopupMenuPrivate; setTitle(title); } // Obsolete void OPopupMenu::setTitle(const QString &title) { OPopupTitle *titleItem = new OPopupTitle(); titleItem->setTitle(title); insertItem(titleItem); d->m_lastTitle = title; } void OPopupTitle::virtual_hook( int, void* ) { /*BASE::virtual_hook( id, data );*/ } void OPopupMenu::virtual_hook( int, void* ) { /*BASE::virtual_hook( id, data );*/ } diff --git a/libopie2/opieui/oselector.cpp b/libopie2/opieui/oselector.cpp index 05543c5..936dfe6 100644 --- a/libopie2/opieui/oselector.cpp +++ b/libopie2/opieui/oselector.cpp @@ -1,719 +1,719 @@ /* This file is part of the KDE libraries Copyright (C) 1997 Martin Jones (mjones@kde.org) This library 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 library 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 library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* QT */ #include <qimage.h> #include <qdrawutil.h> /* OPIE */ #include <opie2/oimageeffect.h> #include <opie2/oselector.h> #define STORE_W 8 #define STORE_W2 STORE_W * 2 //----------------------------------------------------------------------------- /* * 2D value selector. * The contents of the selector are drawn by derived class. */ using namespace Opie::Ui; OXYSelector::OXYSelector( QWidget *parent, const char *name ) : QWidget( parent, name ) { xPos = 0; yPos = 0; minX = 0; minY = 0; maxX = 100; maxY = 100; store.setOptimization( QPixmap::BestOptim ); store.resize( STORE_W2, STORE_W2 ); } OXYSelector::~OXYSelector() {} void OXYSelector::setRange( int _minX, int _minY, int _maxX, int _maxY ) { px = 2; py = 2; minX = _minX; minY = _minY; maxX = _maxX; maxY = _maxY; } void OXYSelector::setValues( int _xPos, int _yPos ) { xPos = _xPos; yPos = _yPos; if ( xPos > maxX ) xPos = maxX; else if ( xPos < minX ) xPos = minX; if ( yPos > maxY ) yPos = maxY; else if ( yPos < minY ) yPos = minY; int xp = 2 + (width() - 4) * xPos / (maxX - minX); int yp = height() - 2 - (height() - 4) * yPos / (maxY - minY); setPosition( xp, yp ); } QRect OXYSelector::contentsRect() const { return QRect( 2, 2, width()-4, height()-4 ); } void OXYSelector::paintEvent( QPaintEvent *ev ) { QRect cursorRect( px - STORE_W, py - STORE_W, STORE_W2, STORE_W2); QRect paintRect = ev->rect(); QPainter painter; painter.begin( this ); QBrush brush; qDrawShadePanel( &painter, 0, 0, width(), height(), colorGroup(), TRUE, 2, &brush ); drawContents( &painter ); if (paintRect.contains(cursorRect)) { bitBlt( &store, 0, 0, this, px - STORE_W, py - STORE_W, STORE_W2, STORE_W2, CopyROP ); drawCursor( &painter, px, py ); } else if (paintRect.intersects(cursorRect)) { repaint( cursorRect, false); } painter.end(); } void OXYSelector::mousePressEvent( QMouseEvent *e ) { int xVal, yVal; valuesFromPosition( e->pos().x() - 2, e->pos().y() - 2, xVal, yVal ); setValues( xVal, yVal ); emit valueChanged( xPos, yPos ); } void OXYSelector::mouseMoveEvent( QMouseEvent *e ) { int xVal, yVal; valuesFromPosition( e->pos().x() - 2, e->pos().y() - 2, xVal, yVal ); setValues( xVal, yVal ); emit valueChanged( xPos, yPos ); } void OXYSelector::wheelEvent( QWheelEvent *e ) { - #if QT_VERSION > 290 + #if QT_VERSION >= 0x030000 if ( e->orientation() == Qt::Horizontal ) setValues( xValue() + e->delta()/120, yValue() ); else setValues( xValue(), yValue() + e->delta()/120 ); emit valueChanged( xPos, yPos ); #else Q_UNUSED( e ) #endif } void OXYSelector::valuesFromPosition( int x, int y, int &xVal, int &yVal ) const { xVal = ( (maxX-minX) * (x-2) ) / ( width()-4 ); yVal = maxY - ( ( (maxY-minY) * (y-2) ) / ( height()-4 ) ); if ( xVal > maxX ) xVal = maxX; else if ( xVal < minX ) xVal = minX; if ( yVal > maxY ) yVal = maxY; else if ( yVal < minY ) yVal = minY; } void OXYSelector::setPosition( int xp, int yp ) { if ( xp < 2 ) xp = 2; else if ( xp > width() - 2 ) xp = width() - 2; if ( yp < 2 ) yp = 2; else if ( yp > height() - 2 ) yp = height() - 2; QPainter painter; painter.begin( this ); bitBlt( this, px - STORE_W, py - STORE_W, &store, 0, 0, STORE_W2, STORE_W2, CopyROP ); bitBlt( &store, 0, 0, this, xp - STORE_W, yp - STORE_W, STORE_W2, STORE_W2, CopyROP ); drawCursor( &painter, xp, yp ); px = xp; py = yp; painter.end(); } void OXYSelector::drawContents( QPainter * ) {} void OXYSelector::drawCursor( QPainter *p, int xp, int yp ) { p->setPen( QPen( white ) ); p->drawLine( xp - 6, yp - 6, xp - 2, yp - 2 ); p->drawLine( xp - 6, yp + 6, xp - 2, yp + 2 ); p->drawLine( xp + 6, yp - 6, xp + 2, yp - 2 ); p->drawLine( xp + 6, yp + 6, xp + 2, yp + 2 ); } //----------------------------------------------------------------------------- /* * 1D value selector with contents drawn by derived class. * See OColorDialog for example. */ OSelector::OSelector( QWidget *parent, const char *name ) : QWidget( parent, name ), QRangeControl() { _orientation = Horizontal; _indent = TRUE; } OSelector::OSelector( Orientation o, QWidget *parent, const char *name ) : QWidget( parent, name ), QRangeControl() { _orientation = o; _indent = TRUE; } OSelector::~OSelector() {} QRect OSelector::contentsRect() const { if ( orientation() == Vertical ) return QRect( 2, 5, width()-9, height()-10 ); else return QRect( 5, 2, width()-10, height()-9 ); } void OSelector::paintEvent( QPaintEvent * ) { QPainter painter; painter.begin( this ); drawContents( &painter ); QBrush brush; if ( indent() ) { if ( orientation() == Vertical ) qDrawShadePanel( &painter, 0, 3, width()-5, height()-6, colorGroup(), TRUE, 2, &brush ); else qDrawShadePanel( &painter, 3, 0, width()-6, height()-5, colorGroup(), TRUE, 2, &brush ); } QPoint pos = calcArrowPos( value() ); drawArrow( &painter, TRUE, pos ); painter.end(); } void OSelector::mousePressEvent( QMouseEvent *e ) { moveArrow( e->pos() ); } void OSelector::mouseMoveEvent( QMouseEvent *e ) { moveArrow( e->pos() ); } void OSelector::wheelEvent( QWheelEvent *e ) { int val = value() + e->delta()/120; emit valueChanged( val ); setValue( val ); } void OSelector::valueChange() { QPainter painter; QPoint pos; painter.begin( this ); pos = calcArrowPos( prevValue() ); drawArrow( &painter, FALSE, pos ); pos = calcArrowPos( value() ); drawArrow( &painter, TRUE, pos ); painter.end(); } void OSelector::moveArrow( const QPoint &pos ) { int val; if ( orientation() == Vertical ) val = ( maxValue() - minValue() ) * (height()-pos.y()-3) / (height()-10) + minValue(); else val = ( maxValue() - minValue() ) * (width()-pos.x()-3) / (width()-10) + minValue(); if ( val > maxValue() ) val = maxValue(); if ( val < minValue() ) val = minValue(); emit valueChanged( val ); setValue( val ); } QPoint OSelector::calcArrowPos( int val ) { QPoint p; if ( orientation() == Vertical ) { p.setY( height() - ( (height()-10) * val / ( maxValue() - minValue() ) + 5 ) ); p.setX( width() - 5 ); } else { p.setX( width() - ( (width()-10) * val / ( maxValue() - minValue() ) + 5 ) ); p.setY( height() - 5 ); } return p; } void OSelector::drawContents( QPainter * ) {} void OSelector::drawArrow( QPainter *painter, bool show, const QPoint &pos ) { if ( show ) { QPointArray array(3); painter->setPen( QPen() ); painter->setBrush( QBrush( colorGroup().buttonText() ) ); if ( orientation() == Vertical ) { array.setPoint( 0, pos.x()+0, pos.y()+0 ); array.setPoint( 1, pos.x()+5, pos.y()+5 ); array.setPoint( 2, pos.x()+5, pos.y()-5 ); } else { array.setPoint( 0, pos.x()+0, pos.y()+0 ); array.setPoint( 1, pos.x()+5, pos.y()+5 ); array.setPoint( 2, pos.x()-5, pos.y()+5 ); } painter->drawPolygon( array ); } else { if ( orientation() == Vertical ) { repaint(pos.x(), pos.y()-5, 6, 11, true); } else { repaint(pos.x()-5, pos.y(), 11, 6, true); } } } //---------------------------------------------------------------------------- OGradientSelector::OGradientSelector( QWidget *parent, const char *name ) : OSelector( parent, name ) { init(); } OGradientSelector::OGradientSelector( Orientation o, QWidget *parent, const char *name ) : OSelector( o, parent, name ) { init(); } OGradientSelector::~OGradientSelector() {} void OGradientSelector::init() { color1.setRgb( 0, 0, 0 ); color2.setRgb( 255, 255, 255 ); text1 = text2 = ""; } void OGradientSelector::drawContents( QPainter *painter ) { QImage image( contentsRect().width(), contentsRect().height(), 32 ); QColor col; float scale; int redDiff = color2.red() - color1.red(); int greenDiff = color2.green() - color1.green(); int blueDiff = color2.blue() - color1.blue(); if ( orientation() == Vertical ) { for ( int y = 0; y < image.height(); y++ ) { scale = 1.0 * y / image.height(); col.setRgb( color1.red() + int(redDiff*scale), color1.green() + int(greenDiff*scale), color1.blue() + int(blueDiff*scale) ); unsigned int *p = (uint *) image.scanLine( y ); for ( int x = 0; x < image.width(); x++ ) *p++ = col.rgb(); } } else { unsigned int *p = (uint *) image.scanLine( 0 ); for ( int x = 0; x < image.width(); x++ ) { scale = 1.0 * x / image.width(); col.setRgb( color1.red() + int(redDiff*scale), color1.green() + int(greenDiff*scale), color1.blue() + int(blueDiff*scale) ); *p++ = col.rgb(); } for ( int y = 1; y < image.height(); y++ ) memcpy( image.scanLine( y ), image.scanLine( y - 1), sizeof( unsigned int ) * image.width() ); } QColor ditherPalette[8]; for ( int s = 0; s < 8; s++ ) ditherPalette[s].setRgb( color1.red() + redDiff * s / 8, color1.green() + greenDiff * s / 8, color1.blue() + blueDiff * s / 8 ); OImageEffect::dither( image, ditherPalette, 8 ); QPixmap p; p.convertFromImage( image ); painter->drawPixmap( contentsRect().x(), contentsRect().y(), p ); if ( orientation() == Vertical ) { int yPos = contentsRect().top() + painter->fontMetrics().ascent() + 2; int xPos = contentsRect().left() + (contentsRect().width() - painter->fontMetrics().width( text2 )) / 2; QPen pen( color2 ); painter->setPen( pen ); painter->drawText( xPos, yPos, text2 ); yPos = contentsRect().bottom() - painter->fontMetrics().descent() - 2; xPos = contentsRect().left() + (contentsRect().width() - painter->fontMetrics().width( text1 )) / 2; pen.setColor( color1 ); painter->setPen( pen ); painter->drawText( xPos, yPos, text1 ); } else { int yPos = contentsRect().bottom()-painter->fontMetrics().descent()-2; QPen pen( color2 ); painter->setPen( pen ); painter->drawText( contentsRect().left() + 2, yPos, text1 ); pen.setColor( color1 ); painter->setPen( pen ); painter->drawText( contentsRect().right() - painter->fontMetrics().width( text2 ) - 2, yPos, text2 ); } } //----------------------------------------------------------------------------- static QColor *standardPalette = 0; #define STANDARD_PAL_SIZE 17 OColor::OColor() : QColor() { r = 0; g = 0; b = 0; h = 0; s = 0; v = 0; }; OColor::OColor( const OColor &col) : QColor( col ) { h = col.h; s = col.s; v = col.v; r = col.r; g = col.g; b = col.b; }; OColor::OColor( const QColor &col) : QColor( col ) { QColor::rgb(&r, &g, &b); QColor::hsv(&h, &s, &v); }; bool OColor::operator==(const OColor& col) const { return (h == col.h) && (s == col.s) && (v == col.v) && (r == col.r) && (g == col.g) && (b == col.b); } OColor& OColor::operator=(const OColor& col) { *(QColor *)this = col; h = col.h; s = col.s; v = col.v; r = col.r; g = col.g; b = col.b; return *this; } void OColor::setHsv(int _h, int _s, int _v) { h = _h; s = _s; v = _v; QColor::setHsv(h, s, v); QColor::rgb(&r, &g, &b); }; void OColor::setRgb(int _r, int _g, int _b) { r = _r; g = _g; b = _b; QColor::setRgb(r, g, b); QColor::hsv(&h, &s, &v); } void OColor::rgb(int *_r, int *_g, int *_b) const { *_r = r; *_g = g; *_b = b; } void OColor::hsv(int *_h, int *_s, int *_v) const { *_h = h; *_s = s; *_v = v; } static void createStandardPalette() { if ( standardPalette ) return; standardPalette = new QColor[STANDARD_PAL_SIZE]; int i = 0; standardPalette[i++] = Qt::red; standardPalette[i++] = Qt::green; standardPalette[i++] = Qt::blue; standardPalette[i++] = Qt::cyan; standardPalette[i++] = Qt::magenta; standardPalette[i++] = Qt::yellow; standardPalette[i++] = Qt::darkRed; standardPalette[i++] = Qt::darkGreen; standardPalette[i++] = Qt::darkBlue; standardPalette[i++] = Qt::darkCyan; standardPalette[i++] = Qt::darkMagenta; standardPalette[i++] = Qt::darkYellow; standardPalette[i++] = Qt::white; standardPalette[i++] = Qt::lightGray; standardPalette[i++] = Qt::gray; standardPalette[i++] = Qt::darkGray; standardPalette[i++] = Qt::black; } OHSSelector::OHSSelector( QWidget *parent, const char *name ) : OXYSelector( parent, name ) { setRange( 0, 0, 359, 255 ); } void OHSSelector::updateContents() { drawPalette(&pixmap); } void OHSSelector::resizeEvent( QResizeEvent * ) { updateContents(); } void OHSSelector::drawContents( QPainter *painter ) { painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap ); } void OHSSelector::drawPalette( QPixmap *pixmap ) { int xSize = contentsRect().width(), ySize = contentsRect().height(); QImage image( xSize, ySize, 32 ); QColor col; int h, s; uint *p; for ( s = ySize-1; s >= 0; s-- ) { p = (uint *) image.scanLine( ySize - s - 1 ); for( h = 0; h < xSize; h++ ) { col.setHsv( 359*h/(xSize-1), 255*s/(ySize-1), 192 ); *p = col.rgb(); p++; } } if ( QColor::numBitPlanes() <= 8 ) { createStandardPalette(); OImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE ); } pixmap->convertFromImage( image ); } //----------------------------------------------------------------------------- OValueSelector::OValueSelector( QWidget *parent, const char *name ) : OSelector( OSelector::Vertical, parent, name ), _hue(0), _sat(0) { setRange( 0, 255 ); pixmap.setOptimization( QPixmap::BestOptim ); } OValueSelector::OValueSelector(Orientation o, QWidget *parent, const char *name ) : OSelector( o, parent, name), _hue(0), _sat(0) { setRange( 0, 255 ); pixmap.setOptimization( QPixmap::BestOptim ); } void OValueSelector::updateContents() { drawPalette(&pixmap); } void OValueSelector::resizeEvent( QResizeEvent * ) { updateContents(); } void OValueSelector::drawContents( QPainter *painter ) { painter->drawPixmap( contentsRect().x(), contentsRect().y(), pixmap ); } void OValueSelector::drawPalette( QPixmap *pixmap ) { int xSize = contentsRect().width(), ySize = contentsRect().height(); QImage image( xSize, ySize, 32 ); QColor col; uint *p; QRgb rgb; if ( orientation() == OSelector::Horizontal ) { for ( int v = 0; v < ySize; v++ ) { p = (uint *) image.scanLine( ySize - v - 1 ); for( int x = 0; x < xSize; x++ ) { col.setHsv( _hue, _sat, 255*x/(xSize-1) ); rgb = col.rgb(); *p++ = rgb; } } } if( orientation() == OSelector::Vertical ) { for ( int v = 0; v < ySize; v++ ) { p = (uint *) image.scanLine( ySize - v - 1 ); col.setHsv( _hue, _sat, 255*v/(ySize-1) ); rgb = col.rgb(); for ( int i = 0; i < xSize; i++ ) *p++ = rgb; } } if ( QColor::numBitPlanes() <= 8 ) { createStandardPalette(); OImageEffect::dither( image, standardPalette, STANDARD_PAL_SIZE ); } pixmap->convertFromImage( image ); } diff --git a/libopie2/opieui/oselector.h b/libopie2/opieui/oselector.h index fe75a46..3dbdb38 100644 --- a/libopie2/opieui/oselector.h +++ b/libopie2/opieui/oselector.h @@ -1,523 +1,523 @@ /* This file is part of the KDE libraries Copyright (C) 1997 Martin Jones (mjones@kde.org) This library 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 library 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 library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //----------------------------------------------------------------------------- // Selector widgets for KDE Color Selector, but probably useful for other // stuff also. #ifndef __OSELECT_H__ #define __OSELECT_H__ #include <qwidget.h> #include <qrangecontrol.h> #include <qpixmap.h> namespace Opie { namespace Ui { /** * OXYSelector is the base class for other widgets which * provides the ability to choose from a two-dimensional * range of values. The currently chosen value is indicated * by a cross. An example is the @ref OHSSelector which * allows to choose from a range of colors, and which is * used in OColorDialog. * * A custom drawing routine for the widget surface has * to be provided by the subclass. */ class OXYSelector : public QWidget { Q_OBJECT public: /** * Constructs a two-dimensional selector widget which * has a value range of [0..100] in both directions. */ OXYSelector( QWidget *parent=0, const char *name=0 ); /** * Destructs the widget. */ ~OXYSelector(); /** * Sets the current values in horizontal and * vertical direction. */ void setValues( int xPos, int yPos ); /** * Sets the range of possible values. */ void setRange( int minX, int minY, int maxX, int maxY ); /** * @return the current value in horizontal direction. */ int xValue() const { return xPos; } /** * @return the current value in vertical direction. */ int yValue() const { return yPos; } /** * @return the rectangle on which subclasses should draw. */ QRect contentsRect() const; signals: /** * This signal is emitted whenever the user chooses a value, * e.g. by clicking with the mouse on the widget. */ void valueChanged( int x, int y ); protected: /** * Override this function to draw the contents of the widget. * The default implementation does nothing. * * Draw within @ref contentsRect() only. */ virtual void drawContents( QPainter * ); /** * Override this function to draw the cursor which * indicates the currently selected value pair. */ virtual void drawCursor( QPainter *p, int xp, int yp ); /** * @reimplemented */ virtual void paintEvent( QPaintEvent *e ); /** * @reimplemented */ virtual void mousePressEvent( QMouseEvent *e ); /** * @reimplemented */ virtual void mouseMoveEvent( QMouseEvent *e ); /** * @reimplemented */ virtual void wheelEvent( QWheelEvent * ); /** * Converts a pixel position to its corresponding values. */ void valuesFromPosition( int x, int y, int& xVal, int& yVal ) const; private: void setPosition( int xp, int yp ); int px; int py; int xPos; int yPos; int minX; int maxX; int minY; int maxY; QPixmap store; private: class OXYSelectorPrivate; OXYSelectorPrivate *d; }; /** * OSelector is the base class for other widgets which * provides the ability to choose from a one-dimensional * range of values. An example is the @ref OGradientSelector * which allows to choose from a range of colors. * * A custom drawing routine for the widget surface has * to be provided by the subclass. */ class OSelector : public QWidget, public QRangeControl { Q_OBJECT Q_PROPERTY( int value READ value WRITE setValue ) Q_PROPERTY( int minValue READ minValue WRITE setMinValue ) Q_PROPERTY( int maxValue READ maxValue WRITE setMaxValue ) public: /** * Constructs a horizontal one-dimensional selection widget. */ OSelector( QWidget *parent=0, const char *name=0 ); /** * Constructs a one-dimensional selection widget with * a given orientation. */ OSelector( Orientation o, QWidget *parent = 0L, const char *name = 0L ); /* * Destructs the widget. */ ~OSelector(); /** * @return the orientation of the widget. */ Orientation orientation() const { return _orientation; } /** * @return the rectangle on which subclasses should draw. */ QRect contentsRect() const; /** * Sets the indent option of the widget to i. * This determines whether a shaded frame is drawn. */ void setIndent( bool i ) { _indent = i; } /** * @return whether the indent option is set. */ bool indent() const { return _indent; } /** * Sets the value. */ void setValue(int value) { QRangeControl::setValue(value); } /** * @returns the value. */ int value() const { return QRangeControl::value(); } /** * Sets the min value. */ - #if ( QT_VERSION > 290 ) + #if ( QT_VERSION >= 0x030000 ) void setMinValue(int value) { QRangeControl::setMinValue(value); } #else void setMinValue(int value) { QRangeControl::setRange(value,QRangeControl::maxValue()); } #endif /** * @return the min value. */ int minValue() const { return QRangeControl::minValue(); } /** * Sets the max value. */ - #if ( QT_VERSION > 290 ) + #if ( QT_VERSION >= 0x030000 ) void setMaxValue(int value) { QRangeControl::setMaxValue(value); } #else void setMaxValue(int value) { QRangeControl::setRange(QRangeControl::minValue(),value); } #endif /** * @return the max value. */ int maxValue() const { return QRangeControl::maxValue(); } signals: /** * This signal is emitted whenever the user chooses a value, * e.g. by clicking with the mouse on the widget. */ void valueChanged( int value ); protected: /** * Override this function to draw the contents of the control. * The default implementation does nothing. * * Draw only within contentsRect(). */ virtual void drawContents( QPainter * ); /** * Override this function to draw the cursor which * indicates the current value. This function is * always called twice, once with argument show=false * to clear the old cursor, once with argument show=true * to draw the new one. */ virtual void drawArrow( QPainter *painter, bool show, const QPoint &pos ); /** * @reimplemented */ virtual void valueChange(); /** * @reimplemented */ virtual void paintEvent( QPaintEvent * ); /** * @reimplemented */ virtual void mousePressEvent( QMouseEvent *e ); /** * @reimplemented */ virtual void mouseMoveEvent( QMouseEvent *e ); /** * @reimplemented */ virtual void wheelEvent( QWheelEvent * ); private: QPoint calcArrowPos( int val ); void moveArrow( const QPoint &pos ); Orientation _orientation; bool _indent; private: class OSelectorPrivate; OSelectorPrivate *d; }; /** * The OGradientSelector widget allows the user to choose * from a one-dimensional range of colors which is given as a * gradient between two colors provided by the programmer. */ class OGradientSelector : public OSelector { Q_OBJECT Q_PROPERTY( QColor firstColor READ firstColor WRITE setFirstColor ) Q_PROPERTY( QColor secondColor READ secondColor WRITE setSecondColor ) Q_PROPERTY( QString firstText READ firstText WRITE setFirstText ) Q_PROPERTY( QString secondText READ secondText WRITE setSecondText ) public: /** * Constructs a horizontal color selector which * contains a gradient between white and black. */ OGradientSelector( QWidget *parent=0, const char *name=0 ); /** * Constructs a colors selector with orientation o which * contains a gradient between white and black. */ OGradientSelector( Orientation o, QWidget *parent=0, const char *name=0 ); /** * Destructs the widget. */ ~OGradientSelector(); /** * Sets the two colors which span the gradient. */ void setColors( const QColor &col1, const QColor &col2 ) { color1 = col1; color2 = col2; update();} void setText( const QString &t1, const QString &t2 ) { text1 = t1; text2 = t2; update(); } /** * Set each color on its own. */ void setFirstColor( const QColor &col ) { color1 = col; update(); } void setSecondColor( const QColor &col ) { color2 = col; update(); } /** * Set each description on its own */ void setFirstText( const QString &t ) { text1 = t; update(); } void setSecondText( const QString &t ) { text2 = t; update(); } const QColor firstColor() const { return color1; } const QColor secondColor() const { return color2; } const QString firstText() const { return text1; } const QString secondText() const { return text2; } protected: /** * @reimplemented */ virtual void drawContents( QPainter * ); /** * @reimplemented */ virtual QSize minimumSize() const { return sizeHint(); } private: void init(); QColor color1; QColor color2; QString text1; QString text2; private: class OGradientSelectorPrivate; OGradientSelectorPrivate *d; }; /** * Widget for Hue/Saturation selection. * The actual values can be fetched using the inherited xValue and yValue * methods. * * @see OXYSelector, OValueSelector, OColorDialog * @author Martin Jones (mjones@kde.org) * @version $Id$ */ class OHSSelector : public OXYSelector { Q_OBJECT public: /** * Constructs a hue/saturation selection widget. */ OHSSelector( QWidget *parent=0, const char *name=0 ); protected: /** * Draws the contents of the widget on a pixmap, * which is used for buffering. */ virtual void drawPalette( QPixmap *pixmap ); /** * @reimplemented */ virtual void resizeEvent( QResizeEvent * ); /** * Reimplemented from OXYSelector. This drawing is * buffered in a pixmap here. As real drawing * routine, drawPalette() is used. */ virtual void drawContents( QPainter *painter ); private: void updateContents(); QPixmap pixmap; private: class OHSSelectorPrivate; OHSSelectorPrivate *d; }; class OValueSelectorPrivate; /** * Widget for color value selection. * * @see OHSSelector, OColorDialog * @author Martin Jones (mjones@kde.org) * @version $Id$ */ class OValueSelector : public OSelector { Q_OBJECT public: /** * Constructs a widget for color selection. */ OValueSelector( QWidget *parent=0, const char *name=0 ); /** * Constructs a widget for color selection with a given orientation */ OValueSelector( Orientation o, QWidget *parent = 0, const char *name = 0 ); int hue() const { return _hue; } void setHue( int h ) { _hue = h; } int saturation() const { return _sat; } void setSaturation( int s ) { _sat = s; } void updateContents(); protected: /** * Draws the contents of the widget on a pixmap, * which is used for buffering. */ virtual void drawPalette( QPixmap *pixmap ); /** * @reimplemented */ virtual void resizeEvent( QResizeEvent * ); /** * Reimplemented from OSelector. The drawing is * buffered in a pixmap here. As real drawing * routine, drawPalette() is used. */ virtual void drawContents( QPainter *painter ); private: int _hue; int _sat; QPixmap pixmap; private: class OValueSelectorPrivate; OValueSelectorPrivate *d; }; class OColor : public QColor { public: OColor(); OColor( const OColor &col); OColor( const QColor &col); OColor& operator=( const OColor& col); bool operator==( const OColor& col) const; void setHsv(int _h, int _s, int _v); void setRgb(int _r, int _g, int _b); void rgb(int *_r, int *_g, int *_b) const; void hsv(int *_h, int *_s, int *_v) const; protected: int h; int s; int v; int r; int g; int b; private: class OColorPrivate; OColorPrivate *d; }; } } #endif // __OSELECT_H__ |