INI_UTILS/widget.cpp
2025-06-08 10:56:52 +03:00

198 lines
5.8 KiB
C++

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
myTable::myTable(const records &hash):QTableWidget() {
fill(hash);
}
void myTable::fill(const records &hash) {
setRowCount(hash.size());
setColumnCount(2);
int ii=0;
for (const auto &rec: hash ) {
QTableWidgetItem *item1 = new QTableWidgetItem(rec.first);
QTableWidgetItem *item2 = new QTableWidgetItem(rec.second);
setItem(ii, 0, item1);
setItem(ii, 1, item2);
++ii;
}
}
Widget::Widget(QWidget *parent)
: QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->hide();
ui->pushButton->setIcon(QIcon(":/res/icons/open-file-48.png"));
ui->pushButton->setIconSize(QSize(28, 28));
ui->pushButton->setToolTip("Открыть INI файл...");
ui->pushButton_2->setIcon(QIcon(":/res/icons/logout-52.png"));
ui->pushButton_2->setIconSize(QSize(26, 22));
ui->pushButton_2->setToolTip("Выход");
ui->pushButton_3->setIcon(QIcon(":/res/icons/save-as-64.png"));
ui->pushButton_3->setIconSize(QSize(28, 28));
ui->pushButton_3->setToolTip("Сохранить как...");
ui->pushButton_3->setEnabled(false);
ui->pushButton_4->setIcon(QIcon(":/res/icons/save-50.png"));
ui->pushButton_4->setIconSize(QSize(26, 26));
ui->pushButton_4->setToolTip("Сохранить");
ui->pushButton_4->setEnabled(false);
ui->tabWidget->hide();
setWindowIcon(QIcon());
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString pathStr = ui->lineEdit->text();
if (pathStr.isEmpty()) pathStr = QDir::currentPath();
QString fileName = QFileDialog::getOpenFileName(this,
tr("Выберите файл"),
pathStr,
tr("INI файлы (*.ini)"));
if (!fileName.isEmpty()) {
ui->lineEdit->setText(fileName);
QTimer::singleShot(200, this, SLOT(genTabs()));
}
}
void Widget::genTabs() {
ui->tabWidget->hide();
tabs.clear();
QTabWidget *tw = ui->tabWidget;
for (int i=tw->count()-1; i>=0; i--) {
QWidget *w = tw->widget(i);
tw->removeTab(i);
if (w!= nullptr) delete w;
}
tw->clear();
this->setWindowTitle(ui->lineEdit->text());
QFile file(ui->lineEdit->text());
if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::critical(this, "Ошибка", "Ошибка открытия файла");
ui->pushButton_3->setEnabled(false);
ui->pushButton_4->setEnabled(false);
return;
}
ui->pushButton_3->setEnabled(true);
ui->pushButton_4->setEnabled(true);
proceedFile(file);
if (file.isOpen()) file.close();
const QIcon nullIcon;
for (int i=0; i<tabs.size(); ++i) {
myTable *local_tab = new myTable(tabs[i].m_hash);
tw->addTab(local_tab, nullIcon, tabs[i].m_name);
}
tw->setCurrentIndex(0);
tw->show();
}
void Widget::on_lineEdit_returnPressed()
{
QTimer::singleShot(200, this, SLOT(genTabs()));
}
void Widget::on_pushButton_2_clicked()
{
close();
}
void Widget::proceedFile(QFile &file) {
int numLine = 0;
comments.clear();
while (!file.atEnd()) {
numLine++;
QByteArray line = file.readLine();
QString str = QString::fromLocal8Bit(line.data());
if (str.length()>1 && str.right(2) == "\r\n") str.chop(2);
while (!str.isEmpty() && str.back()=='\t') str.chop(1);
if (str.isEmpty()) continue;
if (str.front()==';') {
comments.insert(numLine, str);
continue;
}
if (str.front() == '[') {
tabs.push_back(tabChapter(str));
continue;
}
QString strKey = str.section('=', 0, 0);
QString strData = str.section('=', 1);
QPair<QString, QString> pair(strKey, strData);
tabs.back().m_hash.push_back(pair);
}
}
void Widget::on_pushButton_4_clicked()
{
// saveBtn
QString path = ui->lineEdit->text();
saveDataToFile(path);
}
void Widget::on_pushButton_3_clicked()
{
// saveAsBtn
QString pathStr = ui->lineEdit->text();
if (pathStr.isEmpty()) pathStr = QDir::currentPath();
QString fileName = QFileDialog::getSaveFileName(this,
tr("Выберите файл"),
pathStr,
tr("INI файлы (*.ini)"));
if (!fileName.isEmpty()) {
saveDataToFile(fileName);
}
}
void Widget::saveDataToFile(QString &name) {
QFile fd(name);
if (!fd.open(QIODevice::WriteOnly | QIODevice::Text)) {
QMessageBox::critical(this, "Ошибка файла", "Ошибка открытия файла на запись");
}
int numLine = 1;
while (comments.find(numLine)!=comments.end()) {
fd.write(comments[numLine++].toLocal8Bit());
fd.write("\n");
}
for (int i=0; i<ui->tabWidget->count(); ++i) {
fd.write(ui->tabWidget->tabText(i).toLocal8Bit());
fd.write("\n");
numLine++;
while (comments.find(numLine)!=comments.end()) {
fd.write(comments[numLine++].toLocal8Bit());
fd.write("\n");
}
myTable *tab = (myTable *)ui->tabWidget->widget(i);
for (int j=0; j<tab->rowCount(); j++) {
QString str = tab->item(j, 0)->text() +
QString("=") + tab->item(j, 1)->text() + "\n";
fd.write(str.toLocal8Bit());
numLine++;
while (comments.find(numLine)!=comments.end()) {
fd.write(comments[numLine++].toLocal8Bit());
fd.write("\n");
}
}
fd.write("\n");
numLine++;
}
if (fd.isOpen()) fd.close();
setWindowTitle(name);
}