quarkai/component/kylinfontdialog.cpp

497 lines
16 KiB
C++
Raw Normal View History

2017-12-21 11:51:56 +08:00
/*
* Copyright (C) 2013 ~ 2015 National University of Defense Technology(NUDT) & Kylin Ltd.
*
* Authors:
* Kobe Lee xiangli@ubuntukylin.com/kobe24_lixiang@126.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; version 3.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#include "kylinfontdialog.h"
2018-01-22 12:18:09 +08:00
#include <QApplication>
#include <QScreen>
2017-12-21 11:51:56 +08:00
#include <QMouseEvent>
#include <QListView>
#include <QStringListModel>
#include <QDebug>
#include <QSettings>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QLineEdit>
KylinFontDialog::KylinFontDialog(/*QSettings *mSettings, QString flag, */QString cur_font, QString skin, QWidget *parent) :
QDialog(parent)
{
this->setFixedSize(600, 500);
this->setStyleSheet("QDialog{border: 1px solid white;border-radius:1px;background-color: #ffffff;}");
2017-12-22 08:39:00 +08:00
this->setWindowIcon(QIcon(":/res/kylin-assistant.png"));
2017-12-21 11:51:56 +08:00
this->setAttribute(Qt::WA_DeleteOnClose);
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAutoFillBackground(true);
title_bar = new KylinTitleBar();
initTitleBar(skin);
cur_tip_label = new QLabel();
cur_font_label = new QLabel();
font_label = new QLabel();
style_label = new QLabel();
size_label = new QLabel();
font_edit = new QLineEdit();
style_edit = new QLineEdit();
size_edit = new QLineEdit();
font_view = new QListView();
style_view = new QListView();
size_view = new QListView();
sample_label = new QLabel();
sample_edit = new QLineEdit();
ok_btn = new QPushButton();
cacel_btn = new QPushButton();
ok_btn->setFixedSize(91, 25);
ok_btn->setObjectName("blackButton");
ok_btn->setFocusPolicy(Qt::NoFocus);
cacel_btn->setFixedSize(91, 25);
cacel_btn->setObjectName("blackButton");
cacel_btn->setFocusPolicy(Qt::NoFocus);
font_edit->setStyleSheet("QLineEdit{border:1px solid #bebebe;}");
style_edit->setStyleSheet("QLineEdit{border:1px solid #bebebe;}");
size_edit->setStyleSheet("QLineEdit{border:1px solid #bebebe;}");
sample_edit->setStyleSheet("QLineEdit{border:1px solid #bebebe;}");
style_label->setFixedWidth(140);
style_edit->setFixedWidth(140);
style_view->setFixedWidth(140);
size_label->setFixedWidth(60);
size_edit->setFixedWidth(60);
size_view->setFixedWidth(60);
font_edit->setReadOnly(true);
font_edit->setFocusProxy(font_view);
font_label->setBuddy(font_view);
style_edit->setReadOnly(true);
style_edit->setFocusProxy(style_view);
style_label->setBuddy(style_view);
size_edit->setReadOnly(true);
size_edit->setFocusProxy(size_view);
size_label->setBuddy(size_view);
sample_edit->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
sample_edit->setAlignment(Qt::AlignCenter);
QHBoxLayout *layout1 = new QHBoxLayout();
layout1->addWidget(cur_tip_label);
layout1->addWidget(cur_font_label);
layout1->addStretch();
layout1->setSpacing(5);
layout1->setMargin(0);
layout1->setContentsMargins(10, 0, 0, 0);
QVBoxLayout *layout2 = new QVBoxLayout();
layout2->addWidget(font_label);
layout2->addWidget(font_edit);
layout2->addWidget(font_view);
QVBoxLayout *layout3 = new QVBoxLayout();
layout3->addWidget(style_label);
layout3->addWidget(style_edit);
layout3->addWidget(style_view);
QVBoxLayout *layout4 = new QVBoxLayout();
layout4->addWidget(size_label);
layout4->addWidget(size_edit);
layout4->addWidget(size_view);
QHBoxLayout *layout5 = new QHBoxLayout();
layout5->addLayout(layout2);
layout5->addLayout(layout3);
layout5->addLayout(layout4);
layout5->setSpacing(10);
layout5->setMargin(0);
layout5->setContentsMargins(10, 0, 10, 0);
QVBoxLayout *layout6 = new QVBoxLayout();
layout6->addWidget(cacel_btn);
layout6->addWidget(ok_btn);
QHBoxLayout *layout7 = new QHBoxLayout();
layout7->addWidget(sample_edit);
// layout7->addStretch();
layout7->addLayout(layout6);
QVBoxLayout *layout8 = new QVBoxLayout();
layout8->addWidget(sample_label);
layout8->addLayout(layout7);
layout8->setSpacing(5);
layout8->setMargin(0);
layout8->setContentsMargins(10, 0, 10, 10);
QVBoxLayout *main_layout = new QVBoxLayout();
main_layout->addWidget(title_bar);
main_layout->addLayout(layout1);
main_layout->addLayout(layout5);
main_layout->addLayout(layout8);
main_layout->setSpacing(5);
main_layout->setMargin(0);
main_layout->setContentsMargins(0, 0, 0, 0);
setLayout(main_layout);
cur_font_label->setText(cur_font);
familymodel = new QStringListModel;
stylemodel = new QStringListModel;
sizemodel = new QStringListModel;
this->initDialog();//初始化字体对话框
this->setLanguage();
this->initConnect();
2018-01-22 12:18:09 +08:00
this->moveCenter();
2017-12-21 11:51:56 +08:00
}
KylinFontDialog::~KylinFontDialog()
{
if (familymodel != NULL) {
delete familymodel;
familymodel = NULL;
}
if (stylemodel != NULL) {
delete stylemodel;
stylemodel = NULL;
}
if (sizemodel != NULL) {
delete sizemodel;
sizemodel = NULL;
}
if (title_bar != NULL) {
delete title_bar;
title_bar = NULL;
}
if (cur_tip_label != NULL) {
delete cur_tip_label;
cur_tip_label = NULL;
}
if (cur_font_label != NULL) {
delete cur_font_label;
cur_font_label = NULL;
}
if (font_label != NULL) {
delete font_label;
font_label = NULL;
}
if (style_label != NULL) {
delete style_label;
style_label = NULL;
}
if (size_label != NULL) {
delete size_label;
size_label = NULL;
}
if (font_edit != NULL) {
delete font_edit;
font_edit = NULL;
}
if (style_edit != NULL) {
delete style_edit;
style_edit = NULL;
}
if (size_edit != NULL) {
delete size_edit;
size_edit = NULL;
}
if (font_view != NULL) {
delete font_view;
font_view = NULL;
}
if (style_view != NULL) {
delete style_view;
style_view = NULL;
}
if (size_view != NULL) {
delete size_view;
size_view = NULL;
}
if (sample_label != NULL) {
delete sample_label;
sample_label = NULL;
}
if (sample_edit != NULL) {
delete sample_edit;
sample_edit = NULL;
}
if (ok_btn != NULL) {
delete ok_btn;
ok_btn = NULL;
}
if (cacel_btn != NULL) {
delete cacel_btn;
cacel_btn = NULL;
}
}
2018-01-22 12:18:09 +08:00
void KylinFontDialog::moveCenter()
{
QPoint pos = QCursor::pos();
QRect primaryGeometry;
for (QScreen *screen : qApp->screens()) {
if (screen->geometry().contains(pos)) {
primaryGeometry = screen->geometry();
}
}
if (primaryGeometry.isEmpty()) {
primaryGeometry = qApp->primaryScreen()->geometry();
}
this->move(primaryGeometry.x() + (primaryGeometry.width() - this->width())/2,
primaryGeometry.y() + (primaryGeometry.height() - this->height())/2);
}
2017-12-21 11:51:56 +08:00
void KylinFontDialog::setLanguage()
{
cur_tip_label->setText(tr("Current Font") + ":");
font_label->setText(tr("Font"));
style_label->setText(tr("Style"));
size_label->setText(tr("Size"));
sample_label->setText(tr("View"));
ok_btn->setText(tr("OK"));
cacel_btn->setText(tr("Cancel"));
}
void KylinFontDialog::initConnect()
{
// connect(title_bar, SIGNAL(showMinDialog()), this, SLOT(onMinButtonClicked()));
connect(title_bar,SIGNAL(closeDialog()), this, SLOT(onCacelButtonClicked()));
connect(font_view, SIGNAL(clicked(QModelIndex)), this, SLOT(updateAll(QModelIndex)));
connect(style_view, SIGNAL(clicked(QModelIndex)), this, SLOT(updateStyleandSize(QModelIndex)));
connect(size_view, SIGNAL(clicked(QModelIndex)), this, SLOT(updateSize(QModelIndex)));
connect(cacel_btn, SIGNAL(clicked()), this, SLOT(onCacelButtonClicked()));
connect(ok_btn, SIGNAL(clicked()), this, SLOT(onOKButtonClicked()));
}
void KylinFontDialog::onCacelButtonClicked()
{
this->close();
}
void KylinFontDialog::onOKButtonClicked() {
if(font_edit->text().isEmpty()) {
//提示 您还没有更换字体,请选择字体进行更换!
QMessageBox::warning(NULL,
tr("Tips"),
tr("You haven't change the font, please choose the font!"),
QMessageBox::Ok);
}
else {
selectedFont = font_edit->text().append(" ").append(style_edit->text().append(" ").append(size_edit->text()));
emit this->rebackCurrentFont(selectedFont);
this->accept();
}
}
void KylinFontDialog::initTitleBar(QString skin)
{
title_bar->setTitleWidth(600);
title_bar->setTitleName(tr("Font Dialog"));
// title_bar->setTitleBackgound(":/background/res/skin/1.png");
title_bar->setTitleBackgound(skin);
}
void KylinFontDialog::initDialog() {
//列出所有字体的名字
QStringList familyNames = fdb.families();
familymodel->setStringList(familyNames);
font_view->setModel(familymodel);
QModelIndex index;
index = familymodel->index(0);
font_view->setCurrentIndex(index);
//列出系统对应的所有风格
QStringList familystyles = fdb.styles(font_view->currentIndex().data().toString());
stylemodel->setStringList(familystyles);
style_view->setModel(stylemodel);
index = stylemodel->index(0);
style_view->setCurrentIndex(index);
//列出所有字体及其风格对应的所有大小
QList<int> sizes = fdb.pointSizes(font_view->currentIndex().data().toString(), style_view->currentIndex().data().toString());
QStringList str_sizes;
for(QList<int>::const_iterator it = sizes.constBegin(); it != sizes.constEnd(); ++it) {
str_sizes.append(QString::number(*it));
}
sizemodel->setStringList(str_sizes);
size_view->setModel(sizemodel);
//默认的字体大小显示为11
bool flag = false;
int row = -1;
for(QStringList::Iterator m = str_sizes.begin(); m != str_sizes.end(); ++m) {
row++;
QString size = *m;
if("11" == size) {//默认字体大小存在列表中
index = sizemodel->index(row);
size_view->setCurrentIndex(index);
flag = true;
break;
}
}
if(flag == false) {//11不存在列表中此时让光标定位在第一个大小上面
index = sizemodel->index(0);
size_view->setCurrentIndex(index);
}
}
void KylinFontDialog::updateSampleFont() {
QFont font(fdb.font(font_edit->text(), style_edit->text(), size_edit->text().toInt()));
if (font != sample_edit->font()) {
sample_edit->setFont(font);
}
}
void KylinFontDialog::updateAll(QModelIndex index) {
font_edit->setText(index.data().toString());
QModelIndex styleindex = stylemodel->index(0);
//更新stylemodel
QStringList familystyles = fdb.styles(font_edit->text());
stylemodel->setStringList(familystyles);
style_view->setModel(stylemodel);
//设置光标默认值
style_view->setCurrentIndex(styleindex);
style_edit->setText(style_view->currentIndex().data().toString());
//列出所有字体及其风格对应的所有大小
//更新sizemodel
bool sizeFlag = false;
int num = 0;
QList<int> sizes = fdb.pointSizes(font_edit->text(), style_edit->text());
QStringList str_sizes;
int row = -1;
for(QList<int>::const_iterator it = sizes.constBegin(); it != sizes.constEnd(); ++it) {
row++;
str_sizes.append(QString::number(*it));
if(*it == 11) {
sizeFlag = true;
num = row;
}
}
sizemodel->setStringList(str_sizes);
size_view->setModel(sizemodel);
QModelIndex sizeindex;
//更新时如果大小列表中存在11,则大小的默认值设为11
if(sizeFlag == false) {
sizeindex = sizemodel->index(0);
size_view->setCurrentIndex(sizeindex);
size_edit->setText(size_view->currentIndex().data().toString());
}
else {
sizeFlag = false;
sizeindex = sizemodel->index(num);
size_view->setCurrentIndex(sizeindex);
size_edit->setText(size_view->currentIndex().data().toString());
}
QString curStr = font_edit->text().append(" ").append(style_edit->text().append(" ").append(size_edit->text()));
cur_font_label->setText(curStr);
sample_edit->setText("Ubuntu Kylin:做最有中国味的操作系统!");
updateSampleFont();
}
void KylinFontDialog::updateStyleandSize(QModelIndex index) {
style_edit->setText(index.data().toString());
//列出所有字体及其风格对应的所有大小
//更新sizemodel
bool sizeFlag = false;
int num = 0;
QList<int> sizes = fdb.pointSizes(font_edit->text(), style_edit->text());
QStringList str_sizes;
int row = -1;
for(QList<int>::const_iterator it = sizes.constBegin(); it != sizes.constEnd(); ++it) {
row++;
str_sizes.append(QString::number(*it));
if(*it == 11) {
sizeFlag = true;
num = row;
}
}
sizemodel->setStringList(str_sizes);
size_view->setModel(sizemodel);
//更新时如果大小列表中存在11,则大小的默认值设为11
QModelIndex sizeindex;
if(sizeFlag == false) {
sizeindex = sizemodel->index(0);
size_view->setCurrentIndex(sizeindex);
size_edit->setText(size_view->currentIndex().data().toString());
}
else {
sizeFlag = false;
sizeindex = sizemodel->index(num);
size_view->setCurrentIndex(sizeindex);
size_edit->setText(size_view->currentIndex().data().toString());
}
QString curfont = font_edit->text();
if(!curfont.isEmpty()) {
QString curStr = font_edit->text().append(" ").append(style_edit->text().append(" ").append(size_edit->text()));
cur_font_label->setText(curStr);
updateSampleFont();
}
}
void KylinFontDialog::updateSize(QModelIndex index) {
size_edit->setText(index.data().toString());
QString curfont = font_edit->text();
if(!curfont.isEmpty()) {
QString curStr = font_edit->text().append(" ").append(style_edit->text().append(" ").append(size_edit->text()));
cur_font_label->setText(curStr);
updateSampleFont();
}
}
void KylinFontDialog::resetTitleSkin(QString skin)
{
title_bar->resetBackground(skin);
}
bool KylinFontDialog::eventFilter(QObject *obj, QEvent *event) {
if(obj == ok_btn ||obj == cacel_btn)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *me = (QMouseEvent *)event;
dragPos = me->globalPos() - frameGeometry().topLeft();
}else if(event->type() == QEvent::MouseButtonRelease)
{
setWindowOpacity(1);
}
}
return QObject::eventFilter(obj, event);
}
void KylinFontDialog::mousePressEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
dragPos = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
void KylinFontDialog::mouseMoveEvent(QMouseEvent *event) {
if (event->buttons() & Qt::LeftButton ) {
move(event->globalPos() - dragPos);
setWindowOpacity(1);//0.5
}
event->accept();
}
void KylinFontDialog::mouseReleaseEvent(QMouseEvent *event) {
if (event->button() == Qt::LeftButton) {
setWindowOpacity(1);
}
event->accept();
}