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:
@@ -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:
|
||||||
............................
|
............................
|
||||||
|
|||||||
168
WINGs/wtabview.c
168
WINGs/wtabview.c
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user