From 93941b2c03455c336fd2428466917ecaa60e3354 Mon Sep 17 00:00:00 2001 From: kojima Date: Sat, 4 Mar 2000 00:18:13 +0000 Subject: [PATCH] *** empty log message *** --- WINGs/ChangeLog | 1 + WINGs/wtabview.c | 172 +++++++++++++++++++++++++++++++++++++++++++++---------- WINGs/wtest.c | 29 ++++++++-- 3 files changed, 168 insertions(+), 34 deletions(-) diff --git a/WINGs/ChangeLog b/WINGs/ChangeLog index 85546daf..c9fe2db0 100644 --- a/WINGs/ChangeLog +++ b/WINGs/ChangeLog @@ -38,6 +38,7 @@ changes since wmaker 0.61.1: wsyserror(), but printing the message for the specified error code. - added 3 new classes: WMData, WMHost and WMConnection - fixed a big memory leak in the color panel code (from Pascal Hofstee). +- added scrolling to tabview changes since wmaker 0.61.0: ............................ diff --git a/WINGs/wtabview.c b/WINGs/wtabview.c index 1cb520f2..6c1b2aa0 100644 --- a/WINGs/wtabview.c +++ b/WINGs/wtabview.c @@ -8,9 +8,12 @@ typedef struct W_TabView { struct W_TabViewItem **items; int itemCount; - int maxItems; /* size of items array */ + int maxItems; /* size of items array, can be increased */ int selectedItem; + int firstVisible; + + int visibleTabs; WMFont *font; @@ -28,7 +31,10 @@ typedef struct W_TabView { WMTabViewTypes type:2; unsigned tabbed:1; - unsigned allowsTruncatedLabels:1; + unsigned dontFitAll:1; + + unsigned leftDown:1; // scrolling button state + unsigned rightDown:1; } flags; } TabView; @@ -37,6 +43,9 @@ typedef struct W_TabView { #define DEFAULT_WIDTH 40 #define DEFAULT_HEIGHT 40 +#define NORMAL_SIDE_OFFSET 8 +#define BUTTONED_SIDE_OFFSET 20 + static void destroyTabView(TabView *tPtr); static void paintTabView(TabView *tPtr); @@ -71,11 +80,31 @@ handleEvents(XEvent *event, void *data) case ButtonPress: { - WMTabViewItem *item = WMTabViewItemAtPoint(tPtr, + WMTabViewItem *item = WMTabViewItemAtPoint(tPtr, event->xbutton.x, event->xbutton.y); if (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; @@ -241,17 +270,33 @@ WMTabViewItem* WMTabViewItemAtPoint(WMTabView *tPtr, int x, int y) { int i; + int offset; + int count = tPtr->visibleTabs; + int first = tPtr->firstVisible; + + if (tPtr->flags.dontFitAll) { + offset = BUTTONED_SIDE_OFFSET; + + i = tPtr->selectedItem - tPtr->firstVisible; + if (i >= 0 && i < tPtr->visibleTabs + && isInside(offset + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, + tPtr->tabHeight, x, y)) { + return tPtr->items[tPtr->selectedItem]; + } + } else { + offset = NORMAL_SIDE_OFFSET; - i = tPtr->selectedItem; - if (isInside(8 + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, - tPtr->tabHeight, x, y)) { - return tPtr->items[i]; + i = tPtr->selectedItem; + if (isInside(offset + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, + tPtr->tabHeight, x, y)) { + return tPtr->items[i]; + } } - for (i = 0; i < tPtr->itemCount; i++) { - if (isInside(8 + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, + for (i = 0; i < count; i++) { + if (isInside(offset + (tPtr->tabWidth-10)*i, 0, tPtr->tabWidth, tPtr->tabHeight, x, y)) { - return tPtr->items[i]; + return tPtr->items[i+first]; } } return NULL; @@ -364,9 +409,15 @@ recalcTabWidth(TabView *tPtr) } } tPtr->tabWidth += 30; - if (tPtr->tabWidth > twidth - 10 * tPtr->itemCount - && tPtr->tabWidth < twidth - 16) - tPtr->tabWidth = (twidth - 16) / tPtr->itemCount; + if ((tPtr->tabWidth + 2) * tPtr->itemCount > twidth - 2*NORMAL_SIDE_OFFSET) { + tPtr->flags.dontFitAll = 1; + 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; + } } @@ -442,6 +493,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 paintTabView(TabView *tPtr) { Pixmap buffer; @@ -452,6 +517,13 @@ paintTabView(TabView *tPtr) WMRect rect; 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, W_VIEW(tPtr)->size.width, tPtr->tabHeight, W_VIEW(tPtr)->screen->depth); @@ -459,35 +531,75 @@ paintTabView(TabView *tPtr) XFillRectangle(dpy, buffer, WMColorGC(W_VIEW(tPtr)->backColor), 0, 0, W_VIEW(tPtr)->size.width, tPtr->tabHeight); - rect.pos.x = 8 + 15; 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.height = tPtr->tabHeight; - for (i = tPtr->itemCount - 1; i >= 0; i--) { - if (i != tPtr->selectedItem) { - drawTab(tPtr, buffer, 8 + (rect.size.width-10)*i, 0, + for (i = count - (moreAtRight ? 0 : 1); + i >= (moreAtLeft ? -1 : 0); i--) { + if (!selectedIsVisible || i != (tPtr->selectedItem-first)) { + drawTab(tPtr, buffer, offs + (rect.size.width-10)*i, 0, 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); - - XDrawLine(dpy, buffer, white, 0, tPtr->tabHeight - 1, - 8, tPtr->tabHeight - 1); - - XDrawLine(dpy, buffer, white, - 8 + 10 + (rect.size.width-10) * tPtr->itemCount, - tPtr->tabHeight - 1, W_VIEW(tPtr)->size.width - 1, - tPtr->tabHeight - 1); - + + 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, + offs, tPtr->tabHeight - 1); + + XDrawLine(dpy, buffer, white, + offs + 10 + (rect.size.width-10) * count, + tPtr->tabHeight - 1, W_VIEW(tPtr)->size.width - 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 < tPtr->itemCount; i++) { - W_DrawLabel(tPtr->items[i], buffer, rect); + for (i = 0; i < count; i++) { + W_DrawLabel(tPtr->items[first+i], buffer, rect); 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, W_VIEW(tPtr)->size.width, tPtr->tabHeight, 0, 0); diff --git a/WINGs/wtest.c b/WINGs/wtest.c index 995e371c..9aba32f1 100644 --- a/WINGs/wtest.c +++ b/WINGs/wtest.c @@ -467,6 +467,26 @@ testTabView(WMScreen *scr) 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); WMMapSubwidgets(win); WMMapWidget(win); @@ -690,16 +710,17 @@ int main(int argc, char **argv) * Put the testSomething() function you want to test here. */ + testTabView(scr); - testSplitView(scr); +#if 0 testFontPanel(scr); - testGradientButtons(scr); -#if 1 + testSplitView(scr); + + testGradientButtons(scr); testProgressIndicator(scr); testColorWell(scr); - testTabView(scr); testTextField(scr); testOpenFilePanel(scr); -- 2.11.4.GIT