From 72ecfdbdd885e89c0229f7c5c40893c817e03267 Mon Sep 17 00:00:00 2001 From: Vorpal Date: Sun, 8 Jun 2025 10:56:52 +0300 Subject: [PATCH] init --- icons.qrc | 8 ++ icons/logout-52.png | Bin 0 -> 697 bytes icons/open-file-48.png | Bin 0 -> 609 bytes icons/save-50.png | Bin 0 -> 379 bytes icons/save-as-64.png | Bin 0 -> 696 bytes ini_utils.pro | 32 +++++++ ini_utils_ru_RU.ts | 3 + main.cpp | 23 +++++ widget.cpp | 197 +++++++++++++++++++++++++++++++++++++++++ widget.h | 63 +++++++++++++ widget.ui | 118 ++++++++++++++++++++++++ 11 files changed, 444 insertions(+) create mode 100644 icons.qrc create mode 100644 icons/logout-52.png create mode 100644 icons/open-file-48.png create mode 100644 icons/save-50.png create mode 100644 icons/save-as-64.png create mode 100644 ini_utils.pro create mode 100644 ini_utils_ru_RU.ts create mode 100644 main.cpp create mode 100644 widget.cpp create mode 100644 widget.h create mode 100644 widget.ui diff --git a/icons.qrc b/icons.qrc new file mode 100644 index 0000000..2b8fe2f --- /dev/null +++ b/icons.qrc @@ -0,0 +1,8 @@ + + + icons/open-file-48.png + icons/logout-52.png + icons/save-50.png + icons/save-as-64.png + + diff --git a/icons/logout-52.png b/icons/logout-52.png new file mode 100644 index 0000000000000000000000000000000000000000..83af84b1704d6411639b8a37b86696ad26e4fed4 GIT binary patch literal 697 zcmV;q0!ICbP)xVtnQBXVXO-R2*_oZ0?wxI>ptIh3>!EsU zs+$rb$GCU)7)iWC3SX0gp;5>_7bzGf+TEUwB`@CDF!!UAq+riCL?)bsfsLsgjLl4g zV9X>`nM~PZw&>tZCRB904A7e?M-rZ~jy8p7V;yZ81-sKg_-bxPB;jz<$s%C>7(eKo znl2RhP0VZQG>ZkBsTxlUGKB32U+94ahMJkJk&NYAo(l%ZBxU`8W%p7rKqi6uL4CXt z43J5_RlkgchamxxeQpZ^h!hNC30s9=nhrz~KC^@ig<+ZuL=xYzUOzn-Oc|iyKCH3C ztEBK_Fs)BnD_WY_cXL{oPU`>illsw3CqlJ2Eub?2^CgyW*_lvnj&pQ^yMmL#w|sAH zeQ6&_Na5Gep0OT{Dp@EGjn-y?EZtMEw|Gnoug!ON zxoN^~bt+-}_P6Fo67W%KIBz$rj++LA;ljT*pQ?oMyAnJzs*c7B5Z1W`bQH;^q2Adj z0VTM-Q3Be(jj!fA+hEiTMhe_;jR)qRl*m^i{VL#Q4#?m_|%S#aQC7xN`_Us zCfvIee**;fhm-ekAV>2$TBR$|0_J897!f1gl{v)=fmLT8I9G|q3rQteCSdkjFfl!s9|Wy1ahuVVfZPGmtAVi<6$AV v7CvewREt7*)qJ%(dGm!rp-?Ck++_F#NGHpt5Nk#*00000NkvXXu0mjfjQbJB literal 0 HcmV?d00001 diff --git a/icons/save-50.png b/icons/save-50.png new file mode 100644 index 0000000000000000000000000000000000000000..f78bd737df1edaae683ddd41aa4b310d355ff3a3 GIT binary patch literal 379 zcmV->0fhdEP)4UZ`LSawnI}z?!kL$E6f1H71VLzx&DRSi^<}iWGNFxA>f3(84Ej(?#1p_* zX*~9laU}tP;d(MByWPw^EEHP=yUU~}g56|7i@4U~|6c&@WYQJEb~0&;U~`%DMewoD zj6%c^-bNw9P5Ka#sU_lqhZ3>*DuY1S-ST5F5hnFp-Y|%SR(}JEq){Lu6h8%)L@54~ zXGw&nl89D6K{v&Gm6dx{aFLJ_ZFYEY(R%?;u!vMhBA#IxtqK_}&#;VEg^ZSGSVn8i zqXloSg@*g~F&YsQ`7rd!yB>_jGq_+<#gJcm9c$n8hk?S7x+KuBttC z-UZa#AeOcdP{KRH_+1(A8#PZ4nj-|ivfT#=;ivy&2;n>7=5>pE_O8z{!ZSknHA?}? zcy~}NA^6dbaCUv3wHil-;6ru-EG`}&7EcI%wj-STH@CT87~f_kAR&ZrMwYO=w2)4v zc?n>=x>?)}5-x>ZN_a0D0k*ufAdFu|kkG9O31N)FxK?`s35$4gt4iOW2?^oG6=D1x z>MkH*1gC`X+qjv~rsjo^gMeu=AsYd6lb}NuIu8MJk)R_8DEp!4q&1;10b0`Y*IosR(S9F1@ENZ2G3(lY~VEgs8D0OOi4 zTpmS&P~%$IE?B<=!siykj-C@E!IL(@`H;H=Ay~B)JkWEnB79NUj@vHLkT zcMHSILiPz&r?Ys1S3|nP=a4%}@Mw59fz^;ZTkI1agzdl}3BvfX%zw4aoxc*`eOh?u eWlMyE>5D&nzWNEd#$K5K0000 + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..bb95124 --- /dev/null +++ b/main.cpp @@ -0,0 +1,23 @@ +#include "widget.h" + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "ini_utils_" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + a.installTranslator(&translator); + break; + } + } + Widget w; + w.show(); + return a.exec(); +} diff --git a/widget.cpp b/widget.cpp new file mode 100644 index 0000000..9b53246 --- /dev/null +++ b/widget.cpp @@ -0,0 +1,197 @@ +#include "widget.h" +#include "ui_widget.h" + +#include + +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; iaddTab(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 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; itabWidget->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; jrowCount(); 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); +} diff --git a/widget.h b/widget.h new file mode 100644 index 0000000..9b6d555 --- /dev/null +++ b/widget.h @@ -0,0 +1,63 @@ +#ifndef WIDGET_H +#define WIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class Widget; } +QT_END_NAMESPACE + +using record = QPair; +using records = QVector; + +class tabChapter { +public: + tabChapter(); + tabChapter(QString _name) : m_name(_name) {} + QString m_name; + records m_hash; +}; + +class myTable : public QTableWidget +{ + Q_OBJECT +public: + myTable(const records &hash = {}); +private: + void fill(const records &hash); +}; + +class Widget : public QWidget +{ + Q_OBJECT + +public: + Widget(QWidget *parent = nullptr); + ~Widget(); + +private slots: + void on_pushButton_clicked(); + void genTabs(); + void on_lineEdit_returnPressed(); + + void on_pushButton_2_clicked(); + + void on_pushButton_4_clicked(); + + void on_pushButton_3_clicked(); + +private: + Ui::Widget *ui; + void proceedFile(QFile &file); + QVector tabs; + QHash comments; + void saveDataToFile(QString &fileName); +}; +#endif // WIDGET_H diff --git a/widget.ui b/widget.ui new file mode 100644 index 0000000..f2444b1 --- /dev/null +++ b/widget.ui @@ -0,0 +1,118 @@ + + + Widget + + + + 0 + 0 + 574 + 792 + + + + + 0 + 0 + + + + + 574 + 792 + + + + + 574 + 792 + + + + ini_UTILS + + + + false + + + + 30 + 70 + 521 + 24 + + + + + + + + + + 30 + 20 + 51 + 41 + + + + + + + + + + 210 + 20 + 51 + 41 + + + + + + + + + + 149 + 20 + 51 + 41 + + + + + + + + + + 89 + 20 + 51 + 41 + + + + + + + + + + 30 + 70 + 530 + 711 + + + + -1 + + + + + +