From 29a63fc5f2f4f0ec5be6d9ff6a688550f48fe88e Mon Sep 17 00:00:00 2001 From: Joshua Drake Date: Tue, 31 Jan 2023 09:22:48 -0600 Subject: Initial Commit. :) --- engineeringpage.cpp | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++ engineeringpage.h | 72 +++++++++++++++++++ 2 files changed, 272 insertions(+) create mode 100644 engineeringpage.cpp create mode 100644 engineeringpage.h diff --git a/engineeringpage.cpp b/engineeringpage.cpp new file mode 100644 index 0000000..695c697 --- /dev/null +++ b/engineeringpage.cpp @@ -0,0 +1,200 @@ +/* + Class for making engineering pages + Created by Joshua Drake + 6/9/2022 +*/ +#include "engineeringpage.h" + +engineeringpage::engineeringpage(QWidget *parent) : QWidget(parent) , + rows(0) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + title->setText("Null"); + title->setFrameStyle(QFrame::NoFrame); + title->setAlignment(Qt::AlignCenter | Qt::AlignCenter ); + title->setGeometry(0,0,SCREEN_WIDTH,20); + + table->setAlternatingRowColors(true); + table->setFrameStyle(QFrame::NoFrame); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + initializestylesheet(); +} +engineeringpage::engineeringpage(QString titletext, QStringList message_names,QWidget *parent) : QWidget(parent) , + rows(0) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + title->setText("Null"); + title->setFrameStyle(QFrame::NoFrame); + title->setAlignment(Qt::AlignCenter | Qt::AlignCenter ); + title->setGeometry(0,0,SCREEN_WIDTH,20); + + table->setAlternatingRowColors(true); + table->setFrameStyle(QFrame::NoFrame); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + initializestylesheet(); + configure(titletext, message_names); +} + +void engineeringpage::initializestylesheet() +{ + table->setStyleSheet( + "QTableView" + "{" + "padding: 0px 0px 0px 0px;" + "background-color: black;" + "alternate-background-color: white;" + "selection-background-color: white;" + "/*border: 1px solid white;*/" + "border-width: 1px;" + "border-radius: 5px;" + "border-color: white;" + "border-style: outset;" + "}" + "QTableView::item" + "{" + "color: white;" + "background-color: black;" + "alternate-background-color: white;" + "border-bottom: 1px dotted white;" + "}" + + "QHeaderView::section" + " {" + "background-color: black;" + "border-right: 1px solid white;" + "border-bottom: 1px solid white;" + "text-align: center;" + "padding: 0px 0px;" + "}"); +} +void engineeringpage::configure(QString titletext, QStringList message_names) +{ + rows = message_names.length(); + title->setText(titletext); + title->setGeometry(0,0,SCREEN_WIDTH,SCREEN_HEIGHT*.10); + + table->setColumnCount(1); + table->setRowCount(rows); + table->setFrameShape(QFrame::NoFrame); + table->setGeometry(0,(SCREEN_HEIGHT*.10),SCREEN_WIDTH,SCREEN_HEIGHT - (SCREEN_HEIGHT*.10)); + table->setSelectionBehavior(QAbstractItemView::SelectRows); + verticalheader = table->verticalHeader(); + verticalheader->setMinimumSectionSize(1); + verticalheader->setDefaultSectionSize((SCREEN_HEIGHT - (SCREEN_HEIGHT*.10))/rows); + verticalheader->setMaximumSectionSize(SCREEN_HEIGHT); + + //verticalheader->setSectionResizeMode(QHeaderView::Fixed); + verticalheader->setAlternatingRowColors(true); + verticalheader->setFixedWidth(SCREEN_WIDTH * .40); + + horizontalheader = table->horizontalHeader(); + horizontalheader->setSectionResizeMode(QHeaderView::Stretch); + horizontalheader->setMaximumSectionSize(SCREEN_WIDTH); + horizontalheader->setVisible(false); + + + + table->setVerticalHeaderLabels(message_names); + // table->verticalHeader()->font().setCapitalization(true); + QFont tableFont("System", verticalheader->height(), QFont::Bold, false); + tableFont.setCapitalization(QFont::MixedCase); + const int dataFontSize = table->verticalHeader()->rect().height(); + + + verticalheader->setFont(tableFont); + for(int x = 0; x < rows; x++) + { + //qDebug() << message_names.at(x).length(); + /*if(message_names.at(x).length() > 10)tableFont.setPointSizeF((verticalheader->width())/(message_names.at(x).length())); + else tableFont.setPixelSize((verticalheader->width())/(message_names.at(x).length())); //adjust font to be relative to header width and number of characters within the label + */ + tableFont.setPointSizeF(table->verticalHeader()->rect().height()); + table->verticalHeaderItem(x)->setFont(tableFont); + //table->verticalHeaderItem(x)->setTextAlignment(Qt::AlignCenter); + + + QTableWidgetItem *instance = new QTableWidgetItem(); + QTableWidgetItem *v_instance = new QTableWidgetItem(); + tableFont.setPixelSize(dataFontSize); + + instance->setTextAlignment(Qt::AlignCenter); + instance->setFont(tableFont); + //instance->setText(message_names.at(x)); + v_instance->setTextAlignment(Qt::AlignCenter); + v_instance->setFont(tableFont); + v_instance->setText(message_names.at(x)); + tableHeader.push_back(v_instance); + tableData.push_back(instance); + + if(textOverhang(tableHeader[x],message_names.at(x))) + { + v_instance->setTextAlignment(Qt::AlignLeft); + v_instance->setTextAlignment(Qt::AlignVCenter); + + text_scrolling.insert(tableHeader[x],scrollText(message_names.at(x))); + } + table->setVerticalHeaderItem(x,tableHeader[x]); + table->setItem(x,0,tableData[x]); + + //qDebug() << table->verticalHeaderItem(x) << " : " << table->item(x,0); + } + scroll_timer.setInterval(350); + connect(&scroll_timer, SIGNAL(timeout()), this, SLOT(check_scroll())); + scroll_timer.start(); +} + +void engineeringpage::update(int row, QString message_data) +{ + if(row >= rows) return; + tableData[row]->setText(message_data); +} +void engineeringpage::update(QStringList message_data) +{ + for(int x = 0; (x < tableData.size()) && (x < message_data.size()); x++) tableData[x]->setText(message_data.at(x)); +} +void engineeringpage::update(QList message_data) +{ + for(int x = 0; (x < tableData.size()) && (x < message_data.size()); x++) tableData[x]->setData(Qt::DisplayRole,message_data.at(x)); + //qDebug() << message_data; +} +void engineeringpage::update(QByteArray message_data) +{ + for(int x = 0; x < (x < tableData.size()) && (x < message_data.size()); x++) tableData[x]->setData(Qt::DisplayRole,message_data.at(x)); + //qDebug() << message_data; +} +bool engineeringpage::textOverhang(QTableWidgetItem *instance, QString text) +{ + QFontMetrics fm(instance->font()); + + if(fm.horizontalAdvance(text) > table->verticalHeader()->rect().width()) return true; + return false; +} + +void engineeringpage :: check_scroll(void) +{ + + QMap::iterator i; + for (i = text_scrolling.begin(); i != text_scrolling.end(); ++i) + { + if(i.value().scrolled) + { + if(i.value().position > 0) + { + i.value().position--; + i.key()->setText(i.value().fullText.right(i.value().fullText.length() - i.value().position)); + } + else i.value().scrolled = false; + } + else + { + if(textOverhang(i.key(),i.value().fullText.right(i.value().fullText.length() - i.value().position))) + { + i.value().position++; + i.key()->setText(i.value().fullText.right(i.value().fullText.length() - i.value().position)); + } + else i.value().scrolled = true; + } + } +} + + diff --git a/engineeringpage.h b/engineeringpage.h new file mode 100644 index 0000000..506d846 --- /dev/null +++ b/engineeringpage.h @@ -0,0 +1,72 @@ +#ifndef ENGINEERINGPAGE_H +#define ENGINEERINGPAGE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "stdlib.h" + +#define SCREEN_HEIGHT 240 +#define SCREEN_WIDTH 320 + +class engineeringpage : public QWidget +{ + Q_OBJECT +public: + explicit engineeringpage(QWidget *parent = nullptr); + explicit engineeringpage(QString titletext, QStringList message_names, QWidget *parent = nullptr); + void configure(QString titletext, QStringList message_names); + +signals: + +public slots: + void update(QStringList message_data); + void update(int row, QString message_data); + void update(QList message_data); + void update(QByteArray message_data); +private slots: + void check_scroll(void); + +private: + typedef struct scrollText + { + scrollText () : fullText("") + { + position = 0; + scrolled = false; + } + scrollText(QString s) + { + fullText = s; + position = 0; + scrolled = false; + } + int position; + QString fullText; + bool scrolled; + } scrollText; + + int rows; + QString titletext; + QTableWidget *table = new QTableWidget(this); + QLabel *title = new QLabel(this); + QHeaderView *verticalheader, *horizontalheader; + std::vector tableHeader; + std::vector tableData; + void initializestylesheet(void); + bool textOverhang(QTableWidgetItem *instance, QString text); + QMap text_scrolling; + QTimer scroll_timer; + +}; + +#endif // ENGINEERINGPAGE_H -- cgit v1.2.3