mirror of
https://github.com/ckb-next/ckb-next.git
synced 2026-10-10 12:27:21 -04:00
300 lines
10 KiB
C++
300 lines
10 KiB
C++
#include <QTimer>
|
|
#include "animscript.h"
|
|
#include "autorun.h"
|
|
#include "ckbsettings.h"
|
|
#include "kb.h"
|
|
#include "settingswidget.h"
|
|
#include "ui_settingswidget.h"
|
|
#include <QMessageBox>
|
|
#include <QFileDialog>
|
|
#include <QDateTime>
|
|
#include "mainwindow.h"
|
|
#include <ckbnextconfig.h>
|
|
#include <QProgressBar>
|
|
|
|
extern QString devpath;
|
|
|
|
// Modifier keys (OS-dependent)
|
|
static QStringList modKeys, modNames;
|
|
static bool updateRequestedByUser = false;
|
|
|
|
SettingsWidget::SettingsWidget(QWidget *parent) :
|
|
QWidget(parent), devDetect(nullptr), devDetectProgress(nullptr),
|
|
ui(new Ui::SettingsWidget)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
// Prepare extra settings
|
|
extra = ui->extraWidget;
|
|
|
|
#ifndef Q_OS_MACOS
|
|
ui->uninstallButton->hide();
|
|
#endif
|
|
|
|
CkbSettings settings("Program");
|
|
|
|
// Load modifier remap
|
|
KbBind::loadGlobalRemap();
|
|
if(modKeys.isEmpty()){
|
|
modKeys << "caps" << "lshift" << "lctrl" << "lalt" << "lwin";
|
|
#ifdef Q_OS_MACOS
|
|
modNames << "Caps Lock" << "Shift" << "Control (⌃)" << "Option (⌥)" << "Command (⌘)";
|
|
#else
|
|
modNames << "Caps Lock" << "Shift" << "Control" << "Alt" << "Super";
|
|
#endif
|
|
}
|
|
foreach(const QString& name, modNames){
|
|
ui->capsBox->addItem(name);
|
|
ui->shiftBox->addItem(name);
|
|
ui->ctrlBox->addItem(name);
|
|
ui->altBox->addItem(name);
|
|
ui->winBox->addItem(name);
|
|
}
|
|
|
|
int idx = modKeys.indexOf(KbBind::globalRemap("caps"));
|
|
if(idx >= 0)
|
|
ui->capsBox->setCurrentIndex(idx);
|
|
idx = modKeys.indexOf(KbBind::globalRemap("lshift"));
|
|
if(idx >= 0)
|
|
ui->shiftBox->setCurrentIndex(idx);
|
|
idx = modKeys.indexOf(KbBind::globalRemap("lctrl"));
|
|
if(idx >= 0)
|
|
ui->ctrlBox->setCurrentIndex(idx);
|
|
idx = modKeys.indexOf(KbBind::globalRemap("lwin"));
|
|
if(idx >= 0)
|
|
ui->winBox->setCurrentIndex(idx);
|
|
idx = modKeys.indexOf(KbBind::globalRemap("lalt"));
|
|
if(idx >= 0)
|
|
ui->altBox->setCurrentIndex(idx);
|
|
#ifdef Q_OS_MACOS
|
|
if(settings.value("osxCmdSwap").toBool()){
|
|
// ckb <0.0.41
|
|
settings.remove("osxCmdSwap");
|
|
ui->ctrlBox->setCurrentIndex(modKeys.indexOf("lwin"));
|
|
ui->winBox->setCurrentIndex(modKeys.indexOf("lctrl"));
|
|
updateModifiers();
|
|
}
|
|
#endif
|
|
|
|
// Read auto update settings
|
|
ui->autoFWBox->setChecked(!settings.value("DisableAutoFWCheck").toBool());
|
|
|
|
// Read auto run settings
|
|
if(!AutoRun::available())
|
|
ui->loginItemBox->hide();
|
|
else {
|
|
if(!AutoRun::once())
|
|
// If this is the first time running the app, enable auto run by default
|
|
AutoRun::enable();
|
|
ui->loginItemBox->setChecked(AutoRun::isEnabled());
|
|
}
|
|
|
|
QString copyrightText = QString("© 2014-2016 <a href=\"https://github.com/ccMSC/\" style=\"text-decoration:none;\">ccMSC</a>.<br/>© 2017-%1 <a href=\"https://github.com/ckb-next/ckb-next/graphs/contributors\" style=\"text-decoration:none;\">%2</a>.").arg(CKB_NEXT_COPYRIGHT_YEAR, tr("The ckb-next development team"));
|
|
|
|
#ifndef OS_MAC_LEGACY
|
|
#ifdef Q_OS_MACOS
|
|
copyrightText.append(tr("<br/>Special thanks to <a href=\"https://github.com/tekezo\" style=\"text-decoration:none;\">tekezo</a> for <a href=\"https://github.com/tekezo/Karabiner-VirtualHIDDevice\" style=\"text-decoration:none;\">VirtualHIDDevice</a>."));
|
|
#endif
|
|
#endif
|
|
|
|
ui->label_2->setText(copyrightText);
|
|
|
|
#ifdef DISABLE_UPDATER
|
|
ui->autoUpdBox->hide();
|
|
ui->pushButton_2->hide();
|
|
#else
|
|
ui->autoUpdBox->setChecked(!settings.value("DisableAutoUpdCheck", false).toBool());
|
|
#endif
|
|
|
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
|
ui->hiDPIBox->setChecked(settings.value("HiDPI", false).toBool());
|
|
#else
|
|
ui->hiDPIBox->hide();
|
|
#endif
|
|
}
|
|
|
|
SettingsWidget::~SettingsWidget(){
|
|
delete ui;
|
|
}
|
|
|
|
void SettingsWidget::pollUpdates(){
|
|
extra->pollUpdates();
|
|
}
|
|
|
|
void SettingsWidget::setStatus(const QString& text){
|
|
ui->devicesLabel->setText(text);
|
|
}
|
|
|
|
void SettingsWidget::setVersion(const CkbVersionNumber& version){
|
|
ui->versionLabel->setText(QString("ckb-next ") + version.toString());
|
|
}
|
|
|
|
static inline QString right(const QString& left){
|
|
if(left[0] != 'l')
|
|
return left;
|
|
return "r" + left.mid(1);
|
|
}
|
|
|
|
void SettingsWidget::updateModifiers(){
|
|
QHash<QString, QString> newMods;
|
|
newMods["caps"] = modKeys[ui->capsBox->currentIndex()];
|
|
newMods["lshift"] = modKeys[ui->shiftBox->currentIndex()];
|
|
newMods["rshift"] = right(modKeys[ui->shiftBox->currentIndex()]);
|
|
newMods["lctrl"] = modKeys[ui->ctrlBox->currentIndex()];
|
|
newMods["rctrl"] = right(modKeys[ui->ctrlBox->currentIndex()]);
|
|
newMods["lalt"] = modKeys[ui->altBox->currentIndex()];
|
|
newMods["ralt"] = right(modKeys[ui->altBox->currentIndex()]);
|
|
newMods["lwin"] = modKeys[ui->winBox->currentIndex()];
|
|
newMods["rwin"] = right(modKeys[ui->winBox->currentIndex()]);
|
|
KbBind::setGlobalRemap(newMods);
|
|
KbBind::saveGlobalRemap();
|
|
}
|
|
|
|
void SettingsWidget::on_pushButton_clicked(){
|
|
qApp->quit();
|
|
}
|
|
|
|
void SettingsWidget::on_capsBox_activated(int index){
|
|
updateModifiers();
|
|
}
|
|
|
|
void SettingsWidget::on_shiftBox_activated(int index){
|
|
updateModifiers();
|
|
}
|
|
|
|
void SettingsWidget::on_ctrlBox_activated(int index){
|
|
updateModifiers();
|
|
}
|
|
|
|
void SettingsWidget::on_altBox_activated(int index){
|
|
updateModifiers();
|
|
}
|
|
|
|
void SettingsWidget::on_winBox_activated(int index){
|
|
updateModifiers();
|
|
}
|
|
|
|
void SettingsWidget::on_autoFWBox_clicked(bool checked){
|
|
CkbSettings::set("Program/DisableAutoFWCheck", !checked);
|
|
}
|
|
|
|
void SettingsWidget::on_loginItemBox_clicked(bool checked){
|
|
if(checked)
|
|
AutoRun::enable();
|
|
else
|
|
AutoRun::disable();
|
|
}
|
|
|
|
void SettingsWidget::on_aboutQt_clicked(){
|
|
QMessageBox::aboutQt(this);
|
|
}
|
|
|
|
void SettingsWidget::on_generateReportButton_clicked(){
|
|
// Don't allow the script to run twice
|
|
if(devDetect || devDetectProgress)
|
|
return;
|
|
|
|
QMessageBox::information(this, tr("Generate report"), tr("This will collect software logs, as well as information about the Corsair devices in your system.\n\n"
|
|
"Make sure they are plugged in and click OK."));
|
|
devDetect = new QProcess();
|
|
connect(devDetect, SIGNAL(finished(int)), this, SLOT(devDetectFinished(int)));
|
|
connect(devDetect, &QProcess::destroyed, this, &SettingsWidget::devDetectDestroyed);
|
|
#if defined(Q_OS_LINUX)
|
|
QString devDetectPath("ckb-next-dev-detect");
|
|
#elif defined(Q_OS_MACOS)
|
|
QString devDetectPath("/Applications/ckb-next.app/Contents/Resources/ckb-next-dev-detect");
|
|
#endif
|
|
devDetect->start(devDetectPath, QStringList() << "--nouserinput");
|
|
|
|
// Check if it was started successfully
|
|
if(!devDetect->waitForStarted()){
|
|
QMessageBox::critical(this, tr("Error executing ckb-next-dev-detect"), tr("An error occurred while trying to execute ckb-next-dev-detect.\n"
|
|
"File not found or not executable."));
|
|
devDetect->deleteLater();
|
|
return;
|
|
}
|
|
devDetectProgress = new QProgressDialog(tr("Generating Report"), "", 0, 0, this);
|
|
devDetectProgress->setCancelButton(nullptr);
|
|
devDetectProgress->open();
|
|
}
|
|
|
|
void SettingsWidget::devDetectFinished(int retVal){
|
|
devDetectProgress->close();
|
|
delete devDetectProgress;
|
|
devDetectProgress = nullptr;
|
|
QFile report("/tmp/ckb-next-dev-detect-report.gz");
|
|
if(retVal || !report.exists()){
|
|
QString errMsg(tr("An error occurred while trying to execute ckb-next-dev-detect.\n\n"));
|
|
errMsg.append(devDetect->readAllStandardError());
|
|
errMsg.append("\n");
|
|
errMsg.append(QString(tr("Return code %1")).arg(retVal));
|
|
QMessageBox::critical(this, tr("Error executing ckb-next-dev-detect"), errMsg);
|
|
devDetect->deleteLater();
|
|
return;
|
|
}
|
|
|
|
QString newdir = QFileDialog::getExistingDirectory(this, tr("Select output directory"));
|
|
QString newfile(newdir + "/ckb-next-report-" + QString::number(QDateTime::currentMSecsSinceEpoch()/1000) + ".gz");
|
|
if(report.copy(newfile)){
|
|
QMessageBox::information(this, tr("Report generated successfully"), tr("The report has been generated successfully."));
|
|
// Try to show the newly generated file
|
|
#if defined(Q_OS_LINUX)
|
|
if(QProcess::execute("sh", QStringList() << "-c" << "gtk-launch `xdg-mime query default inode/directory` '" + newfile + "'"))
|
|
QProcess::execute("xdg-open", QStringList() << newdir);
|
|
#elif defined(Q_OS_MACOS)
|
|
QProcess::execute("open", QStringList() << "-R" << newfile);
|
|
#endif
|
|
}
|
|
else
|
|
QMessageBox::critical(this, tr("Error writing report"), tr("Could not write report to the selected directory.\n"
|
|
"Please pick a different one and try again."));
|
|
report.remove();
|
|
devDetect->deleteLater();
|
|
}
|
|
|
|
void SettingsWidget::devDetectDestroyed(){
|
|
devDetect = nullptr;
|
|
}
|
|
|
|
void SettingsWidget::on_autoUpdBox_clicked(bool checked)
|
|
{
|
|
CkbSettings::set("Program/DisableAutoUpdCheck", !checked);
|
|
}
|
|
|
|
void SettingsWidget::on_pushButton_2_clicked()
|
|
{
|
|
emit checkForUpdates();
|
|
ui->pushButton_2->setEnabled(false);
|
|
ui->pushButton_2->setText(tr("Checking..."));
|
|
updateRequestedByUser = true;
|
|
}
|
|
|
|
void SettingsWidget::enableUpdateButton(){
|
|
ui->pushButton_2->setEnabled(true);
|
|
}
|
|
|
|
void SettingsWidget::setUpdateButtonText(const QString& text){
|
|
if(updateRequestedByUser) {
|
|
ui->pushButton_2->setText(text);
|
|
updateRequestedByUser = false;
|
|
}
|
|
}
|
|
|
|
void SettingsWidget::on_uninstallButton_clicked()
|
|
{
|
|
#ifdef Q_OS_MACOS
|
|
if(QMessageBox::warning(this, tr("Uninstall ckb-next"), tr("WARNING: Clicking OK will uninstall ckb-next and any older versions of the software from your system.\n\n"
|
|
"Your settings and lighting profiles will be preserved."), QMessageBox::Cancel, QMessageBox::Ok) != QMessageBox::Ok)
|
|
return;
|
|
|
|
// Open a terminal and run the uninstall script
|
|
QProcess::execute("open", QStringList() << "-a" << "Terminal" << "/Applications/ckb-next.app/Contents/Resources/uninstall.sh");
|
|
#endif
|
|
}
|
|
|
|
void SettingsWidget::on_hiDPIBox_clicked(bool checked)
|
|
{
|
|
CkbSettings::set("Program/HiDPI", checked);
|
|
QMessageBox::warning(this, tr("Please restart ckb-next"), tr("Please click the Quit button and restart ckb-next for the changes to take effect."), QMessageBox::Ok);
|
|
}
|