1
0
Files
2021-01-11 13:59:25 +01:00

319 lines
6.7 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QCloseEvent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, trayIcon(new QSystemTrayIcon(this))
{
ui->setupUi(this);
connect(ui->pushButton_kw_berechnen, SIGNAL(clicked()), SLOT(dateCalculate()));
connect(ui->pushButton_datum_berechnen, SIGNAL(clicked()), SLOT(kwCalculate()));
//Tray icon menu
auto menu = this->createMenu();
this->trayIcon->setContextMenu(menu);
QDate *dateToday= new QDate( QDate::currentDate() );
ui->dateEdit_kw_berechnen->setDate(*dateToday);
dateCalculate();
datum heute (dateToday->day(), dateToday->month(), dateToday->year());
ui->spinBox_datum_jahr->setValue(heute.getJahr());
ui->spinBox_datum_kw->setValue(heute.kwBerechnen());
kwCalculate();
QPixmap pixmap(24,24);
pixmap.fill(Qt::white);
QPainter painter(&pixmap);
painter.drawText(pixmap.rect(),Qt::AlignCenter,QString::number(heute.kwBerechnen()));
// App icon
auto appIcon = QIcon(pixmap);
this->trayIcon->setIcon(appIcon);
this->setWindowIcon(appIcon);
// Displaying the tray icon
this->trayIcon->show();
// Interaction
connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::iconActivated);
}
QMenu* MainWindow::createMenu()
{
// App can exit via Quit menu
auto quitAction = new QAction("&Quit", this);
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
auto menu = new QMenu(this);
menu->addAction(quitAction);
return menu;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason_)
{
switch (reason_) {
case QSystemTrayIcon::Trigger:
if (isHidden())
show();
else
hide();
break;
default:
;
}
}
void MainWindow::dateCalculate()
{
QDate date1 = ui->dateEdit_kw_berechnen->date();
int day = date1.day();
int month = date1.month();
int year = date1.year();
datum datum1 (day, month, year);
ui->lineEdit_kw_berechnen_ausgabe->setText(QString::number(datum1.kwBerechnen()));
}
void MainWindow::kwCalculate()
{
int kw = ui->spinBox_datum_kw->value();
int jahr = ui->spinBox_datum_jahr->value();
if (kw == 53 && datum(3,1,jahr+1).kwBerechnen() == 1) {
kw = 1;
ui->spinBox_datum_kw->setValue(kw);
jahr += 1;
ui->spinBox_datum_jahr->setValue(jahr);
}
datum start = datum::kwStartBerechnen(kw, jahr);
datum ende = datum::kwEndeBerechnen(start);
QString ausgabe = QString::number(start.getTag()) + "." + QString::number(start.getMonat()) + "." + QString::number(start.getJahr())
+ " - " + QString::number(ende.getTag()) + "." + QString::number(ende.getMonat()) + "." + QString::number(ende.getJahr());
ui->lineEdit_datum_berechnen_ausgabe->setText(ausgabe);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
hide();
event->ignore();
}
int datum::getTag()
{
return tag;
}
int datum::getMonat()
{
return monat;
}
int datum::getJahr()
{
return jahr;
}
bool datum::schaltjahrBestimmen(int jahr) {
bool sjahr = 0;
if (!((jahr % 4) || !(jahr % 100)) || !((jahr % 4) || (jahr % 400)))
sjahr = 1;
return sjahr;
}
datum::datum() {
tag = 1;
monat = 1;
jahr = 2020;
schaltjahr = schaltjahrBestimmen(jahr);
}
datum::datum(int t, int m, int j) {
tag = t;
monat = m;
jahr = j;
schaltjahr = schaltjahrBestimmen(j);
}
datum::~datum() {
}
void datum::ausgeben() {
cout << tag << " tag " << monat << " Monat " << jahr << " Jahr " << schaltjahr << endl;
}
int datum::wochentag()
{
int year = jahr;
int m = monat;
if (m < 3)
year--;
string yearst = to_string(year);
string cst = yearst.substr(0, 2);
string yst = yearst.substr(2, 4);
int y = stoi(yst);
int c = stoi(cst);
int d = tag;
if (m == 1 || m == 2)
m += 10;
else
m -= 2;
int w = (d + (int)(2.6 * m - 0.2) + y + (int)(y / 4) + (int)(c / 4) - 2 * c) % 7;
if (w < 0)
w += 7;
return w;
}
int datum::kwBerechnen()
{
int monate[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int tage = 0;
if (monat == 1)
tage = tag;
else
{
for (int i = 0; i < monat - 1; i++)
tage += monate[i];
tage += tag;
}
if (schaltjahrBestimmen(jahr) == 1 && monat > 2)
tage += 1;
datum ersteJan(1, 1, jahr);
int wochentagErste = ersteJan.wochentag();
int offset = 0;
int kw = 0;
if (wochentagErste <= 4) {
offset = wochentagErste - 2;
kw += 1;
}
else {
offset = (8 - wochentagErste) % 7;
offset = 7 - (offset+1);
}
kw += ((tage + offset) / 7);
if (kw == 0)
{
datum datum2(31, 12, jahr - 1);
if (datum2.kwBerechnen() == 52)
kw = 52;
else
kw = 53;
}
else if (kw == 53)
{
datum datum1(1, 1, jahr + 1);
if (datum1.wochentag() < 4)
kw = 1;
}
return kw;
}
void datum::changeMonat(int m)
{
monat = (monat+m)%12;
if (monat == 0)
monat = 12;
}
void datum::changeTag(int t)
{
tag += t;
}
void datum::changeJahr(int j)
{
jahr += j;
}
datum datum::kwStartBerechnen(int kw, int jahr)
{
datum datumErste(1, 1, jahr);
int kwAnfang = datumErste.kwBerechnen();
if (kwAnfang == 53 || kwAnfang == 52)
{
datumErste.changeTag(3);
kwAnfang = 1;
}
int wochentag = datumErste.wochentag();
for (int i = 1; i < wochentag; i++)
{
datumErste.changeTag(-1);
}
int monate[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (datumErste.schaltjahrBestimmen(jahr))
monate[1] = 29;
int stelle = 0;
for (int i = 1; i < kw; i++)
{
datumErste.changeTag(7);
if (datumErste.getTag() > monate[stelle])
{
datumErste.changeTag(-(monate[stelle]));
datumErste.changeMonat(1);
stelle++;
}
}
if (datumErste.getTag()<1)
datumErste = kwStartBerechnen(53, jahr-1);
else if (datumErste.wochentag()==0)
datumErste.changeTag(1);
return datumErste;
}
datum datum::kwEndeBerechnen(datum start)
{
int monate[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int vorMonat = start.getMonat();
if (start.schaltjahrBestimmen(start.getJahr()))
monate[1] = 29;
start.changeTag(6);
if (start.getTag()>monate[start.getMonat()-1]) {
start.changeTag(-(monate[start.getMonat()-1]));
start.changeMonat(1);
if (vorMonat==12 && start.getMonat() == 1)
start.changeJahr(1);
}
return start;
}