mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
ide: Now can edit (even create) .png file
git-svn-id: svn://ultimatepp.org/upp/trunk@5073 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
57a0162305
commit
4907a0464e
12 changed files with 135 additions and 27 deletions
|
|
@ -286,6 +286,8 @@ IconDes::IconDes()
|
|||
|
||||
magnify = 13;
|
||||
pen = 1;
|
||||
|
||||
single_mode = false;
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -429,7 +429,7 @@ void IconDes::SaveUndo()
|
|||
return;
|
||||
Slot& c = Current();
|
||||
Vector<Image> undo = UnpackImlData(c.undo);
|
||||
int maxn = minmax(400000 / max(c.image.GetLength(), 1), 4, 128);
|
||||
int maxn = minmax((single_mode ? 4000000 : 400000) / max(c.image.GetLength(), 1), 4, 128);
|
||||
while(undo.GetCount() > maxn)
|
||||
undo.Remove(0);
|
||||
if(undo.GetCount() && undo.Top() == c.image)
|
||||
|
|
@ -490,6 +490,8 @@ void IconDes::SyncImage()
|
|||
c.pastepos = Null;
|
||||
if(c.selection.GetSize() != c.image.GetSize())
|
||||
SetSelect(255);
|
||||
if(single_mode)
|
||||
info.SetLabel(Format("%d x %d", c.image.GetWidth(), c.image.GetHeight()));
|
||||
}
|
||||
selectrect = false;
|
||||
SetBar();
|
||||
|
|
@ -576,4 +578,16 @@ void IconDes::ResizeDown()
|
|||
Reset();
|
||||
}
|
||||
|
||||
void IconDes::SingleMode()
|
||||
{
|
||||
single_mode = true;
|
||||
list.Ctrl::Remove();
|
||||
rgbactrl.SubCtrl(&single);
|
||||
Size fsz = GetTextSize("Resize", StdFont());
|
||||
single.Add(info.HSizePos().TopPos(0, fsz.cy));
|
||||
resize.SetLabel("Resize");
|
||||
single.Add(resize.LeftPos(0, fsz.cx + 2 * fsz.cy).TopPos(4 * fsz.cy / 3, 4 * fsz.cy / 3));
|
||||
resize <<= THISBACK(EditImage);
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -147,6 +147,10 @@ private:
|
|||
IconShow iconshow;
|
||||
Image cursor_image;
|
||||
Image fill_cursor;
|
||||
bool single_mode;
|
||||
ParentCtrl single;
|
||||
Label info;
|
||||
Button resize;
|
||||
|
||||
Array<Slot> removed;
|
||||
|
||||
|
|
@ -265,9 +269,11 @@ private:
|
|||
void SyncList();
|
||||
void ListCursor();
|
||||
void PrepareImageDlg(WithImageLayout<TopWindow>& dlg);
|
||||
void PrepareImageSizeDlg(WithImageSizeLayout<TopWindow>& dlg);
|
||||
void ImageInsert(const String& name, const Image& m, bool exp = false);
|
||||
void InsertImage();
|
||||
void InsertRemoved(int ii);
|
||||
void EditImageSize();
|
||||
void EditImage();
|
||||
void RemoveImage();
|
||||
void Duplicate();
|
||||
|
|
@ -318,7 +324,8 @@ public:
|
|||
|
||||
void SerializeSettings(Stream& s);
|
||||
|
||||
void HideList() { list.Hide(); }
|
||||
void SingleMode();
|
||||
bool IsSingleMode() const { return single_mode; }
|
||||
|
||||
typedef IconDes CLASSNAME;
|
||||
|
||||
|
|
|
|||
|
|
@ -44,3 +44,4 @@ KEY(EMPTY_ELLIPSES, "Empty ellipses", K_W)
|
|||
KEY(RECTANGLES, "Rectangles", K_R)
|
||||
KEY(EMPTY_RECTANGLES, "Empty rectangles", K_T)
|
||||
KEY(HOTSPOTS, "Hotspots", K_H)
|
||||
KEY(RESIZE_SINGLE, "Resize", 0)
|
||||
|
|
@ -10,6 +10,15 @@ LAYOUT(ImageLayout, 168, 108)
|
|||
ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(96, 64).TopPosZ(80, 24))
|
||||
END_LAYOUT
|
||||
|
||||
LAYOUT(ImageSizeLayout, 168, 68)
|
||||
ITEM(Label, dv___0, SetLabel(t_("Size")).LeftPosZ(8, 40).TopPosZ(8, 19))
|
||||
ITEM(EditIntSpin, cx, Min(1).Max(8192).LeftPosZ(52, 44).TopPosZ(8, 19))
|
||||
ITEM(EditIntSpin, cy, Min(1).Max(8192).LeftPosZ(116, 44).TopPosZ(8, 19))
|
||||
ITEM(Label, dv___3, SetLabel(t_("x")).LeftPosZ(100, 12).TopPosZ(8, 16))
|
||||
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(28, 64).TopPosZ(36, 24))
|
||||
ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(96, 64).TopPosZ(36, 24))
|
||||
END_LAYOUT
|
||||
|
||||
LAYOUT(FilePropertiesLayout, 176, 68)
|
||||
ITEM(Option, format, SetLabel(t_("Legacy .iml format")).LeftPosZ(8, 160).TopPosZ(8, 15))
|
||||
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(36, 64).TopPosZ(36, 24))
|
||||
|
|
|
|||
|
|
@ -52,6 +52,18 @@ void IconDes::PrepareImageDlg(WithImageLayout<TopWindow>& dlg)
|
|||
dlg.name.SetFilter(sCharFilterCid);
|
||||
}
|
||||
|
||||
void IconDes::PrepareImageSizeDlg(WithImageSizeLayout<TopWindow>& dlg)
|
||||
{
|
||||
CtrlLayoutOKCancel(dlg, "New image");
|
||||
dlg.cx <<= 16;
|
||||
dlg.cy <<= 16;
|
||||
if(IsCurrent()) {
|
||||
Size sz = GetImageSize();
|
||||
dlg.cx <<= sz.cx;
|
||||
dlg.cy <<= sz.cy;
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckName(WithImageLayout<TopWindow>& dlg)
|
||||
{
|
||||
String n = dlg.name;
|
||||
|
|
@ -207,10 +219,40 @@ void IconDes::ListCursor()
|
|||
SyncImage();
|
||||
}
|
||||
|
||||
void IconDes::EditImageSize()
|
||||
{
|
||||
Slot& c = Current();
|
||||
WithImageSizeLayout<TopWindow> dlg;
|
||||
PrepareImageSizeDlg(dlg);
|
||||
dlg.Breaker(dlg.cx);
|
||||
dlg.Breaker(dlg.cy);
|
||||
Image img = c.image;
|
||||
dlg.cx <<= img.GetWidth();
|
||||
dlg.cy <<= img.GetHeight();
|
||||
for(;;) {
|
||||
switch(dlg.Run()) {
|
||||
case IDCANCEL:
|
||||
c.image = img;
|
||||
Reset();
|
||||
return;
|
||||
case IDOK:
|
||||
Reset();
|
||||
return;
|
||||
}
|
||||
c.image = CreateImage(Size(minmax((int)~dlg.cx, 1, 8192), minmax((int)~dlg.cy, 1, 8192)), Null);
|
||||
UPP::Copy(c.image, Point(0, 0), img, img.GetSize());
|
||||
Reset();
|
||||
}
|
||||
}
|
||||
|
||||
void IconDes::EditImage()
|
||||
{
|
||||
if(!IsCurrent())
|
||||
return;
|
||||
if(single_mode) {
|
||||
EditImageSize();
|
||||
return;
|
||||
}
|
||||
Slot& c = Current();
|
||||
WithImageLayout<TopWindow> dlg;
|
||||
PrepareImageDlg(dlg);
|
||||
|
|
@ -289,25 +331,29 @@ void IconDes::ChangeSlot(int d)
|
|||
void IconDes::ListMenu(Bar& bar)
|
||||
{
|
||||
using namespace IconDesKeys;
|
||||
bar.Add(AK_INSERT_IMAGE, IconDesImg::Insert(), THISBACK(InsertImage));
|
||||
bar.Add(IsCurrent(), AK_IMAGE, IconDesImg::Edit(), THISBACK(EditImage));
|
||||
bar.Add(IsCurrent(), AK_REMOVE_IMAGE, IconDesImg::Remove(), THISBACK(RemoveImage));
|
||||
bar.Add(IsCurrent(), AK_DUPLICATE, IconDesImg::Duplicate(), THISBACK(Duplicate));
|
||||
bar.Add(AK_INSERT_CLIP, IconDesImg::InsertPaste(), THISBACK(InsertPaste));
|
||||
bar.Add(AK_INSERT_FILE, IconDesImg::InsertFile(), THISBACK(InsertFile));
|
||||
bar.Add(AK_INSERT_IML, IconDesImg::InsertIml(), THISBACK(InsertIml));
|
||||
bar.Add(AK_EXPORT_PNGS, IconDesImg::ExportPngs(), THISBACK(ExportPngs));
|
||||
bar.Separator();
|
||||
bar.Add(IsCurrent() && list.GetCursor() > 0, AK_MOVE_UP, IconDesImg::MoveUp(),
|
||||
THISBACK1(MoveSlot, -1));
|
||||
bar.Add(IsCurrent() && list.GetCursor() < slot.GetCount() - 1, AK_MOVE_DOWN, IconDesImg::MoveDown(),
|
||||
THISBACK1(MoveSlot, 1));
|
||||
if(removed.GetCount()) {
|
||||
if(single_mode)
|
||||
bar.Add(IsCurrent(), AK_RESIZE_SINGLE, IconDesImg::Edit(), THISBACK(EditImage));
|
||||
else {
|
||||
bar.Add(AK_INSERT_IMAGE, IconDesImg::Insert(), THISBACK(InsertImage));
|
||||
bar.Add(IsCurrent(), AK_IMAGE, IconDesImg::Edit(), THISBACK(EditImage));
|
||||
bar.Add(IsCurrent(), AK_REMOVE_IMAGE, IconDesImg::Remove(), THISBACK(RemoveImage));
|
||||
bar.Add(IsCurrent(), AK_DUPLICATE, IconDesImg::Duplicate(), THISBACK(Duplicate));
|
||||
bar.Add(AK_INSERT_CLIP, IconDesImg::InsertPaste(), THISBACK(InsertPaste));
|
||||
bar.Add(AK_INSERT_FILE, IconDesImg::InsertFile(), THISBACK(InsertFile));
|
||||
bar.Add(AK_INSERT_IML, IconDesImg::InsertIml(), THISBACK(InsertIml));
|
||||
bar.Add(AK_EXPORT_PNGS, IconDesImg::ExportPngs(), THISBACK(ExportPngs));
|
||||
bar.Separator();
|
||||
for(int i = removed.GetCount() - 1; i >= 0; i--) {
|
||||
Slot& r = removed[i];
|
||||
bar.Add("Insert " + sFormatImageName(r.name, r.image, r.exp), r.base_image,
|
||||
THISBACK1(InsertRemoved, i));
|
||||
bar.Add(IsCurrent() && list.GetCursor() > 0, AK_MOVE_UP, IconDesImg::MoveUp(),
|
||||
THISBACK1(MoveSlot, -1));
|
||||
bar.Add(IsCurrent() && list.GetCursor() < slot.GetCount() - 1, AK_MOVE_DOWN, IconDesImg::MoveDown(),
|
||||
THISBACK1(MoveSlot, 1));
|
||||
if(removed.GetCount()) {
|
||||
bar.Separator();
|
||||
for(int i = removed.GetCount() - 1; i >= 0; i--) {
|
||||
Slot& r = removed[i];
|
||||
bar.Add("Insert " + sFormatImageName(r.name, r.image, r.exp), r.base_image,
|
||||
THISBACK1(InsertRemoved, i));
|
||||
}
|
||||
}
|
||||
}
|
||||
bar.Separator();
|
||||
|
|
|
|||
|
|
@ -63,7 +63,8 @@ void IdeIconDes::Save()
|
|||
void IdeIconDes::ToolEx(Bar& bar)
|
||||
{
|
||||
bar.Separator();
|
||||
bar.Add("File properties..", IconDesImg::FileProperties(), THISBACK(FileProperties));
|
||||
if(!IsSingleMode())
|
||||
bar.Add("File properties..", IconDesImg::FileProperties(), THISBACK(FileProperties));
|
||||
}
|
||||
|
||||
void IdeIconDes::FileProperties()
|
||||
|
|
@ -88,7 +89,7 @@ void IdeIconDes::EditMenu(Bar& bar)
|
|||
{
|
||||
EditBar(bar);
|
||||
ToolEx(bar);
|
||||
bar.Add("List", THISBACK(ListMenu));
|
||||
bar.Add(IsSingleMode() ? "PNG" : "List", THISBACK(ListMenu));
|
||||
bar.Add("Selection", THISBACK(SelectBar));
|
||||
bar.Add("Image", THISBACK(ImageBar));
|
||||
bar.Add("Draw", THISBACK(DrawBar));
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ struct IdeIconDes : IdeDesigner, IconDes {
|
|||
bool Load(const char *filename);
|
||||
void FileProperties();
|
||||
void CopyId(const String& n);
|
||||
void RestoreEditPos();
|
||||
|
||||
typedef IdeIconDes CLASSNAME;
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,13 @@ void SerializeIconDesPos(Stream& s)
|
|||
}
|
||||
}
|
||||
|
||||
void IdeIconDes::RestoreEditPos()
|
||||
{
|
||||
IdeIconEditPos& ep = sEP().GetAdd(filename);
|
||||
if(ep.filetime == filetime)
|
||||
SetEditPos(ep);
|
||||
}
|
||||
|
||||
bool IsImlFile(const char *path)
|
||||
{
|
||||
return ToLower(GetFileExt(path)) == ".iml";
|
||||
|
|
@ -63,9 +70,7 @@ struct IconDesModule : public IdeModule {
|
|||
IdeIconDes *d = new IdeIconDes;
|
||||
LoadFromGlobal(*d, "icondes-ctrl");
|
||||
if(d->Load(path)) {
|
||||
IdeIconEditPos& ep = sEP().GetAdd(path);
|
||||
if(ep.filetime == d->filetime)
|
||||
d->SetEditPos(ep);
|
||||
d->RestoreEditPos();
|
||||
return d;
|
||||
}
|
||||
delete d;
|
||||
|
|
@ -93,6 +98,8 @@ void IdeIconDes::CopyId(const String& n)
|
|||
|
||||
void IdeIconDes::ListMenuEx(Bar& bar)
|
||||
{
|
||||
if(IsSingleMode())
|
||||
return;
|
||||
String n = GetCurrentName();
|
||||
String c = GetFileTitle(filename);
|
||||
c.Set(0, ToUpper(c[0]));
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ struct IdePngDes : IdeIconDes {
|
|||
virtual void Save();
|
||||
|
||||
void Load(const char *filename);
|
||||
void Create(const char *filename);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -44,6 +44,7 @@ struct ImageViewModule : public IdeModule {
|
|||
if(ToLower(GetFileExt(path)) == ".png" && sz.cx <= 768 && sz.cy <= 512) {
|
||||
IdePngDes *d = new IdePngDes;
|
||||
d->Load(path);
|
||||
d->RestoreEditPos();
|
||||
return d;
|
||||
}
|
||||
else {
|
||||
|
|
@ -60,6 +61,13 @@ struct ImageViewModule : public IdeModule {
|
|||
return d;
|
||||
}
|
||||
}
|
||||
else
|
||||
if(ToLower(GetFileExt(path)) == ".png" && GetFileLength(path) == 0) {
|
||||
IdePngDes *d = new IdePngDes;
|
||||
d->Create(path);
|
||||
d->RestoreEditPos();
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,8 @@
|
|||
void IdePngDes::Save()
|
||||
{
|
||||
if(GetCount())
|
||||
SaveChangedFile(filename, PNGEncoder().SaveString(GetImage(0)), true);
|
||||
SaveChangedFileFinish(filename, PNGEncoder().SaveString(GetImage(0)));
|
||||
filetime = FileGetTime(filename);
|
||||
}
|
||||
|
||||
void IdePngDes::Load(const char *_filename)
|
||||
|
|
@ -13,5 +14,15 @@ void IdePngDes::Load(const char *_filename)
|
|||
filetime = FileGetTime(filename);
|
||||
Image m = StreamRaster::LoadFileAny(filename);
|
||||
AddImage(filename, m, false);
|
||||
HideList();
|
||||
SingleMode();
|
||||
}
|
||||
|
||||
void IdePngDes::Create(const char *_filename)
|
||||
{
|
||||
Clear();
|
||||
filename = _filename;
|
||||
filetime = GetSysTime();
|
||||
Image m = CreateImage(Size(16, 16), Null);
|
||||
AddImage(filename, m, false);
|
||||
SingleMode();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue