~ximion/listaller/master

« back to all changes in this revision

Viewing changes to src/iconloader.pas

  • Committer: Matthias Klumpp
  • Date: 2009-12-30 22:33:48 UTC
  • Revision ID: git-v1:9eb5299c9fc4fc3bc980b625e4876139716bb101
Restructured source code

Moved all additional code to /src, created dirs for 3rd-party components,
all libraries go to /lib, daemons to /helper, source code documentation to
/docs, all bindings to /bindings.
Included configure script which needs a little wor now.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
{ Copyright (C) 2008-2009 Matthias Klumpp
 
2
 
 
3
  Authors:
 
4
   Matthias Klumpp
 
5
 
 
6
  This program is free software: you can redistribute it and/or modify it under
 
7
  the terms of the GNU General Public License as published by the Free Software
 
8
  Foundation, version 3.
 
9
 
 
10
  This program is distributed in the hope that it will be useful, but WITHOUT
 
11
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 
12
  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
13
 
 
14
  You should have received a copy of the GNU General Public License v3
 
15
  along with this program. If not, see <http://www.gnu.org/licenses/>.}
 
16
//** This unit contains an icon-load procedure to find the right icons for Qt4 and GTK2 GUI
 
17
unit iconloader;
 
18
 
 
19
{$mode objfpc}{$H+}
 
20
 
 
21
interface
 
22
 
 
23
uses
 
24
  Classes, SysUtils, Graphics, LCLType
 
25
  {$IFDEF LCLGTK2}
 
26
  ,gtkdef, gtk2, gdk2pixbuf, gtk2int, gdk2
 
27
  {$ENDIF};
 
28
 
 
29
//** Loads a stock icon (native on GTK2, if Qt4 is used aditional images are needed) @returns Handle to th bitmap
 
30
procedure LoadStockPixmap(StockId: PChar; IconSize: integer;bmp: TBitmap);
 
31
 
 
32
const
 
33
//Stock constants
 
34
 STOCK_QUIT='stock-quit';
 
35
 STOCK_GO_FORWARD='stock-go-forward';
 
36
 STOCK_GO_BACK='stock-go-back';
 
37
 STOCK_DIALOG_WARNING='stock-dialog-warning';
 
38
 STOCK_CLOSE='stock-close';
 
39
 STOCK_DELETE='stock-delete';
 
40
 STOCK_EXECUTE='stock-execute';
 
41
 STOCK_APPLY='stock-apply';
 
42
 STOCK_DIALOG_INFO='stock-dialog-info';
 
43
 STOCK_REFRESH='stock-refresh';
 
44
 STOCK_OPEN='stock-open';
 
45
 STOCK_PROJECT_OPEN='stock-project-open';
 
46
 ICON_SIZE_BUTTON=4;
 
47
 ICON_SIZE_SMALL_TOOLBAR=2;
 
48
 ICON_SIZE_LARGE_TOOLBAR=3;
 
49
 ICON_SIZE_MENU=1;
 
50
 //
 
51
 //** Directory with KDE4 icons
 
52
 KDE_ICON_DIR='/usr/share/icons/default.kde4/';
 
53
 
 
54
implementation
 
55
 
 
56
procedure LoadStockPixmap(StockId: PChar; IconSize: integer; bmp: TBitmap);
 
57
{$IFDEF LCLGTK2}
 
58
function Gtk2LoadStockPixmap(StockId: PChar; IconSize: integer): HBitmap;
 
59
var
 
60
  StockWindow: PGtkWidget;
 
61
  Pixmap: PGDIObject;
 
62
  Pixbuf: PGDKPixbuf;
 
63
begin
 
64
  Result := 0;
 
65
  // If not a default icon then stop
 
66
  if gtk_icon_factory_lookup_default(StockId) = nil then Exit;
 
67
  StockWindow := gtk_window_new(GTK_WINDOW_TOPLEVEL);
 
68
  Pixbuf := gtk_widget_render_icon(StockWindow, StockId, IconSize, nil);
 
69
  gtk_widget_destroy(StockWindow);
 
70
  // Check if icon was assigned
 
71
  if PtrUInt(Pixbuf) = 0 then Exit;
 
72
  Pixmap := Gtk2WidgetSet.NewGDIObject(gdiBitmap);
 
73
  with Pixmap^ do
 
74
  begin
 
75
    GDIBitmapType := gbPixmap;
 
76
    visual := gdk_visual_get_system();
 
77
    gdk_visual_ref(visual);
 
78
    colormap := gdk_colormap_get_system();
 
79
    gdk_colormap_ref(colormap);
 
80
    gdk_pixbuf_render_pixmap_and_mask(Pixbuf, GDIPixmapObject.Image,
 
81
      GDIPixmapObject.Mask, 192);
 
82
  end;
 
83
  gdk_pixbuf_unref(Pixbuf);
 
84
  Result := HBitmap(PtrUInt(Pixmap));
 
85
end;
 
86
var cicon: String;BH: HBitmap;
 
87
begin
 
88
{$ENDIF}
 
89
{$IFDEF LCLGTK2}
 
90
 if StockId = STOCK_PROJECT_OPEN then StockId:=STOCK_OPEN;
 
91
 cicon:=StringReplace(StockId,'stock','gtk',[rfReplaceAll]);
 
92
 BH:=Gtk2LoadStockPixmap(PChar(cicon),IconSize);
 
93
 if BH <> 0 then
 
94
    bmp.Handle:=BH;
 
95
{$ELSE}
 
96
var cicon: String;pic: TPicture;s: String;
 
97
begin
 
98
if not DirectoryExists(KDE_ICON_DIR+'22x22/') then
 
99
 if not DirectoryExists('/usr/share/icons/default.kde/22x22') then
 
100
  if not DirectoryExists('/usr/share/icons/oxygen/22x22') then
 
101
   if not DirectoryExists('/usr/share/icons/hicolor/22x22') then exit;
 
102
 if StockId = STOCK_QUIT then cicon:='process-stop.png';
 
103
 if StockId = STOCK_GO_FORWARD then cicon:='arrow-right.png';
 
104
 if StockId = STOCK_GO_BACK then cicon:='arrow-left.png';
 
105
 if StockId = STOCK_DIALOG_WARNING then cicon:='../status/dialog-warning.png';
 
106
 if StockId = STOCK_CLOSE then cicon:='window-close.png';
 
107
 if StockId = STOCK_DELETE then cicon:='edit-delete.png';
 
108
 if StockId = STOCK_EXECUTE then cicon:='fork.png';
 
109
 if StockId = STOCK_APPLY then cicon:='dialog-ok-apply.png';
 
110
 if StockId = STOCK_DIALOG_INFO then cicon:='help-hint.png';
 
111
 if StockId = STOCK_REFRESH then cicon:='view-refresh.png';
 
112
 if StockId = STOCK_PROJECT_OPEN then cicon:='project-open.png';
 
113
 if StockId = STOCK_OPEN then cicon:='../places/folder.png';
 
114
 
 
115
 if IconSize=4 then
 
116
  s:=KDE_ICON_DIR+'16x16/actions/';
 
117
 if IconSize=3 then
 
118
  s:=KDE_ICON_DIR+'32x32/actions/';
 
119
 if IconSize=2 then
 
120
  s:=KDE_ICON_DIR+'22x22/actions/';
 
121
 if IconSize=1 then
 
122
  s:=KDE_ICON_DIR+'16x16/actions/';
 
123
 if not FileExists(s) then exit;
 
124
 pic:=TPicture.Create;
 
125
 pic.LoadFromFile(s+cicon);
 
126
 bmp.Clear;
 
127
 bmp.LoadFromBitmapHandles(pic.Bitmap.Handle,pic.Bitmap.MaskHandle);
 
128
 pic.Free;
 
129
{$ENDIF}
 
130
end;
 
131
 
 
132
end.
 
133