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.
lxqt-panel-packaging/panel/config/configpanelwidget.cpp

409 lines
14 KiB

/* BEGIN_COMMON_COPYRIGHT_HEADER
* (c)LGPL2+
*
* LXDE-Qt - a lightweight, Qt based, desktop toolset
* http://razor-qt.org
*
* Copyright: 2010-2011 Razor team
* Authors:
* Marat "Morion" Talipov <morion.self@gmail.com>
*
* This program or library is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* END_COMMON_COPYRIGHT_HEADER */
#include "configpanelwidget.h"
#include "ui_configpanelwidget.h"
#include "../lxqtpanellimits.h"
#include <KWindowSystem/KWindowSystem>
#include <QDebug>
#include <QListView>
#include <QDesktopWidget>
#include <QWindow>
#include <QColorDialog>
#include <QFileDialog>
#include <QStandardPaths>
using namespace LXQt;
struct ScreenPosition
{
int screen;
ILXQtPanel::Position position;
};
Q_DECLARE_METATYPE(ScreenPosition)
ConfigPanelWidget::ConfigPanelWidget(LXQtPanel *panel, QWidget *parent) :
QWidget(parent),
ui(new Ui::ConfigPanelWidget),
mPanel(panel)
{
ui->setupUi(this);
fillComboBox_position();
fillComboBox_alignment();
mOldPanelSize = mPanel->panelSize();
mOldIconSize = mPanel->iconSize();
mOldLineCount = mPanel->lineCount();
mOldLength = mPanel->length();
mOldLengthInPercents = mPanel->lengthInPercents();
mOldAlignment = mPanel->alignment();
mOldScreenNum = mPanel->screenNum();
mScreenNum = mOldScreenNum;
mOldPosition = mPanel->position();
mPosition = mOldPosition;
mOldHidable = mPanel->hidable();
mOldAnimation = mPanel->animationTime();
mOldShowDelay = mPanel->showDelay();
ui->spinBox_panelSize->setMinimum(PANEL_MINIMUM_SIZE);
ui->spinBox_panelSize->setMaximum(PANEL_MAXIMUM_SIZE);
mOldFontColor = mPanel->fontColor();
mFontColor = mOldFontColor;
mOldBackgroundColor = mPanel->backgroundColor();
mBackgroundColor = mOldBackgroundColor;
mOldBackgroundImage = mPanel->backgroundImage();
mOldOpacity = mPanel->opacity();
mOldReserveSpace = mPanel->reserveSpace();
// reset configurations from file
reset();
connect(ui->spinBox_panelSize, SIGNAL(valueChanged(int)), this, SLOT(editChanged()));
connect(ui->spinBox_iconSize, SIGNAL(valueChanged(int)), this, SLOT(editChanged()));
connect(ui->spinBox_lineCount, SIGNAL(valueChanged(int)), this, SLOT(editChanged()));
connect(ui->spinBox_length, SIGNAL(valueChanged(int)), this, SLOT(editChanged()));
connect(ui->comboBox_lenghtType, SIGNAL(activated(int)), this, SLOT(widthTypeChanged()));
connect(ui->comboBox_alignment, SIGNAL(activated(int)), this, SLOT(editChanged()));
connect(ui->comboBox_position, SIGNAL(activated(int)), this, SLOT(positionChanged()));
connect(ui->checkBox_hidable, SIGNAL(toggled(bool)), this, SLOT(editChanged()));
connect(ui->spinBox_animation, SIGNAL(valueChanged(int)), this, SLOT(editChanged()));
connect(ui->spinBox_delay, SIGNAL(valueChanged(int)), this, SLOT(editChanged()));
connect(ui->checkBox_customFontColor, SIGNAL(toggled(bool)), this, SLOT(editChanged()));
connect(ui->pushButton_customFontColor, SIGNAL(clicked(bool)), this, SLOT(pickFontColor()));
connect(ui->checkBox_customBgColor, SIGNAL(toggled(bool)), this, SLOT(editChanged()));
connect(ui->pushButton_customBgColor, SIGNAL(clicked(bool)), this, SLOT(pickBackgroundColor()));
connect(ui->checkBox_customBgImage, SIGNAL(toggled(bool)), this, SLOT(editChanged()));
connect(ui->lineEdit_customBgImage, SIGNAL(textChanged(QString)), this, SLOT(editChanged()));
connect(ui->pushButton_customBgImage, SIGNAL(clicked(bool)), this, SLOT(pickBackgroundImage()));
connect(ui->slider_opacity, &QSlider::valueChanged, this, &ConfigPanelWidget::editChanged);
connect(ui->checkBox_reserveSpace, &QAbstractButton::toggled, [this](bool checked) { mPanel->setReserveSpace(checked, true); });
}
/************************************************
*
************************************************/
void ConfigPanelWidget::reset()
{
ui->spinBox_panelSize->setValue(mOldPanelSize);
ui->spinBox_iconSize->setValue(mOldIconSize);
ui->spinBox_lineCount->setValue(mOldLineCount);
ui->comboBox_position->setCurrentIndex(indexForPosition(mOldScreenNum, mOldPosition));
ui->checkBox_hidable->setChecked(mOldHidable);
ui->spinBox_animation->setValue(mOldAnimation);
ui->spinBox_delay->setValue(mOldShowDelay);
fillComboBox_alignment();
ui->comboBox_alignment->setCurrentIndex(mOldAlignment + 1);
ui->comboBox_lenghtType->setCurrentIndex(mOldLengthInPercents ? 0 : 1);
widthTypeChanged();
ui->spinBox_length->setValue(mOldLength);
mFontColor.setNamedColor(mOldFontColor.name());
ui->pushButton_customFontColor->setStyleSheet(QString("background: %1").arg(mOldFontColor.name()));
mBackgroundColor.setNamedColor(mOldBackgroundColor.name());
ui->pushButton_customBgColor->setStyleSheet(QString("background: %1").arg(mOldBackgroundColor.name()));
ui->lineEdit_customBgImage->setText(mOldBackgroundImage);
ui->slider_opacity->setValue(mOldOpacity);
ui->checkBox_reserveSpace->setChecked(mOldReserveSpace);
ui->checkBox_customFontColor->setChecked(mOldFontColor.isValid());
ui->checkBox_customBgColor->setChecked(mOldBackgroundColor.isValid());
ui->checkBox_customBgImage->setChecked(QFileInfo(mOldBackgroundImage).exists());
// update position
positionChanged();
}
/************************************************
*
************************************************/
void ConfigPanelWidget::fillComboBox_position()
{
int screenCount = QApplication::desktop()->screenCount();
if (screenCount == 1)
{
addPosition(tr("Top of desktop"), 0, LXQtPanel::PositionTop);
addPosition(tr("Left of desktop"), 0, LXQtPanel::PositionLeft);
addPosition(tr("Right of desktop"), 0, LXQtPanel::PositionRight);
addPosition(tr("Bottom of desktop"), 0, LXQtPanel::PositionBottom);
}
else
{
for (int screenNum = 0; screenNum < screenCount; screenNum++)
{
if (screenNum)
ui->comboBox_position->insertSeparator(9999);
addPosition(tr("Top of desktop %1").arg(screenNum +1), screenNum, LXQtPanel::PositionTop);
addPosition(tr("Left of desktop %1").arg(screenNum +1), screenNum, LXQtPanel::PositionLeft);
addPosition(tr("Right of desktop %1").arg(screenNum +1), screenNum, LXQtPanel::PositionRight);
addPosition(tr("Bottom of desktop %1").arg(screenNum +1), screenNum, LXQtPanel::PositionBottom);
}
}
}
/************************************************
*
************************************************/
void ConfigPanelWidget::fillComboBox_alignment()
{
ui->comboBox_alignment->setItemData(0, QVariant(LXQtPanel::AlignmentLeft));
ui->comboBox_alignment->setItemData(1, QVariant(LXQtPanel::AlignmentCenter));
ui->comboBox_alignment->setItemData(2, QVariant(LXQtPanel::AlignmentRight));
if (mPosition == ILXQtPanel::PositionTop ||
mPosition == ILXQtPanel::PositionBottom)
{
ui->comboBox_alignment->setItemText(0, tr("Left"));
ui->comboBox_alignment->setItemText(1, tr("Center"));
ui->comboBox_alignment->setItemText(2, tr("Right"));
}
else
{
ui->comboBox_alignment->setItemText(0, tr("Top"));
ui->comboBox_alignment->setItemText(1, tr("Center"));
ui->comboBox_alignment->setItemText(2, tr("Bottom"));
};
}
/************************************************
*
************************************************/
void ConfigPanelWidget::addPosition(const QString& name, int screen, LXQtPanel::Position position)
{
if (LXQtPanel::canPlacedOn(screen, position))
ui->comboBox_position->addItem(name, QVariant::fromValue((ScreenPosition){screen, position}));
}
/************************************************
*
************************************************/
int ConfigPanelWidget::indexForPosition(int screen, ILXQtPanel::Position position)
{
for (int i = 0; i < ui->comboBox_position->count(); i++)
{
ScreenPosition sp = ui->comboBox_position->itemData(i).value<ScreenPosition>();
if (screen == sp.screen && position == sp.position)
return i;
}
return -1;
}
/************************************************
*
************************************************/
ConfigPanelWidget::~ConfigPanelWidget()
{
delete ui;
}
/************************************************
*
************************************************/
void ConfigPanelWidget::editChanged()
{
mPanel->setPanelSize(ui->spinBox_panelSize->value(), true);
mPanel->setIconSize(ui->spinBox_iconSize->value(), true);
mPanel->setLineCount(ui->spinBox_lineCount->value(), true);
mPanel->setLength(ui->spinBox_length->value(),
ui->comboBox_lenghtType->currentIndex() == 0,
true);
LXQtPanel::Alignment align = LXQtPanel::Alignment(
ui->comboBox_alignment->itemData(
ui->comboBox_alignment->currentIndex()
).toInt());
mPanel->setAlignment(align, true);
mPanel->setPosition(mScreenNum, mPosition, true);
mPanel->setHidable(ui->checkBox_hidable->isChecked(), true);
mPanel->setAnimationTime(ui->spinBox_animation->value(), true);
mPanel->setShowDelay(ui->spinBox_delay->value(), true);
mPanel->setFontColor(ui->checkBox_customFontColor->isChecked() ? mFontColor : QColor(), true);
if (ui->checkBox_customBgColor->isChecked())
{
mPanel->setBackgroundColor(mBackgroundColor, true);
mPanel->setOpacity(ui->slider_opacity->value(), true);
}
else
{
mPanel->setBackgroundColor(QColor(), true);
mPanel->setOpacity(100, true);
}
QString image = ui->checkBox_customBgImage->isChecked() ? ui->lineEdit_customBgImage->text() : QString();
mPanel->setBackgroundImage(image, true);
}
/************************************************
*
************************************************/
void ConfigPanelWidget::widthTypeChanged()
{
int max = getMaxLength();
if (ui->comboBox_lenghtType->currentIndex() == 0)
{
// Percents .............................
int v = ui->spinBox_length->value() * 100.0 / max;
ui->spinBox_length->setRange(1, 100);
ui->spinBox_length->setValue(v);
}
else
{
// Pixels ...............................
int v = max / 100.0 * ui->spinBox_length->value();
ui->spinBox_length->setRange(-max, max);
ui->spinBox_length->setValue(v);
}
}
/************************************************
*
************************************************/
int ConfigPanelWidget::getMaxLength()
{
QDesktopWidget* dw = QApplication::desktop();
if (mPosition == ILXQtPanel::PositionTop ||
mPosition == ILXQtPanel::PositionBottom)
return dw->screenGeometry(mScreenNum).width();
else
return dw->screenGeometry(mScreenNum).height();
}
/************************************************
*
************************************************/
void ConfigPanelWidget::positionChanged()
{
ScreenPosition sp = ui->comboBox_position->itemData(
ui->comboBox_position->currentIndex()).value<ScreenPosition>();
bool updateAlig = (sp.position == ILXQtPanel::PositionTop ||
sp.position == ILXQtPanel::PositionBottom) !=
(mPosition == ILXQtPanel::PositionTop ||
mPosition == ILXQtPanel::PositionBottom);
int oldMax = getMaxLength();
mPosition = sp.position;
mScreenNum = sp.screen;
int newMax = getMaxLength();
if (ui->comboBox_lenghtType->currentIndex() == 1 &&
oldMax != newMax)
{
// Pixels ...............................
int v = ui->spinBox_length->value() * 1.0 * newMax / oldMax;
ui->spinBox_length->setMaximum(newMax);
ui->spinBox_length->setValue(v);
}
if (updateAlig)
fillComboBox_alignment();
editChanged();
}
/************************************************
*
************************************************/
void ConfigPanelWidget::pickFontColor()
{
QColorDialog d(QColor(mFontColor.name()), this);
d.setWindowTitle(tr("Pick color"));
d.setWindowModality(Qt::WindowModal);
if (d.exec() && d.currentColor().isValid())
{
mFontColor.setNamedColor(d.currentColor().name());
ui->pushButton_customFontColor->setStyleSheet(QString("background: %1").arg(mFontColor.name()));
editChanged();
}
}
/************************************************
*
************************************************/
void ConfigPanelWidget::pickBackgroundColor()
{
QColorDialog d(QColor(mBackgroundColor.name()), this);
d.setWindowTitle(tr("Pick color"));
d.setWindowModality(Qt::WindowModal);
if (d.exec() && d.currentColor().isValid())
{
mBackgroundColor.setNamedColor(d.currentColor().name());
ui->pushButton_customBgColor->setStyleSheet(QString("background: %1").arg(mBackgroundColor.name()));
editChanged();
}
}
/************************************************
*
************************************************/
void ConfigPanelWidget::pickBackgroundImage()
{
QString picturesLocation;
picturesLocation = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
QFileDialog* d = new QFileDialog(this, tr("Pick image"), picturesLocation, tr("Images (*.png *.gif *.jpg)"));
d->setAttribute(Qt::WA_DeleteOnClose);
d->setWindowModality(Qt::WindowModal);
connect(d, &QFileDialog::fileSelected, ui->lineEdit_customBgImage, &QLineEdit::setText);
d->show();
}