root/lib/widget/frame.c

/* [previous][next][first][last][top][bottom][index][help]  */

DEFINITIONS

This source file includes following definitions.
  1. frame_adjust
  2. frame_draw
  3. frame_new
  4. frame_callback
  5. frame_set_title

   1 /*
   2    Widgets for the Midnight Commander
   3 
   4    Copyright (C) 2020-2022
   5    The Free Software Foundation, Inc.
   6 
   7    Authors:
   8    Andrew Borodin <aborodin@vmail.ru>, 2020-2022
   9 
  10    This file is part of the Midnight Commander.
  11 
  12    The Midnight Commander is free software: you can redistribute it
  13    and/or modify it under the terms of the GNU General Public License as
  14    published by the Free Software Foundation, either version 3 of the License,
  15    or (at your option) any later version.
  16 
  17    The Midnight Commander is distributed in the hope that it will be useful,
  18    but WITHOUT ANY WARRANTY; without even the implied warranty of
  19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20    GNU General Public License for more details.
  21 
  22    You should have received a copy of the GNU General Public License
  23    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  24  */
  25 
  26 /** \file frame.c
  27  *  \brief Source: WFrame widget (frame of dialogs)
  28  */
  29 
  30 #include <config.h>
  31 
  32 #include <stdlib.h>
  33 
  34 #include "lib/global.h"
  35 #include "lib/tty/tty.h"
  36 #include "lib/tty/color.h"
  37 #include "lib/skin.h"
  38 #include "lib/strutil.h"
  39 #include "lib/util.h"           /* MC_PTR_FREE */
  40 #include "lib/widget.h"
  41 
  42 /*** global variables ****************************************************************************/
  43 
  44 /*** file scope macro definitions ****************************************************************/
  45 
  46 /*** file scope type declarations ****************************************************************/
  47 
  48 /*** file scope variables ************************************************************************/
  49 
  50 /* --------------------------------------------------------------------------------------------- */
  51 /*** file scope functions ************************************************************************/
  52 /* --------------------------------------------------------------------------------------------- */
  53 
  54 static void
  55 frame_adjust (WFrame * f)
     /* [previous][next][first][last][top][bottom][index][help]  */
  56 {
  57     Widget *w = WIDGET (f);
  58 
  59     w->rect = WIDGET (w->owner)->rect;
  60     w->pos_flags |= WPOS_KEEP_ALL;
  61 }
  62 
  63 /* --------------------------------------------------------------------------------------------- */
  64 
  65 static void
  66 frame_draw (const WFrame * f)
     /* [previous][next][first][last][top][bottom][index][help]  */
  67 {
  68     const Widget *wf = CONST_WIDGET (f);
  69     const WRect *w = &wf->rect;
  70     int d = f->compact ? 0 : 1;
  71     const int *colors;
  72 
  73     colors = widget_get_colors (wf);
  74 
  75     if (mc_global.tty.shadows)
  76         tty_draw_box_shadow (w->y, w->x, w->lines, w->cols, SHADOW_COLOR);
  77 
  78     tty_setcolor (colors[FRAME_COLOR_NORMAL]);
  79     tty_fill_region (w->y, w->x, w->lines, w->cols, ' ');
  80     tty_draw_box (w->y + d, w->x + d, w->lines - 2 * d, w->cols - 2 * d, f->single);
  81 
  82     if (f->title != NULL)
  83     {
  84         /* TODO: truncate long title */
  85         tty_setcolor (colors[FRAME_COLOR_TITLE]);
  86         widget_gotoyx (f, d, (w->cols - str_term_width1 (f->title)) / 2);
  87         tty_print_string (f->title);
  88     }
  89 }
  90 
  91 /* --------------------------------------------------------------------------------------------- */
  92 /*** public functions ****************************************************************************/
  93 /* --------------------------------------------------------------------------------------------- */
  94 
  95 WFrame *
  96 frame_new (int y, int x, int lines, int cols, const char *title, gboolean single, gboolean compact)
     /* [previous][next][first][last][top][bottom][index][help]  */
  97 {
  98     WRect r = { y, x, lines, cols };
  99     WFrame *f;
 100     Widget *w;
 101 
 102     f = g_new (WFrame, 1);
 103     w = WIDGET (f);
 104     widget_init (w, &r, frame_callback, NULL);
 105 
 106     f->single = single;
 107     f->compact = compact;
 108 
 109     f->title = NULL;
 110     frame_set_title (f, title);
 111 
 112     return f;
 113 }
 114 
 115 /* --------------------------------------------------------------------------------------------- */
 116 
 117 cb_ret_t
 118 frame_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
     /* [previous][next][first][last][top][bottom][index][help]  */
 119 {
 120     WFrame *f = FRAME (w);
 121 
 122     switch (msg)
 123     {
 124     case MSG_INIT:
 125         frame_adjust (f);
 126         return MSG_HANDLED;
 127 
 128     case MSG_DRAW:
 129         frame_draw (f);
 130         return MSG_HANDLED;
 131 
 132     case MSG_DESTROY:
 133         g_free (f->title);
 134         return MSG_HANDLED;
 135 
 136     default:
 137         return widget_default_callback (w, sender, msg, parm, data);
 138     }
 139 }
 140 
 141 /* --------------------------------------------------------------------------------------------- */
 142 
 143 void
 144 frame_set_title (WFrame * f, const char *title)
     /* [previous][next][first][last][top][bottom][index][help]  */
 145 {
 146     MC_PTR_FREE (f->title);
 147 
 148     /* Strip existing spaces, add one space before and after the title */
 149     if (title != NULL && *title != '\0')
 150     {
 151         char *t;
 152 
 153         t = g_strstrip (g_strdup (title));
 154         if (*t != '\0')
 155             f->title = g_strdup_printf (" %s ", t);
 156         g_free (t);
 157     }
 158 
 159     widget_draw (WIDGET (f));
 160 }
 161 
 162 /* --------------------------------------------------------------------------------------------- */

/* [previous][next][first][last][top][bottom][index][help]  */