Procházet zdrojové kódy

LibGUI: Don't draw left and right side of surfaces that span entire window.

In other words, if a surface stretches from the left side of the window
all the way to the right side, skip shading and highlighting the sides.
This makes widgets blend together just slightly with the window. :^)
Andreas Kling před 6 roky
rodič
revize
d48f486634

+ 5 - 2
LibGUI/GFrame.cpp

@@ -38,8 +38,11 @@ void GFrame::paint_event(GPaintEvent& event)
     if (m_thickness >= 1) {
         painter.draw_line(rect().top_left(), rect().top_right(), top_left_color);
         painter.draw_line(rect().bottom_left(), rect().bottom_right(), bottom_right_color);
-        painter.draw_line(rect().top_left().translated(0, 1), rect().bottom_left().translated(0, -1), top_left_color);
-        painter.draw_line(rect().top_right(), rect().bottom_right().translated(0, -1), bottom_right_color);
+
+        if (m_shape != Shape::Panel || !spans_entire_window_horizontally()) {
+            painter.draw_line(rect().top_left().translated(0, 1), rect().bottom_left().translated(0, -1), top_left_color);
+            painter.draw_line(rect().top_right(), rect().bottom_right().translated(0, -1), bottom_right_color);
+        }
     }
 
     if (m_shape == Shape::Container && m_thickness >= 2) {

+ 2 - 2
LibGUI/GStatusBar.cpp

@@ -10,7 +10,7 @@ GStatusBar::GStatusBar(GWidget* parent)
     set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
     set_preferred_size({ 0, 20 });
     set_layout(make<GBoxLayout>(Orientation::Horizontal));
-    layout()->set_margins({ 4, 2, 4, 2 });
+    layout()->set_margins({ 2, 2, 2, 2 });
     m_label = new GLabel(this);
     m_label->set_frame_shadow(GFrame::Shadow::Sunken);
     m_label->set_frame_shape(GFrame::Shape::Panel);
@@ -36,5 +36,5 @@ void GStatusBar::paint_event(GPaintEvent& event)
 {
     GPainter painter(*this);
     painter.set_clip_rect(event.rect());
-    StylePainter::the().paint_surface(painter, rect());
+    StylePainter::the().paint_surface(painter, rect(), !spans_entire_window_horizontally());
 }

+ 1 - 1
LibGUI/GToolBar.cpp

@@ -79,5 +79,5 @@ void GToolBar::paint_event(GPaintEvent& event)
 {
     GPainter painter(*this);
     painter.set_clip_rect(event.rect());
-    StylePainter::the().paint_surface(painter, rect());
+    StylePainter::the().paint_surface(painter, rect(), !spans_entire_window_horizontally());
 }

+ 15 - 0
LibGUI/GWidget.cpp

@@ -353,3 +353,18 @@ void GWidget::set_visible(bool visible)
     if (m_visible)
         update();
 }
+
+bool GWidget::spans_entire_window_horizontally() const
+{
+    auto* w = window();
+    if (!w)
+        return false;
+    auto* main_widget = w->main_widget();
+    if (!main_widget)
+        return false;
+    if (main_widget == this)
+        return true;
+    auto wrr = window_relative_rect();
+    dbgprintf("Checking %s{%p} wrr=%s, mwr=%s\n", class_name(), this, wrr.to_string().characters(), main_widget->rect().to_string().characters());
+    return wrr.left() == main_widget->rect().left() && wrr.right() == main_widget->rect().right();
+}

+ 2 - 0
LibGUI/GWidget.h

@@ -139,6 +139,8 @@ public:
     bool is_visible() const { return m_visible; }
     void set_visible(bool);
 
+    bool spans_entire_window_horizontally() const;
+
 private:
     virtual bool is_widget() const final { return true; }
 

+ 5 - 3
SharedGraphics/StylePainter.cpp

@@ -98,11 +98,13 @@ void StylePainter::paint_button(Painter& painter, const Rect& rect, ButtonStyle
     }
 }
 
-void StylePainter::paint_surface(Painter& painter, const Rect& rect)
+void StylePainter::paint_surface(Painter& painter, const Rect& rect, bool paint_vertical_lines)
 {
     painter.fill_rect({ rect.x(), rect.y() + 1, rect.width(), rect.height() - 2 }, Color::LightGray);
     painter.draw_line(rect.top_left(), rect.top_right(), Color::White);
     painter.draw_line(rect.bottom_left(), rect.bottom_right(), Color::MidGray);
-    painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), Color::White);
-    painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), Color::MidGray);
+    if (paint_vertical_lines) {
+        painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), Color::White);
+        painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), Color::MidGray);
+    }
 }

+ 1 - 1
SharedGraphics/StylePainter.h

@@ -10,7 +10,7 @@ public:
     static StylePainter& the();
 
     void paint_button(Painter&, const Rect&, ButtonStyle, bool pressed, bool hovered = false);
-    void paint_surface(Painter&, const Rect&);
+    void paint_surface(Painter&, const Rect&, bool paint_vertical_lines = true);
 
 private:
     StylePainter();