Work on skins. First implementation ready.

This commit is contained in:
Martin Rotter 2013-09-22 07:38:42 +02:00
parent d995782668
commit 6ef18d1477
6 changed files with 181 additions and 71 deletions

View file

@ -78,6 +78,8 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
this, SLOT(displayProxyPassword(int)));
connect(m_ui->m_btnBrowserProgressColor, SIGNAL(clicked()),
this, SLOT(changeBrowserProgressColor()));
connect(m_ui->m_treeSkins, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
this, SLOT(onSkinSelected(QTreeWidgetItem*,QTreeWidgetItem*)));
// Load all settings.
loadGeneral();
@ -92,6 +94,16 @@ FormSettings::~FormSettings() {
delete m_ui;
}
void FormSettings::onSkinSelected(QTreeWidgetItem *current,
QTreeWidgetItem *previous) {
Q_UNUSED(previous);
if (current != NULL) {
Skin skin = current->data(0, Qt::UserRole).value<Skin>();
m_ui->m_lblSelectedContents->setText(skin.m_visibleName);
}
}
void FormSettings::changeBrowserProgressColor() {
QColorDialog color_dialog(m_initialSettings.m_webBrowserProgress, this);
color_dialog.setWindowTitle(tr("Select color for web browser progress bar"));
@ -397,28 +409,36 @@ void FormSettings::loadInterface() {
m_ui->m_cmbIconTheme->setCurrentIndex(theme_index);
}
#endif
}
// Load skin.
QList<Skin> installed_skins = SkinFactory::getInstance()->getInstalledSkins();
QString active_skin = SkinFactory::getInstance()->getCurrentSkinName();
// Load skin.
QList<Skin> installed_skins = SkinFactory::getInstance()->getInstalledSkins();
QString selected_skin = SkinFactory::getInstance()->getSelectedSkinName();
QString active_skin = SkinFactory::getInstance()->getCurrentSkinName();
foreach (Skin skin, installed_skins) {
QTreeWidgetItem *new_item = new QTreeWidgetItem(QStringList() <<
skin.m_visibleName <<
skin.m_version <<
skin.m_author <<
skin.m_email);
new_item->setData(0, Qt::UserRole, QVariant::fromValue(skin));
foreach (Skin skin, installed_skins) {
QTreeWidgetItem *new_item = new QTreeWidgetItem(QStringList() <<
skin.m_visibleName <<
skin.m_version <<
skin.m_author <<
skin.m_email);
new_item->setData(0, Qt::UserRole, QVariant::fromValue(skin));
// Add this skin and mark it as active if its active now.
m_ui->m_treeSkins->addTopLevelItem(new_item);
// Add this skin and mark it as active if its active now.
m_ui->m_treeSkins->addTopLevelItem(new_item);
if (skin.m_baseName == active_skin) {
m_ui->m_treeSkins->setCurrentItem(new_item);
}
if (skin.m_baseName == selected_skin) {
m_ui->m_treeSkins->setCurrentItem(new_item);
}
}
if (m_ui->m_treeSkins->currentItem() == NULL) {
// No skin is selected or currently selected skin is unavailable.
m_ui->m_treeSkins->setCurrentItem(m_ui->m_treeSkins->topLevelItem(0));
}
m_ui->m_lblActiveContents->setText(SkinFactory::getInstance()->getSkinInfo(active_skin).m_visibleName);
// Load tab settings.
m_ui->m_checkCloseTabsMiddleClick->setChecked(settings->value(APP_CFG_GUI,
"tab_close_mid_button",

View file

@ -32,6 +32,7 @@ class FormSettings : public QDialog {
void loadInterface();
void saveInterface();
void changeBrowserProgressColor();
void onSkinSelected(QTreeWidgetItem *current, QTreeWidgetItem *previous);
void loadGeneral();
void saveGeneral();

View file

@ -121,49 +121,121 @@
<attribute name="title">
<string>Icons &amp;&amp; skins</string>
</attribute>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="m_lblIconTheme">
<property name="text">
<string>Icon theme</string>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="m_scrollIconSkins">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="buddy">
<cstring>m_cmbIconTheme</cstring>
<property name="widgetResizable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="m_cmbIconTheme"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="m_lblSkin">
<property name="text">
<string>Skin</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QTreeWidget" name="m_treeSkins">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="indentation">
<number>0</number>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<column>
<property name="text">
<string notr="true">1</string>
<widget class="QWidget" name="scrollAreaWidgetContents_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>581</width>
<height>340</height>
</rect>
</property>
</column>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="m_lblIconTheme">
<property name="text">
<string>Icon theme</string>
</property>
<property name="buddy">
<cstring>m_cmbIconTheme</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="m_cmbIconTheme"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="m_lblSkin">
<property name="text">
<string>Skin</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QTreeWidget" name="m_treeSkins">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="indentation">
<number>0</number>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="m_lblActiveCaption">
<property name="text">
<string>Active skin</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="m_lblActiveContents">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="m_lblSelectedCaption">
<property name="text">
<string>Selected skin</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="m_lblSelectedContents">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="label">
<property name="text">
<string>Newly selected skin is activated after the applicaton gets restarted!!!</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>

View file

@ -28,16 +28,13 @@ SkinFactory *SkinFactory::getInstance() {
}
void SkinFactory::loadCurrentSkin() {
QString skin_name_from_settings = Settings::getInstance()->value(APP_CFG_GUI,
"skin",
"base/plain.xml").toString();
QString skin_name_from_settings = getSelectedSkinName();
bool loaded = false;
Skin skin_data = getSkinInfo(skin_name_from_settings, &loaded);
if (skin_name_from_settings == APP_THEME_SYSTEM) {
qApp->setStyleSheet(QString());
qApp->setStyle(NULL);
qDebug("System default skin loaded.");
// NOTE: No need to call qApp->setStylesheet(QString()) here.
qDebug("'Default system skin' loaded.");
}
else if (loaded) {
loadSkinFromData(skin_data.m_rawData, skin_name_from_settings);
@ -54,7 +51,7 @@ void SkinFactory::loadCurrentSkin() {
qDebug("Skin '%s' loaded.", qPrintable(skin_name_from_settings));
}
else {
qDebug("Skin '%s' not loaded because style name is not specified or skin raw data is missing.",
qDebug("Skin '%s' not loaded because style name is not specified or skin raw data is missing. Default skin loaded.",
qPrintable(skin_name_from_settings));
}
}
@ -89,7 +86,12 @@ bool SkinFactory::loadSkinFromData(QString skin_data, const QString &skin_path)
void SkinFactory::setCurrentSkinName(const QString &skin_name) {
Settings::getInstance()->setValue(APP_CFG_GUI, "skin", skin_name);
loadCurrentSkin();
}
QString SkinFactory::getSelectedSkinName() {
return Settings::getInstance()->value(APP_CFG_GUI,
"skin",
APP_THEME_SYSTEM).toString();
}
QString SkinFactory::getCurrentSkinName() {
@ -98,6 +100,21 @@ QString SkinFactory::getCurrentSkinName() {
Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
Skin skin;
if (skin_name == APP_THEME_SYSTEM) {
skin.m_author = "-";
skin.m_baseName = APP_THEME_SYSTEM;
skin.m_email = "-";
skin.m_version = "-";
skin.m_visibleName = tr("default system skin");
if (ok != NULL) {
*ok = true;
}
return skin;
}
QXmlQuery query;
QFile skin_file(APP_SKIN_PATH + QDir::separator() + skin_name);
@ -157,13 +174,7 @@ Skin SkinFactory::getSkinInfo(const QString &skin_name, bool *ok) {
QList<Skin> SkinFactory::getInstalledSkins() {
QList<Skin> skins;
Skin default_skin;
default_skin.m_author = "-";
default_skin.m_baseName = APP_THEME_SYSTEM;
default_skin.m_email = "-";
default_skin.m_version = "-";
default_skin.m_visibleName = tr("default system skin");
skins.append(default_skin);
skins.append(getSkinInfo(APP_THEME_SYSTEM));
bool skin_load_ok;
QStringList skin_directories = QDir(APP_SKIN_PATH).entryList(QDir::Dirs |

View file

@ -44,8 +44,15 @@ class SkinFactory : public QObject {
// NOTE: Skin name is formatted as "<folder>/<skin>.xml".
QString getCurrentSkinName();
// Returns the name of the skin, that should be activated
// after application restart.
QString getSelectedSkinName();
// Gets skin about a particular skin.
Skin getSkinInfo(const QString &skin_name, bool *ok = NULL);
// Returns list of installed skins, including "default system skin".
// NOTE: Default skin always lies at position 0.
QList<Skin> getInstalledSkins();
// Sets the desired skin as the active one if it exists.

View file

@ -72,7 +72,6 @@ int main(int argc, char *argv[]) {
IconThemeFactory::getInstance()->setupSearchPaths();
IconThemeFactory::getInstance()->loadCurrentIconTheme(false);
SkinFactory::getInstance()->loadCurrentSkin();
SkinFactory::getInstance()->getInstalledSkins();
// Load localization and setup locale before any widget is constructed.
LoadLocalization();