The beginning of a settings window. Only application settings for now
This commit is contained in:
parent
002867c17b
commit
2ae3f3bf7e
8 changed files with 265 additions and 22 deletions
142
SettingsWindow.cpp
Normal file
142
SettingsWindow.cpp
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
#include "MainWindow.h"
|
||||||
|
#include "SettingsWindow.h"
|
||||||
|
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
|
SettingsWindow::SettingsWindow (QWidget *parent) : QMainWindow (parent)
|
||||||
|
{
|
||||||
|
#ifndef _WIN32
|
||||||
|
setWindowIcon (QIcon (":icon.png"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
resize (400, 300);
|
||||||
|
|
||||||
|
QWidget *dummy = new QWidget (this);
|
||||||
|
setCentralWidget (dummy);
|
||||||
|
|
||||||
|
QVBoxLayout *vbox = new QVBoxLayout (dummy);
|
||||||
|
|
||||||
|
QTabWidget *tab = new QTabWidget (dummy);
|
||||||
|
vbox->addWidget (tab);
|
||||||
|
|
||||||
|
QWidget *dummy2 = new QWidget (dummy);
|
||||||
|
QHBoxLayout *hbox = new QHBoxLayout (dummy2);
|
||||||
|
vbox->addWidget (dummy2);
|
||||||
|
|
||||||
|
QPushButton *cancel = new QPushButton (tr ("Cancel"));
|
||||||
|
cancel->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||||
|
QPushButton *ok = new QPushButton (tr ("OK"));
|
||||||
|
ok->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||||
|
connect (ok, SIGNAL (clicked ()), this, SLOT (okButton ()));
|
||||||
|
|
||||||
|
hbox->addWidget (new QWidget (dummy2), 1);
|
||||||
|
hbox->addWidget (cancel);
|
||||||
|
hbox->addWidget (ok);
|
||||||
|
|
||||||
|
m_mainwindow = new SettingsTabMain (tab);
|
||||||
|
m_playlistwin = new QWidget (tab);
|
||||||
|
m_medialib = new QWidget (tab);
|
||||||
|
|
||||||
|
tab->addTab (m_mainwindow, tr ("Main Window"));
|
||||||
|
tab->addTab (m_playlistwin, tr ("Playlist Window"));
|
||||||
|
tab->addTab (m_medialib, tr ("Medialib"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsWindow::okButton (void)
|
||||||
|
{
|
||||||
|
XMMSHandler *xmmsh = XMMSHandler::getInstance ();
|
||||||
|
m_mainwindow->saveSettings ();
|
||||||
|
|
||||||
|
close ();
|
||||||
|
xmmsh->updateSettings ();
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingsTabMain::SettingsTabMain (QWidget *parent) : QWidget (parent)
|
||||||
|
{
|
||||||
|
QSettings s;
|
||||||
|
|
||||||
|
QVBoxLayout *vbox = new QVBoxLayout (this);
|
||||||
|
QWidget *c = new QWidget (this);
|
||||||
|
QHBoxLayout *h = new QHBoxLayout (c);
|
||||||
|
|
||||||
|
vbox->addWidget (c);
|
||||||
|
|
||||||
|
s.beginGroup ("maindisplay");
|
||||||
|
m_scrolltbar = new QCheckBox (tr ("Scroll titlebar"), this);
|
||||||
|
|
||||||
|
if (s.value("scrollbar").toBool ())
|
||||||
|
m_scrolltbar->setCheckState (Qt::Checked);
|
||||||
|
else
|
||||||
|
m_scrolltbar->setCheckState (Qt::Unchecked);
|
||||||
|
|
||||||
|
h->addWidget (m_scrolltbar);
|
||||||
|
|
||||||
|
m_fontsize = new QSpinBox (this);
|
||||||
|
m_fontsize->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||||
|
m_fontsize->setMinimum (6);
|
||||||
|
m_fontsize->setMaximum (20);
|
||||||
|
m_fontsize->setValue (s.value("fontsize").toInt ());
|
||||||
|
h->addWidget (m_fontsize);
|
||||||
|
|
||||||
|
QLabel *l = new QLabel (tr ("Titlebar fontsize"), this);
|
||||||
|
l->setSizePolicy (QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
|
||||||
|
h->addWidget (l);
|
||||||
|
|
||||||
|
QFrame *f = new QFrame (this);
|
||||||
|
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||||
|
vbox->addWidget (f, 1);
|
||||||
|
|
||||||
|
c = new QWidget (this);
|
||||||
|
h = new QHBoxLayout (c);
|
||||||
|
|
||||||
|
vbox->addWidget (c);
|
||||||
|
|
||||||
|
m_mainttf = new QCheckBox (tr ("Draw main title with TrueType fonts"), this);
|
||||||
|
m_mainttf->setCheckState (s.value ("mainttf").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||||
|
h->addWidget (m_mainttf);
|
||||||
|
|
||||||
|
/*
|
||||||
|
c = new QWidget (this);
|
||||||
|
h = new QHBoxLayout (c);
|
||||||
|
|
||||||
|
vbox->addWidget (c);
|
||||||
|
|
||||||
|
m_shadettf = new QCheckBox (tr ("Draw shaded title with TrueType fonts"), this);
|
||||||
|
m_shadettf->setCheckState (s.value ("shadettf").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||||
|
h->addWidget (m_shadettf);
|
||||||
|
*/
|
||||||
|
|
||||||
|
f = new QFrame (this);
|
||||||
|
f->setFrameStyle (QFrame::HLine | QFrame::Raised);
|
||||||
|
vbox->addWidget (f, 1);
|
||||||
|
|
||||||
|
c = new QWidget (this);
|
||||||
|
h = new QHBoxLayout (c);
|
||||||
|
|
||||||
|
vbox->addWidget (c);
|
||||||
|
|
||||||
|
m_quitonclose = new QCheckBox (tr ("Quit XMMS2D when closing Promoe"));
|
||||||
|
if (s.contains ("quitonclose"))
|
||||||
|
s.setValue ("quitonclose", false);
|
||||||
|
m_quitonclose->setCheckState (s.value ("quitonclose").toBool () ? Qt::Checked : Qt::Unchecked);
|
||||||
|
h->addWidget (m_quitonclose);
|
||||||
|
|
||||||
|
|
||||||
|
s.endGroup ();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SettingsTabMain::saveSettings (void)
|
||||||
|
{
|
||||||
|
QSettings s;
|
||||||
|
|
||||||
|
s.beginGroup ("maindisplay");
|
||||||
|
s.setValue ("scrollbar", m_scrolltbar->checkState () == Qt::Checked);
|
||||||
|
s.setValue ("fontsize", m_fontsize->value ());
|
||||||
|
s.setValue ("quitonclose", m_quitonclose->checkState () == Qt::Checked);
|
||||||
|
s.setValue ("mainttf", m_mainttf->checkState () == Qt::Checked);
|
||||||
|
s.endGroup ();
|
||||||
|
}
|
46
SettingsWindow.h
Normal file
46
SettingsWindow.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#ifndef __SETTINGSWINDOW_H__
|
||||||
|
#define __SETTINGSWINDOW_H__
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QTabWidget>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
class SettingsTabMain : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
SettingsTabMain (QWidget *parent);
|
||||||
|
~SettingsTabMain () {}
|
||||||
|
void saveSettings (void);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
QCheckBox *m_scrolltbar;
|
||||||
|
QSpinBox *m_fontsize;
|
||||||
|
QCheckBox *m_quitonclose;
|
||||||
|
QCheckBox *m_mainttf;
|
||||||
|
QCheckBox *m_shadettf;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SettingsWindow : public QMainWindow {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
SettingsWindow (QWidget *parent);
|
||||||
|
~SettingsWindow () {}
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void okButton (void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SettingsTabMain *m_mainwindow;
|
||||||
|
QWidget *m_playlistwin;
|
||||||
|
QWidget *m_medialib;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
70
TextBar.cpp
70
TextBar.cpp
|
@ -4,21 +4,37 @@
|
||||||
|
|
||||||
TextScroller::TextScroller (QWidget *parent, uint w, uint h) : QWidget (parent)
|
TextScroller::TextScroller (QWidget *parent, uint w, uint h) : QWidget (parent)
|
||||||
{
|
{
|
||||||
|
XMMSHandler *xmmsh = XMMSHandler::getInstance ();
|
||||||
Skin *skin = Skin::getInstance ();
|
Skin *skin = Skin::getInstance ();
|
||||||
|
|
||||||
connect (skin, SIGNAL (skinChanged (Skin *)),
|
connect (skin, SIGNAL (skinChanged (Skin *)),
|
||||||
this, SLOT (setPixmaps(Skin *)));
|
this, SLOT (setPixmaps(Skin *)));
|
||||||
|
|
||||||
|
QSettings s;
|
||||||
|
|
||||||
|
s.beginGroup ("maindisplay");
|
||||||
|
|
||||||
|
if (!s.contains("scrollbar"))
|
||||||
|
s.setValue("scrollbar", true);
|
||||||
|
|
||||||
|
if (!s.contains("fontsize"))
|
||||||
|
s.setValue("fontsize", 8);
|
||||||
|
|
||||||
|
if (!s.contains("mainttf"))
|
||||||
|
s.setValue("mainttf", true);
|
||||||
|
|
||||||
|
if (!s.contains("shadettf"))
|
||||||
|
s.setValue("shadettf", true);
|
||||||
|
|
||||||
m_h = h;
|
m_h = h;
|
||||||
m_w = w;
|
m_w = w;
|
||||||
m_x_off = 0;
|
m_x_off = 0;
|
||||||
m_x2_off = 0;
|
m_x2_off = 0;
|
||||||
#ifdef Q_OS_MACX
|
m_fontsize = s.value ("fontsize").toInt ();
|
||||||
m_fontsize = 9;
|
m_ttf = s.value ("mainttf").toBool ();
|
||||||
#else
|
m_text = "Promoe 0.1";
|
||||||
m_fontsize = 8; /* default */
|
|
||||||
#endif
|
s.endGroup ();
|
||||||
m_ttf = true;
|
|
||||||
|
|
||||||
setMinimumSize(m_w + 2, m_h);
|
setMinimumSize(m_w + 2, m_h);
|
||||||
setMaximumSize(m_w + 2, m_h);
|
setMaximumSize(m_w + 2, m_h);
|
||||||
|
@ -31,7 +47,20 @@ TextScroller::TextScroller (QWidget *parent, uint w, uint h) : QWidget (parent)
|
||||||
|
|
||||||
m_timer = new QTimer (this);
|
m_timer = new QTimer (this);
|
||||||
connect (m_timer, SIGNAL (timeout()), this, SLOT (addOffset ()));
|
connect (m_timer, SIGNAL (timeout()), this, SLOT (addOffset ()));
|
||||||
|
connect (xmmsh, SIGNAL (settingsSaved ()), this, SLOT (settingsSaved ()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TextScroller::settingsSaved (void)
|
||||||
|
{
|
||||||
|
QSettings s;
|
||||||
|
s.beginGroup ("maindisplay");
|
||||||
|
m_fontsize = s.value ("fontsize").toInt ();
|
||||||
|
m_ttf = s.value ("mainttf").toBool ();
|
||||||
|
s.endGroup ();
|
||||||
|
|
||||||
|
setText (m_text);
|
||||||
|
update ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -43,7 +72,7 @@ TextScroller::setPixmaps (Skin *skin)
|
||||||
pal.setBrush (QPalette::Window, b);
|
pal.setBrush (QPalette::Window, b);
|
||||||
setPalette (pal);
|
setPalette (pal);
|
||||||
|
|
||||||
setText (QString::fromUtf8 ("Promoe 0.1"));
|
setText (m_text);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
|
@ -63,8 +92,10 @@ TextScroller::addOffset ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TextScroller::setText (const QString &text)
|
TextScroller::setText (QString text)
|
||||||
{
|
{
|
||||||
|
m_text = text;
|
||||||
|
|
||||||
if (m_ttf) {
|
if (m_ttf) {
|
||||||
drawQtFont (text);
|
drawQtFont (text);
|
||||||
} else {
|
} else {
|
||||||
|
@ -76,12 +107,12 @@ TextScroller::setText (const QString &text)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TextScroller::drawBitmapFont (const QString &text)
|
TextScroller::drawBitmapFont (QString text)
|
||||||
{
|
{
|
||||||
Skin *skin = Skin::getInstance ();
|
Skin *skin = Skin::getInstance ();
|
||||||
|
|
||||||
int width = text.length() * 6;
|
int width = text.length() * 6;
|
||||||
QString (temp) = text.toLower ();
|
QString temp = text.toLower ();
|
||||||
|
|
||||||
if (width > m_w) {
|
if (width > m_w) {
|
||||||
temp += QString::fromAscii (" -- ");
|
temp += QString::fromAscii (" -- ");
|
||||||
|
@ -91,29 +122,36 @@ TextScroller::drawBitmapFont (const QString &text)
|
||||||
} else {
|
} else {
|
||||||
m_pixmap = QPixmap (m_w, m_h);
|
m_pixmap = QPixmap (m_w, m_h);
|
||||||
}
|
}
|
||||||
const char *t = temp.toLatin1();
|
QByteArray temp2 = temp.toLatin1();
|
||||||
|
const char *t = temp2.data();
|
||||||
|
|
||||||
QPainter (paint);
|
QPainter (paint);
|
||||||
|
|
||||||
paint.begin (&m_pixmap);
|
paint.begin (&m_pixmap);
|
||||||
paint.fillRect (m_pixmap.rect(), Qt::white);
|
|
||||||
|
paint.drawPixmap (m_pixmap.rect (),
|
||||||
|
skin->getItem (Skin::TEXTBG),
|
||||||
|
skin->getItem (Skin::TEXTBG).rect ());
|
||||||
|
|
||||||
for (uint i = 0; i < strlen (t); i++) {
|
for (uint i = 0; i < strlen (t); i++) {
|
||||||
QPixmap p = skin->getLetter (t[i]);
|
QPixmap p = skin->getLetter (t[i]);
|
||||||
if (!p) {
|
if (p.isNull ()) {
|
||||||
p = skin->getLetter(' ');
|
p = skin->getLetter(' ');
|
||||||
|
if (p.isNull ()) {
|
||||||
|
qDebug ("abort ffs!");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
paint.drawPixmap (QRect (i * 6, m_y, 4, 6),
|
paint.drawPixmap (QRect ((i * 6), m_y, 4, 6),
|
||||||
p, p.rect());
|
p, p.rect());
|
||||||
}
|
}
|
||||||
|
|
||||||
paint.end();
|
paint.end();
|
||||||
m_pixmap.setMask (m_pixmap.createHeuristicMask ());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TextScroller::drawQtFont (const QString &text)
|
TextScroller::drawQtFont (QString text)
|
||||||
{
|
{
|
||||||
Skin *skin = Skin::getInstance ();
|
Skin *skin = Skin::getInstance ();
|
||||||
|
|
||||||
|
|
|
@ -22,13 +22,14 @@ class TextScroller : public QWidget
|
||||||
TextScroller (QWidget *parent, uint, uint);
|
TextScroller (QWidget *parent, uint, uint);
|
||||||
~TextScroller ();
|
~TextScroller ();
|
||||||
|
|
||||||
void setText(const QString &text);
|
void setText(QString text);
|
||||||
void setFontSize (int i) { m_fontsize = i; }
|
void setFontSize (int i) { m_fontsize = i; }
|
||||||
void setTTF (bool b) { m_ttf = b; }
|
void setTTF (bool b) { m_ttf = b; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void addOffset ();
|
void addOffset ();
|
||||||
void setPixmaps(Skin *skin);
|
void setPixmaps(Skin *skin);
|
||||||
|
void settingsSaved (void);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QPixmap m_pixmap;
|
QPixmap m_pixmap;
|
||||||
|
@ -44,9 +45,10 @@ class TextScroller : public QWidget
|
||||||
bool m_ttf;
|
bool m_ttf;
|
||||||
|
|
||||||
QTimer *m_timer;
|
QTimer *m_timer;
|
||||||
|
QString m_text;
|
||||||
|
|
||||||
void drawBitmapFont (const QString &text);
|
void drawBitmapFont (QString text);
|
||||||
void drawQtFont (const QString &text);
|
void drawQtFont (QString text);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "Display.h"
|
#include "Display.h"
|
||||||
#include "SkinChooser.h"
|
#include "SkinChooser.h"
|
||||||
#include "Medialib.h"
|
#include "Medialib.h"
|
||||||
|
#include "SettingsWindow.h"
|
||||||
|
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
|
|
||||||
|
@ -50,6 +51,7 @@ TitleBar::showMenu (void)
|
||||||
qm.addAction (a);
|
qm.addAction (a);
|
||||||
a = new QAction (tr ("Application settings"), this);
|
a = new QAction (tr ("Application settings"), this);
|
||||||
a->setShortcut (tr ("Alt+A"));
|
a->setShortcut (tr ("Alt+A"));
|
||||||
|
connect (a, SIGNAL (triggered ()), this, SLOT (showSettings ()));
|
||||||
qm.addAction (a);
|
qm.addAction (a);
|
||||||
a = new QAction (tr ("Server settings"), this);
|
a = new QAction (tr ("Server settings"), this);
|
||||||
a->setShortcut (tr ("Alt+S"));
|
a->setShortcut (tr ("Alt+S"));
|
||||||
|
@ -71,6 +73,13 @@ TitleBar::showMlib ()
|
||||||
mw->show ();
|
mw->show ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TitleBar::showSettings ()
|
||||||
|
{
|
||||||
|
SettingsWindow *sw = new SettingsWindow (window ());
|
||||||
|
sw->show ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TitleBar::showTheme ()
|
TitleBar::showTheme ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,6 +21,7 @@ class TitleBar : public PixWidget
|
||||||
void showMenu (void);
|
void showMenu (void);
|
||||||
void showTheme (void);
|
void showTheme (void);
|
||||||
void showMlib (void);
|
void showMlib (void);
|
||||||
|
void showSettings (void);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mouseDoubleClickEvent (QMouseEvent *event);
|
void mouseDoubleClickEvent (QMouseEvent *event);
|
||||||
|
|
|
@ -36,6 +36,8 @@ class XMMSHandler : public QObject, public sigc::trackable {
|
||||||
|
|
||||||
const XMMSClient *getXMMS () { return m_xmmsc; }
|
const XMMSClient *getXMMS () { return m_xmmsc; }
|
||||||
|
|
||||||
|
void updateSettings (void) { emit settingsSaved (); }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setPlaytime ();
|
void setPlaytime ();
|
||||||
void fileOpen (void);
|
void fileOpen (void);
|
||||||
|
@ -53,6 +55,7 @@ class XMMSHandler : public QObject, public sigc::trackable {
|
||||||
}
|
}
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
void settingsSaved (void);
|
||||||
void playbackStatusChanged (uint status);
|
void playbackStatusChanged (uint status);
|
||||||
void playtimeChanged (uint time);
|
void playtimeChanged (uint time);
|
||||||
void mediainfoChanged (uint, QHash<QString, QString>);
|
void mediainfoChanged (uint, QHash<QString, QString>);
|
||||||
|
|
|
@ -19,7 +19,8 @@ SOURCES += XmmsQT4.cpp \
|
||||||
SkinChooser.cpp \
|
SkinChooser.cpp \
|
||||||
PlaylistShade.cpp \
|
PlaylistShade.cpp \
|
||||||
Medialib.cpp \
|
Medialib.cpp \
|
||||||
qtmd5.cpp
|
qtmd5.cpp \
|
||||||
|
SettingsWindow.cpp
|
||||||
|
|
||||||
HEADERS += XmmsQT4.h \
|
HEADERS += XmmsQT4.h \
|
||||||
PixWidget.h \
|
PixWidget.h \
|
||||||
|
@ -42,7 +43,8 @@ HEADERS += XmmsQT4.h \
|
||||||
SkinChooser.h \
|
SkinChooser.h \
|
||||||
PlaylistShade.h \
|
PlaylistShade.h \
|
||||||
Medialib.h \
|
Medialib.h \
|
||||||
qtmd5.h
|
qtmd5.h \
|
||||||
|
SettingsWindow.h
|
||||||
|
|
||||||
|
|
||||||
RESOURCES = promoe.qrc
|
RESOURCES = promoe.qrc
|
||||||
|
@ -53,7 +55,7 @@ macx:QTPLUGIN += qjpeg
|
||||||
QMAKE_LFLAGS += -L$$[QT_INSTALL_PLUGINS]/imageformats
|
QMAKE_LFLAGS += -L$$[QT_INSTALL_PLUGINS]/imageformats
|
||||||
|
|
||||||
CONFIG += link_pkgconfig
|
CONFIG += link_pkgconfig
|
||||||
CXXFLAGS += -g
|
QMAKE_CXXFLAGS += -g
|
||||||
;CONFIG += debug warn_on
|
;CONFIG += debug warn_on
|
||||||
QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter
|
QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-parameter
|
||||||
PKGCONFIG += xmms2-client xmms2-client-cpp sigc++-2.0
|
PKGCONFIG += xmms2-client xmms2-client-cpp sigc++-2.0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue