Files
konsole/src/ColorSchemeEditor.cpp
Kurt Hindenburg 1c3a87bf5f ColorScheme dialog improvements - extra column for intense colors
Add extra column for intense colors so each color and the corresponding
intense color is side by side (the data model colorScheme is unchanged,
only the ui has the additional column)
Also adjust the GUI such that there are no scrollbars for the table. The
EditProfileDialog is still larger.

Patch by renan fargetton renan.fargetton@gmail.com
with minor edits by me
From review 110318
CCMAIL: renan.fargetton@gmail.com
GUI:
2013-05-07 11:47:28 -04:00

245 lines
8.8 KiB
C++

/*
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>
// KDE
#include <KColorDialog>
#include <KWindowSystem>
#include <KFileDialog>
#include <KUrlCompletion>
// 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 / 2;
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
ColorSchemeEditor::ColorSchemeEditor(QWidget* aParent)
: QWidget(aParent)
, _colors(0)
{
_ui = new Ui::ColorSchemeEditor();
_ui->setupUi(this);
// description edit
_ui->descriptionEdit->setClearButtonShown(true);
connect(_ui->descriptionEdit , SIGNAL(textChanged(QString)) , this ,
SLOT(setDescription(QString)));
// transparency slider
QFontMetrics metrics(font());
_ui->transparencyPercentLabel->setMinimumWidth(metrics.width("100%"));
connect(_ui->transparencySlider , SIGNAL(valueChanged(int)) , this , SLOT(setTransparencyPercentLabel(int)));
// randomized background
connect(_ui->randomizedBackgroundCheck , SIGNAL(toggled(bool)) , this ,
SLOT(setRandomizedBackgroundColor(bool)));
// wallpaper stuff
KUrlCompletion* fileCompletion = new KUrlCompletion(KUrlCompletion::FileCompletion);
fileCompletion->setParent(this);
_ui->wallpaperPath->setCompletionObject(fileCompletion);
_ui->wallpaperPath->setClearButtonShown(true);
_ui->wallpaperSelectButton->setIcon(KIcon("image-x-generic"));
connect(_ui->wallpaperSelectButton, SIGNAL(clicked()),
this, SLOT(selectWallpaper()));
connect(_ui->wallpaperPath, SIGNAL(textChanged(QString)),
this, SLOT(wallpaperPathChanged(QString)));
// color table
_ui->colorTable->setColumnCount(3);
_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");
_ui->colorTable->setHorizontalHeaderLabels(labels);
// Set resize mode for colorTable columns
_ui->colorTable->horizontalHeader()->setResizeMode(NAME_COLUMN, QHeaderView::ResizeToContents);
_ui->colorTable->horizontalHeader()->setResizeMode(COLOR_COLUMN, QHeaderView::Stretch);
_ui->colorTable->horizontalHeader()->setResizeMode(INTENSE_COLOR_COLUMN, QHeaderView::Stretch);
QTableWidgetItem* item = new QTableWidgetItem("Test");
_ui->colorTable->setItem(0, 0, item);
_ui->colorTable->verticalHeader()->hide();
connect(_ui->colorTable , SIGNAL(itemClicked(QTableWidgetItem*)) , this ,
SLOT(editColorItem(QTableWidgetItem*)));
// 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)
return;
QColor color = item->background().color();
int result = KColorDialog::getColor(color);
if (result == KColorDialog::Accepted) {
item->setBackground(color);
int colorSchemeRow = item->row();
// Intense colors row are in the bottom half of the color table
if (item->column() == INTENSE_COLOR_COLUMN)
colorSchemeRow += COLOR_TABLE_ROW_LENGTH;
ColorEntry entry(_colors->colorEntry(colorSchemeRow));
entry.color = color;
_colors->setColorTableEntry(colorSchemeRow, entry);
emit colorsChanged(_colors);
}
}
void ColorSchemeEditor::selectWallpaper()
{
const KUrl url = KFileDialog::getImageOpenUrl(_ui->wallpaperPath->text(),
this,
i18nc("@action:button", "Select wallpaper image file"));
if (!url.isEmpty())
_ui->wallpaperPath->setText(url.path());
}
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(QString("%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)
{
delete _colors;
_colors = new ColorScheme(*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"));
_ui->colorTable->setItem(row, NAME_COLUMN, nameItem);
_ui->colorTable->setItem(row, COLOR_COLUMN, colorItem);
_ui->colorTable->setItem(row, INTENSE_COLOR_COLUMN, colorItemIntense);
}
// 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;
}
#include "ColorSchemeEditor.moc"