You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

308 lines
12 KiB

/*
Copyright 2007-2008 by Robert Knight <robertknight@gmail.com>
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
// Own
#include "ColorSchemeEditor.h"
// Qt
#include <QtGui/QFontMetrics>
#include <QtCore/QFileInfo>
#include <QCompleter>
#include <QFileSystemModel>
#include <QtCore/QUrl>
#include <QtGui/QIcon>
#include <QFileDialog>
#include <QImageReader>
// KDE
#include <QColorDialog>
#include <KWindowSystem>
#include <KLocalizedString>
#include <QDialogButtonBox>
#include <QPushButton>
#include <QVBoxLayout>
// Konsole
#include "ui_ColorSchemeEditor.h"
#include "ColorScheme.h"
#include "CharacterColor.h"
using namespace Konsole;
// colorTable is half the length of _table in ColorScheme class
// since intense colors are in a separated column
const int COLOR_TABLE_ROW_LENGTH = TABLE_COLORS / 3;
const int NAME_COLUMN = 0; // column 0 : color names
const int COLOR_COLUMN = 1; // column 1 : actual colors
const int INTENSE_COLOR_COLUMN = 2; // column 2 : intense colors
const int FAINT_COLOR_COLUMN = 3; // column 2 : faint colors
ColorSchemeEditor::ColorSchemeEditor(QWidget* aParent)
: QDialog(aParent)
, _isNewScheme(false)
, _colors(0)
{
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel|QDialogButtonBox::Apply);
QWidget *mainWidget = new QWidget(this);
QVBoxLayout *mainLayout = new QVBoxLayout;
setLayout(mainLayout);
mainLayout->addWidget(mainWidget);
QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
okButton->setDefault(true);
okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
connect(buttonBox, &QDialogButtonBox::accepted, this, &ColorSchemeEditor::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &ColorSchemeEditor::reject);
mainLayout->addWidget(buttonBox);
connect(buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, this, &Konsole::ColorSchemeEditor::saveColorScheme);
connect(okButton, &QPushButton::clicked, this, &Konsole::ColorSchemeEditor::saveColorScheme);
// ui
_ui = new Ui::ColorSchemeEditor();
_ui->setupUi(mainWidget);
// description edit
_ui->descriptionEdit->setClearButtonEnabled(true);
connect(_ui->descriptionEdit , &QLineEdit::textChanged , this , &Konsole::ColorSchemeEditor::setDescription);
// transparency slider
QFontMetrics metrics(font());
_ui->transparencyPercentLabel->setMinimumWidth(metrics.width(QStringLiteral("100%")));
connect(_ui->transparencySlider , &QSlider::valueChanged , this , &Konsole::ColorSchemeEditor::setTransparencyPercentLabel);
// randomized background
connect(_ui->randomizedBackgroundCheck , &QCheckBox::toggled , this , &Konsole::ColorSchemeEditor::setRandomizedBackgroundColor);
// wallpaper stuff
QFileSystemModel *dirModel = new QFileSystemModel(this);
dirModel->setFilter(QDir::AllEntries);
dirModel->setRootPath(QString('/'));
QCompleter *completer = new QCompleter(this);
completer->setModel(dirModel);
_ui->wallpaperPath->setCompleter(completer);
_ui->wallpaperPath->setClearButtonEnabled(true);
_ui->wallpaperSelectButton->setIcon(QIcon::fromTheme(QStringLiteral("image-x-generic")));
connect(_ui->wallpaperSelectButton, &QToolButton::clicked, this, &Konsole::ColorSchemeEditor::selectWallpaper);
connect(_ui->wallpaperPath, &QLineEdit::textChanged, this, &Konsole::ColorSchemeEditor::wallpaperPathChanged);
// color table
_ui->colorTable->setColumnCount(4);
_ui->colorTable->setRowCount(COLOR_TABLE_ROW_LENGTH);
QStringList labels;
labels << i18nc("@label:listbox Column header text for color names", "Name")
<< i18nc("@label:listbox Column header text for the actual colors", "Color")
<< i18nc("@label:listbox Column header text for the actual intense colors", "Intense color")
<< i18nc("@label:listbox Column header text for the actual faint colors", "Faint color");
_ui->colorTable->setHorizontalHeaderLabels(labels);
// Set resize mode for colorTable columns
_ui->colorTable->horizontalHeader()->setSectionResizeMode(NAME_COLUMN, QHeaderView::ResizeToContents);
_ui->colorTable->horizontalHeader()->setSectionResizeMode(COLOR_COLUMN, QHeaderView::Stretch);
_ui->colorTable->horizontalHeader()->setSectionResizeMode(INTENSE_COLOR_COLUMN, QHeaderView::Stretch);
_ui->colorTable->horizontalHeader()->setSectionResizeMode(FAINT_COLOR_COLUMN, QHeaderView::Stretch);
QTableWidgetItem* item = new QTableWidgetItem(QStringLiteral("Test"));
_ui->colorTable->setItem(0, 0, item);
_ui->colorTable->verticalHeader()->hide();
connect(_ui->colorTable , &QTableWidget::itemClicked , this , &Konsole::ColorSchemeEditor::editColorItem);
// warning label when transparency is not available
_ui->transparencyWarningWidget->setWordWrap(true);
_ui->transparencyWarningWidget->setCloseButtonVisible(false);
_ui->transparencyWarningWidget->setMessageType(KMessageWidget::Warning);
if (KWindowSystem::compositingActive()) {
_ui->transparencyWarningWidget->setVisible(false);
} else {
_ui->transparencyWarningWidget->setText(i18nc("@info:status",
"The background transparency setting will not"
" be used because your desktop does not appear to support"
" transparent windows."));
}
}
ColorSchemeEditor::~ColorSchemeEditor()
{
delete _colors;
delete _ui;
}
void ColorSchemeEditor::editColorItem(QTableWidgetItem* item)
{
// ignore if this is not a color column
if (item->column() != COLOR_COLUMN && item->column() != INTENSE_COLOR_COLUMN && item->column() != FAINT_COLOR_COLUMN) {
return;
}
QColor color = item->background().color();
color = QColorDialog::getColor(color);
if ( color.isValid() ) {
item->setBackground(color);
int colorSchemeRow = item->row();
// Intense colors row are in the middle third of the color table
if (item->column() == INTENSE_COLOR_COLUMN) {
colorSchemeRow += COLOR_TABLE_ROW_LENGTH;
}
// and the faint color rows are in the middle third of the color table
if (item->column() == FAINT_COLOR_COLUMN) {
colorSchemeRow += 2*COLOR_TABLE_ROW_LENGTH;
}
ColorEntry entry(_colors->colorEntry(colorSchemeRow));
entry.color = color;
_colors->setColorTableEntry(colorSchemeRow, entry);
emit colorsChanged(_colors);
}
}
void ColorSchemeEditor::selectWallpaper()
{
// Get supported image formats and convert to QString for getOpenFileName()
const QList<QByteArray> mimeTypes = QImageReader::supportedImageFormats();
QString fileFormats = QStringLiteral("(");
Q_FOREACH (const QByteArray &mime, mimeTypes) {
fileFormats += QStringLiteral("*.%1 ").arg(QLatin1String(mime));
}
fileFormats += QLatin1String(")");
const QString fileName = QFileDialog::getOpenFileName(this,
i18nc("@title:window", "Select wallpaper image file"),
_ui->wallpaperPath->text(),
i18nc("Filter in file open dialog", "Supported Images") + fileFormats);
if (!fileName.isEmpty())
_ui->wallpaperPath->setText(fileName);
}
void ColorSchemeEditor::wallpaperPathChanged(const QString& path)
{
if (path.isEmpty()) {
_colors->setWallpaper(path);
} else {
QFileInfo i(path);
if (i.exists() && i.isFile() && i.isReadable())
_colors->setWallpaper(path);
}
}
void ColorSchemeEditor::setDescription(const QString& text)
{
if (_colors)
_colors->setDescription(text);
if (_ui->descriptionEdit->text() != text)
_ui->descriptionEdit->setText(text);
}
void ColorSchemeEditor::setTransparencyPercentLabel(int percent)
{
_ui->transparencyPercentLabel->setText(QStringLiteral("%1%").arg(percent));
const qreal opacity = (100.0 - percent) / 100.0;
_colors->setOpacity(opacity);
}
void ColorSchemeEditor::setRandomizedBackgroundColor(bool randomize)
{
_colors->setRandomizedBackgroundColor(randomize);
}
void ColorSchemeEditor::setup(const ColorScheme* scheme, bool isNewScheme)
{
_isNewScheme = isNewScheme;
delete _colors;
_colors = new ColorScheme(*scheme);
if (_isNewScheme) {
setWindowTitle(i18n("New Color Scheme"));
setDescription(i18n("New Color Scheme"));
} else {
setWindowTitle(i18n("Edit Color Scheme"));
}
// setup description edit
_ui->descriptionEdit->setText(_colors->description());
// setup color table
setupColorTable(_colors);
// setup transparency slider
const int transparencyPercent = qRound((1 - _colors->opacity()) * 100);
_ui->transparencySlider->setValue(transparencyPercent);
setTransparencyPercentLabel(transparencyPercent);
// randomized background color checkbox
_ui->randomizedBackgroundCheck->setChecked(scheme->randomizedBackgroundColor());
// wallpaper stuff
_ui->wallpaperPath->setText(scheme->wallpaper()->path());
}
void ColorSchemeEditor::setupColorTable(const ColorScheme* colors)
{
ColorEntry table[TABLE_COLORS];
colors->getColorTable(table);
for (int row = 0; row < COLOR_TABLE_ROW_LENGTH; row++) {
QTableWidgetItem* nameItem = new QTableWidgetItem(ColorScheme::translatedColorNameForIndex(row));
nameItem->setFlags(nameItem->flags() & ~Qt::ItemIsEditable);
QTableWidgetItem* colorItem = new QTableWidgetItem();
colorItem->setBackground(table[row].color);
colorItem->setFlags(colorItem->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsSelectable);
colorItem->setToolTip(i18nc("@info:tooltip", "Click to choose color"));
QTableWidgetItem* colorItemIntense = new QTableWidgetItem();
colorItemIntense->setBackground(table[COLOR_TABLE_ROW_LENGTH + row].color);
colorItemIntense->setFlags(colorItem->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsSelectable);
colorItemIntense->setToolTip(i18nc("@info:tooltip", "Click to choose intense color"));
QTableWidgetItem* colorItemFaint = new QTableWidgetItem();
colorItemFaint->setBackground(table[2*COLOR_TABLE_ROW_LENGTH + row].color);
colorItemFaint->setFlags(colorItem->flags() & ~Qt::ItemIsEditable & ~Qt::ItemIsSelectable);
colorItemFaint->setToolTip(i18nc("@info:tooltip", "Click to choose Faint color"));
_ui->colorTable->setItem(row, NAME_COLUMN, nameItem);
_ui->colorTable->setItem(row, COLOR_COLUMN, colorItem);
_ui->colorTable->setItem(row, INTENSE_COLOR_COLUMN, colorItemIntense);
_ui->colorTable->setItem(row, FAINT_COLOR_COLUMN, colorItemFaint);
}
// ensure that color names are as fully visible as possible
_ui->colorTable->resizeColumnToContents(0);
// set the widget height to the table content
_ui->colorTable->setFixedHeight(_ui->colorTable->verticalHeader()->length() + _ui->colorTable->horizontalHeader()->height() + 2);
}
ColorScheme& ColorSchemeEditor::colorScheme() const
{
return *_colors;
}
bool ColorSchemeEditor::isNewScheme() const
{
return _isNewScheme;
}
void ColorSchemeEditor::saveColorScheme()
{
emit colorSchemeSaveRequested(colorScheme(), _isNewScheme);
}