diff --git a/data/art/border-medium.png b/data/art/border-medium.png new file mode 100644 index 000000000..529a60ee4 Binary files /dev/null and b/data/art/border-medium.png differ diff --git a/data/art/border-panel.png b/data/art/border-panel.png new file mode 100644 index 000000000..52b24b919 Binary files /dev/null and b/data/art/border-panel.png differ diff --git a/data/art/border-thin.png b/data/art/border-thin.png new file mode 100644 index 000000000..71fa59a3e Binary files /dev/null and b/data/art/border-thin.png differ diff --git a/data/art/border-window.png b/data/art/border-window.png new file mode 100644 index 000000000..34747d69b Binary files /dev/null and b/data/art/border-window.png differ diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index c696248ab..9b1737f9f 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4224,18 +4224,21 @@ A framed screen has the following attributes: There are the following predefined frame style tables: -* ``GREY_FRAME`` +* ``WINDOW_FRAME`` - A plain grey-colored frame. + A frame suitable for a draggable, optionally resizable window. -* ``BOUNDARY_FRAME`` +* ``PANEL_FRAME`` - The same frame as used by the usual full-screen DF views, like dwarfmode. + A frame suitable for a static (non-draggable, non-resizable) panel. -* ``GREY_LINE_FRAME`` +* ``MEDIUM_FRAME`` - A frame consisting of grey lines, similar to the one used by titan announcements. + A frame suitable for overlay widget panels. +* ``THIN_FRAME`` + + A frame suitable for light accent elements. gui.widgets =========== diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index ceb79556f..439ed5d15 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1693,6 +1693,10 @@ static const LuaWrapper::FunctionReg dfhack_textures_module[] = { WRAPM(Textures, getGreenPinTexposStart), WRAPM(Textures, getRedPinTexposStart), WRAPM(Textures, getIconsTexposStart), + WRAPM(Textures, getThinBordersTexposStart), + WRAPM(Textures, getMediumBordersTexposStart), + WRAPM(Textures, getPanelBordersTexposStart), + WRAPM(Textures, getWindowBordersTexposStart), { NULL, NULL } }; diff --git a/library/include/modules/Textures.h b/library/include/modules/Textures.h index e3e5a8ec0..e01003704 100644 --- a/library/include/modules/Textures.h +++ b/library/include/modules/Textures.h @@ -41,5 +41,13 @@ DFHACK_EXPORT long getRedPinTexposStart(); */ DFHACK_EXPORT long getIconsTexposStart(); +/** + * Get the first texpos for the DFHack borders. Each is a 7x3 grid. + */ +DFHACK_EXPORT long getThinBordersTexposStart(); +DFHACK_EXPORT long getMediumBordersTexposStart(); +DFHACK_EXPORT long getPanelBordersTexposStart(); +DFHACK_EXPORT long getWindowBordersTexposStart(); + } } diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 530848f61..e415000ae 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -789,29 +789,23 @@ end -------------------------- -- Plain grey-colored frame. +-- deprecated GREY_FRAME = { frame_pen = to_pen{ ch = ' ', fg = COLOR_BLACK, bg = COLOR_GREY }, title_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_WHITE }, signature_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, } --- The usual boundary used by the DF screens. Often has fancy pattern in tilesets. +-- The boundary used by the pre-steam DF screens. +-- deprecated BOUNDARY_FRAME = { frame_pen = to_pen{ ch = 0xDB, fg = COLOR_GREY, bg = COLOR_BLACK }, title_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, signature_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, } -GREY_LINE_FRAME = { +local BASE_FRAME = { frame_pen = to_pen{ ch=206, fg=COLOR_GREY, bg=COLOR_BLACK }, - t_frame_pen = to_pen{ tile=902, ch=205, fg=COLOR_GREY, bg=COLOR_BLACK }, - l_frame_pen = to_pen{ tile=908, ch=186, fg=COLOR_GREY, bg=COLOR_BLACK }, - b_frame_pen = to_pen{ tile=916, ch=205, fg=COLOR_GREY, bg=COLOR_BLACK }, - r_frame_pen = to_pen{ tile=910, ch=186, fg=COLOR_GREY, bg=COLOR_BLACK }, - lt_frame_pen = to_pen{ tile=901, ch=201, fg=COLOR_GREY, bg=COLOR_BLACK }, - lb_frame_pen = to_pen{ tile=915, ch=200, fg=COLOR_GREY, bg=COLOR_BLACK }, - rt_frame_pen = to_pen{ tile=903, ch=187, fg=COLOR_GREY, bg=COLOR_BLACK }, - rb_frame_pen = to_pen{ tile=917, ch=188, fg=COLOR_GREY, bg=COLOR_BLACK }, title_pen = to_pen{ fg=COLOR_BLACK, bg=COLOR_GREY }, inactive_title_pen = to_pen{ fg=COLOR_GREY, bg=COLOR_BLACK }, signature_pen = to_pen{ fg=COLOR_GREY, bg=COLOR_BLACK }, @@ -819,6 +813,31 @@ GREY_LINE_FRAME = { unpinned_pen = to_pen{tile=782, ch=216, fg=COLOR_GREY, bg=COLOR_BLACK}, } +local function make_frame(name, double_line) + local texpos = dfhack.textures['get'..name..'BordersTexposStart']() + local tp = function(offset) + if texpos == -1 then return nil end + return texpos + offset + end + + local frame = copyall(BASE_FRAME) + frame.t_frame_pen = to_pen{ tile=tp(1), ch=double_line and 205 or 196, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.l_frame_pen = to_pen{ tile=tp(7), ch=double_line and 186 or 179, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.b_frame_pen = to_pen{ tile=tp(15), ch=double_line and 205 or 196, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.r_frame_pen = to_pen{ tile=tp(9), ch=double_line and 186 or 179, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.lt_frame_pen = to_pen{ tile=tp(0), ch=double_line and 201 or 218, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.lb_frame_pen = to_pen{ tile=tp(14), ch=double_line and 200 or 192, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.rt_frame_pen = to_pen{ tile=tp(2), ch=double_line and 187 or 191, fg=COLOR_GREY, bg=COLOR_BLACK } + frame.rb_frame_pen = to_pen{ tile=tp(16), ch=double_line and 188 or 217, fg=COLOR_GREY, bg=COLOR_BLACK } + return frame +end + +WINDOW_FRAME = make_frame('Window', true) +GREY_LINE_FRAME = WINDOW_FRAME -- for compatibility with pre-steam code +PANEL_FRAME = make_frame('Panel', false) +MEDIUM_FRAME = make_frame('Medium', false) +THIN_FRAME = make_frame('Thin', false) + function paint_frame(dc,rect,style,title,show_pin,pinned,inactive) local pen = style.frame_pen local x1,y1,x2,y2 = dc.x1+rect.x1, dc.y1+rect.y1, dc.x1+rect.x2, dc.y1+rect.y2 diff --git a/library/modules/Textures.cpp b/library/modules/Textures.cpp index 78ed53d97..2975dc4d8 100644 --- a/library/modules/Textures.cpp +++ b/library/modules/Textures.cpp @@ -22,6 +22,10 @@ static long g_dfhack_logo_texpos_start = -1; static long g_green_pin_texpos_start = -1; static long g_red_pin_texpos_start = -1; static long g_icons_texpos_start = -1; +static long g_thin_borders_texpos_start = -1; +static long g_medium_borders_texpos_start = -1; +static long g_panel_borders_texpos_start = -1; +static long g_window_borders_texpos_start = -1; // Converts an arbitrary Surface to something like the display format // (32-bit RGBA), and converts magenta to transparency if convert_magenta is set @@ -120,6 +124,14 @@ void Textures::init(color_ostream &out) { &g_red_pin_texpos_start); g_num_dfhack_textures += load_textures(out, "hack/data/art/icons.png", &g_icons_texpos_start); + g_num_dfhack_textures += load_textures(out, "hack/data/art/border-thin.png", + &g_thin_borders_texpos_start); + g_num_dfhack_textures += load_textures(out, "hack/data/art/border-medium.png", + &g_medium_borders_texpos_start); + g_num_dfhack_textures += load_textures(out, "hack/data/art/border-panel.png", + &g_panel_borders_texpos_start); + g_num_dfhack_textures += load_textures(out, "hack/data/art/border-window.png", + &g_window_borders_texpos_start); DEBUG(textures,out).print("loaded %ld textures\n", g_num_dfhack_textures); @@ -167,3 +179,19 @@ long Textures::getRedPinTexposStart() { long Textures::getIconsTexposStart() { return g_icons_texpos_start; } + +long Textures::getThinBordersTexposStart() { + return g_thin_borders_texpos_start; +} + +long Textures::getMediumBordersTexposStart() { + return g_medium_borders_texpos_start; +} + +long Textures::getPanelBordersTexposStart() { + return g_panel_borders_texpos_start; +} + +long Textures::getWindowBordersTexposStart() { + return g_window_borders_texpos_start; +} diff --git a/plugins/lua/orders.lua b/plugins/lua/orders.lua index aecd940d6..40c79fca4 100644 --- a/plugins/lua/orders.lua +++ b/plugins/lua/orders.lua @@ -50,7 +50,7 @@ OrdersOverlay.ATTRS{ default_pos={x=61,y=-6}, viewscreens='dwarfmode', frame={w=30, h=4}, - frame_style=gui.GREY_LINE_FRAME, + frame_style=gui.MEDIUM_FRAME, frame_background=gui.CLEAR_PEN, }