Draw tags

This commit is contained in:
Raphael Robatsch 2021-10-22 15:34:19 +02:00
parent 64fa80f8b2
commit 4c0b1f31fe
7 changed files with 58 additions and 47 deletions

View file

@ -3,7 +3,7 @@ project('somebar', ['c', 'cpp'],
wayland_dep = dependency('wayland-client')
qt5 = import('qt5')
qt5_dep = dependency('qt5', modules: ['Core', 'Widgets'])
qt5_dep = dependency('qt5', modules: ['Core', 'Gui'])
#moc = qt5.compile_moc(headers: [ 'src/.hpp', ])
subdir('protocols')
@ -12,7 +12,6 @@ executable('somebar',
'src/main.cpp',
'src/shm_buffer.cpp',
'src/bar.cpp',
'src/bar_widget.cpp',
wayland_sources,
#moc,
dependencies: [qt5_dep, wayland_dep])

View file

@ -1,7 +1,9 @@
// somebar - dwl bar
// See LICENSE file for copyright and license details.
#include <QColor>
#include <QImage>
#include <QPainter>
#include "bar.hpp"
#include "config.hpp"
@ -24,6 +26,10 @@ Bar::Bar(const wl_output *output)
zwlr_layer_surface_v1_set_size(_layerSurface, 0, barSize);
zwlr_layer_surface_v1_set_exclusive_zone(_layerSurface, barSize);
wl_surface_commit(_surface);
for (auto i=1; i<=4; i++) {
_tags.push_back({ QString::number(i), i%2 == 0 });
}
}
Bar::~Bar()
@ -36,10 +42,11 @@ void Bar::layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height
{
zwlr_layer_surface_v1_ack_configure(_layerSurface, serial);
_bufs.emplace(width, height, WL_SHM_FORMAT_XRGB8888);
auto root = _widget.root();
root->setFixedSize(width, height);
render();
}
static QBrush inactiveBg = {QColor::fromRgb(0, 0, 0)};
static QBrush activeBg = QBrush {QColor::fromRgb(0, 0, 255)};
static QPen fg = QPen {QBrush {QColor::fromRgb(255, 255, 255)}, 1};
void Bar::render()
{
@ -48,11 +55,38 @@ void Bar::render()
_bufs->width,
_bufs->height,
_bufs->stride,
QImage::Format_RGBX8888
QImage::Format_ARGB32
};
auto root = _widget.root();
root->render(&img);
auto painter = QPainter {&img};
auto font = painter.font();
font.setBold(true);
font.setPixelSize(18);
painter.setFont(font);
painter.setPen(fg);
painter.fillRect(0, 0, img.width(), img.height(), activeBg);
_fontMetrics.emplace(painter.font());
_textY = _fontMetrics->ascent() + paddingY;
renderTags(painter);
wl_surface_attach(_surface, _bufs->buffer(), 0, 0);
wl_surface_commit(_surface);
_bufs->flip();
}
void Bar::renderTags(QPainter &painter)
{
auto x = 0;
for (const auto &tag : _tags) {
auto size = textWidth(tag.name) + paddingX*2;
auto& bg = tag.active ? activeBg : inactiveBg;
painter.fillRect(x, 0, size, barSize, bg);
painter.drawText(paddingX+x, _textY, tag.name);
x += size;
}
}
int Bar::textWidth(const QString &text)
{
return _fontMetrics->size(Qt::TextSingleLine, text).width();
}

View file

@ -3,22 +3,33 @@
#pragma once
#include <optional>
#include <vector>
#include <wayland-client.h>
#include <QString>
#include <QFontMetrics>
#include "wlr-layer-shell-unstable-v1-client-protocol.h"
#include "common.hpp"
#include "shm_buffer.hpp"
#include "bar_widget.hpp"
struct Tag {
QString name;
bool active;
};
class Bar {
static const zwlr_layer_surface_v1_listener _layerSurfaceListener;
wl_surface *_surface {nullptr};
zwlr_layer_surface_v1 *_layerSurface {nullptr};
std::optional<QFontMetrics> _fontMetrics;
std::optional<ShmBuffer> _bufs;
BarWidget _widget;
std::vector<Tag> _tags;
int _textY;
void layerSurfaceConfigure(uint32_t serial, uint32_t width, uint32_t height);
void render();
void renderTags(QPainter &painter);
int textWidth(const QString &text);
public:
explicit Bar(const wl_output *output);
~Bar();

View file

@ -1,18 +0,0 @@
// somebar - dwl bar
// See LICENSE file for copyright and license details.
#include "bar_widget.hpp"
BarWidget::BarWidget()
: _box {QBoxLayout::LeftToRight, &_root}
, _label {&_root}
{
_root.setAttribute(Qt::WA_DontShowOnScreen);
_label.setText("somebar");
}
BarWidget::~BarWidget()
{
}
QWidget* BarWidget::root() { return &_root; }

View file

@ -1,17 +0,0 @@
// somebar - dwl bar
// See LICENSE file for copyright and license details.
#pragma once
#include <QBoxLayout>
#include <QLabel>
#include <QWidget>
class BarWidget {
QWidget _root;
QBoxLayout _box;
QLabel _label;
public:
explicit BarWidget();
~BarWidget();
QWidget* root();
};

View file

@ -1,5 +1,7 @@
// somebar - dwl bar
// See LICENSE file for copyright and license details.
constexpr int barSize = 20;
constexpr int barSize = 26;
constexpr bool topbar = 1;
constexpr int paddingX = 10;
constexpr int paddingY = 3;

View file

@ -5,7 +5,7 @@
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <QApplication>
#include <QGuiApplication>
#include <QSocketNotifier>
#include <wayland-client.h>
#include "qnamespace.h"
@ -68,7 +68,7 @@ static const struct wl_registry_listener registry_listener = { registryHandleGlo
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QGuiApplication app(argc, argv);
QCoreApplication::setOrganizationName("tape software");
QCoreApplication::setOrganizationDomain("tapesoftware.net");
QCoreApplication::setApplicationName("somebar");