celsplashscreen.cpp
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. /***************************************************************************
  2.                           celsplashscreen.cpp  -  description
  3.                              -------------------
  4.     begin                : Tue Jan 03 23:27:30 CET 2006
  5.     copyright            : (C) 2006 by Christophe Teyssier
  6.     email                : chris@teyssier.org
  7.  ***************************************************************************/
  8. /***************************************************************************
  9.  *                                                                         *
  10.  *   This program is free software; you can redistribute it and/or modify  *
  11.  *   it under the terms of the GNU General Public License as published by  *
  12.  *   the Free Software Foundation; either version 2 of the License, or     *
  13.  *   (at your option) any later version.                                   *
  14.  *                                                                         *
  15.  ***************************************************************************/
  16. #include <qapplication.h>
  17. #include <qpainter.h>
  18. #include <qrect.h>
  19. #include <klocale.h>
  20. #include <kglobal.h>
  21. #include <kglobalsettings.h>
  22. #include <celsplashscreen.h>
  23. #include <X11/Xlib.h>
  24. CelSplashScreen::CelSplashScreen(const QString& filename, QWidget* _parent):
  25.     QWidget(0, 0, WStyle_Customize | WX11BypassWM), 
  26.     parent(_parent)
  27. {
  28.     setPixmap(filename);
  29.     show();
  30. }
  31. void CelSplashScreen::mousePressEvent( QMouseEvent * )
  32. {
  33.     hide();
  34. }
  35. void CelSplashScreen::repaint()
  36. {
  37.     drawContents();
  38.     QWidget::repaint();
  39.     QApplication::flush();
  40. }
  41. void CelSplashScreen::drawContents()
  42. {
  43.     QPixmap textPix = pixmap;
  44.     QPainter painter( &textPix, this );
  45.     drawContents( &painter );
  46.     setErasePixmap( textPix );
  47. }
  48. void CelSplashScreen::drawContents(QPainter *painter) {
  49.     status.draw(painter);
  50. }
  51. void CelSplashScreen::update(const string& _message) {
  52.     status.setContent(_message.c_str());
  53.     repaint();
  54. }
  55. void CelSplashScreen::finish( QWidget *mainWin )
  56. {
  57.     if ( mainWin ) {
  58. extern void qt_wait_for_window_manager( QWidget *mainWin );
  59. qt_wait_for_window_manager( mainWin );
  60.     }
  61.     close();
  62. }
  63. void CelSplashScreen::setPixmap( const QString &filename )
  64. {
  65.     QPixmap _pixmap(filename);
  66.     resize( _pixmap.size() );
  67.     //  Set default values for status and version fields
  68.     status.getRect().setX(20);
  69.     status.getRect().setY(height() - 40);
  70.     status.getRect().setWidth(width() - 200);
  71.     status.getRect().setHeight(20);
  72.     status.setFlags(Qt::AlignLeft | Qt::AlignTop);
  73.     version.getRect().setX(width() - 180);
  74.     version.getRect().setY(height() - 40);
  75.     version.getRect().setWidth(150);
  76.     version.getRect().setHeight(20);
  77.     version.setFlags(Qt::AlignRight | Qt::AlignTop);
  78.     version.setContent(VERSION);
  79.     KFileMetaInfo info(filename);
  80.     KFileMetaInfoGroup comments = info.group("Comment");
  81.     if (comments.isValid()) {
  82.         status.set("status", comments);
  83.         version.set("version", comments);
  84.         int i = 0;
  85.         char extraName[10];
  86.         sprintf(extraName, "extra%02d", i);
  87.         while (i< 100 && comments.item(QString(extraName) + "_insert_before").isValid()) {
  88.             TextItem extra;
  89.             extra.set(extraName, comments);
  90.             extraText.push_back(extra);
  91.             i++;
  92.             sprintf(extraName, "extra%02d", i);
  93.         }
  94.     }
  95.     QRect desk = KGlobalSettings::splashScreenDesktopGeometry();
  96.     setGeometry( ( desk.width() / 2 ) - ( width() / 2 ) + desk.left(),
  97.        ( desk.height() / 2 ) - ( height() / 2 ) + desk.top(),
  98.          width(), height() );
  99.     if (_pixmap.hasAlphaChannel()) {
  100.         QPixmap bg = QPixmap::grabWindow( qt_xrootwin(), x(), y(), width(), height() );
  101.         QPainter painter(&bg);
  102.         painter.drawPixmap(0, 0, _pixmap);
  103.         pixmap = bg;
  104.     } else {
  105.         pixmap = _pixmap;
  106.     }
  107.     
  108.     QPainter painter( &pixmap, this );
  109.     version.draw(&painter);
  110.     for(std::vector<TextItem>::const_iterator i = extraText.begin(); i != extraText.end();  ++i)
  111.         (*i).draw(&painter);
  112.     repaint();
  113. }
  114. TextItem::TextItem():
  115.     disable(false),
  116.     color(QColor("white")),
  117.     font(QFont("Arial")),
  118.     showBox(false)
  119.  {
  120.     font.setPixelSize(11);
  121. }
  122. void TextItem::draw(QPainter *painter) const {
  123.     if (disable) return;
  124.     painter->setPen(color);
  125.     painter->setFont(font);
  126.     painter->drawText(rect, flags, insertBefore + content);
  127.     if (showBox) painter->drawRect(rect);
  128. }
  129. void TextItem::setColor(const QString& rgb) {
  130.     bool okr, okg, okb;
  131.     int r, g, b;
  132.     r = rgb.mid(0, 2).toInt(&okr, 16);
  133.     g = rgb.mid(2, 2).toInt(&okg, 16);
  134.     b = rgb.mid(4, 2).toInt(&okb, 16);
  135.     if (okr && okg && okb) color.setRgb(r, g, b);
  136. }
  137. void TextItem::set(const QString& prefix, const KFileMetaInfoGroup& comments) {
  138.     bool ok;
  139.     int intVal;
  140.     intVal = comments.value(prefix + "_disable").toInt(&ok);
  141.     if (ok) disable = intVal;
  142.     intVal = comments.value(prefix + "_x").toInt(&ok);
  143.     if (ok) rect.setX(intVal);
  144.     intVal = comments.value(prefix + "_y").toInt(&ok);
  145.     if (ok) rect.setY(intVal);
  146.     intVal = comments.value(prefix + "_width").toInt(&ok);
  147.     if (ok) rect.setWidth(intVal);
  148.     intVal = comments.value(prefix+ "_height").toInt(&ok);
  149.     if (ok) rect.setHeight(intVal);
  150.     QString sVal = comments.value(prefix + "_halign").toString();
  151.     int _flags = -1;
  152.     if (sVal == "left") {
  153.         _flags = Qt::AlignLeft;
  154.     } else if (sVal == "center") {
  155.         _flags = Qt::AlignHCenter;
  156.     } else if (sVal == "right") {
  157.         _flags = Qt::AlignRight;
  158.     }
  159.     sVal = comments.value(prefix + "_valign").toString();
  160.     if (sVal == "top") {
  161.         if (_flags < 0) _flags = Qt::AlignTop;
  162.         else _flags |= Qt::AlignTop;
  163.     } else if (sVal == "center") {
  164.         if (_flags < 0) _flags = Qt::AlignVCenter;
  165.         else _flags |= Qt::AlignVCenter;
  166.     } else if (sVal == "bottom") {
  167.         if (_flags < 0) _flags = Qt::AlignBottom;
  168.         else _flags |= Qt::AlignBottom;
  169.     }
  170.     if (_flags >= 0) flags = _flags;
  171.     sVal = comments.value(prefix + "_font_family").toString();
  172.     if (sVal != "") font.setFamily(sVal);
  173.     intVal = comments.value(prefix + "_font_size").toInt(&ok);
  174.     if (ok) font.setPixelSize(intVal);
  175.     intVal = comments.value(prefix + "_font_is_bold").toInt(&ok);
  176.     if (ok) font.setBold(intVal);
  177.     sVal = comments.value(prefix + "_color").toString();
  178.     if (sVal != "") setColor(sVal);
  179.     intVal = comments.value(prefix + "_show_box").toInt(&ok);
  180.     if (ok) showBox = intVal;
  181.     sVal = comments.value(prefix + "_insert_before").toString();
  182.     if (sVal != "") insertBefore = sVal;
  183. }