source: filezilla/trunk/fuentes/src/interface/settings/optionspage_themes.cpp @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 2 years ago

Update new version: 3.15.02

File size: 6.6 KB
Line 
1#include <filezilla.h>
2
3#include "../Options.h"
4#include "settingsdialog.h"
5#include "optionspage.h"
6#include "optionspage_themes.h"
7#include "../themeprovider.h"
8
9#include <wx/dcclient.h>
10#include <wx/scrolwin.h>
11
12BEGIN_EVENT_TABLE(COptionsPageThemes, COptionsPage)
13EVT_CHOICE(XRCID("ID_THEME"), COptionsPageThemes::OnThemeChange)
14END_EVENT_TABLE()
15
16const int BORDER = 5;
17
18class CIconPreview : public wxScrolledWindow
19{
20public:
21        CIconPreview(wxWindow* pParent)
22                : wxScrolledWindow(pParent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER | wxVSCROLL)
23        {
24                m_sizeInitialized = false;
25                m_extra_padding = 0;
26        }
27
28        void LoadIcons(const wxString& theme, const wxSize& iconSize)
29        {
30                m_iconSize = iconSize;
31                m_icons = CThemeProvider::GetAllImages(theme, m_iconSize);
32        }
33
34        void CalcSize()
35        {
36                if (m_sizeInitialized)
37                        return;
38                m_sizeInitialized = true;
39
40                wxSize size = GetClientSize();
41
42                if (!m_icons.empty()) {
43                        int icons_per_line = wxMax(1, (size.GetWidth() - BORDER) / (m_iconSize.GetWidth() + BORDER));
44
45                        // Number of lines and line height
46                        int lines = (m_icons.size() - 1) / icons_per_line + 1;
47                        int vheight = lines * (m_iconSize.GetHeight() + BORDER) + BORDER;
48                        if (vheight > size.GetHeight()) {
49                                // Scroll bar would appear, need to adjust width
50                                size.SetHeight(vheight);
51                                SetVirtualSize(size);
52                                SetScrollRate(0, m_iconSize.GetHeight() + BORDER);
53
54                                wxSize size2 = GetClientSize();
55                                size.SetWidth(size2.GetWidth());
56
57                                icons_per_line = wxMax(1, (size.GetWidth() - BORDER) / (m_iconSize.GetWidth() + BORDER));
58                                lines = (m_icons.size() - 1) / icons_per_line + 1;
59                                vheight = lines * (m_iconSize.GetHeight() + BORDER) + BORDER;
60                                if (vheight > size.GetHeight())
61                                        size.SetHeight(vheight);
62                        }
63
64                        // Calculate extra padding
65                        if (icons_per_line > 1) {
66                                int extra = size.GetWidth() - BORDER - icons_per_line * (m_iconSize.GetWidth() + BORDER);
67                                m_extra_padding = extra / (icons_per_line - 1);
68                        }
69                }
70                SetVirtualSize(size);
71                SetScrollRate(0, m_iconSize.GetHeight() + BORDER);
72        }
73
74protected:
75        DECLARE_EVENT_TABLE()
76        virtual void OnPaint(wxPaintEvent&)
77        {
78                CalcSize();
79
80                wxPaintDC dc(this);
81                PrepareDC(dc);
82
83                wxSize size = GetClientSize();
84
85                if (m_icons.empty()) {
86                        dc.SetFont(GetFont());
87                        wxString text = _("No images available");
88                        wxCoord w, h;
89                        dc.GetTextExtent(text, &w, &h);
90                        dc.DrawText(text, (size.GetWidth() - w) / 2, (size.GetHeight() - h) / 2);
91                        return;
92                }
93
94                int x = BORDER;
95                int y = BORDER;
96
97                for( auto const& bmp : m_icons ) {
98                        dc.DrawBitmap(*bmp, x, y, true);
99                        x += m_iconSize.GetWidth() + BORDER + m_extra_padding;
100                        if ((x + m_iconSize.GetWidth() + BORDER) > size.GetWidth()) {
101                                x = BORDER;
102                                y += m_iconSize.GetHeight() + BORDER;
103                        }
104                }
105        }
106
107        std::vector<std::unique_ptr<wxBitmap>> m_icons;
108        wxSize m_iconSize;
109        bool m_sizeInitialized;
110        int m_extra_padding;
111};
112
113BEGIN_EVENT_TABLE(CIconPreview, wxScrolledWindow)
114EVT_PAINT(CIconPreview::OnPaint)
115END_EVENT_TABLE()
116
117COptionsPageThemes::~COptionsPageThemes()
118{
119}
120
121bool COptionsPageThemes::LoadPage()
122{
123        return true;
124}
125
126bool COptionsPageThemes::SavePage()
127{
128        if (!m_was_selected)
129                return true;
130
131        wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);
132
133        const int sel = pTheme->GetSelection();
134        const wxString theme = ((wxStringClientData*)pTheme->GetClientObject(sel))->GetData();
135
136        m_pOptions->SetOption(OPTION_THEME, theme);
137
138        wxNotebook *pPreview = XRCCTRL(*this, "ID_PREVIEW", wxNotebook);
139        wxString size = pPreview->GetPageText(pPreview->GetSelection());
140        m_pOptions->SetOption(OPTION_THEME_ICONSIZE, size);
141
142        return true;
143}
144
145bool COptionsPageThemes::Validate()
146{
147        return true;
148}
149
150bool COptionsPageThemes::DisplayTheme(const wxString& theme)
151{
152        wxString name, author, mail;
153        if (!CThemeProvider::GetThemeData(theme, name, author, mail)) {
154                return false;
155        }
156        if (name.empty()) {
157                return false;
158        }
159
160        if (author.empty()) {
161                author = _("N/a");
162        }
163        if (mail.empty()) {
164                mail = _("N/a");
165        }
166
167        bool failure = false;
168        SetStaticText(XRCID("ID_AUTHOR"), author, failure);
169        SetStaticText(XRCID("ID_EMAIL"), mail, failure);
170
171        wxNotebook *pPreview = XRCCTRL(*this, "ID_PREVIEW", wxNotebook);
172
173        wxString selected_size;
174        int selected_page = pPreview->GetSelection();
175        if (selected_page != -1)
176                selected_size = pPreview->GetPageText(selected_page);
177        else
178                selected_size = COptions::Get()->GetOption(OPTION_THEME_ICONSIZE);
179
180        pPreview->DeleteAllPages();
181
182        for( auto const& size : CThemeProvider::GetThemeSizes(theme) ) {
183                int pos = size.Find('x');
184                if (pos <= 0 || pos >= (int)size.Len() - 1)
185                        continue;
186
187                long width = 0;
188                long height = 0;
189                if (!size.Left(pos).ToLong(&width) ||
190                        !size.Mid(pos + 1).ToLong(&height) ||
191                        width <= 0 || height <= 0)
192                {
193                        continue;
194                }
195
196                wxSize iconSize(width, height);
197
198                wxPanel* pPanel = new wxPanel();
199#ifdef __WXMSW__
200                // Drawing glitch on MSW
201                pPanel->Hide();
202#endif
203                pPanel->Create(pPreview);
204                wxSizer* pSizer = new wxBoxSizer(wxVERTICAL);
205                pPanel->SetSizer(pSizer);
206                pSizer->Add(new wxStaticText(pPanel, wxID_ANY, _("Preview:")), 0, wxLEFT|wxRIGHT|wxTOP, 5);
207
208                CIconPreview *pIconPreview = new CIconPreview(pPanel);
209                pIconPreview->LoadIcons(theme, iconSize);
210
211                pSizer->Add(pIconPreview, 1, wxGROW | wxALL, 5);
212
213                pPreview->AddPage(pPanel, size, selected_size == size);
214        }
215
216        return !failure;
217}
218
219void COptionsPageThemes::OnThemeChange(wxCommandEvent&)
220{
221        wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);
222
223        const int sel = pTheme->GetSelection();
224        const wxString theme = ((wxStringClientData*)pTheme->GetClientObject(sel))->GetData();
225
226        DisplayTheme(theme);
227}
228
229bool COptionsPageThemes::OnDisplayedFirstTime()
230{
231        bool failure = false;
232
233        wxChoice* pTheme = XRCCTRL(*this, "ID_THEME", wxChoice);
234        if (!pTheme)
235                return false;
236
237        if (!pTheme || !XRCCTRL(*this, "ID_PREVIEW", wxNotebook) ||
238                !XRCCTRL(*this, "ID_AUTHOR", wxStaticText) ||
239                !XRCCTRL(*this, "ID_EMAIL", wxStaticText))
240                return false;
241
242        auto const themes = CThemeProvider::GetThemes();
243        if (themes.empty())
244                return false;
245
246        wxString activeTheme = m_pOptions->GetOption(OPTION_THEME);
247        wxString firstName;
248        for (auto const& theme : themes) {
249                wxString name, author, mail;
250                if (!CThemeProvider::GetThemeData(theme, name, author, mail))
251                        continue;
252                if (firstName.empty())
253                        firstName = name;
254                int n = pTheme->Append(name, new wxStringClientData(theme));
255                if (theme == activeTheme)
256                        pTheme->SetSelection(n);
257        }
258        if (pTheme->GetSelection() == wxNOT_FOUND)
259                pTheme->SetSelection(pTheme->FindString(firstName));
260        activeTheme = ((wxStringClientData*)pTheme->GetClientObject(pTheme->GetSelection()))->GetData();
261
262        if (!DisplayTheme(activeTheme))
263                failure = true;
264
265        pTheme->GetContainingSizer()->Layout();
266
267        return !failure;
268}
Note: See TracBrowser for help on using the repository browser.