📄 qpedecoration_qws.cpp
字号:
if ( *iface ) (*iface)->addRef(); return QS_OK; } Q_REFCOUNTprivate: ulong ref;};static WindowDecorationInterface *wdiface = 0;static PluginLoaderIntern *wdLoader = 0;//===========================================================================bool QPEDecoration::helpExists() const{ if ( helpFile.isNull() ) { QStringList helpPath = Global::helpPath(); QString hf = QString(qApp->argv()[0]) + ".html"; bool he = FALSE; for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end() && !he; ++it) he = QFile::exists( *it + "/" + hf ); ((QPEDecoration*)this)->helpFile = hf; ((QPEDecoration*)this)->helpexists = he; return he; } return helpexists;}QPEDecoration::QPEDecoration() : QWSDefaultDecoration(){ if ( wdLoader ) { delete wdLoader; wdLoader = 0; } else { delete wdiface; } wdiface = new DefaultWindowDecoration; helpexists = FALSE; // We don't know (flagged by helpFile being null) qpeManager = new QPEManager( this ); imageOk = Resource::loadImage( "OKButton" ); imageClose = Resource::loadImage( "CloseButton" ); imageHelp = Resource::loadImage( "HelpButton" );}QPEDecoration::QPEDecoration( const QString &plugin ) : QWSDefaultDecoration(){ if ( wdLoader ) { delete wdLoader; wdLoader = 0; } else { delete wdiface; } if ( plugin == "Qtopia" ) { // No tr wdiface = new DefaultWindowDecoration; } else { wdLoader = new PluginLoaderIntern( "decorations" ); // No tr WindowDecorationInterface *iface = 0; if ( !wdLoader->inSafeMode() && wdLoader->isEnabled(plugin) && wdLoader->queryInterface( plugin, IID_WindowDecoration, (QUnknownInterface**)&iface ) == QS_OK && iface ) { wdiface = iface; } else { delete wdLoader; wdLoader = 0; wdiface = new DefaultWindowDecoration; } } helpexists = FALSE; // We don't know (flagged by helpFile being null) qpeManager = new QPEManager( this );}QPEDecoration::~QPEDecoration(){ delete qpeManager;}const char **QPEDecoration::menuPixmap(){ return (const char **)0;}const char **QPEDecoration::closePixmap(){ return (const char **)qpe_close_xpm;}const char **QPEDecoration::minimizePixmap(){ return (const char **)qpe_accept_xpm;}const char **QPEDecoration::maximizePixmap(){ return (const char **)0;}const char **QPEDecoration::normalizePixmap(){ return (const char **)0;}int QPEDecoration::getTitleHeight( const QWidget *w ){ WindowDecorationInterface::WindowData wd; windowData( w, wd ); return wdiface->metric(WindowDecorationInterface::TitleHeight,&wd);}/* If rect is empty, no frame is added. (a hack, really)*/QRegion QPEDecoration::region(const QWidget *widget, const QRect &rect, QWSDecoration::Region type){ qpeManager->updateActive(); WindowDecorationInterface::WindowData wd; windowData( widget, wd ); wd.rect = rect; int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); int okWidth = wdiface->metric(WindowDecorationInterface::OKWidth,&wd); int closeWidth = wdiface->metric(WindowDecorationInterface::CloseWidth,&wd); int helpWidth = wdiface->metric(WindowDecorationInterface::HelpWidth,&wd); int grab = wdiface->metric(WindowDecorationInterface::CornerGrabSize,&wd); QRegion region; switch ((int)type) { case Menu: break; case Maximize: if ( !widget->inherits( "QDialog" ) && qApp->desktop()->width() > 350 ) { int maximizeWidth = wdiface->metric(WindowDecorationInterface::MaximizeWidth,&wd); int left = rect.right() - maximizeWidth - closeWidth; if ( ((DecorHackWidget *)widget)->needsOk() ) left -= okWidth; QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight); region = r; } break; case Minimize: if ( ((DecorHackWidget *)widget)->needsOk() ) { QRect r(rect.right() - okWidth, rect.top() - titleHeight, okWidth, titleHeight); if (r.left() > rect.left() + titleHeight) region = r; } break; case Close: { int left = rect.right() - closeWidth; if ( ((DecorHackWidget *)widget)->needsOk() ) left -= okWidth; QRect r(left, rect.top() - titleHeight, closeWidth, titleHeight); region = r; } break; case Title: if ( !widget->isMaximized() ) { int width = rect.width() - helpWidth - closeWidth; if ( ((DecorHackWidget *)widget)->needsOk() ) width -= okWidth; QRect r(rect.left()+helpWidth, rect.top() - titleHeight, width, titleHeight); if (r.width() > 0) region = r; } break; case Help: if ( helpExists() || widget->testWFlags(Qt::WStyle_ContextHelp) ) { QRect r(rect.left(), rect.top() - titleHeight, helpWidth, titleHeight); region = r; } break; case Top: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); int b = wdiface->metric(WindowDecorationInterface::TopBorder,&wd); region = m & QRect( br.left()+grab, br.top(), br.width()-2*grab, b ); } break; case Left: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); int b = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd); region = m & QRect( br.left(), br.top()+grab, b, br.height()-2*grab ); } break; case Right: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); int b = wdiface->metric(WindowDecorationInterface::RightBorder,&wd); region = m & QRect( rect.right(), br.top()+grab, b, br.height()-2*grab ); } break; case Bottom: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); int b = wdiface->metric(WindowDecorationInterface::BottomBorder,&wd); region = m & QRect( br.left()+grab, rect.bottom(), br.width()-2*grab, b ); } break; case TopLeft: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd); int lb = wdiface->metric(WindowDecorationInterface::LeftBorder,&wd); QRegion crgn( br.left(), br.top(), grab, tb ); crgn |= QRect( br.left(), br.top(), lb, grab ); region = m & crgn; } break; case TopRight: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); int tb = wdiface->metric(WindowDecorationInterface::TopBorder,&wd); int rb = wdiface->metric(WindowDecorationInterface::RightBorder,&wd); QRegion crgn( br.right()-grab, br.top(), grab, tb ); crgn |= QRect( br.right()-rb, br.top(), rb, grab ); region = m & crgn; } break; case BottomLeft: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); region = m & QRect( br.left(), br.bottom()-grab, grab, grab ); } break; case BottomRight: if ( !widget->isMaximized() ) { QRegion m = wdiface->mask(&wd); QRect br = m.boundingRect(); region = m & QRect( br.right()-grab, br.bottom()-grab, grab, grab ); } break; case All: if ( widget->isMaximized() ) region = QWSDefaultDecoration::region(widget, rect, type); else region = wdiface->mask(&wd) - rect; break; default: region = QWSDefaultDecoration::region(widget, rect, type); break; } return region;}void QPEDecoration::paint(QPainter *painter, const QWidget *widget){ WindowDecorationInterface::WindowData wd; windowData( widget, wd ); int titleWidth = getTitleWidth(widget); int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); QRect rect(widget->rect()); // title bar rect QRect tbr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight );#ifndef QT_NO_PALETTE QRegion oldClip = painter->clipRegion(); painter->setClipRegion( oldClip - QRegion( tbr ) ); // reduce flicker wdiface->drawArea( WindowDecorationInterface::Border, painter, &wd ); painter->setClipRegion( oldClip ); if (titleWidth > 0) { const QColorGroup &cg = widget->palette().active(); QBrush titleBrush; QPen titlePen; if ( wd.flags & WindowDecorationInterface::WindowData::Active ) { titleBrush = cg.brush(QColorGroup::Highlight); titlePen = cg.color(QColorGroup::HighlightedText); } else { titleBrush = cg.brush(QColorGroup::Background); titlePen = cg.color(QColorGroup::Text); } wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd ); // Draw caption painter->setPen(titlePen); QFont f( QApplication::font() ); f.setWeight( QFont::Bold ); painter->setFont(f); wdiface->drawArea( WindowDecorationInterface::TitleText, painter, &wd ); }#endif //QT_NO_PALETTE paintButton( painter, widget, (QWSDecoration::Region)Help, 0 );}void QPEDecoration::paintButton(QPainter *painter, const QWidget *w, QWSDecoration::Region type, int state){ WindowDecorationInterface::Button b; switch ((int)type) { case Close: b = WindowDecorationInterface::Close; break; case Minimize: if ( ((DecorHackWidget *)w)->needsOk() ) b = WindowDecorationInterface::OK; else if ( helpExists() ) b = WindowDecorationInterface::Help; else return; break; case Help: b = WindowDecorationInterface::Help; break; case Maximize: b = WindowDecorationInterface::Maximize; break; default: return; } WindowDecorationInterface::WindowData wd; windowData( w, wd ); int titleHeight = wdiface->metric(WindowDecorationInterface::TitleHeight,&wd); QRect rect(w->rect()); QRect tbr( rect.left(), rect.top() - titleHeight, rect.width(), titleHeight ); QRect brect(region(w, w->rect(), type).boundingRect()); const QColorGroup &cg = w->palette().active(); if ( wd.flags & WindowDecorationInterface::WindowData::Active ) painter->setPen( cg.color(QColorGroup::HighlightedText) ); else painter->setPen( cg.color(QColorGroup::Text) ); QRegion oldClip = painter->clipRegion(); painter->setClipRegion( QRect(brect.x(), tbr.y(), brect.width(), tbr.height()) ); // reduce flicker wdiface->drawArea( WindowDecorationInterface::Title, painter, &wd ); wdiface->drawButton( b, painter, &wd, brect.x(), brect.y(), brect.width(), brect.height(), (QWSButton::State)state ); painter->setClipRegion( oldClip );}//#define QPE_DONT_SHOW_TITLEBARvoid QPEDecoration::maximize( QWidget *widget ){#ifdef QPE_DONT_SHOW_TITLEBAR if ( !widget->inherits( "QDialog" ) ) { widget->setGeometry( qt_maxWindowRect ); } else #endif { QWSDecoration::maximize( widget ); }}QPopupMenu *QPEDecoration::menu( const QWidget *, const QPoint & ){ QPopupMenu *m = new QPopupMenu(); m->insertItem(QPEManager::tr("Restore"), (int)Normalize); m->insertItem(QPEManager::tr("Move"), (int)Title); m->insertItem(QPEManager::tr("Size"), (int)BottomRight); m->insertItem(QPEManager::tr("Maximize"), (int)Maximize); m->insertSeparator(); m->insertItem(QPEManager::tr("Close"), (int)Close); return m;}#ifndef QT_NO_DIALOGclass HackDialog : public QDialog{public: void acceptIt() { if ( isA( "QMessageBox" ) ) qApp->postEvent( this, new QKeyEvent( QEvent::KeyPress, Key_Enter, '\n', 0, "\n" ) ); else accept(); }};#endifvoid QPEDecoration::minimize( QWidget *widget ){#ifndef QT_NO_DIALOG // We use the minimize button as an "accept" button. if ( widget->inherits( "QDialog" ) ) { HackDialog *d = (HackDialog *)widget; d->acceptIt(); } #endif else if ( ((DecorHackWidget *)widget)->needsOk() ) { QSignal s; s.connect( widget, SLOT( accept() ) ); s.activate(); } else { help( widget ); }}void QPEDecoration::help( QWidget *w ){ if ( helpExists() ) { QString hf = helpFile; QString localHelpFile = QString(qApp->argv()[0]) + "-" + w->name() + ".html"; QStringList helpPath = Global::helpPath(); for (QStringList::ConstIterator it=helpPath.begin(); it!=helpPath.end(); ++it) { if ( QFile::exists( *it + "/" + localHelpFile ) ) { hf = localHelpFile; break; } } Global::execute( "helpbrowser", hf ); } else if ( w && w->testWFlags(Qt::WStyle_ContextHelp) ) { QWhatsThis::enterWhatsThisMode(); QWhatsThis::leaveWhatsThisMode( qApp->translate("QPEDecoration", "<Qt>Comprehensive help is not available for this application, " "however there is context-sensitive help.<p>To use context-sensitive help:<p>" "<ol><li>click and hold the help button." "<li>when the title bar shows <b>What's this...</b>, " "click on any control.</ol></Qt>" ) ); }}void QPEDecoration::windowData( const QWidget *w, WindowDecorationInterface::WindowData &wd ) const{ wd.rect = w->rect(); if ( qpeManager->whatsThisWidget() == w ) wd.caption = qApp->translate("QPEDecoration","What's this..." ); else wd.caption = w->caption(); wd.palette = qApp->palette(); wd.flags = 0; wd.flags |= w->isMaximized() ? WindowDecorationInterface::WindowData::Maximized : 0; wd.flags |= w->testWFlags(Qt::WStyle_Dialog) ? WindowDecorationInterface::WindowData::Dialog : 0; const QWidget *active = qpeManager->activeWidget(); wd.flags |= w == active ? WindowDecorationInterface::WindowData::Active : 0; wd.reserved = 1;}/*#ifndef QT_NO_POPUPMENUQPopupMenu *QPEDecoration::menu(QWSManager*, const QWidget*, const QPoint&){ return 0;}#endif*/#endif // QT_NO_QWS_QPE_WM_STYLE#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -