summaryrefslogtreecommitdiff
path: root/FL/Fl_File_Icon.H
blob: c63358689fefa20bf907cae7bec99efcc8397f9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
//
// Fl_File_Icon definitions.
//
// Copyright 1999-2010 by Michael Sweet.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file.  If this
// file is missing or damaged, see the license at:
//
//     https://www.fltk.org/COPYING.php
//
// Please see the following page on how to report bugs and issues:
//
//     https://www.fltk.org/bugs.php
//

/* \file
   Fl_File_Icon widget . */

//
// Include necessary header files...
//

#ifndef _Fl_Fl_File_Icon_H_
#  define _Fl_Fl_File_Icon_H_

#  include "Fl.H"


//
// Special color value for the icon color.
//

#  define FL_ICON_COLOR (Fl_Color)0xffffffff    /**< icon color [background?]*/


//
// Fl_File_Icon class...
//

/**
  The Fl_File_Icon class manages icon images that can be used
  as labels in other widgets and as icons in the FileBrowser widget.
*/
class FL_EXPORT Fl_File_Icon {                  //// Icon data

  static Fl_File_Icon *first_;  // Pointer to first icon/filetype
  Fl_File_Icon  *next_;         // Pointer to next icon/filetype
  const char    *pattern_;      // Pattern string
  int           type_;          // Match only if directory or file?
  int           num_data_;      // Number of data elements
  int           alloc_data_;    // Number of allocated elements
  short         *data_;         // Icon data

  public:

  enum                          // File types
  {
    ANY,                        // Any kind of file
    PLAIN,                      // Only plain files
    FIFO,                       // Only named pipes
    DEVICE,                     // Only character and block devices
    LINK,                       // Only symbolic links
    DIRECTORY                   // Only directories
  };

  enum                          // Data opcodes
  {
    END,                        // End of primitive/icon
    COLOR,                      // Followed by color value (2 shorts)
    LINE,                       // Start of line
    CLOSEDLINE,                 // Start of closed line
    POLYGON,                    // Start of polygon
    OUTLINEPOLYGON,             // Followed by outline color (2 shorts)
    VERTEX                      // Followed by scaled X,Y
  };

  Fl_File_Icon(const char *p, int t, int nd = 0, short *d = 0);
  ~Fl_File_Icon();

  short         *add(short d);

  /**
    Adds a color value to the icon array, returning a pointer to it.
    \param[in] c color value
  */
  short         *add_color(Fl_Color c)
                { short *d = add((short)COLOR); add((short)(c >> 16)); add((short)c); return (d); }

  /**
    Adds a vertex value to the icon array, returning a pointer to it.
    The integer version accepts coordinates from 0 to 10000.
    The origin (0.0) is in the lower-lefthand corner of the icon.
    \param[in] x, y vertex coordinates
  */
  short         *add_vertex(int x, int y)
                { short *d = add((short)VERTEX); add((short)x); add((short)y); return (d); }

  /**
    Adds a vertex value to the icon array, returning a pointer to it.
    The floating point version goes from 0.0 to 1.0.
    The origin (0.0) is in the lower-lefthand corner of the icon.
    \param[in] x, y vertex coordinates
  */
  short         *add_vertex(float x, float y)
                { short *d = add((short)VERTEX); add((short)(x * 10000.0));
                  add((short)(y * 10000.0)); return (d); }

  /** Clears all icon data from the icon.*/
  void          clear() { num_data_ = 0; }

  void          draw(int x, int y, int w, int h, Fl_Color ic, int active = 1);

  void          label(Fl_Widget *w);

  static void   labeltype(const Fl_Label *o, int x, int y, int w, int h, Fl_Align a);
  void          load(const char *f);
  int           load_fti(const char *fti);
  int           load_image(const char *i);

  /** Returns next file icon object. See Fl_File_Icon::first() */
  Fl_File_Icon  *next() { return (next_); }

  /** Returns the filename matching pattern for the icon.*/
  const char    *pattern() { return (pattern_); }

  /**  Returns the number of words of data used by the icon.*/
  int           size() { return (num_data_); }

  /**
    Returns the filetype associated with the icon, which can be one of the
    following:

    \li Fl_File_Icon::ANY, any kind of file.
    \li Fl_File_Icon::PLAIN, plain files.
    \li Fl_File_Icon::FIFO, named pipes.
    \li Fl_File_Icon::DEVICE, character and block devices.
    \li Fl_File_Icon::LINK, symbolic links.
    \li Fl_File_Icon::DIRECTORY, directories.
  */
  int           type() { return (type_); }

  /**  Returns the data array for the icon.*/
  short         *value() { return (data_); }

  static Fl_File_Icon *find(const char *filename, int filetype = ANY);

  /** Returns a pointer to the first icon in the list.*/
  static Fl_File_Icon *first() { return (first_); }
  static void   load_system_icons(void);
};

#endif // !_Fl_Fl_File_Icon_H_