mirror of
https://github.com/edisionnano/QDiskInfo.git
synced 2026-03-25 14:10:51 +03:00
Mockup grid view
This commit is contained in:
146
src/gridview.cpp
Normal file
146
src/gridview.cpp
Normal file
@@ -0,0 +1,146 @@
|
||||
#include "gridview.h"
|
||||
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QFrame>
|
||||
#include <QIcon>
|
||||
#include <QCheckBox>
|
||||
#include <QComboBox>
|
||||
#include <QPalette>
|
||||
#include <QLineEdit>
|
||||
|
||||
int gridLayoutSpacing = 10;
|
||||
int iconButtonSize = 64;
|
||||
|
||||
GridView::GridView(QWidget *parent) : QWidget(parent) {
|
||||
setWindowTitle(tr("Grid View"));
|
||||
resize(600, 300);
|
||||
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout(this);
|
||||
|
||||
QComboBox *searchField = new QComboBox();
|
||||
searchField->setEditable(true);
|
||||
connect(searchField->lineEdit(), &QLineEdit::textChanged, this, [this](const QString &text) {
|
||||
this->searchQuery = text;
|
||||
populateGrid();
|
||||
});
|
||||
mainLayout->addWidget(searchField);
|
||||
|
||||
QPalette palette = this->palette();
|
||||
bgColor = palette.color(QPalette::Base).name();
|
||||
borderColor = palette.color(QPalette::Mid).name();
|
||||
hoverColor = palette.color(QPalette::Highlight).name();
|
||||
selectedColor = palette.color(QPalette::Highlight).name();
|
||||
|
||||
QFrame *gridFrame = new QFrame();
|
||||
gridFrame->setStyleSheet(QString(
|
||||
"QFrame { background-color: %1; border-radius: 5px; }"
|
||||
).arg(bgColor, borderColor));
|
||||
|
||||
scrollArea = new QScrollArea();
|
||||
scrollArea->setWidgetResizable(true);
|
||||
scrollArea->setFrameStyle(QFrame::NoFrame);
|
||||
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
scrollArea->setWidget(gridFrame);
|
||||
mainLayout->addWidget(scrollArea);
|
||||
|
||||
gridContainer = new QWidget();
|
||||
gridLayout = new QGridLayout(gridContainer);
|
||||
gridLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter);
|
||||
gridLayout->setSpacing(gridLayoutSpacing);
|
||||
gridFrame->setLayout(gridLayout);
|
||||
disks = {
|
||||
{"/dev/sda", "40C", "Bad"},
|
||||
{"/dev/sdb", "40C", "Good"},
|
||||
{"/dev/sdc", "40C", "Unknown"},
|
||||
{"/dev/sdd", "40C", "Warning"}
|
||||
};
|
||||
populateGrid();
|
||||
|
||||
setLayout(mainLayout);
|
||||
}
|
||||
|
||||
void GridView::resizeEvent(QResizeEvent *) {
|
||||
populateGrid();
|
||||
}
|
||||
|
||||
void GridView::populateGrid() {
|
||||
selectedButton = nullptr;
|
||||
QLayoutItem *child;
|
||||
while ((child = gridLayout->takeAt(0)) != nullptr) {
|
||||
delete child->widget();
|
||||
delete child;
|
||||
}
|
||||
|
||||
int width = scrollArea->viewport()->width();
|
||||
int columnsFormula = (width + gridLayoutSpacing) / (iconButtonSize + gridLayoutSpacing);
|
||||
int cols = qMax(1, columnsFormula - 1);
|
||||
int row = 0, col = 0;
|
||||
|
||||
|
||||
QVector<DiskItem> filteredDisks;
|
||||
filteredDisks.reserve(disks.size());
|
||||
|
||||
for (auto it = disks.cbegin(); it != disks.cend(); ++it) {
|
||||
const DiskItem &disk = *it;
|
||||
if (searchQuery.isEmpty() ||
|
||||
disk.name.contains(searchQuery, Qt::CaseInsensitive) ||
|
||||
disk.category.contains(searchQuery, Qt::CaseInsensitive)) {
|
||||
filteredDisks.append(disk);
|
||||
}
|
||||
}
|
||||
|
||||
extracted(filteredDisks, cols, row, col);
|
||||
}
|
||||
|
||||
void GridView::extracted(const QVector<DiskItem> &filteredDisks, int &cols, int &row, int &col) {
|
||||
for (int i = 0; i < filteredDisks.size(); ++i) {
|
||||
const auto &disk = filteredDisks[i];
|
||||
QWidget *diskWidget = new QWidget();
|
||||
QVBoxLayout *diskLayout = new QVBoxLayout(diskWidget);
|
||||
diskLayout->setAlignment(Qt::AlignCenter);
|
||||
diskLayout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
QPushButton *iconButton = new QPushButton();
|
||||
QString iconPath = QString(":/icons/Disk_%1.svg").arg(disk.icon);
|
||||
iconButton->setIcon(QIcon(iconPath));
|
||||
iconButton->setIconSize(QSize(48, 48));
|
||||
iconButton->setFixedSize(iconButtonSize, iconButtonSize);
|
||||
iconButton->setStyleSheet(
|
||||
QString("QPushButton { border: 2px solid transparent; "
|
||||
"border-radius: 10px; }"
|
||||
"QPushButton:hover { background-color: %1; }"
|
||||
"QPushButton:pressed { border: 2px solid %2; }")
|
||||
.arg(hoverColor, selectedColor));
|
||||
|
||||
QLabel *nameLabel = new QLabel(disk.name);
|
||||
nameLabel->setAlignment(Qt::AlignCenter);
|
||||
QLabel *categoryLabel = new QLabel(disk.category);
|
||||
categoryLabel->setAlignment(Qt::AlignCenter);
|
||||
categoryLabel->setStyleSheet("font-size: 10px; color: gray;");
|
||||
|
||||
connect(iconButton, &QPushButton::clicked, this, [this, iconButton]() {
|
||||
if (selectedButton) {
|
||||
selectedButton->setStyleSheet(iconButton->styleSheet());
|
||||
}
|
||||
selectedButton = iconButton;
|
||||
selectedButton->setStyleSheet(
|
||||
QString(
|
||||
"QPushButton { border: 2px solid %1; background-color: %2; }")
|
||||
.arg(selectedColor, hoverColor));
|
||||
});
|
||||
|
||||
diskLayout->addWidget(iconButton, 0, Qt::AlignCenter);
|
||||
diskLayout->addWidget(nameLabel, 0, Qt::AlignCenter);
|
||||
diskLayout->addWidget(categoryLabel, 0, Qt::AlignCenter);
|
||||
diskWidget->setLayout(diskLayout);
|
||||
gridLayout->addWidget(diskWidget, row, col);
|
||||
|
||||
col++;
|
||||
if (col >= cols) {
|
||||
col = 0;
|
||||
row++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "statusdot.h"
|
||||
#include "custombutton.h"
|
||||
#include "jsonparser.h"
|
||||
#include "gridview.h"
|
||||
|
||||
#include <QDesktopServices>
|
||||
#include <QFileDialog>
|
||||
@@ -244,7 +245,12 @@ void MainWindow::updateUI()
|
||||
}
|
||||
} else if (isScsi) {
|
||||
QJsonObject scsiErrorCounterLog = localObj.value("scsi_error_counter_log").toObject();
|
||||
for (const QString key : {"read", "write", "verify"}) {
|
||||
static const QString keys[] = {
|
||||
QStringLiteral("read"),
|
||||
QStringLiteral("write"),
|
||||
QStringLiteral("verify")
|
||||
};
|
||||
for (const QString& key : keys) {
|
||||
if (scsiErrorCounterLog.value(key).toObject().value("total_uncorrected_errors").toInt() != 0) {
|
||||
caution = true;
|
||||
}
|
||||
@@ -1372,7 +1378,7 @@ void MainWindow::on_actionASCII_View_triggered()
|
||||
|
||||
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Close, asciiViewDialog);
|
||||
connect(buttonBox, &QDialogButtonBox::rejected, asciiViewDialog, &QDialog::close);
|
||||
connect(buttonBox->button(QDialogButtonBox::Save), &QPushButton::clicked, [binaryData, this, deviceNodePath]() {
|
||||
connect(buttonBox->button(QDialogButtonBox::Save), &QPushButton::clicked, this, [binaryData, this, deviceNodePath]() {
|
||||
QString filePath = QFileDialog::getSaveFileName(this, tr("Save Binary Data"), deviceNodePath.section('/', -1) + ".bin", tr("Binary Files (*.bin);;All Files (*)"));
|
||||
if (!filePath.isEmpty()) {
|
||||
QFile file(filePath);
|
||||
@@ -1395,3 +1401,11 @@ void MainWindow::on_actionASCII_View_triggered()
|
||||
asciiViewDialog->exec();
|
||||
}
|
||||
|
||||
|
||||
void MainWindow::on_actionGrid_View_triggered()
|
||||
{
|
||||
auto *gridView = new GridView(nullptr);
|
||||
gridView->setAttribute(Qt::WA_DeleteOnClose);
|
||||
gridView->show();
|
||||
}
|
||||
|
||||
|
||||
@@ -534,6 +534,8 @@
|
||||
<property name="title">
|
||||
<string>Disk</string>
|
||||
</property>
|
||||
<addaction name="actionGrid_View"/>
|
||||
<addaction name="separator"/>
|
||||
</widget>
|
||||
<addaction name="menuFile"/>
|
||||
<addaction name="menuDevice"/>
|
||||
@@ -651,6 +653,14 @@
|
||||
<string>ASCII View</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGrid_View">
|
||||
<property name="icon">
|
||||
<iconset theme="start-here"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Grid View</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="resources.qrc"/>
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<RCC>
|
||||
<qresource prefix="/icons">
|
||||
<file alias="icon.svg">../dist/QDiskInfo.svg</file>
|
||||
<file alias="Disk_Good.svg">../dist/status/Disk_Good.svg</file>
|
||||
<file alias="Disk_Bad.svg">../dist/status/Disk_Bad.svg</file>
|
||||
<file alias="Disk_Warning.svg">../dist/status/Disk_Warning.svg</file>
|
||||
<file alias="Disk_Unknown.svg">../dist/status/Disk_Unknown.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <QProcess>
|
||||
#include <QPushButton>
|
||||
#include <QTimer>
|
||||
#include <qactiongroup.h>
|
||||
|
||||
void utils::clearButtonGroup(QButtonGroup* buttonGroup, QHBoxLayout* horizontalLayout, QSpacerItem* buttonStretch, QMenu* menuDisk)
|
||||
{
|
||||
@@ -19,7 +20,19 @@ void utils::clearButtonGroup(QButtonGroup* buttonGroup, QHBoxLayout* horizontalL
|
||||
}
|
||||
horizontalLayout->removeItem(buttonStretch);
|
||||
delete buttonStretch;
|
||||
menuDisk->clear();
|
||||
|
||||
// Dirty hack to remove only the radio buttons
|
||||
QList<QAction*> actions = menuDisk->actions();
|
||||
bool foundSeparator = false;
|
||||
|
||||
for (int i = 0; i < actions.size(); ++i) {
|
||||
QAction* action = actions[i];
|
||||
if (foundSeparator) {
|
||||
menuDisk->removeAction(action);
|
||||
} else if (action->isSeparator()) {
|
||||
foundSeparator = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QString utils::getSmartctlPath() {
|
||||
|
||||
Reference in New Issue
Block a user