mirror of
https://github.com/wh201906/Proxmark3GUI.git
synced 2026-07-14 22:55:32 +08:00
Support running a external script before client start,
to configure the environment variables Optimize stop(reconnect) logic Search valid ports automatically Update translations
This commit is contained in:
+84
-93
@@ -38,6 +38,12 @@ MainWindow::MainWindow(QWidget *parent):
|
||||
// hide unused tabs
|
||||
ui->funcTab->removeTab(1);
|
||||
ui->funcTab->removeTab(1);
|
||||
|
||||
portSearchTimer = new QTimer(this);
|
||||
portSearchTimer->setInterval(2000);
|
||||
connect(portSearchTimer, &QTimer::timeout, this, &MainWindow::on_portSearchTimer_timeout);
|
||||
portSearchTimer->start();
|
||||
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
@@ -60,31 +66,27 @@ void MainWindow::initUI() // will be called by main.app
|
||||
|
||||
// ******************** basic functions ********************
|
||||
|
||||
void MainWindow::on_PM3_refreshPortButton_clicked()
|
||||
void MainWindow::on_portSearchTimer_timeout()
|
||||
{
|
||||
ui->PM3_portBox->clear();
|
||||
QSerialPort serial;
|
||||
QStringList serialList;
|
||||
QStringList newPortList;
|
||||
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
|
||||
{
|
||||
qDebug() << info.isBusy() << info.isNull() << info.portName() << info.description();
|
||||
serial.setPort(info);
|
||||
|
||||
if(serial.open(QIODevice::ReadWrite))
|
||||
{
|
||||
serialList << info.portName();
|
||||
serial.close();
|
||||
}
|
||||
// qDebug() << info.isBusy() << info.isNull() << info.portName() << info.description();
|
||||
if(!info.isNull())
|
||||
newPortList << info.portName();
|
||||
}
|
||||
foreach(QString port, serialList)
|
||||
if(newPortList != portList) // update PM3_portBox when available ports changed
|
||||
{
|
||||
ui->PM3_portBox->addItem(port);
|
||||
portList = newPortList;
|
||||
ui->PM3_portBox->clear();
|
||||
ui->PM3_portBox->addItems(portList);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_PM3_connectButton_clicked()
|
||||
{
|
||||
qDebug() << "Main:" << QThread::currentThread();
|
||||
|
||||
QString port = ui->PM3_portBox->currentText();
|
||||
if(port == "")
|
||||
QMessageBox::information(NULL, tr("Info"), tr("Plz choose a port first"), QMessageBox::Ok);
|
||||
@@ -92,11 +94,27 @@ void MainWindow::on_PM3_connectButton_clicked()
|
||||
{
|
||||
QStringList args = ui->Set_Client_startArgsEdit->text().replace("<port>", port).split(' ');
|
||||
saveClientPath(ui->PM3_pathEdit->text());
|
||||
QProcess envSetProcess;
|
||||
QFileInfo envScriptPath(ui->Set_Client_envScriptEdit->text());
|
||||
if(envScriptPath.exists())
|
||||
{
|
||||
qDebug() << envScriptPath.absoluteFilePath();
|
||||
#ifdef Q_OS_WIN
|
||||
// cmd /c "<path>">>nul && set
|
||||
envSetProcess.start("cmd /c \"" + envScriptPath.absoluteFilePath() + "\">>nul && set");
|
||||
#else
|
||||
// sh -c '. "<path>">>/dev/null && env'
|
||||
envSetProcess.start("sh -c \' . \"" + envScriptPath.absoluteFilePath() + "\">>/dev/null && env");
|
||||
#endif
|
||||
envSetProcess.waitForReadyRead(10000);
|
||||
clientEnv = QString(envSetProcess.readAll()).split(QRegExp("[\r\n]"), QString::SkipEmptyParts);
|
||||
// qDebug() << "Get Env List" << clientEnv;
|
||||
}
|
||||
else
|
||||
clientEnv.clear();
|
||||
emit setProcEnv(&clientEnv);
|
||||
emit connectPM3(ui->PM3_pathEdit->text(), port, args);
|
||||
}
|
||||
QProcess proc;
|
||||
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
||||
//env.insert();
|
||||
}
|
||||
|
||||
void MainWindow::onPM3StateChanged(bool st, const QString& info)
|
||||
@@ -105,11 +123,13 @@ void MainWindow::onPM3StateChanged(bool st, const QString& info)
|
||||
setState(st);
|
||||
if(st == true)
|
||||
{
|
||||
portSearchTimer->stop();
|
||||
setStatusBar(PM3VersionBar, info);
|
||||
setStatusBar(connectStatusBar, tr("Connected"));
|
||||
}
|
||||
else
|
||||
{
|
||||
portSearchTimer->start();
|
||||
setStatusBar(PM3VersionBar, "");
|
||||
setStatusBar(connectStatusBar, tr("Not Connected"));
|
||||
}
|
||||
@@ -141,7 +161,7 @@ void MainWindow::on_stopButton_clicked()
|
||||
if(!pm3state)
|
||||
break;
|
||||
}
|
||||
on_PM3_connectButton_clicked();
|
||||
emit reconnectPM3();
|
||||
}
|
||||
}
|
||||
// *********************************************************
|
||||
@@ -256,14 +276,14 @@ void MainWindow::on_MF_keyWidget_resized(QObject* obj_addr, QEvent& event)
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::MF_onTypeChanged(int id, bool st)
|
||||
void MainWindow::MF_onMFCardTypeChanged(int id, bool st)
|
||||
{
|
||||
typeBtnGroup->blockSignals(true);
|
||||
qDebug() << id << typeBtnGroup->checkedId();
|
||||
MFCardTypeBtnGroup->blockSignals(true);
|
||||
qDebug() << id << MFCardTypeBtnGroup->checkedId();
|
||||
if(!st)
|
||||
{
|
||||
int result;
|
||||
if(id > typeBtnGroup->checkedId()) // id is specified in uiInit() with a proper order, so I can compare the size by id.
|
||||
if(id > MFCardTypeBtnGroup->checkedId()) // id is specified in uiInit() with a proper order, so I can compare the size by id.
|
||||
{
|
||||
result = QMessageBox::question(this, tr("Info"), tr("Some of the data and key will be cleared.") + "\n" + tr("Continue?"), QMessageBox::Yes | QMessageBox::No);
|
||||
}
|
||||
@@ -274,7 +294,7 @@ void MainWindow::MF_onTypeChanged(int id, bool st)
|
||||
if(result == QMessageBox::Yes)
|
||||
{
|
||||
qDebug() << "Yes";
|
||||
mifare->setCardType(typeBtnGroup->checkedId());
|
||||
mifare->setCardType(MFCardTypeBtnGroup->checkedId());
|
||||
MF_widgetReset();
|
||||
mifare->data_syncWithDataWidget();
|
||||
mifare->data_syncWithKeyWidget();
|
||||
@@ -282,10 +302,10 @@ void MainWindow::MF_onTypeChanged(int id, bool st)
|
||||
else
|
||||
{
|
||||
qDebug() << "No";
|
||||
typeBtnGroup->button(id)->setChecked(true);
|
||||
MFCardTypeBtnGroup->button(id)->setChecked(true);
|
||||
}
|
||||
}
|
||||
typeBtnGroup->blockSignals(false);
|
||||
MFCardTypeBtnGroup->blockSignals(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_MF_selectAllBox_stateChanged(int arg1)
|
||||
@@ -898,23 +918,20 @@ void MainWindow::uiInit()
|
||||
ui->MF_dataWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Data")));
|
||||
ui->MF_dataWidget->setColumnWidth(0, 55);
|
||||
ui->MF_dataWidget->setColumnWidth(1, 55);
|
||||
ui->MF_dataWidget->setColumnWidth(2, 450);
|
||||
|
||||
ui->MF_keyWidget->setColumnCount(3);
|
||||
ui->MF_keyWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Sec")));
|
||||
ui->MF_keyWidget->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("KeyA")));
|
||||
ui->MF_keyWidget->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("KeyB")));
|
||||
ui->MF_keyWidget->setColumnWidth(0, 35);
|
||||
ui->MF_keyWidget->setColumnWidth(1, 125);
|
||||
ui->MF_keyWidget->setColumnWidth(2, 125);
|
||||
ui->MF_keyWidget->setColumnWidth(0, 45);
|
||||
|
||||
MF_widgetReset();
|
||||
typeBtnGroup = new QButtonGroup(this);
|
||||
typeBtnGroup->addButton(ui->MF_Type_miniButton, 0);
|
||||
typeBtnGroup->addButton(ui->MF_Type_1kButton, 1);
|
||||
typeBtnGroup->addButton(ui->MF_Type_2kButton, 2);
|
||||
typeBtnGroup->addButton(ui->MF_Type_4kButton, 4);
|
||||
connect(typeBtnGroup, QOverload<int, bool>::of(&QButtonGroup::buttonToggled), this, &MainWindow::MF_onTypeChanged);
|
||||
MFCardTypeBtnGroup = new QButtonGroup(this);
|
||||
MFCardTypeBtnGroup->addButton(ui->MF_Type_miniButton, 0);
|
||||
MFCardTypeBtnGroup->addButton(ui->MF_Type_1kButton, 1);
|
||||
MFCardTypeBtnGroup->addButton(ui->MF_Type_2kButton, 2);
|
||||
MFCardTypeBtnGroup->addButton(ui->MF_Type_4kButton, 4);
|
||||
connect(MFCardTypeBtnGroup, QOverload<int, bool>::of(&QButtonGroup::buttonToggled), this, &MainWindow::MF_onMFCardTypeChanged);
|
||||
|
||||
ui->MF_keyWidget->installEventFilter(this);
|
||||
ui->MF_dataWidget->installEventFilter(this);
|
||||
@@ -954,13 +971,14 @@ void MainWindow::uiInit()
|
||||
ui->Set_Client_forceEnabledBox->setChecked(keepButtonsEnabled);
|
||||
settings->endGroup();
|
||||
|
||||
settings->beginGroup("Client_Env");
|
||||
ui->Set_Client_envScriptEdit->setText(settings->value("scriptPath").toString());
|
||||
settings->endGroup();
|
||||
|
||||
ui->MF_RW_keyTypeBox->addItem("A", Mifare::KEY_A);
|
||||
ui->MF_RW_keyTypeBox->addItem("B", Mifare::KEY_B);
|
||||
|
||||
on_Raw_CMDHistoryBox_stateChanged(Qt::Unchecked);
|
||||
on_PM3_refreshPortButton_clicked();
|
||||
|
||||
loadClientPreloadEnv();
|
||||
}
|
||||
|
||||
void MainWindow::signalInit()
|
||||
@@ -970,9 +988,11 @@ void MainWindow::signalInit()
|
||||
connect(util, &Util::refreshOutput, this, &MainWindow::refreshOutput);
|
||||
|
||||
connect(this, &MainWindow::connectPM3, pm3, &PM3Process::connectPM3);
|
||||
connect(this, &MainWindow::reconnectPM3, pm3, &PM3Process::reconnectPM3);
|
||||
connect(pm3, &PM3Process::PM3StatedChanged, this, &MainWindow::onPM3StateChanged);
|
||||
connect(pm3, &PM3Process::PM3StatedChanged, util, &Util::setRunningState);
|
||||
connect(this, &MainWindow::killPM3, pm3, &PM3Process::kill);
|
||||
connect(this, &MainWindow::setProcEnv, pm3, &PM3Process::setProcEnv);
|
||||
|
||||
connect(util, &Util::write, pm3, &PM3Process::write);
|
||||
|
||||
@@ -1055,13 +1075,18 @@ void MainWindow::setState(bool st)
|
||||
{
|
||||
setStatusBar(programStatusBar, tr("Idle"));
|
||||
}
|
||||
ui->MF_attackGroupBox->setEnabled(st || keepButtonsEnabled);
|
||||
ui->MF_normalGroupBox->setEnabled(st || keepButtonsEnabled);
|
||||
ui->MF_UIDGroupBox->setEnabled(st || keepButtonsEnabled);
|
||||
ui->MF_simGroupBox->setEnabled(st || keepButtonsEnabled);
|
||||
ui->MF_sniffGroupBox->setEnabled(st || keepButtonsEnabled);
|
||||
ui->Raw_CMDEdit->setEnabled(st || keepButtonsEnabled);
|
||||
ui->Raw_sendCMDButton->setEnabled(st || keepButtonsEnabled);
|
||||
setButtonsEnabled(st || keepButtonsEnabled);
|
||||
}
|
||||
|
||||
void MainWindow::setButtonsEnabled(bool st)
|
||||
{
|
||||
ui->MF_attackGroupBox->setEnabled(st);
|
||||
ui->MF_normalGroupBox->setEnabled(st);
|
||||
ui->MF_UIDGroupBox->setEnabled(st);
|
||||
ui->MF_simGroupBox->setEnabled(st);
|
||||
ui->MF_sniffGroupBox->setEnabled(st);
|
||||
ui->Raw_CMDEdit->setEnabled(st);
|
||||
ui->Raw_sendCMDButton->setEnabled(st);
|
||||
}
|
||||
|
||||
void MainWindow::on_GroupBox_clicked(bool checked)
|
||||
@@ -1099,52 +1124,6 @@ void MainWindow::on_MF_Attack_darksideButton_clicked()
|
||||
setState(true);
|
||||
}
|
||||
|
||||
void MainWindow::on_Set_Client_envDeleteButton_clicked()
|
||||
{
|
||||
ui->Set_Client_envTable->removeRow(ui->Set_Client_envTable->currentRow());
|
||||
}
|
||||
|
||||
void MainWindow::on_Set_Client_envAddButton_clicked()
|
||||
{
|
||||
ui->Set_Client_envTable->insertRow(ui->Set_Client_envTable->rowCount());
|
||||
}
|
||||
|
||||
void MainWindow::on_Set_Client_envClearButton_clicked()
|
||||
{
|
||||
ui->Set_Client_envTable->clearContents();
|
||||
ui->Set_Client_envTable->setRowCount(0);
|
||||
}
|
||||
|
||||
void MainWindow::on_Set_Client_envSaveButton_clicked()
|
||||
{
|
||||
settings->beginGroup("Client_Env");
|
||||
for(int i = 0; i < ui->Set_Client_envTable->rowCount(); i++)
|
||||
{
|
||||
QTableWidgetItem* key = ui->Set_Client_envTable->item(i, 0);
|
||||
QTableWidgetItem* val = ui->Set_Client_envTable->item(i, 1);
|
||||
if(key == nullptr || val == nullptr || key->text().isEmpty() || val->text().isEmpty())
|
||||
continue;
|
||||
settings->setValue(key->text(), val->text());
|
||||
qDebug() << "Env saved: " << i << key->text() << val->text();
|
||||
}
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
void MainWindow::loadClientPreloadEnv()
|
||||
{
|
||||
ui->Set_Client_envTable->clearContents();
|
||||
settings->beginGroup("Client_Env");
|
||||
QStringList keyList = settings->allKeys();
|
||||
ui->Set_Client_envTable->setRowCount(keyList.size());
|
||||
for(int i = 0; i < keyList.size(); i++)
|
||||
{
|
||||
ui->Set_Client_envTable->setItem(i, 0, new QTableWidgetItem(keyList[i]));
|
||||
ui->Set_Client_envTable->setItem(i, 1, new QTableWidgetItem(settings->value(keyList[i]).toString()));
|
||||
}
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_Set_Client_startArgsEdit_editingFinished()
|
||||
{
|
||||
settings->beginGroup("Client_Args");
|
||||
@@ -1158,11 +1137,23 @@ void MainWindow::on_Set_Client_forceEnabledBox_stateChanged(int arg1)
|
||||
keepButtonsEnabled = (arg1 == Qt::Checked);
|
||||
settings->setValue("state", keepButtonsEnabled);
|
||||
settings->endGroup();
|
||||
if(keepButtonsEnabled)
|
||||
setButtonsEnabled(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MainWindow::on_Set_GUI_setLanguageButton_clicked()
|
||||
{
|
||||
Util::chooseLanguage(settings, this);
|
||||
}
|
||||
|
||||
void MainWindow::on_PM3_refreshPortButton_clicked()
|
||||
{
|
||||
on_portSearchTimer_timeout();
|
||||
}
|
||||
|
||||
void MainWindow::on_Set_Client_envScriptEdit_editingFinished()
|
||||
{
|
||||
settings->beginGroup("Client_Env");
|
||||
settings->setValue("scriptPath", ui->Set_Client_envScriptEdit->text());
|
||||
settings->endGroup();
|
||||
}
|
||||
|
||||
+17
-13
@@ -22,6 +22,7 @@
|
||||
#include <QPushButton>
|
||||
#include <QProcessEnvironment>
|
||||
#include <QScrollBar>
|
||||
#include <QTimer>
|
||||
|
||||
#include "common/myeventfilter.h"
|
||||
#include "common/pm3process.h"
|
||||
@@ -51,7 +52,7 @@ public slots:
|
||||
void refreshCMD(const QString& cmd);
|
||||
void setStatusBar(QLabel* target, const QString& text);
|
||||
void onPM3StateChanged(bool st, const QString& info);
|
||||
void MF_onTypeChanged(int id, bool st);
|
||||
void MF_onMFCardTypeChanged(int id, bool st);
|
||||
void on_Raw_CMDEdit_keyPressed(QObject *obj_addr, QEvent &event);
|
||||
void on_MF_keyWidget_resized(QObject *obj_addr, QEvent &event);
|
||||
private slots:
|
||||
@@ -65,7 +66,8 @@ private slots:
|
||||
void on_Raw_clearOutputButton_clicked();
|
||||
|
||||
void sendMSG();
|
||||
void on_PM3_refreshPortButton_clicked();
|
||||
|
||||
void on_portSearchTimer_timeout();
|
||||
|
||||
void on_Raw_CMDHistoryBox_stateChanged(int arg1);
|
||||
|
||||
@@ -154,29 +156,26 @@ private slots:
|
||||
void on_MF_selectTrailerBox_stateChanged(int arg1);
|
||||
|
||||
void on_stopButton_clicked();
|
||||
|
||||
void on_Raw_CMDEdit_textChanged(const QString &arg1);
|
||||
|
||||
void on_MF_Attack_darksideButton_clicked();
|
||||
|
||||
void on_Set_Client_envDeleteButton_clicked();
|
||||
|
||||
void on_Set_Client_envAddButton_clicked();
|
||||
|
||||
void on_Set_Client_envSaveButton_clicked();
|
||||
|
||||
void loadClientPreloadEnv();
|
||||
|
||||
void on_Set_Client_startArgsEdit_editingFinished();
|
||||
|
||||
void on_Set_Client_forceEnabledBox_stateChanged(int arg1);
|
||||
|
||||
void on_Set_Client_envClearButton_clicked();
|
||||
|
||||
void on_Set_GUI_setLanguageButton_clicked();
|
||||
|
||||
void setButtonsEnabled(bool st);
|
||||
|
||||
void on_PM3_refreshPortButton_clicked();
|
||||
|
||||
void on_Set_Client_envScriptEdit_editingFinished();
|
||||
|
||||
private:
|
||||
Ui::MainWindow* ui;
|
||||
QButtonGroup* typeBtnGroup;
|
||||
QButtonGroup* MFCardTypeBtnGroup;
|
||||
QLabel* connectStatusBar;
|
||||
QLabel* programStatusBar;
|
||||
QLabel* PM3VersionBar;
|
||||
@@ -197,6 +196,9 @@ private:
|
||||
bool pm3state;
|
||||
bool keepButtonsEnabled;
|
||||
QThread* pm3Thread;
|
||||
QTimer* portSearchTimer;
|
||||
QStringList portList;
|
||||
QStringList clientEnv;
|
||||
|
||||
Mifare* mifare;
|
||||
Util* util;
|
||||
@@ -211,7 +213,9 @@ private:
|
||||
void saveClientPath(const QString& path);
|
||||
signals:
|
||||
void connectPM3(const QString& path, const QString& port, const QStringList args);
|
||||
void reconnectPM3();
|
||||
void killPM3();
|
||||
void setSerialListener(const QString& name, bool state);
|
||||
void setProcEnv(const QStringList *env);
|
||||
};
|
||||
#endif // MAINWINDOW_H
|
||||
|
||||
+75
-123
@@ -6,14 +6,14 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1029</width>
|
||||
<height>770</height>
|
||||
<width>1050</width>
|
||||
<height>700</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>970</width>
|
||||
<height>770</height>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="contextMenuPolicy">
|
||||
@@ -53,13 +53,20 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Path:</string>
|
||||
<string>Client Path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="PM3_pathEdit"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_18">
|
||||
<property name="text">
|
||||
<string>Port:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="PM3_portBox">
|
||||
<property name="minimumSize">
|
||||
@@ -68,6 +75,9 @@
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@@ -79,7 +89,7 @@
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Refresh</string>
|
||||
<string>Refresh Ports</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -1528,7 +1538,7 @@
|
||||
<attribute name="title">
|
||||
<string>Settings</string>
|
||||
</attribute>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_18">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_15">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_12">
|
||||
<item>
|
||||
@@ -1540,88 +1550,23 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="text">
|
||||
<string>Preload environment variables</string>
|
||||
<string>Preload script path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_15">
|
||||
<item>
|
||||
<widget class="QTableWidget" name="Set_Client_envTable">
|
||||
<property name="selectionBehavior">
|
||||
<enum>QAbstractItemView::SelectRows</enum>
|
||||
</property>
|
||||
<attribute name="horizontalHeaderStretchLastSection">
|
||||
<bool>true</bool>
|
||||
</attribute>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Variable</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Value</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
<item>
|
||||
<widget class="QPushButton" name="Set_Client_envAddButton">
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="Set_Client_envDeleteButton">
|
||||
<property name="text">
|
||||
<string>Delete</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="Set_Client_envClearButton">
|
||||
<property name="text">
|
||||
<string>Clear</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="Set_Client_envSaveButton">
|
||||
<property name="text">
|
||||
<string>Save</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QLineEdit" name="Set_Client_envScriptEdit">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_13">
|
||||
<property name="text">
|
||||
<string>Note:
|
||||
If the variable name already exists, this app will add the new value to the head of the existing one, so these new values have higher priority when calling Proxmark3 client.
|
||||
The environment variables added here won't affect other apps.</string>
|
||||
If the client requires some enviroment variables, you can make a script file(*.bat on Windows or *.sh on Linux) to configure them,
|
||||
then put the path of the script there</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
@@ -1709,55 +1654,62 @@ or "-p <port> -f"</string>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>GUI</string>
|
||||
<widget class="Line" name="line_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_11">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_17">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>Language: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="Set_GUI_setLanguageButton">
|
||||
<property name="text">
|
||||
<string>Choose Language</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_17">
|
||||
<property name="text">
|
||||
<string>(Restart this app to use new language)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_9">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>GUI</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_11">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_17">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>Language: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="Set_GUI_setLanguageButton">
|
||||
<property name="text">
|
||||
<string>Choose Language</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_17">
|
||||
<property name="text">
|
||||
<string>(Restart this app to use new language)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_9">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_5">
|
||||
<property name="orientation">
|
||||
|
||||
Reference in New Issue
Block a user