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

📄 qpedecoration_qws.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/************************************************************************ 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.************************************************************************/#ifdef QWS#define QTOPIA_INTERNAL_LANGLIST#include <qapplication.h>#include <qstyle.h>#include <qwidget.h>#include <qpainter.h>#include <qtimer.h>#include <qwhatsthis.h>#include <qpopupmenu.h>#include "qcopenvelope_qws.h"#include "qpedecoration_p.h"#include <qdialog.h>#include <qdrawutil.h>#include <qgfx_qws.h>#include "qpeapplication.h"#include "resource.h"#include "global.h"#include "qlibrary.h"#include "windowdecorationinterface.h"#include "pluginloader_p.h"#include <qfile.h>#include <qfileinfo.h>#include <qsignal.h>#include <stdlib.h>#ifdef QTOPIA_PHONE#include "phonedecoration_p.h"#endifextern Q_EXPORT QRect qt_maxWindowRect;#define WHATSTHIS_MODE#ifndef QT_NO_QWS_QPE_WM_STYLE#ifndef QT_NO_IMAGEIO_XPM/* XPM */static const char * const qpe_close_xpm[] = {"16 16 3 1","       c None",".      c #FFFFFF","+      c #000000","                ","                ","      .....     ","    ..+++++..   ","   .+++++++++.  ","   .+..+++..+.  ","  .++...+...++. ","  .+++.....+++. ","  .++++...++++. ","  .+++.....+++. ","  .++...+...++. ","   .+..+++..+.  ","   .+++++++++.  ","    ..+++++..   ","      .....     ","                "};/* XPM */static const char * const qpe_accept_xpm[] = {"16 16 3 1","       c None",".      c #FFFFFF","+      c #000000","                ","                ","      .....     ","    ..+++++..   ","   .+++++++++.  ","   .+++++++++.  ","  .+++++++..++. ","  .++.+++...++. ","  .+...+...+++. ","  .+......++++. ","  .++....+++++. ","   .++..+++++.  ","   .+++++++++.  ","    ..+++++..   ","      .....     ","                "};#endif // QT_NO_IMAGEIO_XPMclass DecorHackWidget : public QWidget{public:    bool needsOk() {	return (getWState() & WState_Reserved1 ) ||		 (inherits("QDialog") && !inherits("QMessageBox") 		  && !inherits("QWizard") );    }};static QImage scaleButton( const QImage &img, int height ){    if ( img.height() != 0 && img.height() != height ) {	return img.smoothScale( img.width()*height/img.height(), height );    } else {	return img;    }}class TLWidget : public QWidget{public:    QWSManager *manager()    {	return topData()->qwsManager;    }    QTLWExtra *topExtra()    {	return topData();    }    void setWState( uint s ) { QWidget::setWState( s ); }    void clearWState( uint s ) { QWidget::clearWState( s ); }};QPEManager::QPEManager( QPEDecoration *d, QObject *parent )    : QObject( parent ), decoration( d ), helpState(0), inWhatsThis(FALSE){    wtTimer = new QTimer( this );    connect( wtTimer, SIGNAL(timeout()), this, SLOT(whatsThisTimeout()) );}void QPEManager::updateActive(){    QWidget *newActive = qApp->activeWindow();    if ( newActive && (QWidget*)active == newActive )	return;    if ( active && (!newActive || ((TLWidget *)newActive)->manager()) ) {	((TLWidget *)(QWidget*)active)->manager()->removeEventFilter( this );    }    if ( newActive && ((TLWidget *)newActive)->manager() ) {	active = newActive;	((TLWidget *)(QWidget*)active)->manager()->installEventFilter( this );    } else if ( !newActive ) {	active = 0;    }}int QPEManager::pointInQpeRegion( QWidget *w, const QPoint &p ){    QRect rect(w->geometry());    if ( decoration->region( w, rect,		(QWSDecoration::Region)QPEDecoration::Help ).contains(p) )	return QPEDecoration::Help;    for (int i = QWSDecoration::LastRegion; i >= QWSDecoration::Title; i--) {	if (decoration->region(w, rect, (QWSDecoration::Region)i).contains(p))	    return (QWSDecoration::Region)i;    }    return QWSDecoration::None;}bool QPEManager::eventFilter( QObject *o, QEvent *e ){    QWSManager *mgr = (QWSManager *)o;    QWidget *w = mgr->widget();    switch ( e->type() ) {	case QEvent::MouseButtonPress:	    {		pressTime = QTime::currentTime();		QPoint p = ((QMouseEvent*)e)->globalPos();		int inRegion = pointInQpeRegion( w, p );#ifdef WHATSTHIS_MODE		if ( !w->geometry().contains(p) && QWhatsThis::inWhatsThisMode() ) {		    QString text;		    switch ( inRegion ) {			case QWSDecoration::Close:			    if ( ((DecorHackWidget*)w)->needsOk() )				text = tr("Click to close this window, discarding changes.");			    else				text = tr("Click to close this window.");			    break;			case QWSDecoration::Minimize:			    text = tr("Click to close this window and apply changes.");			    break;			case QWSDecoration::Maximize:			    if ( w->isMaximized() )				text = tr("Click to make this window movable.");			    else				text = tr("Click to make this window use all available screen area.");			    break;			default:			    break;		    }		    QWhatsThis::leaveWhatsThisMode( text );		    whatsThisTimeout();		    helpState = 0;		    return true;		}#endif		if ( inRegion == QPEDecoration::Help ) {#ifdef WHATSTHIS_MODE		    wtTimer->start( 400, TRUE );#endif		    helpState = QWSButton::Clicked|QWSButton::MouseOver;		    drawButton( w, QPEDecoration::Help, helpState );		    return true;		}	    }	    break;	case QEvent::MouseButtonRelease:	    if ( helpState & QWSButton::Clicked ) {		wtTimer->stop();		helpState = 0;		drawButton( w, QPEDecoration::Help, helpState );		QPoint p = ((QMouseEvent*)e)->globalPos();		if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) {		    decoration->help( w );		}		return true;	    }	    break;	case QEvent::MouseMove:	    if ( helpState & QWSButton::Clicked ) {		int oldState = helpState;		QPoint p = ((QMouseEvent*)e)->globalPos();		if ( pointInQpeRegion( w, p ) == QPEDecoration::Help ) {		    helpState = QWSButton::Clicked|QWSButton::MouseOver;		} else {		    helpState = 0;		}		if ( helpState != oldState )		    drawButton( w, QPEDecoration::Help, helpState );	    }	    break;	default:	    break;    }    return QObject::eventFilter( o, e );}void QPEManager::drawButton( QWidget *w, QPEDecoration::QPERegion r, int state ){    QPainter painter(w);    QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region;    painter.internalGfx()->setWidgetDeviceRegion( rgn );    painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All));    decoration->paintButton( &painter, w, (QWSDecoration::Region)r, state );}void QPEManager::drawTitle( QWidget *w ){    QPainter painter(w);    QRegion rgn = ((TLWidget *)w)->topExtra()->decor_allocated_region;    painter.internalGfx()->setWidgetDeviceRegion( rgn );    painter.setClipRegion(decoration->region(w, w->rect(),QWSDecoration::All));    decoration->paint( &painter, w );    decoration->paintButton(&painter, w, QWSDecoration::Menu, 0);    decoration->paintButton(&painter, w, QWSDecoration::Close, 0);    decoration->paintButton(&painter, w, QWSDecoration::Minimize, 0);    decoration->paintButton(&painter, w, QWSDecoration::Maximize, 0);}void QPEManager::whatsThisTimeout(){    if ( !QWhatsThis::inWhatsThisMode() ) {	if ( inWhatsThis ) {	    if ( whatsThis ) {		QWidget *w = whatsThis;		whatsThis = 0;		drawTitle( w );	    }	    wtTimer->stop();	} else {	    QWhatsThis::enterWhatsThisMode();	    helpState = 0;	    updateActive();	    if ( active ) {		whatsThis = active;		drawTitle( active );		// check periodically to see if we've left whats this mode		wtTimer->start( 250 );	    }	}	inWhatsThis = !inWhatsThis;    }}//===========================================================================static QImage *okImage( int th ){    static QImage *i = 0;    if ( !i || i->height() != th ) {	delete i;	i = new QImage(scaleButton(Resource::loadImage("qpe/pda/OKButton"),th));    }    return i;}static QImage *closeImage( int th ){    static QImage *i = 0;    if ( !i || i->height() != th ) {	delete i;	i = new QImage(scaleButton(Resource::loadImage("qpe/pda/CloseButton"),th));    }    return i;}static QImage *helpImage( int th ){    static QImage *i = 0;    if ( !i || i->height() != th ) {	delete i;	i = new QImage(scaleButton(Resource::loadImage("qpe/pda/HelpButton"),th));    }    return i;}static QImage *maximizeImage( int th ){    static QImage *i = 0;    if ( !i || i->height() != th ) {	delete i;	i = new QImage(scaleButton(Resource::loadImage("qpe/pda/MaximizeButton"),th));    }    return i;}int WindowDecorationInterface::metric( Metric m, const WindowData *wd ) const{    switch ( m ) {	case TitleHeight:	    if ( QApplication::desktop()->height() > 320 )		return 19;	    else		return 15;	case LeftBorder:	case RightBorder:	case TopBorder:	case BottomBorder:	    return 4;	case OKWidth:	    return okImage(metric(TitleHeight,wd))->width();	case CloseWidth:	    return closeImage(metric(TitleHeight,wd))->width();	case HelpWidth:	    return helpImage(metric(TitleHeight,wd))->width();	case MaximizeWidth:	    return maximizeImage(metric(TitleHeight,wd))->width();	case CornerGrabSize:	    return 16;    }    return 0;}void WindowDecorationInterface::drawArea( Area a, QPainter *p, const WindowData *wd ) const{    int th = metric( TitleHeight, wd );    QRect r = wd->rect;    switch ( a ) {	case Border:	    {		const QColorGroup &cg = wd->palette.active();		qDrawWinPanel(p, r.x()-metric(LeftBorder,wd),			r.y()-th-metric(TopBorder,wd),			r.width()+metric(LeftBorder,wd)+metric(RightBorder,wd),			r.height()+th+metric(TopBorder,wd)+metric(BottomBorder,wd),			cg, FALSE, &cg.brush(QColorGroup::Background));	    }	    break;	case Title:	    {		const QColorGroup &cg = wd->palette.active();		QBrush titleBrush;		QPen   titleLines;		if ( wd->flags & WindowData::Active ) {		    titleBrush = cg.brush(QColorGroup::Highlight);		    titleLines = titleBrush.color().dark();		} else {		    titleBrush = cg.brush(QColorGroup::Background);		    titleLines = titleBrush.color();		}		p->fillRect( r.x(), r.y()-th, r.width(), th, titleBrush);		p->setPen( titleLines );		for ( int i = r.y()-th; i < r.y(); i += 2 )		    p->drawLine( r.left(), i, r.right(), i );	    }	    break;	case TitleText:	    p->drawText( r.x()+3+metric(HelpWidth,wd), r.top()-th,		r.width()-metric(OKWidth,wd)-metric(CloseWidth,wd),		th, QPainter::AlignVCenter, wd->caption);	    break;    }}void WindowDecorationInterface::drawButton( Button b, QPainter *p, const WindowData *wd, int x, int y, int, int, QWSButton::State state ) const{    QImage *img = 0;    switch ( b ) {	case OK:	    img = okImage(metric(TitleHeight,wd));	    break;	case Close:	    img = closeImage(metric(TitleHeight,wd));	    break;	case Help:	    img = helpImage(metric(TitleHeight,wd));	    break;	case Maximize:	    img = maximizeImage(metric(TitleHeight,wd));	    break;    }    if ( img ) {	if ((state & QWSButton::MouseOver) && (state & QWSButton::Clicked))	    p->drawImage(x+2, y+2, *img);	else	    p->drawImage(x+1, y+1, *img);    }}QRegion WindowDecorationInterface::mask( const WindowData *wd ) const{    int th = metric(TitleHeight,wd);    QRect rect( wd->rect );    QRect r(rect.left() - metric(LeftBorder,wd),	    rect.top() - th - metric(TopBorder,wd),	    rect.width() + metric(LeftBorder,wd) + metric(RightBorder,wd),	    rect.height() + th + metric(TopBorder,wd) + metric(BottomBorder,wd));    return QRegion(r) - rect;}class DefaultWindowDecoration : public WindowDecorationInterface{public:    DefaultWindowDecoration() : ref(0) {}    QString name() const {	return qApp->translate("WindowDecoration", "Default", 		"List box text for default window decoration");    }    QPixmap icon() const {	return QPixmap();    }    QRESULT queryInterface( const QUuid &uuid, QUnknownInterface **iface ) {	*iface = 0;	if ( uuid == IID_QUnknown )	    *iface = this;	else if ( uuid == IID_WindowDecoration )	    *iface = this;	if ( *iface )	    (*iface)->addRef();	return QS_OK;    }    Q_REFCOUNTprivate:    ulong ref;};static WindowDecorationInterface *wdiface = 0;

⌨️ 快捷键说明

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