Mercurial > hg > svgui
comparison view/View.cpp @ 953:fe46201414c8 osx-retina
Fix rendering of selections
| author | Chris Cannam |
|---|---|
| date | Wed, 29 Apr 2015 12:37:23 +0100 |
| parents | b1aa74ce697e |
| children | 76b5eabd816b |
comparison
equal
deleted
inserted
replaced
| 952:b1aa74ce697e | 953:fe46201414c8 |
|---|---|
| 1702 #endif | 1702 #endif |
| 1703 } | 1703 } |
| 1704 | 1704 |
| 1705 QRect nonCacheRect(cacheRect); | 1705 QRect nonCacheRect(cacheRect); |
| 1706 | 1706 |
| 1707 int dpratio = devicePixelRatio(); | |
| 1708 | |
| 1707 // If not all layers are scrollable, but some of the back layers | 1709 // If not all layers are scrollable, but some of the back layers |
| 1708 // are, we should store only those in the cache. | 1710 // are, we should store only those in the cache. |
| 1709 | 1711 |
| 1710 bool layersChanged = false; | 1712 bool layersChanged = false; |
| 1711 LayerList scrollables = getScrollableBackLayers(true, layersChanged); | 1713 LayerList scrollables = getScrollableBackLayers(true, layersChanged); |
| 1713 bool selectionCacheable = nonScrollables.empty(); | 1715 bool selectionCacheable = nonScrollables.empty(); |
| 1714 bool haveSelections = m_manager && !m_manager->getSelections().empty(); | 1716 bool haveSelections = m_manager && !m_manager->getSelections().empty(); |
| 1715 | 1717 |
| 1716 // If all the non-scrollable layers are non-opaque, then we draw | 1718 // If all the non-scrollable layers are non-opaque, then we draw |
| 1717 // the selection rectangle behind them and cache it. If any are | 1719 // the selection rectangle behind them and cache it. If any are |
| 1718 // opaque, however, we can't cache. | 1720 // opaque, however, or if our device-pixel ratio is not 1 (so we |
| 1721 // need to paint direct to the widget), then we can't cache. | |
| 1719 // | 1722 // |
| 1720 if (!selectionCacheable) { | 1723 if (dpratio == 1) { |
| 1721 selectionCacheable = true; | 1724 |
| 1722 for (LayerList::const_iterator i = nonScrollables.begin(); | 1725 if (!selectionCacheable) { |
| 1723 i != nonScrollables.end(); ++i) { | 1726 selectionCacheable = true; |
| 1724 if ((*i)->isLayerOpaque()) { | 1727 for (LayerList::const_iterator i = nonScrollables.begin(); |
| 1725 selectionCacheable = false; | 1728 i != nonScrollables.end(); ++i) { |
| 1726 break; | 1729 if ((*i)->isLayerOpaque()) { |
| 1727 } | 1730 selectionCacheable = false; |
| 1728 } | 1731 break; |
| 1729 } | 1732 } |
| 1730 | 1733 } |
| 1731 if (selectionCacheable) { | 1734 } |
| 1732 QPoint localPos; | 1735 |
| 1733 bool closeToLeft, closeToRight; | 1736 if (selectionCacheable) { |
| 1734 if (shouldIlluminateLocalSelection(localPos, closeToLeft, closeToRight)) { | 1737 QPoint localPos; |
| 1735 selectionCacheable = false; | 1738 bool closeToLeft, closeToRight; |
| 1736 } | 1739 if (shouldIlluminateLocalSelection |
| 1740 (localPos, closeToLeft, closeToRight)) { | |
| 1741 selectionCacheable = false; | |
| 1742 } | |
| 1743 } | |
| 1744 | |
| 1745 } else { | |
| 1746 | |
| 1747 selectionCacheable = false; | |
| 1737 } | 1748 } |
| 1738 | 1749 |
| 1739 #ifdef DEBUG_VIEW_WIDGET_PAINT | 1750 #ifdef DEBUG_VIEW_WIDGET_PAINT |
| 1740 cerr << "View(" << this << ")::paintEvent: have " << scrollables.size() | 1751 cerr << "View(" << this << ")::paintEvent: have " << scrollables.size() |
| 1741 << " scrollable back layers and " << nonScrollables.size() | 1752 << " scrollable back layers and " << nonScrollables.size() |
| 1749 delete m_cache; | 1760 delete m_cache; |
| 1750 m_cache = 0; | 1761 m_cache = 0; |
| 1751 m_selectionCached = false; | 1762 m_selectionCached = false; |
| 1752 } | 1763 } |
| 1753 | 1764 |
| 1754 int dpratio = devicePixelRatio(); | |
| 1755 | |
| 1756 QSize scaledCacheSize(scaledSize(size(), dpratio)); | 1765 QSize scaledCacheSize(scaledSize(size(), dpratio)); |
| 1757 QRect scaledCacheRect(scaledRect(cacheRect, dpratio)); | 1766 QRect scaledCacheRect(scaledRect(cacheRect, dpratio)); |
| 1758 | 1767 |
| 1759 if (!m_buffer || scaledCacheSize != m_buffer->size()) { | 1768 if (!m_buffer || scaledCacheSize != m_buffer->size()) { |
| 1760 delete m_buffer; | 1769 delete m_buffer; |
| 1922 #endif | 1931 #endif |
| 1923 (*i)->paint(&proxy, paint, scaledNonCacheRect); | 1932 (*i)->paint(&proxy, paint, scaledNonCacheRect); |
| 1924 } | 1933 } |
| 1925 | 1934 |
| 1926 paint.end(); | 1935 paint.end(); |
| 1927 | 1936 |
| 1928 paint.begin(m_buffer); | 1937 paint.begin(this); |
| 1938 QRect finalPaintRect = e ? e->rect() : rect(); | |
| 1939 paint.drawPixmap(finalPaintRect, *m_buffer, scaledRect(finalPaintRect, dpratio)); | |
| 1940 paint.end(); | |
| 1941 | |
| 1942 paint.begin(this); | |
| 1929 setPaintFont(paint); | 1943 setPaintFont(paint); |
| 1930 if (e) paint.setClipRect(scaledRect(e->rect(), dpratio)); | 1944 if (e) paint.setClipRect(e->rect()); |
| 1931 if (!m_selectionCached) { | 1945 if (!m_selectionCached) { |
| 1932 drawSelections(paint); | 1946 drawSelections(paint); |
| 1933 } | 1947 } |
| 1934 paint.end(); | 1948 paint.end(); |
| 1935 | 1949 |
| 1946 // Don't show the play pointer when it is redundant with | 1960 // Don't show the play pointer when it is redundant with |
| 1947 // the centre line | 1961 // the centre line |
| 1948 showPlayPointer = false; | 1962 showPlayPointer = false; |
| 1949 } | 1963 } |
| 1950 } | 1964 } |
| 1951 | |
| 1952 paint.begin(this); | |
| 1953 QRect finalPaintRect = e ? e->rect() : rect(); | |
| 1954 paint.drawPixmap(finalPaintRect, *m_buffer, scaledRect(finalPaintRect, dpratio)); | |
| 1955 paint.end(); | |
| 1956 | 1965 |
| 1957 if (showPlayPointer) { | 1966 if (showPlayPointer) { |
| 1958 | 1967 |
| 1959 paint.begin(this); | 1968 paint.begin(this); |
| 1960 | 1969 |
