blob: 0577dabf0f9008d2c66c91a16944cd013def42ba (
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
|
// **************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TRIPPLE_SPLIT_HEADER_8257804292846842573942534254
#define TRIPPLE_SPLIT_HEADER_8257804292846842573942534254
#include <cassert>
#include <memory>
#include <wx/window.h>
#include <wx/dcclient.h>
//a not-so-crappy splitter window
/* manage three contained windows:
1. left and right window are stretched
2. middle window is fixed size
3. middle window position can be changed via mouse with two sash lines
-----------------
| | | |
| | | |
| | | |
-----------------
*/
namespace zen
{
class TripleSplitter : public wxWindow
{
public:
TripleSplitter(wxWindow* parent,
wxWindowID id = wxID_ANY,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0);
~TripleSplitter();
void setupWindows(wxWindow* winL, wxWindow* winC, wxWindow* winR)
{
assert(winL->GetParent() == this && winC->GetParent() == this && winR->GetParent() == this && !GetSizer());
windowL = winL;
windowC = winC;
windowR = winR;
updateWindowSizes();
}
int getSashOffset() const { return centerOffset; }
void setSashOffset(int off) { centerOffset = off; updateWindowSizes(); }
private:
void onEraseBackGround(wxEraseEvent& event) {}
void onSizeEvent(wxSizeEvent& event) { updateWindowSizes(); event.Skip(); }
void onPaintEvent(wxPaintEvent& event)
{
wxPaintDC dc(this);
drawSash(dc);
}
void updateWindowSizes();
int getCenterWidth() const;
int getCenterPosX() const; //return normalized posX
int getCenterPosXOptimal() const;
void drawSash(wxDC& dc);
bool hitOnSashLine(int posX) const;
void onMouseLeftDown(wxMouseEvent& event);
void onMouseLeftUp(wxMouseEvent& event);
void onMouseMovement(wxMouseEvent& event);
void onLeaveWindow(wxMouseEvent& event);
void onMouseCaptureLost(wxMouseCaptureLostEvent& event);
void onMouseLeftDouble(wxMouseEvent& event);
class SashMove;
std::unique_ptr<SashMove> activeMove;
int centerOffset; //offset to add after "gravity" stretching
wxWindow* windowL;
wxWindow* windowC;
wxWindow* windowR;
};
}
#endif //TRIPPLE_SPLIT_HEADER_8257804292846842573942534254
|