File: triple_splitter.h

package info (click to toggle)
freefilesync 13.7-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,044 kB
  • sloc: cpp: 66,712; ansic: 447; makefile: 216
file content (83 lines) | stat: -rw-r--r-- 2,679 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
// *****************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under    *
// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0          *
// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved *
// *****************************************************************************

#ifndef TRIPLE_SPLITTER_H_8257804292846842573942534254
#define TRIPLE_SPLITTER_H_8257804292846842573942534254

#include <cassert>
#include <memory>
#include <optional>
#include <wx/window.h>
#include <wx/bitmap.h>
//#include <wx/dcclient.h>


/* 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 fff
{
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 updateWindowSizes();
    int getCenterWidth() const;
    int getCenterPosX() const; //return normalized posX
    int getCenterPosXOptimal() const;

    void onPaintEvent(wxPaintEvent& event);
    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_ = 0; //offset to add after "gravity" stretching
    const int sashSize_;
    const int childWindowMinSize_;

    wxWindow* windowL_ = nullptr;
    wxWindow* windowC_ = nullptr;
    wxWindow* windowR_ = nullptr;

    std::optional<wxBitmap> doubleBuffer_;
};
}

#endif //TRIPLE_SPLITTER_H_8257804292846842573942534254