SlideShowWindow::SlideShowWindow(QWidget *parent) : QWidget(parent) , m_group(0) , m_scene(0) , m_oldScene(0) , m_useGLWidget(true) , m_glWidget(0) , m_graphicsView(0) , m_xfadeSpeed(300) { QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0,0,0,0); bool verbose = true; QString configFile = "player.ini"; if(verbose) qDebug() << "SlideShowWindow: Reading settings from "<<configFile; QSettings settings(configFile,QSettings::IniFormat); QString str; QStringList parts; QPoint point; QString activeGroup = settings.value("config").toString(); str = settings.value("verbose").toString(); if(!str.isEmpty()) verbose = str == "true"; if(verbose && !activeGroup.isEmpty()) qDebug() << "SlideShowWindow: Using config:"<<activeGroup; #define READ_STRING(key,default) \ (!activeGroup.isEmpty() ? \ (!(str = settings.value(QString("%1/%2").arg(activeGroup).arg(key)).toString()).isEmpty() ? str : \ settings.value(key,default).toString()) : \ settings.value(key,default).toString()) #define READ_POINT(key,default) \ str = READ_STRING(key,default); \ parts = str.split("x"); \ point = QPoint(parts[0].toInt(),parts[1].toInt()); \ if(verbose) qDebug() << "SlideShowWindow: " key ": " << point; m_useGLWidget = READ_STRING("compat","false") == "false"; if(m_useGLWidget) { m_glWidget = new GLWidget(this); layout->addWidget(m_glWidget); qDebug() << "SlideShowWindow: Using OpenGL to provide high-quality graphics."; m_glWidget->setCursor(Qt::BlankCursor); } else { m_graphicsView = new ScaledGraphicsView(); m_graphicsScene = new QGraphicsScene(); m_graphicsView->setScene(m_graphicsScene); m_graphicsView->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); m_graphicsScene->setSceneRect(QRectF(0,0,1000.,750.)); m_graphicsView->setBackgroundBrush(Qt::black); layout->addWidget(m_graphicsView); qDebug() << "SlideShowWindow: Using vendor-provided stock graphics engine for compatibility with older hardware."; m_graphicsView->setCursor(Qt::BlankCursor); } // Window position and size READ_POINT("window-pos","10x10"); QPoint windowPos = point; READ_POINT("window-size","640x480"); QPoint windowSize = point; //windowSize = QPoint(3120,1050); if(verbose) qDebug() << "SlideShowWindow: pos:"<<windowPos<<", size:"<<windowSize; resize(windowSize.x(),windowSize.y()); move(windowPos.x(),windowPos.y()); bool frameless = READ_STRING("frameless","true") == "true"; if(frameless) setWindowFlags(Qt::FramelessWindowHint);// | Qt::ToolTip); if(m_useGLWidget) { // Keystoning / Corner Translations READ_POINT("key-tl","0x0"); m_glWidget->setTopLeftTranslation(point); READ_POINT("key-tr","0x0"); m_glWidget->setTopRightTranslation(point); READ_POINT("key-bl","0x0"); m_glWidget->setBottomLeftTranslation(point); READ_POINT("key-br","0x0"); m_glWidget->setBottomRightTranslation(point); // Brightness/Contrast, Hue/Sat m_glWidget->setBrightness(READ_STRING("brightness","0").toInt()); m_glWidget->setContrast(READ_STRING("contrast","0").toInt()); m_glWidget->setHue(READ_STRING("hue","0").toInt()); m_glWidget->setSaturation(READ_STRING("saturation","0").toInt()); // Flip H/V bool fliph = READ_STRING("flip-h","false") == "true"; if(verbose) qDebug() << "SlideShowWindow: flip-h: "<<fliph; m_glWidget->setFlipHorizontal(fliph); bool flipv = READ_STRING("flip-v","false") == "true"; if(verbose) qDebug() << "SlideShowWindow: flip-v: "<<flipv; m_glWidget->setFlipVertical(flipv); // Rotate int rv = READ_STRING("rotate","0").toInt(); if(verbose) qDebug() << "SlideShowWindow: rotate: "<<rv; if(rv != 0) m_glWidget->setCornerRotation(rv == -1 ? GLRotateLeft : rv == 1 ? GLRotateRight : GLRotateNone); // Aspet Ratio Mode m_glWidget->setAspectRatioMode(READ_STRING("ignore-ar","false") == "true" ? Qt::IgnoreAspectRatio : Qt::KeepAspectRatio); // Alpha Mask QString alphaFile = READ_STRING("alphamask",""); if(!alphaFile.isEmpty()) { QImage alphamask(alphaFile); if(alphamask.isNull()) qDebug() << "SlideShowWindow: Error loading alphamask "<<alphaFile; else m_glWidget->setAlphaMask(alphamask); } // GLWidgetSubview *sub1 = m_glWidget->defaultSubview(); // sub1->setRight(1680./3120.); // // GLWidgetSubview *sub2 = new GLWidgetSubview(); // sub2->setLeft(sub1->right()); // sub2->setBrightness(75); // sub2->setFlipVertical(true); // sub2->setFlipHorizontal(true); // // m_glWidget->addSubview(sub2); } // Canvas Size READ_POINT("canvas-size","1000x750"); QSizeF canvasSize((qreal)point.x(),(qreal)point.y()); //canvasSize = QSizeF(2000,750); canvasSize = QSizeF(3120,1050); if(m_useGLWidget) { m_glWidget->setCanvasSize(canvasSize); } else { m_graphicsScene->setSceneRect(QRectF(QPointF(0,0),canvasSize)); } m_xfadeSpeed = READ_STRING("xfade-speed",300).toInt(); //qDebug() << "SlideShowWindow: Crossfade speed: "<<m_xfadeSpeed; // QString loadGroup = READ_STRING("load-group",""); // if(!loadGroup.isEmpty()) // { // QFile file(loadGroup); // if (!file.open(QIODevice::ReadOnly)) // { // qDebug() << "SlideShowWindow: Unable to read group file: "<<loadGroup; // } // else // { // QByteArray array = file.readAll(); // // GLSceneGroup *group = new GLSceneGroup(); // group->fromByteArray(array); // setGroup(group); // // GLScene *scene = group->at(0); // if(scene) // { // //scene->setGLWidget(this); // setScene(scene); // qDebug() << "SlideShowWindow: [DEBUG]: Loaded File: "<<loadGroup<<", GroupID: "<<group->groupId()<<", SceneID: "<< scene->sceneId(); // // if(m_outputEncoder && // !m_outputEncoder->encodingStarted()) // m_outputEncoder->startEncoder(); // // } // else // { // qDebug() << "SlideShowWindow: [DEBUG]: Loaded File: "<<loadGroup<<", GroupID: "<<group->groupId()<<" - no scenes found at index 0"; // } // } // } // else // { // QString loadGroup = READ_STRING("collection",""); // if(!loadGroup.isEmpty()) // { // QFile file(loadGroup); // if (!file.open(QIODevice::ReadOnly)) // { // qDebug() << "SlideShowWindow: Unable to read group file: "<<loadGroup; // } // else // { // QByteArray array = file.readAll(); // // GLSceneGroupCollection *collection = new GLSceneGroupCollection(); // collection->fromByteArray(array); // setGroup(collection->at(0)); // // if(m_group) // { // GLScene *scene = m_group->at(0); // if(scene) // { // //scene->setGLWidget(this); // setScene(scene); // qDebug() << "SlideShowWindow: [DEBUG]: Loaded File: "<<loadGroup<<", GroupID: "<<m_group->groupId()<<", SceneID: "<< scene->sceneId(); // // GLDrawableList list = scene->drawableList(); // foreach(GLDrawable *gld, list) // if(gld->playlist()->size() > 0) // gld->playlist()->play(); // // if(m_outputEncoder && // !m_outputEncoder->encodingStarted()) // m_outputEncoder->startEncoder(); // // } // else // { // qDebug() << "SlideShowWindow: [DEBUG]: Loaded File: "<<loadGroup<<", GroupID: "<<m_group->groupId()<<" - no scenes found at index 0"; // } // } // } // } // } QStringList argList = qApp->arguments(); if(argList.size() > 1) { QString dirName = argList.at(1); QDir dir(dirName); dir.setNameFilters(QStringList() << "*.jpg" << "*.JPG" << "*.jpeg" << "*.png" << "*.PNG"); QFileInfoList list = dir.entryInfoList(QDir::Files, QDir::Name); if(m_glWidget) m_glWidget->setFboEnabled(false); int spinSize = 28; //QStringList list = dir.entryList(); //foreach(QString file, list) foreach(QFileInfo info, list) { //QFileInfo info(QString("%1/%2").arg(dirName,file)); //if(!info.isFile()) // continue; //QString ext = info.suffix().toLower(); //if(ext != "jpg" || ext != "png" || ext != "jpeg") // continue; bool flipText = true; QString fullFile = info.absoluteFilePath(); qDebug() << "SlideShowWindow: Loading "<<fullFile;//<<" (ext:"<<ext<<")"; GLScene *scene = new GLScene(); { QString comment = ""; QString datetime = ""; try { Exiv2::Image::AutoPtr exiv = Exiv2::ImageFactory::open(fullFile.toStdString()); if(exiv.get() != 0) { exiv->readMetadata(); Exiv2::ExifData& exifData = exiv->exifData(); if (exifData.empty()) { qDebug() << fullFile << ": No Exif data found in the file"; } comment = exifData["Exif.Image.ImageDescription"].toString().c_str(); comment = GLTextDrawable::htmlToPlainText(comment); datetime = exifData["Exif.Photo.DateTimeOriginal"].toString().c_str(); if(comment.trimmed().isEmpty()) { Exiv2::IptcData& iptcData = exiv->iptcData(); comment = iptcData["Iptc.Application2.Caption"].toString().c_str(); comment = GLTextDrawable::htmlToPlainText(comment); if (exifData.empty()) { qDebug() << fullFile << ": No IPTC data found in the file"; } else { qDebug() << "SlideShowWindow: IPTC Caption:"<<comment; } } else { qDebug() << "SlideShowWindow: EXIF Caption:"<<comment; } } } catch (Exiv2::AnyError& e) { std::cout << "Caught Exiv2 exception '" << e << "'\n"; //return -1; } GLImageDrawable *image = new GLImageDrawable(fullFile); if(canvasSize.width() > 1000) { image->setRect(QRectF(QPointF(0,0),QSize(1680,canvasSize.height()))); } else { image->setRect(QRectF(QPointF(0,0),canvasSize)); } //image->setCrossFadeMode(GLVideoDrawable::JustFront); scene->addDrawable(image); if(!comment.isEmpty()) { comment = comment.replace(QRegExp("^\\s*\"([^\"]+)\"\\s*-\\s*"), "<center>\"\\1\"</center><br>"); GLTextDrawable *text = new GLTextDrawable(); QString ptSize = "36"; QString html = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd\">" "<html><head><meta name=\"qrichtext\" content=\"1\"/>" "<style type=\"text/css\">p, li { white-space: pre-wrap; }</style>" "</head>" "<body style=\"font-family:'Sans Serif'; font-size:" + ptSize +"pt; font-weight:600; font-style:normal;\">" "<table style=\"-qt-table-type: root; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;\">" "<tr><td style=\"border: none;\">" "<p style=\"margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">" "<span style=\"font-size:" + ptSize + "pt; font-weight:600; color:#ffffff;\">" + comment + "</span></p></td></tr></table></body></html>"; text->setText(html); //qDebug() << "File # text size:"<<size<<" @ width:"<<w<<", html:"<<html; if(canvasSize.width() > 1000) { QSize size = text->findNaturalSize(1400); QRectF targetRect = QRectF(0, 0, size.width(), size.height()); targetRect.moveCenter(QRectF(1680,0,1440,900).center()); text->setRect(targetRect); if(flipText) { text->setFlipVertical(true); text->setFlipHorizontal(true); } } else { int w = (int)canvasSize.width(); QSize size = text->findNaturalSize(w); double x = (canvasSize.width() - size.width()) / 2; double y = canvasSize.height() - size.height() - 2; text->setRect(QRectF(QPointF(x,y),size)); } text->setZIndex(5.); scene->addDrawable(text); qDebug() << "Loaded caption:"<<comment; } QFileInfo fileInfo(fullFile); QString fileName = fileInfo.baseName().toLower(); fileName = fileName.replace(QRegExp("\\d{2,6}-\\{\\d\\}"),""); fileName = fileName.replace(QRegExp("(dsc_|sdc)"), ""); if(!fileName.isEmpty()) { GLTextDrawable *text = new GLTextDrawable(); //QString html = QString("<span style='font-color:white;font-size:20px'>%1</font>").arg(fileName); QString ptSize = "24"; QString html = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd\">" "<html><head><meta name=\"qrichtext\" content=\"1\"/>" "<style type=\"text/css\">p, li { white-space: pre-wrap; }</style>" "</head>" "<body style=\"font-family:'Sans Serif'; font-size:" + ptSize +"pt; font-weight:600; font-style:normal;\">" "<table style=\"-qt-table-type: root; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;\">" "<tr><td style=\"border: none;\">" "<p style=\"margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">" "<span style=\"font-size:" + ptSize + "pt; font-weight:600; color:#ffffff;\">" "Photograph # "+ fileName + "</span></p></td></tr></table></body></html>"; text->setText(html); int w = (int)canvasSize.width(); QSize size = text->findNaturalSize(w); //qDebug() << "File # text size:"<<size<<" @ width:"<<w<<", html:"<<html; if(flipText) { if(canvasSize.width() > 1000) { int spinSpace = spinSize + 10; size = text->findNaturalSize(1440); //QRectF targetRect = QRectF(0, 0, size.width(), size.height()); //targetRect.moveCenter(QRectF(1680,0,1440,900).center()); double x = 1680 + 10 + spinSpace; double y = 900 - 10 - size.height(); QRectF rect(QPointF(x,y),size); //qDebug() << "Rect: "<<rect; text->setRect(rect); text->setFlipVertical(true); text->setFlipHorizontal(true); } else { // TODO flip here too double x = canvasSize.width() - size.width() - 2; double y = 2; text->setRect(QRectF(QPointF(x,y),size)); } } else { double x = canvasSize.width() - size.width() - 2; double y = 2; text->setRect(QRectF(QPointF(x,y),size)); } text->setZIndex(5.); scene->addDrawable(text); } if(!datetime.isEmpty()) { GLTextDrawable *text = new GLTextDrawable(); //QString html = QString("<span style='font-color:white;font-size:20px'>%1</font>").arg(fileName); // 2009:10:25 12:13:34 QDateTime parsedDate = QDateTime::fromString(datetime, "yyyy:MM:dd hh:mm:ss"); QString dateString = "Photographed " + parsedDate.toString("dddd, MMMM d, yyyy"); QString ptSize = "24"; QString html = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd\">" "<html><head><meta name=\"qrichtext\" content=\"1\"/>" "<style type=\"text/css\">p, li { white-space: pre-wrap; }</style>" "</head>" "<body style=\"font-family:'Sans Serif'; font-size:" + ptSize +"pt; font-weight:600; font-style:normal;\">" "<table style=\"-qt-table-type: root; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;\">" "<tr><td style=\"border: none;\">" "<p style=\"margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">" "<span style=\"font-size:" + ptSize + "pt; font-weight:600; color:#ffffff;\">" + dateString + "</span></p></td></tr></table></body></html>"; text->setText(html); int w = (int)canvasSize.width(); QSize size = text->findNaturalSize(w); //qDebug() << "File # text size:"<<size<<" @ width:"<<w<<", html:"<<html; if(flipText) { if(canvasSize.width() > 1000) { //int spinSpace = spinSize + 10; size = text->findNaturalSize(1440); //QRectF targetRect = QRectF(0, 0, size.width(), size.height()); //targetRect.moveCenter(QRectF(1680,0,1440,900).center()); double x = 1680 + (1440 - size.width()) / 2; double y = 10; //900 - 10 - size.height(); QRectF rect(QPointF(x,y),size); //qDebug() << "Rect: "<<rect; text->setRect(rect); text->setFlipVertical(true); text->setFlipHorizontal(true); } else { // TODO // double x = canvasSize.width() - size.width() - 2; // double y = 2; // text->setRect(QRectF(QPointF(x,y),size)); } } else { // TODO // double x = canvasSize.width() - size.width() - 2; // double y = 2; // text->setRect(QRectF(QPointF(x,y),size)); } text->setZIndex(5.); scene->addDrawable(text); } } m_scenes << scene; }
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> void Scheme::fetch() { READ_BOOL(showMenu); READ_BOOL(showStatusBar); std::string tabPosition = ""; READ_STRING(tabPosition); if ( tabPosition == "off" ) this->tabPosition = 0; else if ( tabPosition == "north" ) this->tabPosition = 1; else if ( tabPosition == "south" ) this->tabPosition = 2; else if ( tabPosition == "west" ) this->tabPosition = 3; else if ( tabPosition == "east" ) this->tabPosition = 4; READ_COLOR(colors.background); READ_COLOR(colors.splash.version); READ_COLOR(colors.splash.message); READ_COLOR(colors.records.alignment); READ_COLOR(colors.records.background); READ_COLOR(colors.records.alternateBackground); READ_COLOR(colors.records.foreground); READ_COLOR(colors.records.alternateForeground); READ_COLOR(colors.records.spectrogram); READ_COLOR(colors.records.gaps); READ_COLOR(colors.records.overlaps); READ_COLOR(colors.records.states.unrequested); READ_COLOR(colors.records.states.requested); READ_COLOR(colors.records.states.inProgress); READ_COLOR(colors.records.states.notAvailable); READ_COLOR(colors.picks.manual); READ_COLOR(colors.picks.automatic); READ_COLOR(colors.picks.undefined); READ_COLOR(colors.picks.disabled); READ_COLOR(colors.arrivals.manual); READ_COLOR(colors.arrivals.automatic); READ_COLOR(colors.arrivals.theoretical); READ_COLOR(colors.arrivals.undefined); READ_COLOR(colors.arrivals.disabled); READ_COLOR_GRADIENT(colors.arrivals.residuals); READ_COLOR(colors.magnitudes.set); READ_COLOR(colors.magnitudes.unset); READ_COLOR(colors.magnitudes.disabled); READ_COLOR_GRADIENT(colors.magnitudes.residuals); READ_COLOR(colors.stations.text); READ_COLOR(colors.stations.associated); READ_COLOR(colors.stations.triggering); READ_COLOR(colors.stations.triggered0); READ_COLOR(colors.stations.triggered1); READ_COLOR(colors.stations.triggered2); READ_COLOR(colors.stations.disabled); READ_COLOR(colors.stations.idle); READ_COLOR(colors.qc.delay0); READ_COLOR(colors.qc.delay1); READ_COLOR(colors.qc.delay2); READ_COLOR(colors.qc.delay3); READ_COLOR(colors.qc.delay4); READ_COLOR(colors.qc.delay5); READ_COLOR(colors.qc.delay6); READ_COLOR(colors.qc.delay7); READ_COLOR(colors.qc.qcWarning); READ_COLOR(colors.qc.qcError); READ_COLOR(colors.qc.qcOk); READ_COLOR(colors.qc.qcNotSet); READ_COLOR(colors.gm.gm0); READ_COLOR(colors.gm.gm1); READ_COLOR(colors.gm.gm2); READ_COLOR(colors.gm.gm3); READ_COLOR(colors.gm.gm4); READ_COLOR(colors.gm.gm5); READ_COLOR(colors.gm.gm6); READ_COLOR(colors.gm.gm7); READ_COLOR(colors.gm.gm8); READ_COLOR(colors.gm.gm9); READ_COLOR(colors.gm.gmNotSet); READ_COLOR(colors.recordView.selectedTraceZoom); READ_COLOR(colors.map.lines); READ_COLOR(colors.map.outlines); READ_COLOR(colors.map.grid); READ_COLOR(colors.map.stationAnnotations); READ_COLOR(colors.map.cityLabels); READ_COLOR(colors.map.cityOutlines); READ_COLOR(colors.map.cityCapital); READ_COLOR(colors.map.cityNormal); READ_COLOR(colors.legend.background); READ_COLOR(colors.legend.border); READ_COLOR(colors.legend.text); READ_COLOR(colors.legend.headerText); READ_BOOL(colors.originSymbol.classic); READ_COLOR_GRADIENT(colors.originSymbol.depth.gradient); READ_BOOL(colors.originSymbol.depth.discrete); READ_COLOR(colors.originStatus.automatic); READ_COLOR(colors.originStatus.manual); READ_INT(marker.lineWidth); READ_INT(records.lineWidth); READ_BOOL(records.antiAliasing); READ_BOOL(records.optimize); READ_FONT(fonts.base); fonts.setBase(fonts.base); READ_FONT_BY_NAME(fonts.smaller, fonts.small); READ_FONT(fonts.normal); READ_FONT(fonts.large); READ_FONT(fonts.highlight); READ_FONT(fonts.heading1); READ_FONT(fonts.heading2); READ_FONT(fonts.heading3); READ_FONT(fonts.cityLabels); READ_FONT(fonts.splashVersion); READ_FONT(fonts.splashMessage); SCApp->setFont(fonts.base); READ_INT(splash.version.align); READ_POINT(splash.version.pos); READ_INT(splash.message.align); READ_POINT(splash.message.pos); READ_INT(map.stationSize); READ_INT(map.originSymbolMinSize); READ_BOOL(map.vectorLayerAntiAlias); READ_BOOL(map.bilinearFilter); READ_BOOL(map.showGrid); READ_BOOL(map.showLayers); READ_BOOL(map.showCities); READ_BOOL(map.showLegends); READ_INT(map.cityPopulationWeight); READ_BOOL(map.toBGR); READ_STRING(map.projection); READ_INT(precision.depth); READ_INT(precision.distance); READ_INT(precision.location); READ_INT(precision.pickTime); READ_INT(precision.traceValues); READ_INT(precision.rms); READ_INT(precision.uncertainties); READ_BOOL(unit.distanceInKM); READ_BOOL(dateTime.useLocalTime); }