LibGUI: Move GUI::SeparatorWidget from ToolBar.cpp to its own file

This makes this nice line separator widget usable outside toolbars.
Also support both horizontal and vertical orientation. :^)
This commit is contained in:
Andreas Kling 2020-12-30 03:52:27 +01:00
parent 2dc09d1cd7
commit 5b1a6d7c66
Notes: sideshowbarker 2024-07-19 00:24:39 +09:00
5 changed files with 115 additions and 22 deletions

View file

@ -65,6 +65,7 @@ set(SOURCES
RunningProcessesModel.cpp
ScrollBar.cpp
ScrollableWidget.cpp
SeparatorWidget.cpp
ShellSyntaxHighlighter.cpp
Shortcut.cpp
Slider.cpp

View file

@ -0,0 +1,62 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* 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());
}
}
}

View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
* 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;
};
}

View file

@ -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);
@ -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));
}

View file

@ -58,6 +58,7 @@ private:
RefPtr<Action> action;
};
NonnullOwnPtrVector<Item> m_items;
const Gfx::Orientation m_orientation;
int m_button_size { 16 };
bool m_has_frame { true };
};