summaryrefslogtreecommitdiff
path: root/plugins/HistoryStats/src/column_splittimeline.h
blob: 98b524627278f184013d1250e05d158d9dc8b02f (plain)
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
#if !defined(HISTORYSTATS_GUARD_COLUMN_SPLITTIMELINE_H)
#define HISTORYSTATS_GUARD_COLUMN_SPLITTIMELINE_H

#include "column.h"

/*
 * ColSplitTimeline
 */

class ColSplitTimeline
	: public Column
{
public:
	typedef std::map<int, InOut> TimelineMap;

	struct SplitParams {
		int alignment; // 0 = day, 1 = week
		int columns_to_group;
		int hours_in_block;
		int blocks_in_column;
		int effective_vis_mode;
	};

private:
	int m_nSource; // 0 = characters, 1 = messages, 2 = chats
	int m_nSourceType; // 0 = in, 1 = out, 2 = total, 3 = ratio
	int m_nIgnoreOld;
	int m_nVisMode; // 0 = hours of day, 1 = days of week, 2 = custom
	int m_nHODGroup;
	int m_nDOWGroup;
	int m_nBlockUnit; // 0 = hours, 1 = days, 2 = weeks
	int m_nUnitsPerBlock;
	int m_nBlocks;
	int m_nGraphAlign; // 0 = day boundary, 1 = week boundary
	int m_nCustomGroup;
	bool m_bTopPerColumn;

	OptionsCtrl::Combo m_hSource;
	OptionsCtrl::Edit  m_hIgnoreOld;
	OptionsCtrl::Radio m_hVisMode;
	OptionsCtrl::Edit  m_hHODGroup;
	OptionsCtrl::Edit  m_hDOWGroup;
	OptionsCtrl::Combo m_hBlockUnit;
	OptionsCtrl::Edit  m_hUnitsPerBlock;
	OptionsCtrl::Edit  m_hBlocks;
	OptionsCtrl::Radio m_hGraphAlign;
	OptionsCtrl::Edit  m_hCustomGroup;
	OptionsCtrl::Check m_hTopPerColumn;

	DWORD m_nTimeDiv;
	DWORD m_nTimeOffset;
	int m_nTimelineWidth;
	int m_nBlockOffset;
	int m_nNumBlocks;

private:
	int getValue(const InOut& value)
	{
		switch (m_nSourceType)
		{
			case 0: return value.in;
			case 1: return value.out;
			case 2: return value.total();
		}

		return 0;
	}

	SplitParams getParams() const;
	void addToSlot(Contact& contact, bool bOutgoing, DWORD localTimestamp, int toAdd);

	void outputRenderRowInOut(ext::ostream& tos, const Contact& contact, DisplayType display);
	void outputRenderRowRatio(ext::ostream& tos, const Contact& contact, DisplayType display);

public:
	explicit ColSplitTimeline();

protected:
	virtual const wchar_t* impl_getUID() const { return con::ColSplitTimeline; }
	virtual const wchar_t* impl_getTitle() const { return LPGENW("\"Split\" timeline"); }
	virtual const wchar_t* impl_getDescription() const { return LPGENW("Column holding a graphical overview of your chatting behavior (out, in, total, in/out ratio) from the first to the last day of your history. The information is spread along x- and y-axis and the values are encoded as color values. Different chatting behavior measures are available."); }
	virtual void impl_copyConfig(const Column* pSource);
	virtual int impl_getFeatures() const { return cfHasConfig | cfAcquiresData; }
	virtual void impl_configRead(const SettingsTree& settings);
	virtual void impl_configWrite(SettingsTree& settings) const;
	virtual void impl_configToUI(OptionsCtrl& Opt, OptionsCtrl::Item hGroup);
	virtual void impl_configFromUI(OptionsCtrl& Opt);
	virtual int impl_configGetRestrictions(ext::string*) const { return crPNGFull; }
	virtual ext::string impl_contactDataGetUID() const;
	virtual void impl_contactDataBeginAcquire();
	virtual void impl_contactDataPrepare(Contact& contact) const;
	virtual void impl_contactDataFree(Contact& contact) const;
	virtual void impl_contactDataAcquireMessage(Contact& contact, Message& msg);
	virtual void impl_contactDataAcquireChat(Contact& contact, bool bOutgoing, DWORD localTimestampStarted, DWORD duration);
	virtual void impl_contactDataMerge(Contact& contact, const Contact& include) const;
	virtual void impl_columnDataAfterOmit();
	virtual void impl_outputRenderHeader(ext::ostream& tos, int row, int rowSpan) const;
	virtual void impl_outputRenderRow(ext::ostream& tos, const Contact& contact, DisplayType display);
};

#endif // HISTORYSTATS_GUARD_COLUMN_SPLITTIMELINE_H