1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-01-04 04:44:16 +01:00

*** empty log message ***

This commit is contained in:
kojima
2000-03-04 00:18:13 +00:00
parent 41334b84d5
commit 93941b2c03
3 changed files with 166 additions and 32 deletions

View File

@@ -38,6 +38,7 @@ changes since wmaker 0.61.1:
wsyserror(), but printing the message for the specified error code. wsyserror(), but printing the message for the specified error code.
- added 3 new classes: WMData, WMHost and WMConnection - added 3 new classes: WMData, WMHost and WMConnection
- fixed a big memory leak in the color panel code (from Pascal Hofstee). - fixed a big memory leak in the color panel code (from Pascal Hofstee).
- added scrolling to tabview
changes since wmaker 0.61.0: changes since wmaker 0.61.0:
............................ ............................

View File

@@ -8,9 +8,12 @@ typedef struct W_TabView {
struct W_TabViewItem **items; struct W_TabViewItem **items;
int itemCount; int itemCount;
int maxItems; /* size of items array */ int maxItems; /* size of items array, can be increased */
int selectedItem; int selectedItem;
int firstVisible;
int visibleTabs;
WMFont *font; WMFont *font;
@@ -28,7 +31,10 @@ typedef struct W_TabView {
WMTabViewTypes type:2; WMTabViewTypes type:2;
unsigned tabbed:1; unsigned tabbed:1;
unsigned allowsTruncatedLabels:1; unsigned dontFitAll:1;
unsigned leftDown:1; // scrolling button state
unsigned rightDown:1;
} flags; } flags;
} TabView; } TabView;
@@ -37,6 +43,9 @@ typedef struct W_TabView {
#define DEFAULT_WIDTH 40 #define DEFAULT_WIDTH 40
#define DEFAULT_HEIGHT 40 #define DEFAULT_HEIGHT 40
#define NORMAL_SIDE_OFFSET 8
#define BUTTONED_SIDE_OFFSET 20
static void destroyTabView(TabView *tPtr); static void destroyTabView(TabView *tPtr);
static void paintTabView(TabView *tPtr); static void paintTabView(TabView *tPtr);
@@ -71,11 +80,31 @@ handleEvents(XEvent *event, void *data)
case ButtonPress: case ButtonPress:
{ {
WMTabViewItem *item = WMTabViewItemAtPoint(tPtr, WMTabViewItem *item = WMTabViewItemAtPoint(tPtr,
event->xbutton.x, event->xbutton.x,
event->xbutton.y); event->xbutton.y);
if (item) { if (item) {
WMSelectTabViewItem(tPtr, item); WMSelectTabViewItem(tPtr, item);
} else if (tPtr->flags.dontFitAll) {
int redraw;
if (event->xbutton.x < BUTTONED_SIDE_OFFSET) {
if (tPtr->firstVisible > 0) {
redraw = 1;
tPtr->firstVisible--;
}
} else if (event->xbutton.x - BUTTONED_SIDE_OFFSET
> tPtr->visibleTabs*(tPtr->tabWidth-10)) {
if (tPtr->firstVisible + tPtr->visibleTabs
< tPtr->itemCount) {
redraw = 1;
tPtr->firstVisible++;
}
}
if (redraw) {
paintTabView(tPtr);
}
} }
} }
break; break;
@@ -241,19 +270,35 @@ WMTabViewItem*
WMTabViewItemAtPoint(WMTabView *tPtr, int x, int y) WMTabViewItemAtPoint(WMTabView *tPtr, int x, int y)
{ {
int i; int i;
int offset;
int count = tPtr->visibleTabs;
int first = tPtr->firstVisible;
if (tPtr->flags.dontFitAll) {
offset = BUTTONED_SIDE_OFFSET;
i = tPtr->selectedItem; i = tPtr->selectedItem - tPtr->firstVisible;
if (isInside(8 + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, if (i >= 0 && i < tPtr->visibleTabs
tPtr->tabHeight, x, y)) { && isInside(offset + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth,
return tPtr->items[i]; tPtr->tabHeight, x, y)) {
} return tPtr->items[tPtr->selectedItem];
}
} else {
offset = NORMAL_SIDE_OFFSET;
for (i = 0; i < tPtr->itemCount; i++) { i = tPtr->selectedItem;
if (isInside(8 + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, if (isInside(offset + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth,
tPtr->tabHeight, x, y)) { tPtr->tabHeight, x, y)) {
return tPtr->items[i]; return tPtr->items[i];
} }
} }
for (i = 0; i < count; i++) {
if (isInside(offset + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth,
tPtr->tabHeight, x, y)) {
return tPtr->items[i+first];
}
}
return NULL; return NULL;
} }
@@ -364,9 +409,15 @@ recalcTabWidth(TabView *tPtr)
} }
} }
tPtr->tabWidth += 30; tPtr->tabWidth += 30;
if (tPtr->tabWidth > twidth - 10 * tPtr->itemCount if ((tPtr->tabWidth + 2) * tPtr->itemCount > twidth - 2*NORMAL_SIDE_OFFSET) {
&& tPtr->tabWidth < twidth - 16) tPtr->flags.dontFitAll = 1;
tPtr->tabWidth = (twidth - 16) / tPtr->itemCount; tPtr->firstVisible = 0;
tPtr->visibleTabs = (twidth - 2*BUTTONED_SIDE_OFFSET) / (tPtr->tabWidth-10);
} else {
tPtr->flags.dontFitAll = 0;
tPtr->firstVisible = 0;
tPtr->visibleTabs = tPtr->itemCount;
}
} }
@@ -441,6 +492,20 @@ drawTab(TabView *tPtr, Drawable d, int x, int y,
} }
static void
paintDot(TabView *tPtr, Drawable d, int x, int y)
{
WMScreen *scr = W_VIEW(tPtr)->screen;
Display *dpy = scr->display;
GC white = WMColorGC(scr->white);
GC black = WMColorGC(scr->black);
XFillRectangle(dpy, d, black, x, y, 2, 2);
XDrawPoint(dpy, d, white, x, y);
}
static void static void
paintTabView(TabView *tPtr) paintTabView(TabView *tPtr)
{ {
@@ -452,6 +517,13 @@ paintTabView(TabView *tPtr)
WMRect rect; WMRect rect;
if (tPtr->flags.type == WTTopTabsBevelBorder) { if (tPtr->flags.type == WTTopTabsBevelBorder) {
int count = tPtr->visibleTabs;
int first = tPtr->firstVisible;
int offs;
int moreAtLeft;
int moreAtRight;
int selectedIsVisible;
buffer = XCreatePixmap(dpy, W_VIEW(tPtr)->window, buffer = XCreatePixmap(dpy, W_VIEW(tPtr)->window,
W_VIEW(tPtr)->size.width, tPtr->tabHeight, W_VIEW(tPtr)->size.width, tPtr->tabHeight,
W_VIEW(tPtr)->screen->depth); W_VIEW(tPtr)->screen->depth);
@@ -459,35 +531,75 @@ paintTabView(TabView *tPtr)
XFillRectangle(dpy, buffer, WMColorGC(W_VIEW(tPtr)->backColor), XFillRectangle(dpy, buffer, WMColorGC(W_VIEW(tPtr)->backColor),
0, 0, W_VIEW(tPtr)->size.width, tPtr->tabHeight); 0, 0, W_VIEW(tPtr)->size.width, tPtr->tabHeight);
rect.pos.x = 8 + 15;
rect.pos.y = 2; rect.pos.y = 2;
if (tPtr->flags.dontFitAll) {
rect.pos.x = 15 + BUTTONED_SIDE_OFFSET;
offs = BUTTONED_SIDE_OFFSET;
moreAtLeft = first > 0;
moreAtRight = (first + count) < tPtr->itemCount;
if (tPtr->selectedItem >= first
&& tPtr->selectedItem < first + count)
selectedIsVisible = 1;
else
selectedIsVisible = 0;
} else {
rect.pos.x = 15 + NORMAL_SIDE_OFFSET;
offs = NORMAL_SIDE_OFFSET;
moreAtLeft = 0;
moreAtRight = 0;
selectedIsVisible = 1;
}
rect.size.width = tPtr->tabWidth; rect.size.width = tPtr->tabWidth;
rect.size.height = tPtr->tabHeight; rect.size.height = tPtr->tabHeight;
for (i = tPtr->itemCount - 1; i >= 0; i--) { for (i = count - (moreAtRight ? 0 : 1);
if (i != tPtr->selectedItem) { i >= (moreAtLeft ? -1 : 0); i--) {
drawTab(tPtr, buffer, 8 + (rect.size.width-10)*i, 0, if (!selectedIsVisible || i != (tPtr->selectedItem-first)) {
drawTab(tPtr, buffer, offs + (rect.size.width-10)*i, 0,
rect.size.width, rect.size.height, False); rect.size.width, rect.size.height, False);
} }
} }
drawTab(tPtr, buffer, 8 + (rect.size.width-10) * tPtr->selectedItem,
0, rect.size.width, rect.size.height, True); if (selectedIsVisible) {
drawTab(tPtr, buffer,
offs + (rect.size.width-10) * (tPtr->selectedItem - first),
0, rect.size.width, rect.size.height, True);
XDrawLine(dpy, buffer, white, 0, tPtr->tabHeight - 1, XDrawLine(dpy, buffer, white, 0, tPtr->tabHeight - 1,
8, tPtr->tabHeight - 1); offs, tPtr->tabHeight - 1);
XDrawLine(dpy, buffer, white, XDrawLine(dpy, buffer, white,
8 + 10 + (rect.size.width-10) * tPtr->itemCount, offs + 10 + (rect.size.width-10) * count,
tPtr->tabHeight - 1, W_VIEW(tPtr)->size.width - 1, tPtr->tabHeight - 1, W_VIEW(tPtr)->size.width - 1,
tPtr->tabHeight - 1); tPtr->tabHeight - 1);
} else {
XDrawLine(dpy, buffer, white, 0, tPtr->tabHeight - 1,
W_VIEW(tPtr)->size.width, tPtr->tabHeight - 1);
}
for (i = 0; i < count; i++) {
for (i = 0; i < tPtr->itemCount; i++) { W_DrawLabel(tPtr->items[first+i], buffer, rect);
W_DrawLabel(tPtr->items[i], buffer, rect);
rect.pos.x += rect.size.width - 10; rect.pos.x += rect.size.width - 10;
} }
if (moreAtLeft) {
paintDot(tPtr, buffer, 4, 10);
paintDot(tPtr, buffer, 7, 10);
paintDot(tPtr, buffer, 10, 10);
}
if (moreAtRight) {
int x;
x = BUTTONED_SIDE_OFFSET - 5 + tPtr->visibleTabs * (tPtr->tabWidth - 10);
x = x + (W_VIEW(tPtr)->size.width - x)/2;
paintDot(tPtr, buffer, x + 5, 10);
paintDot(tPtr, buffer, x + 8, 10);
paintDot(tPtr, buffer, x + 11, 10);
}
XCopyArea(dpy, buffer, W_VIEW(tPtr)->window, scr->copyGC, 0, 0, XCopyArea(dpy, buffer, W_VIEW(tPtr)->window, scr->copyGC, 0, 0,
W_VIEW(tPtr)->size.width, tPtr->tabHeight, 0, 0); W_VIEW(tPtr)->size.width, tPtr->tabHeight, 0, 0);

View File

@@ -467,6 +467,26 @@ testTabView(WMScreen *scr)
WMSetTabViewItemLabel(tab, "Something"); WMSetTabViewItemLabel(tab, "Something");
frame = WMCreateFrame(win);
WMSetFrameRelief(frame, WRFlat);
label = WMCreateLabel(frame);
WMResizeWidget(label, 100, 100);
WMMoveWidget(label, 160, 40);
WMSetLabelText(label, "Label 4");
WMMapWidget(label);
tab = WMCreateTabViewItemWithIdentifier(0);
WMSetTabViewItemView(tab, WMWidgetView(frame));
WMAddItemInTabView(tabv, tab);
WMSetTabViewItemLabel(tab, "Bla!");
tab = WMCreateTabViewItemWithIdentifier(0);
WMSetTabViewItemView(tab, WMWidgetView(frame));
WMAddItemInTabView(tabv, tab);
WMSetTabViewItemLabel(tab, "Weee!");
WMRealizeWidget(win); WMRealizeWidget(win);
WMMapSubwidgets(win); WMMapSubwidgets(win);
WMMapWidget(win); WMMapWidget(win);
@@ -690,16 +710,17 @@ int main(int argc, char **argv)
* Put the testSomething() function you want to test here. * Put the testSomething() function you want to test here.
*/ */
testTabView(scr);
#if 0
testFontPanel(scr);
testSplitView(scr); testSplitView(scr);
testFontPanel(scr);
testGradientButtons(scr);
#if 1
testGradientButtons(scr);
testProgressIndicator(scr); testProgressIndicator(scr);
testColorWell(scr); testColorWell(scr);
testTabView(scr);
testTextField(scr); testTextField(scr);
testOpenFilePanel(scr); testOpenFilePanel(scr);