Made cloning, deleting and editing of color schemes functional

This commit is contained in:
Thorbjørn Lindeijer
2009-07-13 14:08:14 +02:00
parent c5a7c48b85
commit 224d457aaa
7 changed files with 173 additions and 62 deletions

View File

@@ -47,18 +47,17 @@ static inline QString colorButtonStyleSheet(const QColor &bgColor)
EditColorSchemeDialog::EditColorSchemeDialog(const FormatDescriptions &fd, EditColorSchemeDialog::EditColorSchemeDialog(const FormatDescriptions &fd,
const FontSettings &fontSettings, const FontSettings &fontSettings,
const ColorScheme &scheme,
QWidget *parent) : QWidget *parent) :
QDialog(parent), QDialog(parent),
m_descriptions(fd), m_descriptions(fd),
m_fontSettings(fontSettings), m_fontSettings(fontSettings),
m_scheme(scheme), m_scheme(fontSettings.colorScheme()),
m_curItem(-1), m_curItem(-1),
m_ui(new Ui::EditColorSchemeDialog) m_ui(new Ui::EditColorSchemeDialog)
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->nameEdit->setText(scheme.name()); m_ui->nameEdit->setText(m_scheme.name());
foreach (const FormatDescription &d, fd) foreach (const FormatDescription &d, fd)
m_ui->itemListWidget->addItem(d.trName()); m_ui->itemListWidget->addItem(d.trName());

View File

@@ -49,7 +49,6 @@ class EditColorSchemeDialog : public QDialog
public: public:
EditColorSchemeDialog(const FormatDescriptions &fd, EditColorSchemeDialog(const FormatDescriptions &fd,
const FontSettings &fontSettings, const FontSettings &fontSettings,
const ColorScheme &scheme,
QWidget *parent = 0); QWidget *parent = 0);
~EditColorSchemeDialog(); ~EditColorSchemeDialog();

View File

