File: SVSplash.cpp

package info (click to toggle)
sonic-visualiser 5.2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 24,744 kB
  • sloc: cpp: 158,888; ansic: 11,920; sh: 1,785; makefile: 517; xml: 64; perl: 31
file content (111 lines) | stat: -rw-r--r-- 3,008 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*
    Sonic Visualiser
    An audio file viewer and annotation editor.
    Centre for Digital Music, Queen Mary, University of London.
    
    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.  See the file
    COPYING included with this distribution for more information.
*/

#include "SVSplash.h"

#include "../version.h"

#include <QPainter>
#include <QApplication>
#include <QScreen>
#include <QSvgRenderer>

#include "system/System.h"

#include <cmath>

#include <iostream>
using namespace std;

SVSplash::SVSplash()
{
    setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);

    bool darkTheme = OSReportsDarkThemeActive();
    
    QPixmap *p1 = new QPixmap(QString(":icons/scalable/sv-splash.png"));

    int w = p1->width(), h = p1->height();
    QScreen *screen = QApplication::primaryScreen();
    QRect desk = screen->availableGeometry();

    double dpratio = devicePixelRatio();
    double widthMultiple = double(desk.width()) / double(w);

    int sw = w, sh = h;

    if (widthMultiple > 2.5 || dpratio > 1.0 || darkTheme) {

        // Hi-dpi either via pixel doubling or simply via lots of
        // pixels - or dark theme splash, for which we only have an
        // svg version

        double factor = widthMultiple / 2.5;
        if (factor < 1.0) factor = 1.0;
        sw = int(floor(w * factor));
        sh = int(floor(h * factor));

        delete p1;
        m_pixmap = new QPixmap(int(floor(sw * dpratio)),
                               int(floor(sh * dpratio)));

//        cerr << "pixmap size = " << m_pixmap->width() << " * "
//             << m_pixmap->height() << endl;
        
        m_pixmap->fill(Qt::white);
        QString filename = "sv-splash";
        if (darkTheme) {
            filename = "sv-splash-dark";
        }
        QSvgRenderer renderer(QString(":icons/scalable/%1.svg").arg(filename));
        QPainter painter(m_pixmap);
        renderer.render(&painter);
        painter.end();

    } else {
        // The "low dpi" case
        m_pixmap = p1;
    }
    
    setFixedWidth(sw);
    setFixedHeight(sh);
    setGeometry(desk.x() + desk.width()/2 - sw/2,
                desk.y() + desk.height()/2 - sh/2,
                sw, sh);
}

SVSplash::~SVSplash()
{
    delete m_pixmap;
}

void
SVSplash::finishSplash(QWidget *w)
{
    finish(w);
}

void
SVSplash::drawContents(QPainter *painter)
{
    painter->drawPixmap(rect(), *m_pixmap, m_pixmap->rect());
    QString text = QString("v%1").arg(SV_VERSION);
    painter->setPen(OSReportsDarkThemeActive() ? Qt::white : Qt::black);
    painter->drawText
        (width() - painter->fontMetrics().horizontalAdvance(text) - (width()/50),
         (width()/70) + painter->fontMetrics().ascent(),
         text);
}