From c5697e1cf7be97a0f3c6fcbaa80a41ece068bd31 Mon Sep 17 00:00:00 2001 From: cxl Date: Wed, 8 Apr 2009 12:28:46 +0000 Subject: [PATCH] CtrlLib: NativePathLargeIcon, ArrayCtrl and EditField minor fixes, Draw: Rescale progress Gate, Painter: ImagePainter, DrawPainter git-svn-id: svn://ultimatepp.org/upp/trunk@1052 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/CtrlLib/ArrayCtrl.cpp | 2 +- uppsrc/CtrlLib/EditField.cpp | 1 + uppsrc/CtrlLib/FileSel.cpp | 88 +++++++++++++++++++++++++----------- uppsrc/CtrlLib/FileSel.h | 3 ++ uppsrc/Draw/ImageOp.h | 9 ++-- uppsrc/Draw/ImageScale.cpp | 11 +++-- uppsrc/Painter/Painter.cpp | 17 +++++++ uppsrc/Painter/Painter.h | 25 ++++++++++ 8 files changed, 120 insertions(+), 36 deletions(-) diff --git a/uppsrc/CtrlLib/ArrayCtrl.cpp b/uppsrc/CtrlLib/ArrayCtrl.cpp index 4f870d433..190fa3bb2 100644 --- a/uppsrc/CtrlLib/ArrayCtrl.cpp +++ b/uppsrc/CtrlLib/ArrayCtrl.cpp @@ -653,7 +653,7 @@ Point ArrayCtrl::FindCellCtrl(Ctrl *ctrl) for(int j = 0; j < ci.GetCount(); j++) if(IsCtrl(i, j)) { CellCtrl& c = GetCtrl(i, j); - if(&c == ctrl || c.ctrl == ctrl) + if(&c == ctrl || c.ctrl == ctrl || c.ctrl->HasChildDeep(ctrl)) return Point(j, i); } } diff --git a/uppsrc/CtrlLib/EditField.cpp b/uppsrc/CtrlLib/EditField.cpp index 7cab17324..2e5137835 100644 --- a/uppsrc/CtrlLib/EditField.cpp +++ b/uppsrc/CtrlLib/EditField.cpp @@ -966,6 +966,7 @@ EditField& EditField::SetFont(Font _font) EditField& EditField::NullText(const char *text, Font fnt, Color ink) { nulltext = text; + nulltext << " "; nullink = ink; nullfont = fnt; Refresh(); diff --git a/uppsrc/CtrlLib/FileSel.cpp b/uppsrc/CtrlLib/FileSel.cpp index 88f69c311..86cad599c 100644 --- a/uppsrc/CtrlLib/FileSel.cpp +++ b/uppsrc/CtrlLib/FileSel.cpp @@ -7,6 +7,7 @@ struct FileIconMaker : ImageMaker { String file; bool exe; bool dir; + bool large; virtual String Key() const { return file + (exe ? "1" : "0") + (dir ? "1" : "0"); @@ -19,7 +20,7 @@ struct FileIconMaker : ImageMaker { SHFILEINFO info; SHGetFileInfo(ToSystemCharset(file), dir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL, &info, sizeof(info), - SHGFI_ICON|SHGFI_SMALLICON|(exe ? 0 : SHGFI_USEFILEATTRIBUTES)); + SHGFI_ICON|(large ? SHGFI_LARGEICON : SHGFI_SMALLICON)|(exe ? 0 : SHGFI_USEFILEATTRIBUTES)); HICON icon = info.hIcon; ICONINFO iconinfo; if(!icon || !GetIconInfo(icon, &iconinfo)) @@ -41,13 +42,14 @@ struct FileIconMaker : ImageMaker { }; -Image GetFileIcon(const char *path, bool dir, bool force = false) +Image GetFileIcon(const char *path, bool dir, bool force, bool large) { FileIconMaker m; String ext = GetFileExt(path); m.exe = false; m.dir = false; m.file = path; + m.large = large; if(force) m.exe = true; else @@ -86,9 +88,9 @@ Image GetFileIcon(const String& folder, const String& filename, bool isdir, bool #else Image GtkThemeIcon(const char *name, int size); -Image GnomeImage(const char *s) +Image GnomeImage(const char *s, bool large = false) { - return GtkThemeIcon(String("gnome-") + s, 16); + return GtkThemeIcon(String("gnome-") + s, large); } struct ExtToMime { @@ -150,6 +152,7 @@ bool ExtToMime::GetMime(const String& ext, String& maj, String& min) struct FileExtMaker : ImageMaker { String ext; + bool large; virtual String Key() const { return ext; @@ -160,43 +163,59 @@ struct FileExtMaker : ImageMaker { String minor; if(!Single().GetMime(ext, major, minor)) return Null; - Image img = GnomeImage("mime-" + major + '-' + minor); + Image img = GnomeImage("mime-" + major + '-' + minor, large ? 48 : 16); return IsNull(img) ? GnomeImage("mime-" + major) : img; } }; -Image PosixGetDriveImage(String dir) +Image PosixGetDriveImage(String dir, bool large) { static Image cdrom = GnomeImage("dev-cdrom"); + static Image lcdrom = GnomeImage("dev-cdrom", true); static Image harddisk = GnomeImage("dev-harddisk"); + static Image lharddisk = GnomeImage("dev-harddisk", true); static Image floppy = GnomeImage("dev-floppy"); + static Image lfloppy = GnomeImage("dev-floppy", true); static Image computer = GnomeImage("dev-computer"); - if(dir.GetCount() == 0 || dir == "/") - return IsNull(computer) ? CtrlImg::Computer() : computer; - if(dir.Find("cdrom") == 0 || dir.Find("cdrecorder") == 0) - return IsNull(cdrom) ? CtrlImg::CdRom() : cdrom; - if(dir.Find("floppy") == 0 || dir.Find("zip") == 0) - return IsNull(floppy) ? CtrlImg::Diskette() : floppy; - return IsNull(harddisk) ? CtrlImg::Hd() : harddisk; + static Image lcomputer = GnomeImage("dev-computer", true); + if(dir.GetCount() == 0 || dir == "/") { + Image m = large ? lcomputer : computer; + return IsNull(m) ? CtrlImg::Computer() : m; + } + if(dir.Find("cdrom") == 0 || dir.Find("cdrecorder") == 0) { + Image m = large ? lcdrom : cdrom; + return IsNull(m) ? CtrlImg::CdRom() : m; + } + if(dir.Find("floppy") == 0 || dir.Find("zip") == 0) { + Image m = large ? lfloppy : floppy; + return IsNull(m) ? CtrlImg::Diskette() : m; + } + Image m = large ? lharddisk : harddisk; + return IsNull(m) ? CtrlImg::Hd() : m; } -Image GetFileIcon(const String& folder, const String& filename, bool isdir, bool isexe) +Image GetFileIcon(const String& folder, const String& filename, bool isdir, bool isexe, bool large) { static Image file = GnomeImage("fs-regular"); + static Image lfile = GnomeImage("fs-regular", true); static Image dir = GnomeImage("fs-directory"); + static Image ldir = GnomeImage("fs-directory", true); static Image exe = GnomeImage("fs-executable"); + static Image lexe = GnomeImage("fs-executable", true); static Image home = GnomeImage("fs-home"); + static Image lhome = GnomeImage("fs-home", true); static Image desktop = GnomeImage("fs-desktop"); + static Image ldesktop = GnomeImage("fs-desktop", true); if(isdir) { Image img = dir; if(AppendFileName(folder, filename) == GetHomeDirectory()) - return home; + return large ? lhome : home; else if(folder == GetHomeDirectory() && filename == "Desktop") - return desktop; + return large ? ldesktop : desktop; else if(folder == "/media" || filename.GetCount() == 0) - return PosixGetDriveImage(filename); + return PosixGetDriveImage(filename, large); return dir; } FileExtMaker m; @@ -204,37 +223,54 @@ Image GetFileIcon(const String& folder, const String& filename, bool isdir, bool Image img; if(m.ext.GetCount()) { m.ext = m.ext.Mid(1); + m.large = large; img = MakeImage(m); } - return IsNull(img) ? isexe ? exe : file : img; + return IsNull(img) ? isexe ? (large ? lexe : exe) : (large ? lfile : file) : img; } #endif #endif -Image NativePathIcon(const char *path, bool folder) +Image NativePathIcon0(const char *path, bool folder, bool large) { #if defined(PLATFORM_WIN32) if (folder) - return GetFileIcon(path, true, true); + return GetFileIcon(path, true, true, large); else - return GetFileIcon(path, false); + return GetFileIcon(path, false, false, large); #endif #ifdef PLATFORM_POSIX String p = path; bool isdrive = folder && ((p == "/media") || (p == "/mnt")); FindFile ff(path); - return isdrive ? PosixGetDriveImage(GetFileName(path)) - : GetFileIcon(path, GetFileName(path), folder, ff.GetMode() & 0111); + return isdrive ? PosixGetDriveImage(GetFileName(path), large) + : GetFileIcon(path, GetFileName(path), folder, ff.GetMode() & 0111, large); #endif } +Image NativePathIcon(const char *path, bool folder) +{ + return NativePathIcon0(path, folder, false); +} + Image NativePathIcon(const char *path) { FindFile ff(path); return NativePathIcon(path, ff.IsFolder()); } +Image NativePathLargeIcon(const char *path, bool folder) +{ + return NativePathIcon0(path, folder, true); +} + +Image NativePathLargeIcon(const char *path) +{ + FindFile ff(path); + return NativePathLargeIcon(path, ff.IsFolder()); +} + bool MatchSearch(const String& filename, const String& search) { return search.GetCount() ? Filter(filename, CharFilterDefaultToUpperAscii).Find(search) >= 0 : true; @@ -250,7 +286,7 @@ bool Load(FileList& list, const String& dir, const char *patterns, bool dirs, if(MatchSearch(root[i].filename, search)) list.Add(root[i].filename, #ifdef PLATFORM_WIN32 - GetFileIcon(root[i].filename, false, true), + GetFileIcon(root[i].filename, false, true, false), #else GetDriveImage(root[i].root_style), #endif @@ -281,7 +317,7 @@ bool Load(FileList& list, const String& dir, const char *patterns, bool dirs, Image img = isdrive ? PosixGetDriveImage(fi.filename) : GetFileIcon(dir, fi.filename, fi.is_directory, fi.unix_mode & 0111); #else - Image img = GetFileIcon(AppendFileName(dir, fi.filename), fi.is_directory); + Image img = GetFileIcon(AppendFileName(dir, fi.filename), fi.is_directory, false, false); #endif if(IsNull(img)) img = fi.is_directory ? CtrlImg::Dir() : CtrlImg::File(); @@ -956,7 +992,7 @@ void FolderDisplay::Paint(Draw& w, const Rect& r, const Value& q, #ifdef PLATFORM_X11 Image img = GetFileIcon(GetFileFolder(s), GetFileName(s), true, false); #else - Image img = s.GetCount() ? GetFileIcon(s, false, true) : CtrlImg::Computer(); + Image img = s.GetCount() ? GetFileIcon(s, false, true, false) : CtrlImg::Computer(); #endif if(IsNull(img)) img = CtrlImg::Dir(); diff --git a/uppsrc/CtrlLib/FileSel.h b/uppsrc/CtrlLib/FileSel.h index ef98f9cec..86277c5e2 100644 --- a/uppsrc/CtrlLib/FileSel.h +++ b/uppsrc/CtrlLib/FileSel.h @@ -7,6 +7,9 @@ void DrawFileName(Draw& w, int x, int y, int wcx, int cy, const WString& mname, Image NativePathIcon(const char *path, bool folder); Image NativePathIcon(const char *path); +Image NativePathLargeIcon(const char *path, bool folder); +Image NativePathLargeIcon(const char *path); + class FileList : public ColumnList, private Display { public: virtual void LeftDown(Point p, dword); diff --git a/uppsrc/Draw/ImageOp.h b/uppsrc/Draw/ImageOp.h index 316298558..5f9667a55 100644 --- a/uppsrc/Draw/ImageOp.h +++ b/uppsrc/Draw/ImageOp.h @@ -68,10 +68,11 @@ public: void DrawRasterData(Draw& w, int x, int y, int cx, int cy, const String& data); -void Rescale(RasterEncoder& tgt, Size sz, Raster& src, const Rect& src_rc); -Image Rescale(const Image& src, Size sz, const Rect& src_rc); -Image Rescale(const Image& src, Size sz); -Image Rescale(const Image& src, int cx, int cy); +void Rescale(RasterEncoder& tgt, Size sz, Raster& src, const Rect& src_rc, + Gate2 progress = false); +Image Rescale(const Image& src, Size sz, const Rect& src_rc, Gate2 progress = false); +Image Rescale(const Image& src, Size sz, Gate2 progress = false); +Image Rescale(const Image& src, int cx, int cy, Gate2 progress = false); struct ImageFilter9 { virtual RGBA operator()(const RGBA **mx) = 0; diff --git a/uppsrc/Draw/ImageScale.cpp b/uppsrc/Draw/ImageScale.cpp index 2dc42f205..bacd39b5a 100644 --- a/uppsrc/Draw/ImageScale.cpp +++ b/uppsrc/Draw/ImageScale.cpp @@ -473,18 +473,19 @@ void RescaleImage::Get(RGBA *tgt) } } -void Rescale(RasterEncoder& tgt, Size tsz, Raster& src, const Rect& src_rc) +void Rescale(RasterEncoder& tgt, Size tsz, Raster& src, const Rect& src_rc, + Gate2 progress) { tgt.Create(tsz, src); RescaleImage rs; rs.Create(tsz, src, src_rc); - while(tsz.cy-- > 0) { + for(int i = 0; i < tsz.cy && !progress(i, tsz.cy); i++) { rs.Get(tgt); tgt.WriteLine(); } } -Image Rescale(const Image& src, Size sz, const Rect& src_rc) +Image Rescale(const Image& src, Size sz, const Rect& src_rc, Gate2 progress) { if(src.GetSize() == sz && src_rc == sz) return src; @@ -494,12 +495,12 @@ Image Rescale(const Image& src, Size sz, const Rect& src_rc) return tgt; } -Image Rescale(const Image& src, Size sz) +Image Rescale(const Image& src, Size sz, Gate2 progress) { return Rescale(src, sz, src.GetSize()); } -Image Rescale(const Image& src, int cx, int cy) +Image Rescale(const Image& src, int cx, int cy, Gate2 progress) { return Rescale(src, Size(cx, cy)); } diff --git a/uppsrc/Painter/Painter.cpp b/uppsrc/Painter/Painter.cpp index 7f391f89c..60f8d760a 100644 --- a/uppsrc/Painter/Painter.cpp +++ b/uppsrc/Painter/Painter.cpp @@ -534,4 +534,21 @@ void NilPainter::EndOp() {} void NilPainter::BeginMaskOp() {} void NilPainter::BeginOnPathOp(double, bool) {} +ImagePainter::ImagePainter(Size sz, int mode) +: ImageBuffer__(sz), BufferPainter(ImageBuffer__::ib, mode) +{} + +ImagePainter::ImagePainter(int cx, int cy, int mode) +: ImageBuffer__(Size(cx, cy)), BufferPainter(ImageBuffer__::ib, mode) +{} + +DrawPainter::DrawPainter(Draw& w, Size sz, int mode) +: ImagePainter(sz, mode), w(w) +{} + +DrawPainter::~DrawPainter() +{ + w.DrawImage(0, 0, *this); +} + END_UPP_NAMESPACE diff --git a/uppsrc/Painter/Painter.h b/uppsrc/Painter/Painter.h index f904da26f..3235b0f0f 100644 --- a/uppsrc/Painter/Painter.h +++ b/uppsrc/Painter/Painter.h @@ -313,6 +313,31 @@ void PaintCharacter(Painter& sw, const Pointf& p, int ch, Font fnt); #include "Painting.h" #include "BufferPainter.h" +class ImageBuffer__ { +protected: + ImageBuffer ib; + +public: + ImageBuffer__(Size sz) : ib(sz) {} +}; + +class ImagePainter : private ImageBuffer__, public BufferPainter { +public: + ImagePainter(Size sz, int mode = MODE_ANTIALIASED); + ImagePainter(int cx, int cy, int mode = MODE_ANTIALIASED); + + Image GetResult() { return ImageBuffer__::ib; } + operator Image() { return GetResult(); } +}; + +class DrawPainter : public ImagePainter { + Draw& w; + +public: + DrawPainter(Draw& w, Size sz, int mode = MODE_ANTIALIASED); + ~DrawPainter(); +}; + class NilPainter : public Painter { protected: virtual void ClearOp(const RGBA& color);