@@ -220,11 +220,25 @@ QString FontSettings::colorSchemeFileName() const
return m_schemeFileName; return m_schemeFileName;
} }
void FontSettings::loadColorScheme(const QString &fileName, /**
const FormatDescriptions &descriptions) * Sets the file name of the color scheme. Does not load the scheme from the
* given file. If you want to load a scheme, use loadColorScheme() instead.
*/
void FontSettings::setColorSchemeFileName(const QString &fileName)
{ {
m_schemeFileName = fileName; m_schemeFileName = fileName;
m_scheme.load(m_schemeFileName); }
bool FontSettings::loadColorScheme(const QString &fileName,
const FormatDescriptions &descriptions)
{
bool loaded = true;
m_schemeFileName = fileName;
if (!m_scheme.load(m_schemeFileName)) {
loaded = false;
qWarning() << "Failed to load color scheme:" << fileName;
}
// Apply default formats to undefined categories // Apply default formats to undefined categories
foreach (const FormatDescription &desc, descriptions) { foreach (const FormatDescription &desc, descriptions) {
@@ -238,6 +252,8 @@ void FontSettings::loadColorScheme(const QString &fileName,
m_scheme.setFormatFor(name, format); m_scheme.setFormatFor(name, format);
} }
} }
return loaded;
} }
/** /**

View File

@@ -84,7 +84,8 @@ public:
Format &formatFor(const QString &category); Format &formatFor(const QString &category);
QString colorSchemeFileName() const; QString colorSchemeFileName() const;
void loadColorScheme(const QString &fileName, const FormatDescriptions &descriptions); void setColorSchemeFileName(const QString &fileName);
bool loadColorScheme(const QString &fileName, const FormatDescriptions &descriptions);
ColorScheme colorScheme() const; ColorScheme colorScheme() const;
void setColorScheme(const ColorScheme &scheme); void setColorScheme(const ColorScheme &scheme);

View File

@@ -37,6 +37,7 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <utils/settingsutils.h> #include <utils/settingsutils.h>
#include <QtCore/QDebug>
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <QtGui/QCheckBox> #include <QtGui/QCheckBox>
@@ -44,6 +45,7 @@
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QFontDatabase> #include <QtGui/QFontDatabase>
#include <QtGui/QListWidget> #include <QtGui/QListWidget>
#include <QtGui/QMessageBox>
#include <QtGui/QPalette> #include <QtGui/QPalette>
#include <QtGui/QPalette> #include <QtGui/QPalette>
#include <QtGui/QTextCharFormat> #include <QtGui/QTextCharFormat>
@@ -73,6 +75,23 @@ public:
Ui::FontSettingsPage ui; Ui::FontSettingsPage ui;
}; };
struct ColorSchemeEntry
{
QString fileName;
QString name;
bool readOnly;
};
} // namespace Internal
} // namespace TextEditor
Q_DECLARE_METATYPE(TextEditor::Internal::ColorSchemeEntry)
using namespace TextEditor;
using namespace TextEditor::Internal;
// ------- FontSettingsPagePrivate
FontSettingsPagePrivate::FontSettingsPagePrivate(const TextEditor::FormatDescriptions &fd, FontSettingsPagePrivate::FontSettingsPagePrivate(const TextEditor::FormatDescriptions &fd,
const QString &name, const QString &name,
const QString &category, const QString &category,
@@ -105,11 +124,6 @@ FontSettingsPagePrivate::FontSettingsPagePrivate(const TextEditor::FormatDescrip
m_lastValue = m_value; m_lastValue = m_value;
} }
} // namespace Internal
} // namespace TextEditor
using namespace TextEditor;
using namespace TextEditor::Internal;
// ------- FormatDescription // ------- FormatDescription
FormatDescription::FormatDescription(const QString &name, const QString &trName, const QColor &color) : FormatDescription::FormatDescription(const QString &name, const QString &trName, const QColor &color) :
@@ -223,7 +237,6 @@ QWidget *FontSettingsPage::createPage(QWidget *parent)
d_ptr->ui.schemeListWidget->addItem(tr("Default")); d_ptr->ui.schemeListWidget->addItem(tr("Default"));
d_ptr->ui.schemeListWidget->setCurrentIndex(d_ptr->ui.schemeListWidget->model()->index(0, 0)); d_ptr->ui.schemeListWidget->setCurrentIndex(d_ptr->ui.schemeListWidget->model()->index(0, 0));
d_ptr->ui.exportButton->setEnabled(true);
d_ptr->ui.editButton->setEnabled(true); d_ptr->ui.editButton->setEnabled(true);
QFontDatabase db; QFontDatabase db;
@@ -237,8 +250,9 @@ QWidget *FontSettingsPage::createPage(QWidget *parent)
connect(d_ptr->ui.familyComboBox, SIGNAL(activated(int)), this, SLOT(updatePointSizes())); connect(d_ptr->ui.familyComboBox, SIGNAL(activated(int)), this, SLOT(updatePointSizes()));
connect(d_ptr->ui.schemeListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), connect(d_ptr->ui.schemeListWidget, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
this, SLOT(colorSchemeSelected(QListWidgetItem*))); this, SLOT(colorSchemeSelected(QListWidgetItem*)));
connect(d_ptr->ui.exportButton, SIGNAL(clicked()), this, SLOT(exportColorScheme())); connect(d_ptr->ui.cloneButton, SIGNAL(clicked()), this, SLOT(cloneColorScheme()));
connect(d_ptr->ui.editButton, SIGNAL(clicked()), this, SLOT(editColorScheme())); connect(d_ptr->ui.editButton, SIGNAL(clicked()), this, SLOT(editColorScheme()));
connect(d_ptr->ui.deleteButton, SIGNAL(clicked()), this, SLOT(deleteColorScheme()));
updatePointSizes(); updatePointSizes();
refreshColorSchemeList(); refreshColorSchemeList();
@@ -272,33 +286,83 @@ void FontSettingsPage::updatePointSizes()
void FontSettingsPage::colorSchemeSelected(QListWidgetItem *item) void FontSettingsPage::colorSchemeSelected(QListWidgetItem *item)
{ {
// TODO: Enable the appropriate actions bool modifiable = false;
if (item) {
const ColorSchemeEntry entry = item->data(Qt::UserRole).value<ColorSchemeEntry>();
modifiable = !entry.readOnly;
}
d_ptr->ui.cloneButton->setEnabled(item != 0);
d_ptr->ui.deleteButton->setEnabled(modifiable);
d_ptr->ui.editButton->setEnabled(modifiable);
} }
void FontSettingsPage::importColorScheme() void FontSettingsPage::cloneColorScheme()
{ {
QString fn = QFileDialog::getOpenFileName(d_ptr->ui.importButton->window(), QListWidgetItem *item = d_ptr->ui.schemeListWidget->currentItem();
tr("Import Color Scheme"), if (!item)
QString(),
tr("Color Schemes (*.xml)"));
if (fn.isEmpty())
return; return;
// Open color scheme and save it in the schemes directory const ColorSchemeEntry entry = item->data(Qt::UserRole).value<ColorSchemeEntry>();
// Load the currently selected color scheme
if (!d_ptr->m_value.loadColorScheme(entry.fileName, d_ptr->m_descriptions))
return;
QString baseDir = customStylesPath();
QString baseFileName = baseDir;
baseFileName.append(QFileInfo(entry.fileName).completeBaseName());
// Find an available file name
int i = 1;
QString fileName;
do {
fileName = baseFileName;
fileName.append(QString("_copy%1.xml").arg((i == 1) ? QString() : QString::number(i)));
++i;
} while (QFile::exists(fileName));
// Create the base directory when it doesn't exist
if (!QFile::exists(baseDir) && !QDir().mkpath(baseDir)) {
qWarning() << "Failed to create color scheme directory:" << baseDir;
return;
} }
void FontSettingsPage::exportColorScheme() ColorScheme scheme = d_ptr->m_value.colorScheme();
scheme.setName(tr("%1 (copy)").arg(scheme.name()));
scheme.save(fileName);
d_ptr->m_value.setColorSchemeFileName(fileName);
refreshColorSchemeList();
}
void FontSettingsPage::deleteColorScheme()
{ {
QString fn = QFileDialog::getSaveFileName(d_ptr->ui.exportButton->window(), QListWidgetItem *item = d_ptr->ui.schemeListWidget->currentItem();
tr("Export Color Scheme"), if (!item)
QString(), return;
tr("Color Schemes (*.xml)"));
if (!fn.isEmpty()) const ColorSchemeEntry entry = item->data(Qt::UserRole).value<ColorSchemeEntry>();
d_ptr->m_value.colorScheme().save(fn); if (!entry.readOnly) {
int ret = QMessageBox::warning(d_ptr->ui.deleteButton->window(),
tr("Delete Color Scheme"),
tr("Are you sure you want to delete this color scheme permanently?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if (ret == QMessageBox::Yes && QFile::remove(entry.fileName))
refreshColorSchemeList();
}
} }
void FontSettingsPage::editColorScheme() void FontSettingsPage::editColorScheme()
{ {
QListWidgetItem *item = d_ptr->ui.schemeListWidget->currentItem();
if (!item)
return;
const ColorSchemeEntry entry = item->data(Qt::UserRole).value<ColorSchemeEntry>();
if (entry.readOnly)
return;
d_ptr->m_value.setFamily(d_ptr->ui.familyComboBox->currentText()); d_ptr->m_value.setFamily(d_ptr->ui.familyComboBox->currentText());
d_ptr->m_value.setAntialias(d_ptr->ui.antialias->isChecked()); d_ptr->m_value.setAntialias(d_ptr->ui.antialias->isChecked());
@@ -307,13 +371,31 @@ void FontSettingsPage::editColorScheme()
if (ok) if (ok)
d_ptr->m_value.setFontSize(size); d_ptr->m_value.setFontSize(size);
if (!d_ptr->m_value.loadColorScheme(entry.fileName, d_ptr->m_descriptions))
return;
EditColorSchemeDialog dialog(d_ptr->m_descriptions, EditColorSchemeDialog dialog(d_ptr->m_descriptions,
d_ptr->m_value, d_ptr->m_value,
d_ptr->m_value.colorScheme(),
d_ptr->ui.editButton->window()); d_ptr->ui.editButton->window());
if (dialog.exec() == QDialog::Accepted) if (dialog.exec() == QDialog::Accepted) {
d_ptr->m_value.setColorScheme(dialog.colorScheme()); ColorScheme newColorScheme = dialog.colorScheme();
newColorScheme.save(entry.fileName);
d_ptr->m_value.setColorScheme(newColorScheme);
refreshColorSchemeList();
}
}
void FontSettingsPage::addColorSchemeEntry(const QString &fileName, bool readOnly)
{
ColorSchemeEntry entry;
entry.fileName = fileName;
entry.name = ColorScheme::readNameOfScheme(fileName);
entry.readOnly = readOnly;
QListWidgetItem *item = new QListWidgetItem(entry.name);
item->setData(Qt::UserRole, QVariant::fromValue<ColorSchemeEntry>(entry));
d_ptr->ui.schemeListWidget->addItem(item);
} }
void FontSettingsPage::refreshColorSchemeList() void FontSettingsPage::refreshColorSchemeList()
@@ -329,11 +411,19 @@ void FontSettingsPage::refreshColorSchemeList()
int count = 0; int count = 0;
foreach (const QString &file, styleDir.entryList()) { foreach (const QString &file, styleDir.entryList()) {
const QString absFileName = styleDir.absoluteFilePath(file); const QString fileName = styleDir.absoluteFilePath(file);
QListWidgetItem *item = new QListWidgetItem(ColorScheme::readNameOfScheme(absFileName)); addColorSchemeEntry(fileName, true);
item->setData(Qt::UserRole, absFileName); if (d_ptr->m_value.colorSchemeFileName() == fileName)
d_ptr->ui.schemeListWidget->addItem(item); selected = count;
if (d_ptr->m_value.colorSchemeFileName() == absFileName) ++count;
}
styleDir.setPath(customStylesPath());
foreach (const QString &file, styleDir.entryList()) {
const QString fileName = styleDir.absoluteFilePath(file);
addColorSchemeEntry(fileName, false);
if (d_ptr->m_value.colorSchemeFileName() == fileName)
selected = count; selected = count;
++count; ++count;
} }
@@ -342,6 +432,13 @@ void FontSettingsPage::refreshColorSchemeList()
d_ptr->ui.schemeListWidget->setCurrentIndex(s); d_ptr->ui.schemeListWidget->setCurrentIndex(s);
} }
QString FontSettingsPage::customStylesPath()
{
QString path = QFileInfo(Core::ICore::instance()->settings()->fileName()).path();
path.append(QLatin1String("/qtcreator/styles/"));
return path;
}
void FontSettingsPage::delayedChange() void FontSettingsPage::delayedChange()
{ {
emit changed(d_ptr->m_value); emit changed(d_ptr->m_value);
@@ -353,9 +450,9 @@ void FontSettingsPage::apply()
d_ptr->m_value.setAntialias(d_ptr->ui.antialias->isChecked()); d_ptr->m_value.setAntialias(d_ptr->ui.antialias->isChecked());
if (QListWidgetItem *item = d_ptr->ui.schemeListWidget->currentItem()) { if (QListWidgetItem *item = d_ptr->ui.schemeListWidget->currentItem()) {
QString file = item->data(Qt::UserRole).toString(); const ColorSchemeEntry entry = item->data(Qt::UserRole).value<ColorSchemeEntry>();
if (file != d_ptr->m_value.colorSchemeFileName()) if (entry.fileName != d_ptr->m_value.colorSchemeFileName())
d_ptr->m_value.loadColorScheme(file, d_ptr->m_descriptions); d_ptr->m_value.loadColorScheme(entry.fileName, d_ptr->m_descriptions);
} }
bool ok = true; bool ok = true;

View File

@@ -112,12 +112,14 @@ private slots:
void delayedChange(); void delayedChange();
void updatePointSizes(); void updatePointSizes();
void colorSchemeSelected(QListWidgetItem *item); void colorSchemeSelected(QListWidgetItem *item);
void importColorScheme(); void cloneColorScheme();
void exportColorScheme(); void deleteColorScheme();
void editColorScheme(); void editColorScheme();
private: private:
void addColorSchemeEntry(const QString &fileName, bool readOnly);
void refreshColorSchemeList(); void refreshColorSchemeList();
static QString customStylesPath();
Internal::FontSettingsPagePrivate *d_ptr; Internal::FontSettingsPagePrivate *d_ptr;
}; };

View File

@@ -109,36 +109,23 @@
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1"> <item row="0" column="1">
<widget class="QPushButton" name="importButton"> <widget class="QPushButton" name="cloneButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Import</string> <string>Clone</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="exportButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Export</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QPushButton" name="editButton"> <widget class="QPushButton" name="deleteButton">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Edit</string> <string>Delete</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="4" column="1">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@@ -151,9 +138,19 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="0" rowspan="4"> <item row="0" column="0" rowspan="5">
<widget class="QListWidget" name="schemeListWidget"/> <widget class="QListWidget" name="schemeListWidget"/>
</item> </item>
<item row="1" column="1">
<widget class="QPushButton" name="editButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Edit</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>