Skip to content

Commit

Permalink
LibGUI: Move GUI::SeparatorWidget from ToolBar.cpp to its own file
Browse files Browse the repository at this point in the history
This makes this nice line separator widget usable outside toolbars.
Also support both horizontal and vertical orientation. :^)
  • Loading branch information
awesomekling committed Dec 30, 2020
1 parent 2dc09d1 commit 5b1a6d7
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 22 deletions.
1 change: 1 addition & 0 deletions Libraries/LibGUI/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ set(SOURCES
RunningProcessesModel.cpp
ScrollBar.cpp
ScrollableWidget.cpp
SeparatorWidget.cpp
ShellSyntaxHighlighter.cpp
Shortcut.cpp
Slider.cpp
Expand Down
62 changes: 62 additions & 0 deletions Libraries/LibGUI/SeparatorWidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright (c) 2020, Andreas Kling <[email protected]>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <LibGUI/Painter.h>
#include <LibGUI/SeparatorWidget.h>
#include <LibGfx/Palette.h>

namespace GUI {

SeparatorWidget::SeparatorWidget(Gfx::Orientation orientation)
: m_orientation(orientation)
{
if (m_orientation == Gfx::Orientation::Vertical)
set_fixed_width(8);
else
set_fixed_height(8);
}

SeparatorWidget::~SeparatorWidget()
{
}

void SeparatorWidget::paint_event(PaintEvent& event)
{
Painter painter(*this);
painter.add_clip_rect(event.rect());

if (m_orientation == Gfx::Orientation::Vertical) {
painter.translate(rect().center().x() - 1, 0);
painter.draw_line({ 0, 0 }, { 0, rect().bottom() }, palette().threed_shadow1());
painter.draw_line({ 1, 0 }, { 1, rect().bottom() }, palette().threed_highlight());
} else {
painter.translate(0, rect().center().y() - 1);
painter.draw_line({ 0, 0 }, { rect().right(), 0 }, palette().threed_shadow1());
painter.draw_line({ 0, 1 }, { rect().right(), 1 }, palette().threed_highlight());
}
}

}
46 changes: 46 additions & 0 deletions Libraries/LibGUI/SeparatorWidget.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2020, Andreas Kling <[email protected]>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#pragma once

#include <LibGUI/Widget.h>

namespace GUI {

class SeparatorWidget final : public Widget {
C_OBJECT(SeparatorWidget);

public:
virtual ~SeparatorWidget() override;

private:
explicit SeparatorWidget(Gfx::Orientation);

virtual void paint_event(PaintEvent&) override;

const Gfx::Orientation m_orientation;
};
}
27 changes: 5 additions & 22 deletions Libraries/LibGUI/ToolBar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,17 @@
#include <LibGUI/BoxLayout.h>
#include <LibGUI/Button.h>
#include <LibGUI/Painter.h>
#include <LibGUI/SeparatorWidget.h>
#include <LibGUI/ToolBar.h>
#include <LibGfx/Palette.h>

namespace GUI {

ToolBar::ToolBar(Orientation orientation, int button_size)
: m_button_size(button_size)
: m_orientation(orientation)
, m_button_size(button_size)
{
if (orientation == Orientation::Horizontal) {
if (m_orientation == Orientation::Horizontal) {
set_fixed_height(button_size + 8);
} else {
set_fixed_width(button_size + 8);
Expand Down Expand Up @@ -98,30 +100,11 @@ void ToolBar::add_action(Action& action)
m_items.append(move(item));
}

class SeparatorWidget final : public Widget {
C_OBJECT(SeparatorWidget)
public:
SeparatorWidget()
{
set_fixed_size(8, 18);
}
virtual ~SeparatorWidget() override { }

virtual void paint_event(PaintEvent& event) override
{
Painter painter(*this);
painter.add_clip_rect(event.rect());
painter.translate(rect().center().x() - 1, 0);
painter.draw_line({ 0, 0 }, { 0, rect().bottom() }, palette().threed_shadow1());
painter.draw_line({ 1, 0 }, { 1, rect().bottom() }, palette().threed_highlight());
}
};

void ToolBar::add_separator()
{
auto item = make<Item>();
item->type = Item::Type::Separator;
add<SeparatorWidget>();
add<SeparatorWidget>(m_orientation == Gfx::Orientation::Horizontal ? Gfx::Orientation::Vertical : Gfx::Orientation::Horizontal);
m_items.append(move(item));
}

Expand Down
1 change: 1 addition & 0 deletions Libraries/LibGUI/ToolBar.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class ToolBar : public Widget {
RefPtr<Action> action;
};
NonnullOwnPtrVector<Item> m_items;
const Gfx::Orientation m_orientation;
int m_button_size { 16 };
bool m_has_frame { true };
};
Expand Down

0 comments on commit 5b1a6d7

Please sign in to comment.