File: TimeTrackingView.h

package info (click to toggle)
charmtimetracker 1.12.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 3,340 kB
  • sloc: cpp: 19,176; xml: 284; python: 120; makefile: 14
file content (130 lines) | stat: -rw-r--r-- 3,840 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
  TimeTrackingView.h

  This file is part of Charm, a task-based time tracking application.

  Copyright (C) 2014-2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com

  Author: Frank Osterfeld <frank.osterfeld@kdab.com>

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef TimeTrackingView_H
#define TimeTrackingView_H

#include <QWidget>
#include <QVector>
#include <QMenu>

#include "Core/Task.h"
#include "TimeTrackingTaskSelector.h"

class QPalette;
class QToolBar;

class TimeTrackingView : public QWidget
{
    Q_OBJECT
private:
    struct DataField {
        QString text;
        QBrush background;
        bool hasHighlight = false; // QBrush does not have isValid()
        bool storeAsActive = false;
        QBrush highlight;
        QFont font;
    };

    /** A struct to store the attributes used during painting.
      The initialize function has and this class have been factored out for performance reasonsduring profiling. */
    struct PaintAttributes {
        QBrush headerBrush;
        QBrush taskBrushEven;
        QBrush taskBrushOdd;
        QBrush totalsRowBrush;
        QBrush totalsRowEvenDayBrush;
        QBrush headerEvenDayBrush;
        QBrush halfHighlight;
        QColor runningTaskColor;
        float dim;
        void initialize(const QPalette &palette);
    };

public:
    explicit TimeTrackingView(QWidget *parent = nullptr);
    void paintEvent(QPaintEvent *) override;
    void resizeEvent(QResizeEvent *) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override;

    void setSummaries(const QVector<WeeklySummary> &summaries);
    QSize sizeHint() const override;
    QSize minimumSizeHint() const override;
    QMenu *menu() const;

    void populateEditMenu(QMenu *);

    void handleActiveEvents();

    bool isTracking() const;

    void configurationChanged();

Q_SIGNALS:
    void startEvent(TaskId);
    void stopEvents();
    void taskMenuChanged();

private Q_SLOTS:
    void slotUpdateSummaries();

private:
    void data(DataField &out, int column, int row) const;
    int columnCount() const
    {
        return 9;
    }

    int rowCount() const
    {
        return qMax(6, m_summaries.count()) + 3;
    }

    int getSummaryAt(const QPoint &position);
    bool taskIsValidAndTrackable(int taskId);

    int taskColumnWidth() const;

    QVector<WeeklySummary> m_summaries;
    mutable QSize m_cachedSizeHint;
    mutable QSize m_cachedMinimumSizeHint;
    mutable QRect m_cachedTotalsFieldRect;
    mutable QRect m_cachedDayFieldRect;
    mutable QFont m_fixedFont;
    mutable QFont m_narrowFont;
    TimeTrackingTaskSelector *m_taskSelector;
    QList<QRect> m_activeFieldRects;
    PaintAttributes m_paintAttributes;
    DataField m_defaultField;
    /** Stored for performance reasons, QDate::currentDate() is expensive. */
    int m_dayOfWeek = 0;
    /** Stored for performance reasons, QDate::shortDayName() is slow on Mac. */
    QString m_shortDayNames[7];
    /** Stored for performance reasons, QFontMetrics::elidedText is slow if called many times. */
    QMap<QString, QString> m_elidedTexts;
    QString elidedText(const QString &text, const QFont &font, int width);
};

#endif