Loading files
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <librepcb/common/fileio/sexpression.h>
#include <librepcb/common/fileio/transactionalfilesystem.h>
#include <librepcb/library/elements.h>
#include <librepcb/workspace/library/workspacelibrarydb.h>
#include <QtCore>
#include <QtWidgets>
using namespace librepcb;
using namespace librepcb::library;
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
QSettings s;
restoreGeometry(s.value("mainwindow/geometry").toByteArray());
restoreState(s.value("mainwindow/state").toByteArray());
ui->libDirs->addItems(s.value("mainwindow/lib_dirs").toStringList());
ui->cbx_lplib->setChecked(s.value("mainwindow/cbx_lplib", true).toBool());
ui->cbx_cmpcat->setChecked(s.value("mainwindow/cbx_cmpcat", true).toBool());
ui->cbx_pkgcat->setChecked(s.value("mainwindow/cbx_pkgcat", true).toBool());
ui->cbx_sym->setChecked(s.value("mainwindow/cbx_sym", true).toBool());
ui->cbx_pkg->setChecked(s.value("mainwindow/cbx_pkg", true).toBool());
ui->cbx_cmp->setChecked(s.value("mainwindow/cbx_cmp", true).toBool());
ui->cbx_dev->setChecked(s.value("mainwindow/cbx_dev", true).toBool());
if (ui->libDirs->count() > 0)
lastDir = ui->libDirs->item(ui->libDirs->count() - 1)->text();
}
MainWindow::~MainWindow() {
QStringList libDirList;
for (int i = 0; i < ui->libDirs->count(); i++)
libDirList.append(ui->libDirs->item(i)->text());
QSettings s;
s.setValue("mainwindow/geometry", saveGeometry());
s.setValue("mainwindow/state", saveState());
s.setValue("mainwindow/lib_dirs", QVariant::fromValue(libDirList));
s.setValue("mainwindow/cbx_lplib", ui->cbx_lplib->isChecked());
s.setValue("mainwindow/cbx_cmpcat", ui->cbx_cmpcat->isChecked());
s.setValue("mainwindow/cbx_pkgcat", ui->cbx_pkgcat->isChecked());
s.setValue("mainwindow/cbx_sym", ui->cbx_sym->isChecked());
s.setValue("mainwindow/cbx_pkg", ui->cbx_pkg->isChecked());
s.setValue("mainwindow/cbx_cmp", ui->cbx_cmp->isChecked());
s.setValue("mainwindow/cbx_dev", ui->cbx_dev->isChecked());
delete ui;
}
void MainWindow::on_addDirectoryBtn_clicked() {
QFileDialog dialog(this, "Select Directories", lastDir);
dialog.setFileMode(QFileDialog::Directory);
dialog.setOptions(QFileDialog::ShowDirsOnly | QFileDialog::ReadOnly |
QFileDialog::HideNameFilterDetails |
QFileDialog::DontUseNativeDialog);
QListView* l = dialog.findChild<QListView*>("listView");
if (l) l->setSelectionMode(QAbstractItemView::MultiSelection);
QTreeView* t = dialog.findChild<QTreeView*>();
if (t) t->setSelectionMode(QAbstractItemView::MultiSelection);
if (dialog.exec()) {
ui->libDirs->addItems(dialog.selectedFiles());
}
lastDir = dialog.directory().absolutePath();
}
void MainWindow::on_removeDirectoryBtn_clicked() {
qDeleteAll(ui->libDirs->selectedItems());
}
void MainWindow::on_clrLibraryBtn_clicked() {
ui->libDirs->clear();
}
void MainWindow::on_updateBtn_clicked() {
if (ui->libDirs->count() == 0) return;
ui->log->clear();
elementCount = 0;
ignoreCount = 0;
errorCount = 0;
for (int i = 0; i < ui->libDirs->count(); i++) {
QString dirStr = ui->libDirs->item(i)->text();
try {
std::shared_ptr<TransactionalFileSystem> fs =
TransactionalFileSystem::openRW(FilePath(dirStr));
library::Library lib(std::unique_ptr<TransactionalDirectory>(
new TransactionalDirectory(fs)));
if (ui->cbx_cmpcat->isChecked())
updateElements<ComponentCategory>(fs, lib);
if (ui->cbx_pkgcat->isChecked()) updateElements<PackageCategory>(fs, lib);
if (ui->cbx_sym->isChecked()) updateElements<Symbol>(fs, lib);
if (ui->cbx_pkg->isChecked()) updateElements<Package>(fs, lib);
if (ui->cbx_cmp->isChecked()) updateElements<Component>(fs, lib);
if (ui->cbx_dev->isChecked()) updateElements<Device>(fs, lib);
if (ui->cbx_lplib->isChecked()) {
lib.save();
fs->save();
elementCount++;
}
} catch (Exception& e) {
ui->log->addItem("ERROR: " % e.getMsg());
errorCount++;
}
}
ui->log->addItem(QString("FINISHED: %1 updated, %2 ignored, %3 errors")
.arg(elementCount)
.arg(ignoreCount)
.arg(errorCount));
ui->log->setCurrentRow(ui->log->count() - 1);
}
template <typename ElementType>
void MainWindow::updateElements(std::shared_ptr<TransactionalFileSystem> fs,
const library::Library& lib) noexcept {
foreach (const QString& path, lib.searchForElements<ElementType>()) {
if (path.contains("00000000-0000-4001-8000-000000000000")) {
// ignore demo files as they contain documentation which would be removed
ignoreCount++;
continue;
}
try {
ElementType element(std::unique_ptr<TransactionalDirectory>(
new TransactionalDirectory(fs, path)));
element.save();
fs->save();
ui->log->addItem(fs->getAbsPath(path).toNative());
elementCount++;
} catch (const Exception& e) {
ui->log->addItem("ERROR: " % e.getMsg());
errorCount++;
}
}
}
9b2f48454This file is pinned to the selected release. Download the original to open it in your design tool.