mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:37:34 +00:00
Make a nice bitmap cursor.
It's rendered as two CharacterBitmaps right now because I don't have a good primitive for this and I wanted it right away. I should add 2-color bitmaps.. Also make a neat little effect where the cursor becomes inverted on press.
This commit is contained in:
parent
1d914cbd84
commit
8e96cba7ef
3 changed files with 56 additions and 8 deletions
|
@ -60,7 +60,7 @@ void AbstractScreen::on_receive_mouse_data(int dx, int dy, bool left_button, boo
|
||||||
auto event = make<MouseEvent>(right_button ? Event::MouseDown : Event::MouseUp, m_cursor_location.x(), m_cursor_location.y(), MouseButton::Right);
|
auto event = make<MouseEvent>(right_button ? Event::MouseDown : Event::MouseUp, m_cursor_location.x(), m_cursor_location.y(), MouseButton::Right);
|
||||||
EventLoop::main().postEvent(&WindowManager::the(), move(event));
|
EventLoop::main().postEvent(&WindowManager::the(), move(event));
|
||||||
}
|
}
|
||||||
if (m_cursor_location != prev_location)
|
if (m_cursor_location != prev_location || prev_left_button != left_button)
|
||||||
WindowManager::the().redraw_cursor();
|
WindowManager::the().redraw_cursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,6 +64,46 @@ void WindowManager::initialize()
|
||||||
s_the_window_manager = nullptr;
|
s_the_window_manager = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* cursor_bitmap_inner_ascii = {
|
||||||
|
" # "
|
||||||
|
" ## "
|
||||||
|
" ### "
|
||||||
|
" #### "
|
||||||
|
" ##### "
|
||||||
|
" ###### "
|
||||||
|
" ####### "
|
||||||
|
" ######## "
|
||||||
|
" ######### "
|
||||||
|
" ########## "
|
||||||
|
" ###### "
|
||||||
|
" ## ## "
|
||||||
|
" # ## "
|
||||||
|
" ## "
|
||||||
|
" ## "
|
||||||
|
" ## "
|
||||||
|
" "
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char* cursor_bitmap_outer_ascii = {
|
||||||
|
"## "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# # "
|
||||||
|
"# #### "
|
||||||
|
"# ## # "
|
||||||
|
"# # # # "
|
||||||
|
"## # # "
|
||||||
|
" # # "
|
||||||
|
" # # "
|
||||||
|
" ## "
|
||||||
|
};
|
||||||
|
|
||||||
WindowManager::WindowManager()
|
WindowManager::WindowManager()
|
||||||
: m_framebuffer(FrameBuffer::the())
|
: m_framebuffer(FrameBuffer::the())
|
||||||
, m_screen_rect(m_framebuffer.rect())
|
, m_screen_rect(m_framebuffer.rect())
|
||||||
|
@ -79,6 +119,9 @@ WindowManager::WindowManager()
|
||||||
m_inactiveWindowBorderColor = Color(64, 64, 64);
|
m_inactiveWindowBorderColor = Color(64, 64, 64);
|
||||||
m_inactiveWindowTitleColor = Color::White;
|
m_inactiveWindowTitleColor = Color::White;
|
||||||
|
|
||||||
|
m_cursor_bitmap_inner = CharacterBitmap::createFromASCII(cursor_bitmap_inner_ascii, 12, 17);
|
||||||
|
m_cursor_bitmap_outer = CharacterBitmap::createFromASCII(cursor_bitmap_outer_ascii, 12, 17);
|
||||||
|
|
||||||
invalidate();
|
invalidate();
|
||||||
compose();
|
compose();
|
||||||
}
|
}
|
||||||
|
@ -260,16 +303,17 @@ void WindowManager::compose()
|
||||||
|
|
||||||
void WindowManager::redraw_cursor()
|
void WindowManager::redraw_cursor()
|
||||||
{
|
{
|
||||||
auto cursor_location = AbstractScreen::the().cursor_location();
|
auto cursor_location = m_framebuffer.cursor_location();
|
||||||
Painter painter(*m_front_bitmap);
|
Painter painter(*m_front_bitmap);
|
||||||
Rect cursor_rect { cursor_location.x() - 10, cursor_location.y() - 10, 21, 21 };
|
Rect cursor_rect { cursor_location.x(), cursor_location.y(), (int)m_cursor_bitmap_inner->width(), (int)m_cursor_bitmap_inner->height() };
|
||||||
flush(m_last_cursor_rect);
|
flush(m_last_cursor_rect);
|
||||||
flush(cursor_rect);
|
flush(cursor_rect);
|
||||||
auto draw_cross = [&painter] (const Point& p) {
|
Color inner_color = Color::White;
|
||||||
painter.draw_line({ p.x() - 10, p.y() }, { p.x() + 10, p.y() }, Color::Red);
|
Color outer_color = Color::Black;
|
||||||
painter.draw_line({ p.x(), p.y() - 10 }, { p.x(), p.y() + 10 }, Color::Red);
|
if (m_framebuffer.left_mouse_button_pressed())
|
||||||
};
|
swap(inner_color, outer_color);
|
||||||
draw_cross(cursor_location);
|
painter.draw_bitmap(cursor_location, *m_cursor_bitmap_inner, inner_color);
|
||||||
|
painter.draw_bitmap(cursor_location, *m_cursor_bitmap_outer, outer_color);
|
||||||
m_last_cursor_rect = cursor_rect;
|
m_last_cursor_rect = cursor_rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ class MouseEvent;
|
||||||
class PaintEvent;
|
class PaintEvent;
|
||||||
class Widget;
|
class Widget;
|
||||||
class Window;
|
class Window;
|
||||||
|
class CharacterBitmap;
|
||||||
class GraphicsBitmap;
|
class GraphicsBitmap;
|
||||||
|
|
||||||
class WindowManager : public Object {
|
class WindowManager : public Object {
|
||||||
|
@ -85,4 +86,7 @@ private:
|
||||||
Vector<Rect> m_invalidated_rects;
|
Vector<Rect> m_invalidated_rects;
|
||||||
|
|
||||||
bool m_pending_compose_event { false };
|
bool m_pending_compose_event { false };
|
||||||
|
|
||||||
|
RetainPtr<CharacterBitmap> m_cursor_bitmap_inner;
|
||||||
|
RetainPtr<CharacterBitmap> m_cursor_bitmap_outer;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue