Skip to content

Commit

Permalink
GUI - Add UI language option
Browse files Browse the repository at this point in the history
  • Loading branch information
SunderB committed Feb 13, 2021
1 parent a396163 commit 47b34e1
Show file tree
Hide file tree
Showing 12 changed files with 511 additions and 36 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ app/gui/qt/moc_mainwindow.cpp
app/gui/qt/moc_sonicpiudpserver.cpp
app/gui/qt/qrc_SonicPi.cpp
app/gui/qt/utils/ruby_help.h
app/gui/qt/help/*.html
app/gui/qt/utils/lang_list.h
app/gui/qt/help
app/gui/qt/help_files.qrc
app/gui/qt/lang/*.qm
app/gui/qt/qrc_help_files.cpp
Expand Down
3 changes: 3 additions & 0 deletions app/gui/qt/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,15 @@ set(QT_SOURCES
set(SOURCES
${QTAPP_ROOT}/main.cpp
${QTAPP_ROOT}/utils/scintilla_api.cpp
${QTAPP_ROOT}/utils/sonic_pi_i18n.cpp
${QTAPP_ROOT}/widgets/sonicpilog.cpp
${QTAPP_ROOT}/widgets/sonicpilog.h
${QTAPP_ROOT}/widgets/sonicpicontext.cpp
${QTAPP_ROOT}/widgets/sonicpicontext.h
${QTAPP_ROOT}/utils/scintilla_api.h
${QTAPP_ROOT}/utils/sonic_pi_i18n.h
${QTAPP_ROOT}/utils/ruby_help.h
${QTAPP_ROOT}/utils/lang_list.h
${QTAPP_ROOT}/model/settings.h
)

Expand Down
22 changes: 6 additions & 16 deletions app/gui/qt/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@
// notice is included.
//++

#include <iostream>

#include <QApplication>
#include <QSplashScreen>
#include <QPixmap>
#include <QBitmap>
#include <QLabel>
#include <QTranslator>
#include <QLibraryInfo>

#include "mainwindow.h"
Expand All @@ -35,7 +36,7 @@

int main(int argc, char *argv[])
{

std::cout << "Starting Sonic Pi..." << std::endl;
#ifndef Q_OS_MAC
Q_INIT_RESOURCE(SonicPi);
#endif
Expand All @@ -49,16 +50,6 @@ int main(int argc, char *argv[])

qRegisterMetaType<SonicPiLog::MultiMessage>("SonicPiLog::MultiMessage");

QString systemLocale = QLocale::system().uiLanguages()[0].replace("-", "_");

QTranslator qtTranslator;
qtTranslator.load("qt_" + systemLocale, QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);

QTranslator translator;
bool i18n = translator.load(QLatin1String("sonic-pi_") + systemLocale, QLatin1String(":/lang")) || systemLocale.startsWith("en") || systemLocale == "C";
app.installTranslator(&translator);

app.setApplicationName(QObject::tr("Sonic Pi"));
app.setStyle("gtk");

Expand All @@ -75,7 +66,7 @@ int main(int argc, char *argv[])
splash->show();
splash->repaint();
app.processEvents();
MainWindow mainWin(app, i18n, splash);
MainWindow mainWin(app, splash);

return app.exec();
#elif _WIN32
Expand Down Expand Up @@ -109,7 +100,7 @@ int main(int argc, char *argv[])
splash->show();
splash->repaint();
app.processEvents();
MainWindow mainWin(app, i18n, splash);
MainWindow mainWin(app, splash);

// Fix for full screen mode. See: https://doc.qt.io/qt-5/windows-issues.html#fullscreen-opengl-based-windows
QWindowsWindowFunctions::setHasBorderInFullScreen(mainWin.windowHandle(), true);
Expand Down Expand Up @@ -139,9 +130,8 @@ int main(int argc, char *argv[])
splashWindow->show();
app.processEvents();

MainWindow mainWin(app, i18n, splashWindow);
MainWindow mainWin(app, splashWindow);
return app.exec();

#endif

}
82 changes: 75 additions & 7 deletions app/gui/qt/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
#include "widgets/sonicpilexer.h"
#include "widgets/sonicpiscintilla.h"

#include "utils/sonic_pi_i18n.h"

#include "utils/borderlesslinksproxystyle.h"

// OSC stuff
Expand Down Expand Up @@ -105,9 +107,9 @@ using namespace SonicPi;
#endif

#ifdef Q_OS_MAC
MainWindow::MainWindow(QApplication& app, bool i18n, QMainWindow* splash)
MainWindow::MainWindow(QApplication& app, QMainWindow* splash)
#else
MainWindow::MainWindow(QApplication& app, bool i18n, QSplashScreen* splash)
MainWindow::MainWindow(QApplication& app, QSplashScreen* splash)
#endif
{
app.installEventFilter(this);
Expand All @@ -118,9 +120,6 @@ MainWindow::MainWindow(QApplication& app, bool i18n, QSplashScreen* splash)

this->piSettings = new SonicPiSettings();

this->splash = splash;
this->i18n = i18n;

#ifdef QT_OLD_API
sonicPiOSCServer = NULL;
#else
Expand Down Expand Up @@ -153,7 +152,6 @@ MainWindow::MainWindow(QApplication& app, bool i18n, QSplashScreen* splash)
version_num = 0;
latest_version_num = 0;
this->splash = splash;
this->i18n = i18n;
#ifdef QT_OLD_API
guiID = QUuid::createUuid().toString();
#endif
Expand All @@ -163,6 +161,10 @@ MainWindow::MainWindow(QApplication& app, bool i18n, QSplashScreen* splash)
initPaths();

bool startupOK = false;
this->sonicPii18n = new SonicPii18n(rootPath());
this->ui_language = sonicPii18n->determineUILanguage(piSettings->language);
std::cout << "Using language: " << ui_language.toUtf8().constData() << std::endl;
this->i18n = sonicPii18n->loadTranslations(ui_language);

#ifdef QT_OLD_API
// Clear out old tasks from previous sessions if they still exist
Expand Down Expand Up @@ -579,7 +581,8 @@ void MainWindow::setupWindowStructure()
prefsWidget->setAllowedAreas(Qt::RightDockWidgetArea);
prefsWidget->setFeatures(QDockWidget::DockWidgetClosable);

settingsWidget = new SettingsWidget(server_osc_cues_port, piSettings, this);
settingsWidget = new SettingsWidget(server_osc_cues_port, i18n, piSettings, sonicPii18n, this);
connect(settingsWidget, SIGNAL(uiLanguageChanged(QString)), this, SLOT(changeUILanguage(QString)));
connect(settingsWidget, SIGNAL(volumeChanged(int)), this, SLOT(changeSystemPreAmp(int)));
connect(settingsWidget, SIGNAL(mixerSettingsChanged()), this, SLOT(mixerSettingsChanged()));
connect(settingsWidget, SIGNAL(midiSettingsChanged()), this, SLOT(toggleMidi()));
Expand Down Expand Up @@ -2179,6 +2182,43 @@ void MainWindow::changeSystemPreAmp(int val, int silent)
statusBar()->showMessage(tr("Updating System Volume..."), 2000);
}

// TODO: Implement real-time language switching
void MainWindow::changeUILanguage(QString lang) {
if (lang != piSettings->language) {
std::cout << "Current language: " << piSettings->language.toUtf8().constData() << std::endl;
std::cout << "New language selected: " << lang.toUtf8().constData() << std::endl;
QString old_lang = sonicPii18n->getNativeLanguageName(piSettings->language);
QString new_lang = sonicPii18n->getNativeLanguageName(lang);

// Load new language
//QString language = sonicPii18n->determineUILanguage(lang);
//sonicPii18n->loadTranslations(language);
//QString title_new = tr("Updated the UI language from %s to %s").arg();

QMessageBox msgBox(this);
msgBox.setText(QString(tr("You've selected a new language: %1")).arg(new_lang));
msgBox.setInformativeText(tr("Do you want to apply this language?\nApplying the new language will restart Sonic Pi."));
QPushButton *restartButton = msgBox.addButton(tr("Apply and Restart"), QMessageBox::ActionRole);
QPushButton *dismissButton = msgBox.addButton(tr("Cancel"), QMessageBox::RejectRole);
msgBox.setDefaultButton(restartButton);
msgBox.setIcon(QMessageBox::Information);
msgBox.exec();

if (msgBox.clickedButton() == (QAbstractButton*)restartButton) {
piSettings->language = lang;
writeSettings();
restartApp();
//statusBar()->showMessage(tr("Updated UI language setting, please restart Sonic Pi to apply it"), 2000);
} else if (msgBox.clickedButton() == (QAbstractButton*)dismissButton) {
// Don't apply the new language settings
settingsWidget->updateSelectedUILanguage(piSettings->language);
}

// Load previously set language
//sonicPii18n->loadTranslations(ui_language);
}
}

void MainWindow::changeScopeKindVisibility(QString name)
{
foreach (QAction* action, scopeKindVisibilityMenu->actions())
Expand Down Expand Up @@ -3500,6 +3540,8 @@ void MainWindow::readSettings()
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "sonic-pi.net", "gui-settings");

// Read in preferences from previous session
piSettings->language = settings.value("prefs/language", "system_locale").toString();

piSettings->show_buttons = settings.value("prefs/show-buttons", true).toBool();
piSettings->show_tabs = settings.value("prefs/show-tabs", true).toBool();
piSettings->show_log = settings.value("prefs/show-log", true).toBool();
Expand Down Expand Up @@ -3549,6 +3591,7 @@ void MainWindow::writeSettings()
{
std::cout << "[GUI] - writing settings" << std::endl;
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "sonic-pi.net", "gui-settings");
settings.setValue("prefs/language", piSettings->language);
settings.setValue("pos", pos());
settings.setValue("size", size());
settings.setValue("first_time", 0);
Expand Down Expand Up @@ -3732,6 +3775,31 @@ void MainWindow::onExitCleanup()
#endif
}

void MainWindow::restartApp() {
QApplication* app = dynamic_cast<QApplication*>(parent());
statusBar()->showMessage(tr("Restarting Sonic Pi..."), 10000);
// Save settings and perform some cleanup
writeSettings();
onExitCleanup();
sleep(1);
std::cout << "Performing application restart... please wait..." << std::endl;
//this->hide(); // So it doesn't look like the app's frozen or crashed
sleep(4); // Allow cleanup to complete
// Create new process
QStringList args = qApp->arguments();
args.removeFirst();
QProcess process;
bool restart_success = process.startDetached(qApp->arguments()[0], args);
if (restart_success) {
std::cout << "Successfully restarted sonic-pi" << std::endl;
} else {
std::cout << "Failed to restart sonic-pi" << std::endl;
}
// Quit
app->exit(0);
exit(0);
}

#ifdef QT_OLD_API
void MainWindow::cleanupRunningProcesses()
{
Expand Down
13 changes: 10 additions & 3 deletions app/gui/qt/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <vector>
#include <memory>


#include <QDate>
#include <QMainWindow>
#include <QFuture>
Expand Down Expand Up @@ -70,6 +71,7 @@ class InfoWidget;
class SettingsWidget;
class Scope;
class ScintillaAPI;
class SonicPii18n;
class SonicPiLog;
class SonicPiScintilla;
class SonicPiTheme;
Expand All @@ -94,9 +96,9 @@ class MainWindow : public QMainWindow

public:
#if defined(Q_OS_MAC)
MainWindow(QApplication &ref, bool i18n, QMainWindow* splash);
MainWindow(QApplication &ref, QMainWindow* splash);
#else
MainWindow(QApplication &ref, bool i18n, QSplashScreen* splash);
MainWindow(QApplication &ref, QSplashScreen* splash);
#endif

SonicPiLog* GetOutputPane() const;
Expand All @@ -123,6 +125,8 @@ class MainWindow : public QMainWindow

bool loaded_workspaces;
QString hash_salt;
QString ui_language;


protected:
void closeEvent(QCloseEvent *event);
Expand All @@ -137,6 +141,7 @@ class MainWindow : public QMainWindow

private slots:

void changeUILanguage(QString lang);
void updateContext(int line, int index);
void updateContextWithCurrentWs();
void docLinkClicked(const QUrl &url);
Expand Down Expand Up @@ -182,6 +187,7 @@ class MainWindow : public QMainWindow
void help();
void toggleHelpIcon();
void onExitCleanup();
void restartApp();
void toggleRecording();
void toggleRecordingOnIcon();
void changeSystemPreAmp(int val, int silent=0);
Expand Down Expand Up @@ -351,10 +357,12 @@ class MainWindow : public QMainWindow
QString rootPath();

void addUniversalCopyShortcuts(QTextEdit *te);
void updateTranslatedUIText();

QMenu *liveMenu, *codeMenu, *audioMenu, *displayMenu, *viewMenu, *ioMenu, *ioMidiInMenu, *ioMidiOutMenu, *ioMidiOutChannelMenu, *localIpAddressesMenu, *themeMenu, *scopeKindVisibilityMenu;

SonicPiSettings *piSettings;
SonicPii18n *sonicPii18n;

#ifdef QT_OLD_API
QFuture<void> osc_thread, server_thread;
Expand Down Expand Up @@ -458,4 +466,3 @@ class MainWindow : public QMainWindow
QSet<QString> cuePaths;

};

1 change: 1 addition & 0 deletions app/gui/qt/model/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class SonicPiSettings {
QString midi_default_channel_str;

// EditorSettings
QString language;
bool auto_indent_on_run;
bool show_line_numbers;
bool show_log;
Expand Down
16 changes: 16 additions & 0 deletions app/gui/qt/utils/lang_list.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//--
// This file is part of Sonic Pi: http://sonic-pi.net
// Full project source: https://github.com/samaaron/sonic-pi
// License: https://github.com/samaaron/sonic-pi/blob/main/LICENSE.md
//
// Copyright 2020 by Sam Aaron (http://sam.aaron.name).
// All rights reserved.
//
// Permission is granted for use, copying, modification, distribution,
// and distribution of modified versions of this work as long as this
// notice is included.
//++

// AUTO-GENERATED-DOCS
// Do not manually add any code below this comment
// otherwise it may be removed
Loading

0 comments on commit 47b34e1

Please sign in to comment.