mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
CtrlLib, Draw: Gtk3 ch improvements
git-svn-id: svn://ultimatepp.org/upp/trunk@13905 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
b991ba78f1
commit
4a50fc3665
6 changed files with 102 additions and 152 deletions
|
|
@ -1,11 +1,11 @@
|
|||
- Possible issue with Capture (e.g. ide about box)
|
||||
|
||||
- Issue with editfield text clipping in the right
|
||||
- LeftRoundness with DropChoice (DropChoiceRdO)
|
||||
- DnD crash?
|
||||
- GUILock docs
|
||||
|
||||
CH:
|
||||
- EditDate / EditTime problems
|
||||
- Redmond scrollbars width
|
||||
- Improve progress?
|
||||
|
||||
|
|
@ -78,3 +78,4 @@ DONE:
|
|||
- spinbutton cosmetics
|
||||
- ide missing vertical line
|
||||
- DropChoice STDSIZE (.TopPosZ(10))
|
||||
- LeftRoundness with DropChoice (DropChoiceRdO)
|
||||
|
|
|
|||
|
|
@ -282,10 +282,11 @@ void ChSynthetic(Image button100x100[4], Color text[4])
|
|||
Color ink = SColorText();
|
||||
for(int i = 0; i < 4; i++) {
|
||||
Image m = button100x100[i];
|
||||
auto Espots = [](const Image& m) { return WithHotSpots(m, DPI(3), DPI(1), CH_EDITFIELD_IMAGE, DPI(3)); };
|
||||
if(i == 0) {
|
||||
ink = GetInk(m);
|
||||
roundness = GetRoundness(m) ? DPI(3) : 0;
|
||||
CtrlsImg::Set(CtrlsImg::I_EFE, WithHotSpots(MakeButton(roundness, SColorPaper(), DPI(1), ink), DPI(3), DPI(1), 0, 0));
|
||||
CtrlsImg::Set(CtrlsImg::I_EFE, Espots(MakeButton(roundness, SColorPaper(), DPI(1), ink)));
|
||||
CtrlsImg::Set(CtrlsImg::I_VE, WithHotSpots(MakeButton(DPI(0), SColorPaper(), DPI(1), ink), DPI(2), DPI(2), 0, 0));
|
||||
LabelBox::SetLook(WithHotSpots(MakeButton(2 * roundness / 3, Image(), DPI(1), ink), DPI(3), DPI(3), 0, 0));
|
||||
}
|
||||
|
|
@ -294,10 +295,9 @@ void ChSynthetic(Image button100x100[4], Color text[4])
|
|||
{
|
||||
EditField::Style& s = EditField::StyleDefault().Write();
|
||||
s.activeedge = true;
|
||||
s.edge[i] = WithHotSpots(MakeButton(roundness, i == CTRL_DISABLED ? SColorFace() : SColorPaper(), DPI(1), ink),
|
||||
DPI(3), DPI(1), 0, 0);
|
||||
s.edge[i] = Espots(MakeButton(roundness, i == CTRL_DISABLED ? SColorFace() : SColorPaper(), DPI(1), ink));
|
||||
if(i == 0)
|
||||
s.coloredge = WithHotSpots(MakeButton(roundness, Black(), DPI(2), Null), DPI(3), DPI(1), 0, 0);
|
||||
s.coloredge = Espots(MakeButton(roundness, Black(), DPI(2), Null));
|
||||
}
|
||||
{
|
||||
auto Set = [&](Button::Style& s, const Image& arrow = Null, Color ink = Null, Color border = Null) {
|
||||
|
|
|
|||
|
|
@ -184,9 +184,6 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
|
|||
return 0;
|
||||
case LOOK_MARGINS:
|
||||
return Rect(n, n, n, n);
|
||||
case LOOK_ISBODYOPAQUE:
|
||||
case LOOK_ISOPAQUE:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(IsType<Color>(v)) {
|
||||
|
|
@ -200,9 +197,6 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
|
|||
return 0;
|
||||
case LOOK_MARGINS:
|
||||
return Rect(1, 1, 1, 1);
|
||||
case LOOK_ISBODYOPAQUE:
|
||||
case LOOK_ISOPAQUE:
|
||||
return !IsNull(c);
|
||||
}
|
||||
}
|
||||
if(IsType<Image>(v)) {
|
||||
|
|
@ -219,6 +213,11 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
|
|||
}
|
||||
Point p2 = img.Get2ndSpot();
|
||||
int tile = 0;
|
||||
if(p2.x == CH_EDITFIELD_IMAGE) {
|
||||
if(op != LOOK_MARGINS)
|
||||
p.x = p.y = p2.y;
|
||||
p2.x = p2.y = 0;
|
||||
}
|
||||
if(p2.x || p2.y) {
|
||||
if(p2.x < p.x) {
|
||||
Swap(p2.x, p.x);
|
||||
|
|
@ -247,138 +246,103 @@ Value StdChLookFn(Draw& w, const Rect& r, const Value& v, int op, Color ink)
|
|||
}
|
||||
if(op == LOOK_MARGINS)
|
||||
return Rect(p.x, p.y, isz.cx - p2.x, isz.cy - p2.y);
|
||||
if(op == LOOK_ISOPAQUE)
|
||||
return img.GetKind() == IMAGE_OPAQUE;
|
||||
if(IsNull(img))
|
||||
return 1;
|
||||
if(op == LOOK_ISBODYOPAQUE) {
|
||||
static VectorMap<int64, bool> btc;
|
||||
int64 key = img.GetSerialId();
|
||||
int q = btc.Find(key);
|
||||
if(q < 0) {
|
||||
bool opaque = true;
|
||||
Rect m = ChMargins(img);
|
||||
Rect r = img.GetSize();
|
||||
r.left += max(m.left, 0);
|
||||
r.right -= max(m.right, 0);
|
||||
r.top += m.top;
|
||||
r.bottom -= m.bottom;
|
||||
int cx = r.right - r.left;
|
||||
if(cx >= 0)
|
||||
for(int y = r.top; y < r.bottom && opaque; y++) {
|
||||
const RGBA *s = img[y] + r.left;
|
||||
const RGBA *e = s + cx;
|
||||
while(s < e) {
|
||||
if(s->a != 255) {
|
||||
opaque = false;
|
||||
LTIMING("ChPaint Image");
|
||||
w.Clipoff(r);
|
||||
Rect sr(p, p2);
|
||||
Size sz2(isz.cx - sr.right, isz.cy - sr.bottom);
|
||||
Rect r = RectC(p.x, p.y, sz.cx - sr.left - sz2.cx, sz.cy - sr.top - sz2.cy);
|
||||
int top = minmax(sz.cy / 2, 0, isz.cy);
|
||||
int bottom = minmax(sz.cy - top, 0, isz.cy);
|
||||
int yy = isz.cy - bottom;
|
||||
int left = minmax(sz.cx / 2, 0, isz.cx);
|
||||
int right = minmax(sz.cx - left, 0, isz.cx);
|
||||
int xx = isz.cx - right;
|
||||
if(!r.IsEmpty()) {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, p.x, p.y), ink);
|
||||
ChDraw(w, 0, r.bottom, img, RectC(0, sr.bottom, p.x, sz2.cy), ink);
|
||||
ChDraw(w, r.right, 0, img, RectC(sr.right, 0, sz2.cx, p.y), ink);
|
||||
ChDraw(w, r.right, r.bottom, img, RectC(sr.right, sr.bottom, sz2.cx, sz2.cy), ink);
|
||||
ChDraw(w, p.x, 0, r.Width(), p.y, img, RectC(p.x, 0, sr.Width(), p.y), ink);
|
||||
ChDraw(w, p.x, r.bottom, r.Width(), sz2.cy, img, RectC(p.x, sr.bottom, sr.Width(), sz2.cy), ink);
|
||||
ChDraw(w, 0, p.y, p.x, r.Height(), img, RectC(0, p.y, p.x, sr.Height()), ink);
|
||||
ChDraw(w, r.right, p.y, sz2.cx, r.Height(), img, RectC(sr.right, p.y, sz2.cx, sr.Height()), ink);
|
||||
if(op == LOOK_PAINT) {
|
||||
if(IsNull(r) || IsNull(sr)) {
|
||||
w.End();
|
||||
return 1;
|
||||
}
|
||||
if(tile) {
|
||||
LTIMING("Ch-Tiles");
|
||||
LTIMING("Ch-Tiles");
|
||||
Size sz;
|
||||
sz.cx = (tile & 1 ? sr : r).GetWidth();
|
||||
sz.cy = (tile & 2 ? sr : r).GetHeight();
|
||||
img = Rescale(img, sz, sr);
|
||||
DrawTiles(w, r, img);
|
||||
}
|
||||
else {
|
||||
static VectorMap<int64, int> btc;
|
||||
int64 key = img.GetSerialId();
|
||||
int q;
|
||||
{
|
||||
LTIMING("Find");
|
||||
q = btc.Find(key);
|
||||
}
|
||||
if(q < 0) {
|
||||
LTIMING("ClassifyContent");
|
||||
q = ClassifyContent(img, sr);
|
||||
if(btc.GetCount() > 100)
|
||||
btc.Clear();
|
||||
btc.Add(key, q);
|
||||
}
|
||||
else
|
||||
q = btc[q];
|
||||
switch(q) {
|
||||
case IMAGECONTENT_VERTDUP|IMAGECONTENT_HORZDUP:
|
||||
{
|
||||
LTIMING("Ch-singlecolor");
|
||||
RGBA c = img[sr.top][sr.left];
|
||||
if(c.a == 255) {
|
||||
w.DrawRect(r, c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(btc.GetCount() > 100)
|
||||
btc.Clear();
|
||||
btc.Add(key, q);
|
||||
return opaque;
|
||||
}
|
||||
return btc[q];
|
||||
}
|
||||
if(op == LOOK_PAINT || op == LOOK_PAINTEDGE) {
|
||||
LTIMING("ChPaint Image");
|
||||
w.Clipoff(r);
|
||||
Rect sr(p, p2);
|
||||
Size sz2(isz.cx - sr.right, isz.cy - sr.bottom);
|
||||
Rect r = RectC(p.x, p.y, sz.cx - sr.left - sz2.cx, sz.cy - sr.top - sz2.cy);
|
||||
int top = minmax(sz.cy / 2, 0, isz.cy);
|
||||
int bottom = minmax(sz.cy - top, 0, isz.cy);
|
||||
int yy = isz.cy - bottom;
|
||||
int left = minmax(sz.cx / 2, 0, isz.cx);
|
||||
int right = minmax(sz.cx - left, 0, isz.cx);
|
||||
int xx = isz.cx - right;
|
||||
if(!r.IsEmpty()) {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, p.x, p.y), ink);
|
||||
ChDraw(w, 0, r.bottom, img, RectC(0, sr.bottom, p.x, sz2.cy), ink);
|
||||
ChDraw(w, r.right, 0, img, RectC(sr.right, 0, sz2.cx, p.y), ink);
|
||||
ChDraw(w, r.right, r.bottom, img, RectC(sr.right, sr.bottom, sz2.cx, sz2.cy), ink);
|
||||
ChDraw(w, p.x, 0, r.Width(), p.y, img, RectC(p.x, 0, sr.Width(), p.y), ink);
|
||||
ChDraw(w, p.x, r.bottom, r.Width(), sz2.cy, img, RectC(p.x, sr.bottom, sr.Width(), sz2.cy), ink);
|
||||
ChDraw(w, 0, p.y, p.x, r.Height(), img, RectC(0, p.y, p.x, sr.Height()), ink);
|
||||
ChDraw(w, r.right, p.y, sz2.cx, r.Height(), img, RectC(sr.right, p.y, sz2.cx, sr.Height()), ink);
|
||||
if(op == LOOK_PAINT) {
|
||||
if(IsNull(r) || IsNull(sr)) {
|
||||
w.End();
|
||||
return 1;
|
||||
}
|
||||
if(tile) {
|
||||
LTIMING("Ch-Tiles");
|
||||
LTIMING("Ch-Tiles");
|
||||
Size sz;
|
||||
sz.cx = (tile & 1 ? sr : r).GetWidth();
|
||||
sz.cy = (tile & 2 ? sr : r).GetHeight();
|
||||
img = Rescale(img, sz, sr);
|
||||
DrawTiles(w, r, img);
|
||||
}
|
||||
else {
|
||||
static VectorMap<int64, int> btc;
|
||||
int64 key = img.GetSerialId();
|
||||
int q;
|
||||
{
|
||||
LTIMING("Find");
|
||||
q = btc.Find(key);
|
||||
}
|
||||
if(q < 0) {
|
||||
LTIMING("ClassifyContent");
|
||||
q = ClassifyContent(img, sr);
|
||||
if(btc.GetCount() > 100)
|
||||
btc.Clear();
|
||||
btc.Add(key, q);
|
||||
}
|
||||
else
|
||||
q = btc[q];
|
||||
switch(q) {
|
||||
case IMAGECONTENT_VERTDUP|IMAGECONTENT_HORZDUP:
|
||||
{
|
||||
LTIMING("Ch-singlecolor");
|
||||
RGBA c = img[sr.top][sr.left];
|
||||
if(c.a == 255) {
|
||||
w.DrawRect(r, c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
default:
|
||||
ChDraw(w, r, img, sr, ink);
|
||||
break;
|
||||
}
|
||||
case 0:
|
||||
default:
|
||||
ChDraw(w, r, img, sr, ink);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if(r.left < r.right) {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, p.x, top), ink);
|
||||
ChDraw(w, 0, sz.cy - bottom, img, RectC(0, yy, p.x, bottom), ink);
|
||||
ChDraw(w, r.right, 0, img, RectC(sr.right, 0, sz2.cx, top), ink);
|
||||
ChDraw(w, r.right, sz.cy - bottom, img, RectC(sr.right, yy, sz2.cx, bottom), ink);
|
||||
ChDraw(w, p.x, 0, r.Width(), top, img, RectC(p.x, 0, sr.Width(), top), ink);
|
||||
ChDraw(w, p.x, sz.cy - bottom, r.Width(), bottom, img, RectC(p.x, yy, sr.Width(), bottom), ink);
|
||||
}
|
||||
else
|
||||
if(r.top < r.bottom) {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, left, p.y), ink);
|
||||
ChDraw(w, 0, r.bottom, img, RectC(0, sr.bottom, left, sz2.cy), ink);
|
||||
ChDraw(w, sz.cx - right, 0, img, RectC(xx, 0, right, p.y), ink);
|
||||
ChDraw(w, sz.cx - right, r.bottom, img, RectC(xx, sr.bottom, right, sz2.cy), ink);
|
||||
ChDraw(w, 0, p.y, left, r.Height(), img, RectC(0, p.y, left, sr.Height()), ink);
|
||||
ChDraw(w, sz.cx - right, p.y, right, r.Height(), img, RectC(xx, p.y, right, sr.Height()), ink);
|
||||
}
|
||||
else {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, left, top), ink);
|
||||
ChDraw(w, 0, sz.cy - bottom, img, RectC(0, yy, left, top), ink);
|
||||
ChDraw(w, sz.cx - right, 0, img, RectC(xx, 0, right, top), ink);
|
||||
ChDraw(w, sz.cx - right, sz.cy - bottom, img, RectC(xx, yy, right, bottom), ink);
|
||||
}
|
||||
w.End();
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
if(r.left < r.right) {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, p.x, top), ink);
|
||||
ChDraw(w, 0, sz.cy - bottom, img, RectC(0, yy, p.x, bottom), ink);
|
||||
ChDraw(w, r.right, 0, img, RectC(sr.right, 0, sz2.cx, top), ink);
|
||||
ChDraw(w, r.right, sz.cy - bottom, img, RectC(sr.right, yy, sz2.cx, bottom), ink);
|
||||
ChDraw(w, p.x, 0, r.Width(), top, img, RectC(p.x, 0, sr.Width(), top), ink);
|
||||
ChDraw(w, p.x, sz.cy - bottom, r.Width(), bottom, img, RectC(p.x, yy, sr.Width(), bottom), ink);
|
||||
}
|
||||
else
|
||||
if(r.top < r.bottom) {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, left, p.y), ink);
|
||||
ChDraw(w, 0, r.bottom, img, RectC(0, sr.bottom, left, sz2.cy), ink);
|
||||
ChDraw(w, sz.cx - right, 0, img, RectC(xx, 0, right, p.y), ink);
|
||||
ChDraw(w, sz.cx - right, r.bottom, img, RectC(xx, sr.bottom, right, sz2.cy), ink);
|
||||
ChDraw(w, 0, p.y, left, r.Height(), img, RectC(0, p.y, left, sr.Height()), ink);
|
||||
ChDraw(w, sz.cx - right, p.y, right, r.Height(), img, RectC(xx, p.y, right, sr.Height()), ink);
|
||||
}
|
||||
else {
|
||||
ChDraw(w, 0, 0, img, RectC(0, 0, left, top), ink);
|
||||
ChDraw(w, 0, sz.cy - bottom, img, RectC(0, yy, left, top), ink);
|
||||
ChDraw(w, sz.cx - right, 0, img, RectC(xx, 0, right, top), ink);
|
||||
ChDraw(w, sz.cx - right, sz.cy - bottom, img, RectC(xx, yy, right, bottom), ink);
|
||||
}
|
||||
w.End();
|
||||
return 1;
|
||||
}
|
||||
return Null;
|
||||
}
|
||||
|
|
@ -512,18 +476,6 @@ Rect ChMargins(const Value& look)
|
|||
return sChOp(w, Null, look, LOOK_MARGINS);
|
||||
}
|
||||
|
||||
bool ChIsOpaque(const Value& look)
|
||||
{
|
||||
NilDraw w;
|
||||
return sChOp(w, Null, look, LOOK_ISOPAQUE);
|
||||
}
|
||||
|
||||
bool ChIsBodyOpaque(const Value& look)
|
||||
{
|
||||
NilDraw w;
|
||||
return sChOp(w, Null, look, LOOK_ISBODYOPAQUE);
|
||||
}
|
||||
|
||||
void DeflateMargins(Rect& r, const Rect& m)
|
||||
{
|
||||
r = Rect(r.left + m.left, r.top + m.top, r.right - m.right, r.bottom - m.bottom);
|
||||
|
|
|
|||
|
|
@ -2,12 +2,11 @@ enum LookOp {
|
|||
LOOK_PAINT,
|
||||
LOOK_MARGINS,
|
||||
LOOK_PAINTEDGE,
|
||||
LOOK_ISOPAQUE,
|
||||
LOOK_ISBODYOPAQUE,
|
||||
};
|
||||
|
||||
enum {
|
||||
CH_SCROLLBAR_IMAGE = -1000 // special Image hotspot x value for ChPaint of scrollbar
|
||||
CH_SCROLLBAR_IMAGE = -1000, // special Image hotspot x value for ChPaint of scrollbar
|
||||
CH_EDITFIELD_IMAGE = -1001, // special Image hotspot x2 value, y2 is then x and y for the purposes of painting
|
||||
};
|
||||
|
||||
void ChLookFn(Value (*fn)(Draw& w, const Rect& r, const Value& look, int lookop, Color ink));
|
||||
|
|
@ -27,8 +26,6 @@ void ChPaintEdge(Draw& w, int x, int y, int cx, int cy, const Value& look, Col
|
|||
void ChPaintBody(Draw& w, const Rect& r, const Value& look, Color ink = Null);
|
||||
void ChPaintBody(Draw& w, int x, int y, int cx, int cy, const Value& look, Color ink = Null);
|
||||
Rect ChMargins(const Value& look);
|
||||
bool ChIsOpaque(const Value& look);
|
||||
bool ChIsBodyOpaque(const Value& look);
|
||||
|
||||
void DeflateMargins(Rect& r, const Rect& margin);
|
||||
void ChDeflateMargins(Rect& r, const Value& look);
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ file
|
|||
Chameleon readonly separator,
|
||||
Cham.h,
|
||||
Cham.cpp,
|
||||
SSettings.cpp,
|
||||
SColors.cpp,
|
||||
GTK-dli readonly separator,
|
||||
gobj.dli,
|
||||
gdk.dli,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue