quarkai/component/kylinfontdialog.cpp

515 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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"
#include "utils.h"
#include <QApplication>
#include <QScreen>
#include <QMouseEvent>
#include <QListView>
#include <QStringListModel>
#include <QDebug>
#include <QSettings>
#include <QLabel>
#include <QPushButton>
#include <QMessageBox>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QGraphicsDropShadowEffect>
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;}");
this->setWindowIcon(QIcon(":/res/kylin-assistant.png"));
this->setAttribute(Qt::WA_DeleteOnClose);
this->setWindowFlags(Qt::FramelessWindowHint);
this->setAutoFillBackground(true);
/*title_bar = new KylinTitleBar();
initTitleBar(skin);*/
title_bar = new MyTitleBar(tr("Font Dialog"), false, this);
title_bar->setFixedSize(this->width(), TITLE_BAR_HEIGHT);
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();//初始化字体对话框
//边框阴影效果
QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this);
shadow_effect->setBlurRadius(5);
shadow_effect->setColor(QColor(0, 0, 0, 127));
shadow_effect->setOffset(2, 4);
this->setGraphicsEffect(shadow_effect);
this->setLanguage();
this->initConnect();
this->moveCenter();
}
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;
}
}
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);
}
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(title_bar, SIGNAL(closeSignal()), 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();
}