Commit 8ffdf90cdf256d7fbfecc3afb0a83aceee4a2bec

Authored by Peter Zhigalov
1 parent 0c71596d

Исправил отображение шрифтов в Win98 и Wine

fem_draw_qt.pro
... ... @@ -18,6 +18,9 @@ greaterThan(QT_MAJOR_VERSION, 4) {
18 18  
19 19 lessThan(QT_VERSION, 4.5.0) {
20 20 DEFINES += HAVE_LESS_THAN_QT45
  21 + win32-g++*|win32-msvc|win32-msvc.net|win32-msvc200* {
  22 + DEFINES += USE_WIN98_WORKAROUNDS
  23 + }
21 24 }
22 25  
23 26 SOURCES += \
... ...
src_qt/mainwindow.cpp
... ... @@ -17,10 +17,17 @@
17 17 #include <QSettings>
18 18 #include <QLocale>
19 19 #include <QResizeEvent>
  20 +#include <QObject>
  21 +#include <QFont>
  22 +#include <QFontDatabase>
20 23 #include <algorithm>
21 24 #include <cmath>
22 25 #include "libs/jo_images.h"
23 26  
  27 +#if defined (Q_OS_WIN) && defined (USE_WIN98_WORKAROUNDS)
  28 +#include <windows.h>
  29 +#endif
  30 +
24 31 // Конструктор
25 32 MainWindow::MainWindow(QWidget *parent) :
26 33 QMainWindow(parent),
... ... @@ -130,6 +137,60 @@ void MainWindow::show()
130 137 QApplication::postEvent(this, new QResizeEvent(size(), size()));
131 138 }
132 139  
  140 +// Исправить отображение локаизованных шрифтов под Windows
  141 +void MainWindow::fonts_fix(const QString & language)
  142 +{
  143 +#if defined (Q_OS_WIN)
  144 +
  145 + // Отображение название языка -> соответствующая ему WritingSystem
  146 + static QList<QPair<QString, QFontDatabase::WritingSystem> > writingsystem_map =
  147 + QList<QPair<QString, QFontDatabase::WritingSystem> >()
  148 + << qMakePair(QString("en"), QFontDatabase::Latin)
  149 + << qMakePair(QString("ru"), QFontDatabase::Cyrillic);
  150 +
  151 + // Найдем WritingSystem для текущего языка
  152 + QFontDatabase::WritingSystem current_writingsystem = QFontDatabase::Any;
  153 + for(QList<QPair<QString, QFontDatabase::WritingSystem> >::Iterator it = writingsystem_map.begin(); it != writingsystem_map.end(); ++it)
  154 + {
  155 + if(it->first == language)
  156 + {
  157 + current_writingsystem = it->second;
  158 + break;
  159 + }
  160 + }
  161 +
  162 + // Шрифт стандартный, по умолчанию
  163 + static QFont default_font = qApp->font();
  164 + // Шрифт Tahoma, если стандартный не поддерживает выбранный язык
  165 + QFont fallback_font = default_font;
  166 + fallback_font.setFamily("Tahoma");
  167 +
  168 + // Проверим, умеет ли стандартный шрифт писать на новом языке
  169 + static QFontDatabase qfd;
  170 + if(!qfd.families(current_writingsystem).contains(default_font.family(), Qt::CaseInsensitive))
  171 + qApp->setFont(fallback_font); // Если не умеет - заменим на Tahoma
  172 + else
  173 + qApp->setFont(default_font); // Если умеет, то вернем его обратно
  174 +
  175 +#if defined (USE_WIN98_WORKAROUNDS)
  176 + // Для Win98 форсированно заменяем шрифты на Tahoma для всех не-английских локалей
  177 + static DWORD dwVersion = (DWORD)(LOBYTE(LOWORD(GetVersion())));
  178 + if(dwVersion <= 4)
  179 + {
  180 + if(language != "en")
  181 + qApp->setFont(fallback_font);
  182 + else
  183 + qApp->setFont(default_font);
  184 + }
  185 +#endif
  186 +
  187 +#else
  188 +
  189 + Q_UNUSED(language);
  190 +
  191 +#endif
  192 +}
  193 +
133 194 // Открытие файла по имени
134 195 void MainWindow::open_file(const QString & filename)
135 196 {
... ... @@ -615,6 +676,9 @@ void MainWindow::update_translations(QString language)
615 676 qApp->installTranslator(&translator);
616 677 ui->retranslateUi(this);
617 678  
  679 + // Пофиксим шрифты
  680 + fonts_fix(language);
  681 +
618 682 // Пробежим по меню и проставим галочку на нужном нам языке и снимем с остальных
619 683 for(QList<QPair<QString, QAction *> >::Iterator it = languages_map.begin(); it != languages_map.end(); ++it)
620 684 it->second->setChecked(it->first == language);
... ...
src_qt/mainwindow.h
... ... @@ -37,6 +37,8 @@ public:
37 37 void dropEvent(QDropEvent * event);
38 38 // Показать окно
39 39 void show();
  40 + // Исправить отображение локаизованных шрифтов под Windows
  41 + void fonts_fix(const QString & language);
40 42 public slots:
41 43 // Открытие файла по имени
42 44 void open_file(const QString & filename);
... ...