diff options
Diffstat (limited to 'wx+')
-rw-r--r-- | wx+/button.cpp | 2 | ||||
-rw-r--r-- | wx+/button.h | 2 | ||||
-rw-r--r-- | wx+/format_unit.cpp | 24 | ||||
-rw-r--r-- | wx+/graph.cpp | 38 | ||||
-rw-r--r-- | wx+/graph.h | 10 | ||||
-rw-r--r-- | wx+/image_tools.h | 9 | ||||
-rw-r--r-- | wx+/mouse_move_dlg.cpp | 10 | ||||
-rw-r--r-- | wx+/mouse_move_dlg.h | 1 | ||||
-rw-r--r-- | wx+/no_flicker.h | 35 | ||||
-rw-r--r-- | wx+/pch.h | 2 | ||||
-rw-r--r-- | wx+/serialize.h | 18 | ||||
-rw-r--r-- | wx+/string_conv.h | 4 | ||||
-rw-r--r-- | wx+/timespan.h | 4 |
13 files changed, 100 insertions, 59 deletions
diff --git a/wx+/button.cpp b/wx+/button.cpp index 7edfdea8..a4d543cf 100644 --- a/wx+/button.cpp +++ b/wx+/button.cpp @@ -15,7 +15,7 @@ using namespace zen; -void zen::setBitmapLabel(wxBitmapButton& button, const wxBitmap& bmp) +void zen::setImage(wxBitmapButton& button, const wxBitmap& bmp) { if (!isEqual(button.GetBitmapLabel(), bmp)) button.SetBitmapLabel(bmp); diff --git a/wx+/button.h b/wx+/button.h index e5d63a19..15ebc5a0 100644 --- a/wx+/button.h +++ b/wx+/button.h @@ -40,7 +40,7 @@ private: }; //set bitmap label flicker free! -void setBitmapLabel(wxBitmapButton& button, const wxBitmap& bmp); +void setImage(wxBitmapButton& button, const wxBitmap& bmp); } diff --git a/wx+/format_unit.cpp b/wx+/format_unit.cpp index 771778aa..994a2b29 100644 --- a/wx+/format_unit.cpp +++ b/wx+/format_unit.cpp @@ -7,6 +7,7 @@ #include "format_unit.h" #include <zen/basic_math.h> #include <zen/i18n.h> +#include <zen/time.h> #include <cwchar> //swprintf #include <ctime> #include <cstdio> @@ -211,22 +212,17 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime) return _("Error"); } - struct tm loc = {}; - loc.tm_year = systemTimeLocal.wYear - 1900; - loc.tm_mon = systemTimeLocal.wMonth - 1; - loc.tm_mday = systemTimeLocal.wDay; - loc.tm_hour = systemTimeLocal.wHour; - loc.tm_min = systemTimeLocal.wMinute; - loc.tm_sec = systemTimeLocal.wSecond; - const struct tm* timePtr = &loc; + zen::TimeComp loc; + loc.year = systemTimeLocal.wYear; + loc.month = systemTimeLocal.wMonth; + loc.day = systemTimeLocal.wDay; + loc.hour = systemTimeLocal.wHour; + loc.minute = systemTimeLocal.wMinute; + loc.second = systemTimeLocal.wSecond; #elif defined FFS_LINUX - const time_t fileTime = to<time_t>(utcTime); - const struct tm* timePtr = ::localtime(&fileTime); //convert to local time + zen::TimeComp loc = zen::localTime(to<time_t>(utcTime)); #endif - wchar_t buffer[1000]; - size_t charsWritten = std::wcsftime(buffer, 1000, L"%x %X", timePtr); - - return std::wstring(buffer, charsWritten); + return formatTime<std::wstring>(L"%x %X", loc); } diff --git a/wx+/graph.cpp b/wx+/graph.cpp index 584ef0ea..2e000389 100644 --- a/wx+/graph.cpp +++ b/wx+/graph.cpp @@ -35,6 +35,8 @@ double zen::nextNiceNumber(double blockSize) //round to next number which is a c const double k = std::floor(std::log10(blockSize)); const double e = std::pow(10, k); + if (isNull(e)) + return 0; const double a = blockSize / e; //blockSize = a * 10^k with a in (1, 10) //have a look at leading two digits: "nice" numbers start with 1, 2, 2.5 and 5 @@ -90,13 +92,15 @@ wxColor getDefaultColor(size_t pos) void drawYLabel(wxDC& dc, double& yMin, double& yMax, const wxRect& clientArea, int labelWidth, bool drawLeft, const LabelFormatter& labelFmt) //clientArea := y-label + data window { //note: DON'T use wxDC::GetSize()! DC may be larger than visible area! - if (clientArea.GetHeight() <= 0 || clientArea.GetWidth() <= 0) return; + if (clientArea.GetHeight() <= 0 || clientArea.GetWidth() <= 0) + return; int optimalBlockHeight = 3 * dc.GetMultiLineTextExtent(wxT("1")).GetHeight();; double valRangePerBlock = (yMax - yMin) * optimalBlockHeight / clientArea.GetHeight(); valRangePerBlock = labelFmt.getOptimalBlockSize(valRangePerBlock); - if (numeric::isNull(valRangePerBlock)) return; + if (isNull(valRangePerBlock)) + return; double yMinNew = std::floor(yMin / valRangePerBlock) * valRangePerBlock; double yMaxNew = std::ceil (yMax / valRangePerBlock) * valRangePerBlock; @@ -139,18 +143,21 @@ void drawYLabel(wxDC& dc, double& yMin, double& yMax, const wxRect& clientArea, void drawXLabel(wxDC& dc, double& xMin, double& xMax, const wxRect& clientArea, int labelHeight, bool drawBottom, const LabelFormatter& labelFmt) //clientArea := x-label + data window { //note: DON'T use wxDC::GetSize()! DC may be larger than visible area! - if (clientArea.GetHeight() <= 0 || clientArea.GetWidth() <= 0) return; + if (clientArea.GetHeight() <= 0 || clientArea.GetWidth() <= 0) + return; int optimalBlockWidth = dc.GetMultiLineTextExtent(wxT("100000000000000")).GetWidth(); double valRangePerBlock = (xMax - xMin) * optimalBlockWidth / clientArea.GetWidth(); valRangePerBlock = labelFmt.getOptimalBlockSize(valRangePerBlock); - if (numeric::isNull(valRangePerBlock)) return; + if (isNull(valRangePerBlock)) + return; double xMinNew = std::floor(xMin / valRangePerBlock) * valRangePerBlock; double xMaxNew = std::ceil (xMax / valRangePerBlock) * valRangePerBlock; int blockCount = numeric::round((xMaxNew - xMinNew) / valRangePerBlock); - if (blockCount == 0) return; + if (blockCount == 0) + return; xMin = xMinNew; //inform about adjusted x value range xMax = xMaxNew; @@ -190,8 +197,8 @@ class ConvertCoord //convert between screen and actual coordinates public: ConvertCoord(double valMin, double valMax, size_t screenSize) : min_(valMin), - scaleToReal(screenSize == 0 ? 0 : (valMax - valMin) / screenSize), - scaleToScr(numeric::isNull(valMax - valMin) ? 0 : screenSize / (valMax - valMin)) {} + scaleToReal(screenSize == 0 ? 0 : (valMax - valMin) / screenSize), + scaleToScr(isNull(valMax - valMin) ? 0 : screenSize / (valMax - valMin)) {} double screenToReal(double screenPos) const //input value: [0, screenSize - 1] { @@ -333,8 +340,11 @@ void Graph2D::render(wxDC& dc) const { { //have everything including label background in natural window color by default (overwriting current background color) - DcBackgroundChanger dummy(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); //sigh, who *invents* this stuff??? -> workaround for issue with wxBufferedPaintDC - //wxDCBrushChanger dummy(dc, *wxTRANSPARENT_BRUSH); + const wxColor backColor = wxPanel::GetClassDefaultAttributes().colBg != wxNullColour ? + wxPanel::GetClassDefaultAttributes().colBg : + wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE); + //wxDCBrushChanger dummy(dc, *wxTRANSPARENT_BRUSH); //sigh, who *invents* this stuff??? -> workaround for issue with wxBufferedPaintDC + DcBackgroundChanger dummy(dc, backColor); dc.Clear(); } @@ -418,8 +428,8 @@ void Graph2D::render(wxDC& dc) const double maxWndY = attr.maxYauto ? -HUGE_VAL : attr.maxY; // if (!curves_.empty()) { - const int avgFactor = 2; //some averaging of edgy input data to smoothen behavior on window resize - const ConvertCoord cvrtX(minWndX, maxWndX, dataArea.width * avgFactor); + const int AVG_FACTOR = 2; //some averaging of edgy input data to smoothen behavior on window resize + const ConvertCoord cvrtX(minWndX, maxWndX, dataArea.width * AVG_FACTOR); for (GraphList::const_iterator j = curves_.begin(); j != curves_.end(); ++j) { @@ -430,13 +440,13 @@ void Graph2D::render(wxDC& dc) const int& offset = yValuesList[j - curves_.begin()].second; //x-value offset in pixel { const int posFirst = std::max<int>(std::ceil(cvrtX.realToScreen(graph.getXBegin())), 0); //evaluate visible area only and make sure to not step one pixel before xbegin()! - const int postLast = std::min<int>(std::floor(cvrtX.realToScreen(graph.getXEnd())), dataArea.width * avgFactor); // + const int postLast = std::min<int>(std::floor(cvrtX.realToScreen(graph.getXEnd())), dataArea.width * AVG_FACTOR); // for (int i = posFirst; i < postLast; ++i) yValues.push_back(graph.getValue(cvrtX.screenToReal(i))); - subsample(yValues, avgFactor); - offset = posFirst / avgFactor; + subsample(yValues, AVG_FACTOR); + offset = posFirst / AVG_FACTOR; } if (!yValues.empty()) diff --git a/wx+/graph.h b/wx+/graph.h index 61a90ca1..34ef196e 100644 --- a/wx+/graph.h +++ b/wx+/graph.h @@ -25,7 +25,7 @@ Example: setLabelX(Graph2D::POSLX_BOTTOM, 20, std::make_shared<LabelFormatterTimeElapsed>()). setLabelY(Graph2D::POSLY_RIGHT, 60, std::make_shared<LabelFormatterBytes>())); //set graph data - std::shared_ptr<GraphData>() graphDataBytes = ... + std::shared_ptr<GraphData> graphDataBytes = ... m_panelGraph->setData(graphDataBytes, Graph2D::LineAttributes().setLineWidth(2).setColor(wxColor(0, 192, 0))); */ @@ -33,9 +33,9 @@ Example: struct GraphData { virtual ~GraphData() {} - virtual double getValue(double x) const = 0; - virtual double getXBegin() const = 0; - virtual double getXEnd() const = 0; //upper bound for x, getValue() is NOT evaluated at this position! Similar to std::vector::end() + virtual double getValue (double x) const = 0; + virtual double getXBegin() const = 0; + virtual double getXEnd () const = 0; //upper bound for x, getValue() is NOT evaluated at this position! Similar to std::vector::end() }; @@ -99,7 +99,7 @@ struct DecimalNumberFormatter : public LabelFormatter //------------------------------------------------------------------------------------------------------------ //emit data selection event -//usage: wnd.Connect(wxEVT_GRAPH_SELECTION, GraphSelectEventHandler(MyDlg::OnGraphSelection), NULL, this); +//Usage: wnd.Connect(wxEVT_GRAPH_SELECTION, GraphSelectEventHandler(MyDlg::OnGraphSelection), NULL, this); // void MyDlg::OnGraphSelection(GraphSelectEvent& event); diff --git a/wx+/image_tools.h b/wx+/image_tools.h index e78e7ced..23a363df 100644 --- a/wx+/image_tools.h +++ b/wx+/image_tools.h @@ -10,7 +10,7 @@ #include <numeric> #include <wx/bitmap.h> #include <wx/dcmemory.h> - +#include <zen/basic_math.h> namespace zen { @@ -64,7 +64,8 @@ double getAvgBrightness(const wxImage& img) { const int pixelCount = img.GetWidth() * img.GetHeight(); auto pixBegin = img.GetData(); - if (pixBegin) + + if (pixelCount > 0 && pixBegin) { auto pixEnd = pixBegin + 3 * pixelCount; //RGB @@ -77,9 +78,9 @@ double getAvgBrightness(const wxImage& img) for (auto iter = pixBegin; iter != pixEnd; ++iter) dividend += *iter * static_cast<double>(alphaFirst[(iter - pixBegin) / 3]); - const int divisor = 3.0 * std::accumulate(alphaFirst, alphaFirst + pixelCount, 0.0); + const double divisor = 3.0 * std::accumulate(alphaFirst, alphaFirst + pixelCount, 0.0); - return dividend / divisor; + return numeric::isNull(divisor) ? 0 : dividend / divisor; } else return std::accumulate(pixBegin, pixEnd, 0.0) / (3.0 * pixelCount); diff --git a/wx+/mouse_move_dlg.cpp b/wx+/mouse_move_dlg.cpp index 3f7ca755..7edaa5db 100644 --- a/wx+/mouse_move_dlg.cpp +++ b/wx+/mouse_move_dlg.cpp @@ -14,6 +14,8 @@ #include <wx/panel.h> #include <wx/gauge.h> #include <wx/statusbr.h> +#include <wx/frame.h> +#include <wx/dialog.h> using namespace zen; @@ -35,7 +37,7 @@ void forEachChild(wxWindow& parent, Fun f) MouseMoveWindow::MouseMoveWindow(wxWindow& parent, bool includeParent) : wxWindow(&parent, wxID_ANY) { - wxObjectEventFunction memFunMouseDown = wxMouseEventHandler(MouseMoveWindow::LeftButtonDown); + wxObjectEventFunction memFunMouseDown = wxMouseEventHandler(MouseMoveWindow::LeftButtonDown); //wxWidgets macros are obviously not C++11 ready auto connect = [&](wxWindow& wnd) { if (dynamic_cast<wxStaticText*> (&wnd) || //redirect clicks on these "dead" controls to move dialog instead @@ -44,8 +46,10 @@ MouseMoveWindow::MouseMoveWindow(wxWindow& parent, bool includeParent) : wxWindo dynamic_cast<wxGauge*> (&wnd) || dynamic_cast<wxStaticLine*> (&wnd) || dynamic_cast<wxStatusBar*> (&wnd) || - dynamic_cast<wxPanel*> (&wnd)) - wnd.Connect(wxEVT_LEFT_DOWN, memFunMouseDown, NULL, this); //wxWidgets macros are obviously not C++11 ready + dynamic_cast<wxPanel*> (&wnd) || + dynamic_cast<wxFrame*> (&wnd) || + dynamic_cast<wxDialog*> (&wnd)) + wnd.Connect(wxEVT_LEFT_DOWN, memFunMouseDown, NULL, this); }; if (includeParent) diff --git a/wx+/mouse_move_dlg.h b/wx+/mouse_move_dlg.h index 44988e3a..c97ef19c 100644 --- a/wx+/mouse_move_dlg.h +++ b/wx+/mouse_move_dlg.h @@ -11,7 +11,6 @@ namespace zen { - /* move dialog by mouse-dragging contained sub-windows: just attach to parent via new in constructor: diff --git a/wx+/no_flicker.h b/wx+/no_flicker.h new file mode 100644 index 00000000..0dceba97 --- /dev/null +++ b/wx+/no_flicker.h @@ -0,0 +1,35 @@ +// ************************************************************************** +// * 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) 2008-2011 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** + +#ifndef NO_FLICKER_HEADER_893421590321532 +#define NO_FLICKER_HEADER_893421590321532 + +#include <wx/window.h> + +namespace zen +{ +inline +void setText(wxTextCtrl& control, const wxString& newText, bool* additionalLayoutChange = NULL) +{ + if (additionalLayoutChange && !*additionalLayoutChange) //never revert from true to false! + *additionalLayoutChange = control.GetValue().length() != newText.length(); //avoid screen flicker: update layout only when necessary + + if (control.GetValue() != newText) + control.ChangeValue(newText); +} + +inline +void setText(wxStaticText& control, const wxString& newText, bool* additionalLayoutChange = NULL) +{ + if (additionalLayoutChange && !*additionalLayoutChange) + *additionalLayoutChange = control.GetLabel().length() != newText.length(); //avoid screen flicker: update layout only when necessary + + if (control.GetLabel() != newText) + control.SetLabel(newText); +} +} + +#endif //NO_FLICKER_HEADER_893421590321532 @@ -18,7 +18,7 @@ #define WX_PRECOMP #endif -#include <wx/wxprec.h> //#includes <wx/msw/wrapwin.h> +#include <wx/wxprec.h> //includes <wx/msw/wrapwin.h> //other wxWidgets headers #include <wx/log.h> diff --git a/wx+/serialize.h b/wx+/serialize.h index c15e963d..cec70278 100644 --- a/wx+/serialize.h +++ b/wx+/serialize.h @@ -64,7 +64,7 @@ private: class ReadInputStream //throw FileError { protected: - ReadInputStream(wxInputStream& stream, const wxString& errorObjName) : stream_(stream), errorObjName_(errorObjName) {} + ReadInputStream(wxInputStream& stream, const Zstring& errorObjName) : stream_(stream), errorObjName_(errorObjName) {} template <class T> T readNumberC() const; //throw FileError, checked read operation @@ -81,14 +81,14 @@ protected: private: wxInputStream& stream_; - const wxString& errorObjName_; //used for error text only + const Zstring& errorObjName_; //used for error text only }; class WriteOutputStream //throw FileError { protected: - WriteOutputStream(const wxString& errorObjName, wxOutputStream& stream) : stream_(stream), errorObjName_(errorObjName) {} + WriteOutputStream(const Zstring& errorObjName, wxOutputStream& stream) : stream_(stream), errorObjName_(errorObjName) {} template <class T> void writeNumberC(T number) const; //throw FileError, checked write operation @@ -104,7 +104,7 @@ protected: private: wxOutputStream& stream_; - const wxString& errorObjName_; //used for error text only! + const Zstring& errorObjName_; //used for error text only! }; @@ -185,7 +185,7 @@ inline void ReadInputStream::check() const { if (stream_.GetLastError() != wxSTREAM_NO_ERROR) - throw zen::FileError(_("Error reading from synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); + throw zen::FileError(_("Error reading from synchronization database:") + L" \n" + L"\"" + errorObjName_ + L"\""); } @@ -210,7 +210,7 @@ S ReadInputStream::readStringC() const //checked read operation } catch (std::exception&) { - throw FileError(_("Error reading from synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); + throw FileError(_("Error reading from synchronization database:") + L" \n" + L"\"" + errorObjName_ + L"\""); } return output; } @@ -226,7 +226,7 @@ ReadInputStream::CharArray ReadInputStream::readArrayC() const stream_.Read(&(*buffer)[0], byteCount); check(); if (stream_.LastRead() != byteCount) //some additional check - throw FileError(_("Error reading from synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); + throw FileError(_("Error reading from synchronization database:") + L" \n" + L"\"" + errorObjName_ + L"\""); } return buffer; } @@ -257,7 +257,7 @@ void WriteOutputStream::writeArrayC(const std::vector<char>& buffer) const stream_.Write(&buffer[0], buffer.size()); check(); if (stream_.LastWrite() != buffer.size()) //some additional check - throw FileError(_("Error writing to synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); + throw FileError(_("Error writing to synchronization database:") + L" \n" + L"\"" + errorObjName_ + L"\""); } } @@ -266,7 +266,7 @@ inline void WriteOutputStream::check() const { if (stream_.GetLastError() != wxSTREAM_NO_ERROR) - throw FileError(_("Error writing to synchronization database:") + " \n" + "\"" + errorObjName_.c_str() + "\""); + throw FileError(_("Error writing to synchronization database:") + L" \n" + L"\"" + errorObjName_ + L"\""); } } diff --git a/wx+/string_conv.h b/wx+/string_conv.h index 3f4574ab..76249aca 100644 --- a/wx+/string_conv.h +++ b/wx+/string_conv.h @@ -13,10 +13,6 @@ namespace zen { -inline wxString operator+(const wxString& lhs, const char* rhs) { return wxString(lhs) += utf8CvrtTo<wxString>(rhs); } -inline wxString operator+(const wxString& lhs, const Zstring& rhs) { return wxString(lhs) += utf8CvrtTo<wxString>(rhs); } - - //conversion between Zstring and wxString inline wxString toWx(const Zstring& str) { return utf8CvrtTo<wxString>(str); } inline Zstring toZ(const wxString& str) { return utf8CvrtTo<Zstring>(str); } diff --git a/wx+/timespan.h b/wx+/timespan.h index d11b328e..698171fa 100644 --- a/wx+/timespan.h +++ b/wx+/timespan.h @@ -19,9 +19,9 @@ namespace zen { inline -wxEventType getEventType() //external linkage +wxEventType getEventType() { - static wxEventType evt = wxNewEventType(); + static wxEventType evt = wxNewEventType(); //external linkage! return evt; } const wxEventType wxEVT_TIMESPAN_CHANGE = getEventType(); |