summaryrefslogtreecommitdiff
path: root/ui/triple_splitter.h
blob: 5b389e5b7c5263044a9cbfb13b70f22a2106c791 (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
// **************************************************************************
// * 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);

    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
bgstack15