#include "timetablewidget.h" #include "mabitimer.h" #include "sequence.h" #include "weather.h" #include #include #include #include #include #include #include #include #include #include #include static void setTableItemRowBackgroundColor(QTableWidget *widget, int row, const QVariant &value) { int columnCount = widget->columnCount(); for(int column = 0; column < columnCount; column++) { QTableWidgetItem *item = widget->item(row, column); if(item != 0) { item->setData(Qt::BackgroundColorRole, value); } else { qDebug() << "item(" << row << "," << column << ") is null"; } } } TimetableWidget::TimetableWidget(QWidget *parent) : QWidget(parent) { setObjectName("TimetableWidget"); QHBoxLayout *buttonLayout; tabWidget = new QTabWidget; mainLayout = new QVBoxLayout; buttonLayout = new QHBoxLayout; uladhTable = new QTableWidget; iriaTable = new QTableWidget; moonRuaTable = new QTableWidget; priceTable = new QTableWidget; uladhTable->setFrameStyle(QFrame::NoFrame); iriaTable->setFrameStyle(QFrame::NoFrame); moonRuaTable->setFrameStyle(QFrame::NoFrame); priceTable->setFrameStyle(QFrame::NoFrame); uladhTable->setSelectionMode(QAbstractItemView::NoSelection); iriaTable->setSelectionMode(QAbstractItemView::NoSelection); moonRuaTable->setSelectionMode(QAbstractItemView::NoSelection); priceTable->setSelectionMode(QAbstractItemView::NoSelection); tabWidget->addTab(uladhTable, QString::fromWCharArray(L"¿ï¶ó ´ë·ú ³¯¾¾")); tabWidget->addTab(iriaTable, QString::fromWCharArray(L"À̸®¾Æ ´ë·ú ³¯¾¾")); tabWidget->addTab(moonRuaTable, QString::fromWCharArray(L"¹®°ÔÀÌÆ®/·ç¾Æ")); tabWidget->addTab(priceTable, QString::fromWCharArray(L"ÇÁ¶óÀ̽º")); initializeTime(); initializeWeather(); initializeMoongate(); mainLayout->addWidget(tabWidget); updateTimer = new QTimer(this); updateTimer->start(5000); prevDayButton = new QPushButton; currDayButton = new QPushButton(QString::fromWCharArray(L"¿À´Ã")); nextDayButton = new QPushButton; prevDayButton->setIcon(QIcon(":/icons/arrowLeft.png")); currDayButton->setIcon(QIcon(":/icons/stop.png")); nextDayButton->setIcon(QIcon(":/icons/arrowRight.png")); buttonLayout->addWidget(prevDayButton); buttonLayout->addWidget(currDayButton); buttonLayout->addWidget(nextDayButton); mainLayout->addLayout(buttonLayout); setWindowTitle(QString::fromWCharArray(L"³¯¾¾ ¹× µîÀå Ç¥")); setWindowIcon(QIcon(":/icons/table.png")); setLayout(mainLayout); resize(400, 600); updateAll(); connect(prevDayButton, SIGNAL(clicked()), this, SLOT(prevDay())); connect(currDayButton, SIGNAL(clicked()), this, SLOT(currDay())); connect(nextDayButton, SIGNAL(clicked()), this, SLOT(nextDay())); connect(updateTimer, SIGNAL(timeout()), this, SLOT(updateCells())); } TimetableWidget::~TimetableWidget() { updateTimer->stop(); qDebug() << "destroyed: " << objectName(); } void TimetableWidget::initializeTime() { noon = QDateTime::currentDateTime(); noon.setTime(QTime(0, 0, 0, 0)); next = noon.addDays(1); } void TimetableWidget::initializeWeather() { QStringList rows; QStringList uladhColumns; QStringList iriaColumns; uladhColumns.append(QString::fromWCharArray(L"Ƽ¸£, µÎ°¥µå")); uladhColumns.append(QString::fromWCharArray(L"´ø¹ÙÆ°, °¡ÀÌ·¹Èå")); uladhColumns.append(QString::fromWCharArray(L"¹ÝÈ£¸£")); uladhColumns.append(QString::fromWCharArray(L"ÀÌ¸à ¸¶ÇÏ")); uladhColumns.append(QString::fromWCharArray(L"¼¾¸¶ÀÌ Æò¿ø")); uladhColumns.append(QString::fromWCharArray(L"ÄÉ¾È Ç×±¸")); iriaColumns.append(QString::fromWCharArray(L"¶ó³ë Áö¿ª")); iriaColumns.append(QString::fromWCharArray(L"ÄÜ´©½º Áö¿ª")); iriaColumns.append(QString::fromWCharArray(L"Äí¸£Å¬·¹ Áö¿ª")); iriaColumns.append(QString::fromWCharArray(L"ÀÚ¸£µò Áö¿ª")); uladhColumns.append(QString::fromWCharArray(L"±×¸²ÀÚ ¼¼°è")); uladhColumns.append(QString::fromWCharArray(L"Żƾ, Ÿ¶ó")); QDateTime current = noon; do { QTime time = current.time(); QString label = QString("%1:%2").arg(time.hour(), 2, 10, QChar('0')).arg(time.minute(), 2, 10, QChar('0')); rows.append(label); current = current.addSecs(60 * 20); } while(current.toTime_t() < next.toTime_t()); uladhTable->setRowCount(rows.size()); uladhTable->setVerticalHeaderLabels(rows); uladhTable->setColumnCount(uladhColumns.size()); uladhTable->setHorizontalHeaderLabels(uladhColumns); uladhTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); uladhTable->horizontalHeader()->setMinimumSectionSize(115); uladhTable->horizontalHeader()->setClickable(false); uladhTable->verticalHeader()->setResizeMode(QHeaderView::Fixed); uladhTable->verticalHeader()->setClickable(false); iriaTable->setRowCount(rows.size()); iriaTable->setVerticalHeaderLabels(rows); iriaTable->setColumnCount(iriaColumns.size()); iriaTable->setHorizontalHeaderLabels(iriaColumns); iriaTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); iriaTable->horizontalHeader()->setMinimumSectionSize(115); iriaTable->horizontalHeader()->setClickable(false); iriaTable->verticalHeader()->setResizeMode(QHeaderView::Fixed); iriaTable->verticalHeader()->setClickable(false); } void TimetableWidget::initializeMoongate() { QStringList rows; QStringList columns; columns.append(QString::fromWCharArray(L"¹®°ÔÀÌÆ®")); columns.append(QString::fromWCharArray(L"·ç¾Æ")); QDateTime current = noon.addSecs(60 * 27); do { QTime time = current.time(); QString label = QString("%1:%2").arg(time.hour(), 2, 10, QChar('0')).arg(time.minute(), 2, 10, QChar('0')); rows.append(label); current = current.addSecs(60 * 36); } while(current.toTime_t() < next.toTime_t()); moonRuaTable->setRowCount(rows.size()); moonRuaTable->setVerticalHeaderLabels(rows); moonRuaTable->setColumnCount(columns.size()); moonRuaTable->setHorizontalHeaderLabels(columns); moonRuaTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); moonRuaTable->horizontalHeader()->setMinimumSectionSize(115); moonRuaTable->horizontalHeader()->setClickable(false); moonRuaTable->verticalHeader()->setResizeMode(QHeaderView::Fixed); moonRuaTable->verticalHeader()->setClickable(false); current = noon; rows.clear(); columns.clear(); columns.append(QString::fromWCharArray(L"ÇÁ¶óÀ̽º")); do { QTime time = current.time(); QString label = QString("%1:%2").arg(time.hour(), 2, 10, QChar('0')).arg(time.minute(), 2, 10, QChar('0')); rows.append(label); current = current.addSecs(60 * 36); } while(current.toTime_t() < next.toTime_t()); priceTable->setRowCount(rows.size()); priceTable->setVerticalHeaderLabels(rows); priceTable->setColumnCount(columns.size()); priceTable->setHorizontalHeaderLabels(columns); priceTable->horizontalHeader()->setResizeMode(QHeaderView::Stretch); priceTable->horizontalHeader()->setMinimumSectionSize(115); priceTable->verticalHeader()->setResizeMode(QHeaderView::Fixed); } void TimetableWidget::updateAll() { updateButton(); updateWeather(); updateMoongate(); updateCells(); } void TimetableWidget::updateButton() { QDateTime now = QDateTime::currentDateTime(); QDate prevDate = noon.addDays(-1).date(); QDate nextDate = noon.addDays(1).date(); QString prevString = QString("%1-%2-%3").arg(prevDate.year()).arg(prevDate.month(), 2, 10, QChar('0')).arg(prevDate.day(), 2, 10, QChar('0')); QString nextString = QString("%1-%2-%3").arg(nextDate.year()).arg(nextDate.month(), 2, 10, QChar('0')).arg(nextDate.day(), 2, 10, QChar('0')); prevDayButton->setText(prevString); nextDayButton->setText(nextString); now.setTime(QTime(0, 0, 0, 0)); currDayButton->setEnabled(noon.toTime_t() != now.toTime_t()); } void TimetableWidget::updateWeather() { QDateTime current = noon; int rowCount = 0; int offset = noon.utcOffset(); uint endTime = next.toTime_t(); step20.clear(); do { uint timespan = current.toTime_t() - offset; QTime timeValue = current.time(); for(int i = 0; i < MabiTimer::weatherCount(); i++) { Weather *weather = MabiTimer::weather(i + 1); float weatherValue = weather->weather(timespan); Weather::WeatherType weatherType = weather->weatherType(weatherValue); QString weatherString = Weather::weatherTypeToString(weatherType); QIcon icon; if(weatherType == Weather::Clear) { icon = QIcon(":/weather/clearA.png"); } else if(weatherType == Weather::Cloud) { icon = QIcon(":/weather/cloudsA.png"); } else if(weatherType == Weather::Rain) { int amount = (int)floorf(weather->rainAmount(weatherValue) * 20); weatherString.append(" +"); weatherString.append(QString::number(amount)); icon = QIcon(":/weather/rain.png"); } else { icon = QIcon(":/weather/storm.png"); } int column; QTableWidget *tableWidget; if(i < 6) { column = i; tableWidget = uladhTable; } else if(i < 10) { column = i - 6; tableWidget = iriaTable; } else { column = i - 4; tableWidget = uladhTable; } QTableWidgetItem *tableWidgetItem = tableWidget->item(rowCount, column); if(tableWidgetItem == 0) { tableWidgetItem = new QTableWidgetItem; tableWidget->setItem(rowCount, column, tableWidgetItem); } tableWidgetItem->setIcon(icon); tableWidgetItem->setText(weatherString); } step20.append(current.toTime_t()); current = current.addSecs(60 * 20); rowCount++; } while(current.toTime_t() < endTime); } void TimetableWidget::updateMoongate() { QTableWidgetItem *item; QStringList *ruaSequence = MabiTimer::sequence()->ruaSequence(); QStringList *priceSequence = MabiTimer::sequence()->priceSequence(); QStringList *moongateSequence = MabiTimer::sequence()->moongateSequence(); uint absdays = (noon.toTime_t() - noon.utcOffset()) / (24 * 60 * 60); uint moonShift = (40 * absdays + 1) % moongateSequence->size(); uint moonCount = moongateSequence->size(); uint ruaShift = (40 * absdays) % ruaSequence->size(); uint ruaCount = ruaSequence->size(); uint priceShift = (40 * absdays + 11) % priceSequence->size(); uint priceCount = priceSequence->size(); uint idx = moonShift; uint step = noon.toTime_t() + (60 * 27); step36.clear(); for(int i = 0; i < 40; i++) { item = new QTableWidgetItem(moongateSequence->at(idx++)); item->setTextAlignment(Qt::AlignCenter); moonRuaTable->setItem(i, 0, item); if(idx >= moonCount) { idx = 0; } step36.append(step); step += 60 * 36; } idx = ruaShift; for(int i = 0; i < 40; i++) { QString rua; if(ruaSequence->at(idx++) == "1") { rua.append(QString::fromWCharArray(L"ÃâÇö")); } item = new QTableWidgetItem(rua); item->setTextAlignment(Qt::AlignCenter); moonRuaTable->setItem(i, 1, item); if(idx >= ruaCount) { idx = 0; } } idx = priceShift; step = noon.toTime_t(); step36_0.clear(); for(int i = 0; i < 40; i++) { item = new QTableWidgetItem(priceSequence->at(idx++)); item->setTextAlignment(Qt::AlignCenter); priceTable->setItem(i, 0, item); if(idx >= priceCount) { idx = 0; } step36_0.append(step); step += 60 * 36; } } void TimetableWidget::nextDay() { noon = noon.addDays(1); next = noon.addDays(1); updateAll(); } void TimetableWidget::currDay() { noon = QDateTime::currentDateTime(); noon.setTime(QTime(0, 0, 0, 0)); next = noon.addDays(1); updateAll(); } void TimetableWidget::prevDay() { noon = noon.addDays(-1); next = noon.addDays(1); updateAll(); } void TimetableWidget::updateCells() { QDate date = noon.date(); QDateTime now = QDateTime::currentDateTime(); const int step20Secs = 60 * 20; const int step36Secs = 60 * 36; const uint nowTimeSpan = now.toTime_t(); for(int row = 0; row < uladhTable->rowCount(); row++) { const uint currentStep = step20[row]; if(nowTimeSpan >= currentStep && nowTimeSpan < (currentStep + step20Secs)) { setTableItemRowBackgroundColor(iriaTable, row, palette().color(QPalette::Button)); setTableItemRowBackgroundColor(uladhTable, row, palette().color(QPalette::Button)); } else { setTableItemRowBackgroundColor(iriaTable, row, QVariant()); setTableItemRowBackgroundColor(uladhTable, row, QVariant()); } } for(int row = 0; row < moonRuaTable->rowCount(); row++) { const uint currentStep = step36[row]; if(nowTimeSpan >= currentStep && nowTimeSpan < (currentStep + step36Secs)) { setTableItemRowBackgroundColor(moonRuaTable, row, palette().color(QPalette::Button)); } else { setTableItemRowBackgroundColor(moonRuaTable, row, QVariant()); } } for(int row = 0; row < priceTable->rowCount(); row++) { const uint currentStep = step36_0[row]; if(nowTimeSpan >= currentStep && nowTimeSpan < (currentStep + step36Secs)) { setTableItemRowBackgroundColor(priceTable, row, palette().color(QPalette::Button)); } else { setTableItemRowBackgroundColor(priceTable, row, QVariant()); } } updateButton(); }