Hugintrunk  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
wxutils.cpp
Go to the documentation of this file.
1 
8 /* This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This software is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this software. If not, see
20 * <http://www.gnu.org/licenses/>.
21 *
22 */
23 
24 #include "wxutils.h"
25 #include <wx/translation.h>
26 
27 namespace hugin_utils
28 {
29 WXIMPEX wxString GetFormattedTimeSpan(const wxTimeSpan& timeSpan)
30 {
31  if (timeSpan.IsNull())
32  {
33  return wxEmptyString;
34  };
35  if (timeSpan.GetHours() >= 1)
36  {
37  // longer than 1 h, format hours:minutes
38  return timeSpan.Format(_("%H:%M h"));
39  }
40  else
41  {
42  // shorter than 1 h
43  if (timeSpan.GetSeconds() > 60)
44  {
45  // format minutes:seconds
46  return timeSpan.Format(_("%M:%S min"));
47  }
48  else
49  {
50  if (timeSpan.GetSeconds() < 1)
51  {
52  // shorter then 1 s, don't display anything
53  return wxEmptyString;
54  }
55  else
56  {
57  // below 1 min, show only seconds
58  return timeSpan.Format(_("%S s"));
59  }
60  }
61  }
62 }
63 
64 // utility functions
65 #include <wx/config.h>
66 
67 void RestoreFramePosition(wxTopLevelWindow* frame, const wxString& basename, const bool ignoreMaximize)
68 {
69  DEBUG_TRACE(basename.mb_str(wxConvLocal));
70  wxConfigBase* config = wxConfigBase::Get();
71 
72  // get display size
73  int dx, dy;
74  wxDisplaySize(&dx, &dy);
75 
76 #ifndef __WXGTK__
77  // restoring the splitter positions properly when maximising doesn't work.
78  // Disabling maximise on wxWidgets >= 2.6.0 and gtk
79  // so ignore it for now
80  if (!ignoreMaximize)
81  {
82  const bool maximized = config->Read("/" + basename + "/maximized", 0l) != 0;
83  if (maximized)
84  {
85  frame->Maximize();
86  return;
87  };
88  };
89 #endif
90 
91  //size
92  const int w = config->Read("/" + basename + "/width", -1l);
93  const int h = config->Read("/" + basename + "/height", -1l);
94  if (w > 0 && w <= dx)
95  {
96  frame->SetClientSize(w, h);
97  }
98  else
99  {
100  frame->Fit();
101  };
102  //position
103  RestoreFramePositionOnly(frame, basename);
104 }
105 
106 void StoreFramePosition(wxTopLevelWindow* frame, const wxString& basename, const bool ignoreMaximize)
107 {
108  DEBUG_TRACE(basename);
109  wxConfigBase* config = wxConfigBase::Get();
110 
111 #ifndef __WXGTK__
112  // restoring the splitter positions properly when maximising doesn't work.
113  // Disabling maximise on wxWidgets >= 2.6.0 and gtk
114  if (!ignoreMaximize && frame->IsMaximized())
115  {
116  config->Write("/" + basename + "/maximized", 1l);
117  config->DeleteEntry("/" + basename + "/width");
118  config->DeleteEntry("/" + basename + "/height");
119  config->DeleteEntry("/" + basename + "/positionX");
120  config->DeleteEntry("/" + basename + "/positionY");
121  return;
122  };
123 #endif
124  if (!frame->IsIconized())
125  {
126  wxSize sz = frame->GetClientSize();
127  config->Write("/" + basename + "/width", sz.GetWidth());
128  config->Write("/" + basename + "/height", sz.GetHeight());
129  wxPoint ps = frame->GetPosition();
130  config->Write("/" + basename + "/positionX", ps.x);
131  config->Write("/" + basename + "/positionY", ps.y);
132  }
133  else
134  {
135  config->DeleteEntry("/" + basename + "/width");
136  config->DeleteEntry("/" + basename + "/height");
137  config->DeleteEntry("/" + basename + "/positionX");
138  config->DeleteEntry("/" + basename + "/positionY");
139  };
140  config->Write("/" + basename + "/maximized", 0l);
141 }
142 
143 void RestoreFramePositionOnly(wxTopLevelWindow* frame, const wxString& basename)
144 {
145  wxConfigBase* config = wxConfigBase::Get();
146 
147  // get display size
148  int dx, dy;
149  wxDisplaySize(&dx, &dy);
150  // get position
151  const int x = config->Read("/" + basename + "/positionX", -1l);
152  const int y = config->Read("/" + basename + "/positionY", -1l);
153  if (y >= 0 && x >= 0 && x < dx && y < dy)
154  {
155  frame->Move(x, y);
156  }
157  else
158  {
159  frame->Move(0, 44);
160  };
161 }
162 
163 void StoreFramePositionOnly(wxTopLevelWindow* frame, const wxString& basename)
164 {
165  wxConfigBase* config = wxConfigBase::Get();
166  const wxPoint ps = frame->GetPosition();
167  config->Write("/" + basename + "/positionX", ps.x);
168  config->Write("/" + basename + "/positionY", ps.y);
169 }
170 
171 #ifdef __WXMSW__
172 #include <wx/msgdlg.h>
173 #include <wx/settings.h>
174 #endif
175 
176 int HuginMessageBox(const wxString& message, const wxString& caption, int style, wxWindow* parent)
177 {
178 #ifdef __WXMSW__
179  if (wxSystemSettings::GetAppearance().IsDark())
180  {
181  // wxMessageBox does not support dark mode on window
182  // so use wxGenericMessageDialog instead
183  wxGenericMessageDialog dlg(parent, message, caption, style);
184  // translate the return code
185  switch (dlg.ShowModal())
186  {
187  case wxID_OK:
188  return wxOK;
189  case wxID_YES:
190  return wxYES;
191  case wxID_NO:
192  return wxNO;
193  case wxID_HELP:
194  return wxHELP;
195  case wxID_CANCEL:
196  default:
197  return wxCANCEL;
198  };
199  }
200  else
201  {
202  // in light mode we are using default wxMessageBox for best
203  // integration with os default style
204  return wxMessageBox(message, caption, style, parent);
205  };
206 #else
207  // on Linux/Mac OS the message box has no caption (see guidelines of the os)
208  return wxMessageBox(message, wxEmptyString, style, parent);
209 #endif
210 }
211 
212 MessageDialog GetMessageDialog(const wxString& message, const wxString& caption, int style, wxWindow* parent)
213 {
214 #ifdef __WXMSW__
215  if (wxSystemSettings::GetAppearance().IsDark())
216  {
217  // wxMessageDialog does not support dark mode
218  // so use wxGenericMessageDialog for dark mode
219  return std::make_unique<wxGenericMessageDialog>(parent, message, caption, style);
220  }
221  else
222  {
223  // in light mode wxGenericMessageDialog looks slightly different than OS standard
224  // so use in this case wxMessageDialog
225  return std::make_unique<wxMessageDialog>(parent, message, caption, style);
226  };
227 #else
228  // on Linux/Mac OS the message box has no caption (see guidelines of the os)
229  return std::make_unique<wxMessageDialog>(parent, message, wxEmptyString, style);
230 #endif
231 }
232 
233 bool AskUserOverwrite(const wxString& filename, const wxString& caption, wxWindow* parent)
234 {
235  if (HuginMessageBox(wxString::Format(_("File %s already exists.\nShould this file overwritten?"), filename),
236  caption, wxYES_NO | wxICON_QUESTION, parent) == wxYES)
237  {
238  return true;
239  }
240  else
241  {
242  return false;
243  };
244 }
245 
247 {
248  m_window = window;
249  m_window->Disable();
250 }
251 
253 {
254  m_window->Enable();
255 }
256 
257 }
bool AskUserOverwrite(const wxString &filename, const wxString &caption, wxWindow *parent)
ask user if the given file should be overwritten, return true if the user confirmed the overwritting ...
Definition: wxutils.cpp:233
void RestoreFramePosition(wxTopLevelWindow *frame, const wxString &basename, const bool ignoreMaximize)
Definition: wxutils.cpp:67
void StoreFramePosition(wxTopLevelWindow *frame, const wxString &basename, const bool ignoreMaximize)
Definition: wxutils.cpp:106
std::unique_ptr< wxMessageDialogBase > MessageDialog
Definition: wxutils.h:90
#define DEBUG_TRACE(msg)
Definition: utils.h:67
WXIMPEX wxString GetFormattedTimeSpan(const wxTimeSpan &timeSpan)
Definition: wxutils.cpp:29
MessageDialog GetMessageDialog(const wxString &message, const wxString &caption, int style, wxWindow *parent)
Definition: wxutils.cpp:212
#define WXIMPEX
Definition: hugin_shared.h:40
DisableWindow(wxWindow *window)
Definition: wxutils.cpp:246
IMPEX double h[25][1024]
Definition: emor.cpp:169
void StoreFramePositionOnly(wxTopLevelWindow *frame, const wxString &basename)
Definition: wxutils.cpp:163
int HuginMessageBox(const wxString &message, const wxString &caption, int style, wxWindow *parent)
Definition: wxutils.cpp:176
void RestoreFramePositionOnly(wxTopLevelWindow *frame, const wxString &basename)
Definition: wxutils.cpp:143