*/}}
浏览代码

double click expand tabs

YimingWu 4 月之前
父节点
当前提交
47c878e2ed
共有 3 个文件被更改,包括 134 次插入83 次删除
  1. 8 9
      la_interface.h
  2. 29 16
      la_kernel.c
  3. 97 58
      resources/la_operators.c

+ 8 - 9
la_interface.h

@@ -775,7 +775,6 @@ STRUCTURE(laBlock){
     real SplitRatio; // From Left/Top;
     laPropPack PP;
     laPropPack FakePS;
-    int OnButton;
 };
 
 #define LA_BLOCK_DROP_LOCATION_L 1
@@ -788,17 +787,18 @@ STRUCTURE(laLayout){
 
     laBlock *OperatingBlock;
     laBlock *FirstBlock;
-    laBlock *MovingBlock;
-    int      IsMoving;
-
-    laPanel *ClickedPanel;
-    laBlock *DropToBlock;
-    laBlock *OnBlockSeperator;
-    char DropLocation;
 
     laSafeString *ID;
 
     laLayoutBkgDrawFunc Draw;
+
+    int      IsMoving;
+    int      IsBlockHeaderClicked,LastX,LastY;
+    int      DropLocation;
+    laPanel *ClickedPanel;
+    laBlock *DropToBlock;
+    laBlock *OnBlockSeperator;
+    laBlock *MovingBlock, *HeaderBlock;
 };
 
 STRUCTURE(laUiList){
@@ -2492,7 +2492,6 @@ int laIsInBlock(laBlock *b, int X, int Y);
 int laIsInBlockHeader(laBlock *b, int X, int Y);
 int laIsInBlockBotton1(laBlock *b, int X, int Y);
 int laIsInBlockBotton2(laBlock *b, int X, int Y);
-laBlock *laClearBlockButtonRecursive(laBlock *b, laBlock *except);
 laBlock *laDetectBlockRecursive(laBlock *b, int X, int Y);
 
 void la_DoUiScissor(laUiItem* ui, int* savex, int* savey, int* savew, int* saveh,

+ 29 - 16
la_kernel.c

@@ -3042,12 +3042,7 @@ void la_BlockDefDrawSelf(laBlock *b, int CH){
     tnsVertexArray2d(tv, 4);
     tnsPackAs(GL_TRIANGLE_FAN);
 
-    if(b->Folded){
-        real Color[4]; tnsVectorCopy4d(laThemeColor(bt,LA_BT_BORDER), Color); Color[3]*=b->OnButton==2?1:(b->OnButton==1?0.3:0);
-        tnsDrawStringAuto("⯆",Color, b->X+LA_SEAM_W,b->X+LA_SEAM_W+LA_RH, CH-b->Y, LA_TEXT_REVERT_Y|LA_TEXT_ALIGN_CENTER);
-        tnsDrawStringAuto("⮼",Color, b->X+LA_SEAM_W+LA_RH,b->X+LA_SEAM_W+LA_2RH, CH-b->Y, LA_TEXT_REVERT_Y|LA_TEXT_ALIGN_CENTER);
-        tnsFlush(); return; 
-    }
+    if(b->Folded){ return;  }
 
     int LT=0,RT=0;
     for (p = b->Panels.pFirst; p; p = p->Item.pNext){
@@ -3123,8 +3118,32 @@ void la_BlockDefDrawRecursive(laWindow *w, laBoxedTheme *bt, laBlock *b){
         la_BlockDefDrawSelfEmpty(b, w->CH);
     }
 
-
-    if(b==MAIN.CurrentWindow->CurrentLayout->MovingBlock){
+    laLayout* l=MAIN.CurrentWindow->CurrentLayout;
+    if(b==l->HeaderBlock){
+        tnsUseNoTexture(); real tv[8]; int YOffset=0;
+        laBoxedTheme* bt = _LA_THEME_FLOATING_PANEL; int MenuHeight=(bt->TM+bt->BM)*2+LA_RH;
+        if(b->Y<MenuHeight+LA_SEAM_W){ YOffset=LA_SEAM_W; }
+        tnsMakeQuad2d(tv, b->X, (w->CH-(b->Y-LA_SEAM_W))-YOffset,
+                          b->X+b->W, (w->CH-(b->Y-LA_SEAM_W))-YOffset,
+                          b->X+b->W, (w->CH-(b->Y+LA_SEAM_W))-YOffset,
+                          b->X, (w->CH-(b->Y+LA_SEAM_W))-YOffset);
+        tnsColor4dv(laThemeColor(_LA_THEME_TAB,LA_BT_BORDER));
+        tnsVertexArray2d(tv, 4);
+        tnsPackAs(GL_TRIANGLE_FAN);
+        if(l->IsBlockHeaderClicked && (!l->IsMoving)){
+            char* Hint=transLate("Double-click to expand 🖱");
+            int Width = tnsStringGetWidth(Hint,0,0)+bt->LM+bt->RM;
+            int UseL=l->LastX-Width-LA_RH; UseL=TNS_MAX2(UseL,b->X);
+            tnsMakeQuad2d(tv, UseL, w->CH-b->Y,
+                              UseL+Width, w->CH-b->Y,
+                              UseL+Width, w->CH-b->Y-LA_RH,
+                              UseL, w->CH-b->Y-LA_RH);
+            tnsColor4dv(laThemeColor(_LA_THEME_TAB,LA_BT_BORDER));
+            tnsVertexArray2d(tv, 4);
+            tnsPackAs(GL_TRIANGLE_FAN);
+            tnsDrawStringAuto(Hint,laThemeColor(_LA_THEME_TAB,LA_BT_TEXT_ACTIVE),UseL+bt->LM,UseL+Width,w->CH-b->Y,LA_TEXT_REVERT_Y);
+        }
+    }elif(b==l->MovingBlock){
         tnsUseNoTexture();
         int at; real tv[8];
         if (b->Vertical){
@@ -3144,6 +3163,7 @@ void la_BlockDefDrawRecursive(laWindow *w, laBoxedTheme *bt, laBlock *b){
         tnsVertexArray2d(tv, 4);
         tnsPackAs(GL_TRIANGLE_FAN);
     }
+
     //la_SetPanelMatrixDrawWindow(b->CurrentPanel, *b->CurrentPanel->BT);
     tnsFlush();
 }
@@ -3370,7 +3390,7 @@ laLayout *laDesignLayout(laWindow *w, char *Title){
     return l;
 }
 void laFoldBlockTitle(laBlock* b){ if(b->B1) return; b->Folded=1; la_RecalcBlockRecursive(b,b->X,b->Y,b->W,b->H); }
-void laUnfoldBlockTitle(laBlock* b){ if(b->B1) return; b->Folded=0; b->OnButton=0; la_RecalcBlockRecursive(b,b->X,b->Y,b->W,b->H); }
+void laUnfoldBlockTitle(laBlock* b){ if(b->B1) return; b->Folded=0; la_RecalcBlockRecursive(b,b->X,b->Y,b->W,b->H); }
 void laMaximizeBlock(laBlock* b){ if(b->B1) return; laWindow* w=MAIN.CurrentWindow;
     if(w->MaximizedBlock==b){laRestoreToLayout(); return;} w->MaximizedBlock=b; la_UpdateUiPlacement(w);
     laNotifyUsers("la.windows.maximized_block"); }
@@ -4396,13 +4416,6 @@ int laIsInBlock(laBlock *b, int X, int Y){
 int laIsInBlockHeader(laBlock *b, int X, int Y){ if (X >= b->X && X <= b->X + b->W && Y >= b->Y && Y <= b->Y + LA_RH) return 1; return 0; }
 int laIsInBlockBotton1(laBlock *b, int X, int Y){ if (X >= b->X && X <= b->X + LA_RH && Y >= b->Y && Y <= b->Y + LA_RH) return 1; return 0; }
 int laIsInBlockBotton2(laBlock *b, int X, int Y){ if (X >= b->X+LA_RH && X <= b->X+LA_2RH && Y >= b->Y && Y <= b->Y + LA_RH) return 1; return 0; }
-laBlock *laClearBlockButtonRecursive(laBlock *b, laBlock *except){
-    if(b->B1){laClearBlockButtonRecursive(b->B1,except);}
-    if(b->B2){laClearBlockButtonRecursive(b->B2,except);}
-    if (!b->B1 && !b->B2){
-        if(b!=except && b->OnButton){ b->OnButton=0; laRefreshWindow(); }
-    }
-}
 laBlock *laDetectBlockRecursive(laBlock *b, int X, int Y){
     laPanel *p;
     laBlock *sb = 0;

+ 97 - 58
resources/la_operators.c

@@ -930,7 +930,7 @@ int OPINV_UDFPropagate(laOperator *a, laEvent *e){
 }
 
 int OPINV_SendSignal(laOperator *a, laEvent *e){
-    const char* sig=strGetArgumentString(&a->ExtraInstructionsP,"signal"); if((!sig) || (!sig[0])) return LA_FINISHED;
+    const char* sig=strGetArgumentString(a->ExtraInstructionsP,"signal"); if((!sig) || (!sig[0])) return LA_FINISHED;
     laCustomSignal* cs=laFindSignal(sig);
     if(cs){ la_SendSignalEvent(e->window->win, cs->Signal); }
     return LA_FINISHED;
@@ -1595,6 +1595,19 @@ int OPINV_NewWindow(laOperator* a, laEvent* e){
     return LA_FINISHED;
 }
 
+void *la_OnBlockFoldedHeader(laBlock *b, laEvent *e){
+    int at;
+    laBlock *bb=0; int NoSubs = (b->B1==0);
+    if(NoSubs){
+        if (e->x>=b->X && e->x<=b->X+b->W && e->y>=b->Y-LA_SEAM_W && e->y<=b->Y+LA_SEAM_W){
+            return b;
+        }
+        return 0;
+    }
+    bb=la_OnBlockFoldedHeader(b->B1,e); if(bb) return bb;
+    bb=la_OnBlockFoldedHeader(b->B2,e); if(bb) return bb;
+    return 0;
+}
 void *la_OnBlockSeperator(laBlock *b, laEvent *e){
     int at;
     laBlock *bb;
@@ -1611,8 +1624,7 @@ void *la_OnBlockSeperator(laBlock *b, laEvent *e){
         }
     }
     if (bb = la_OnBlockSeperator(b->B1, e)) return bb;
-    else
-        return la_OnBlockSeperator(b->B2, e);
+    else return la_OnBlockSeperator(b->B2, e);
 }
 int la_DetectBlockDropLocation(laBlock *b, int X, int Y){
     laPanel *p = b->Panels.pFirst;
@@ -1702,6 +1714,48 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
             }
         }
 
+        if (e->type == LA_MOUSEMOVE){
+            if (MAIN.CurrentWindow->CurrentLayout->ClickedPanel){
+                if (abs(e->x - uid->LastX) > LA_RH*3 || abs(e->y - uid->LastY) > LA_RH*3){
+                    l = MAIN.CurrentWindow->CurrentLayout;
+                    l->DropToBlock = b;
+                    l->DropLocation = la_DetectBlockDropLocation(b, e->x, e->y);
+                    laRefreshWindow();
+                }
+            }
+        }elif (e->type == LA_L_MOUSE_UP){
+            l = MAIN.CurrentWindow->CurrentLayout;
+            if (l->DropToBlock){
+                l->DropToBlock = la_MakeDropBlock(l->DropToBlock,l->DropLocation);
+                p = l->ClickedPanel;
+                if(p->Block == l->DropToBlock){
+                    if(laTearOffPanel(p->Block, p)) Executed=1;
+                }else{
+                    p->Block->CurrentPanel = p->Item.pPrev ? p->Item.pPrev : (p->Item.pNext ? p->Item.pNext : 0);
+                    lstRemoveItem(&p->Block->Panels, p); laBlock* orig_block=p->Block->parent;
+                    int clear=0; if(!lstHaveItemInList(&p->Block->Panels)){clear=1;}
+                    lstPushItem(&l->DropToBlock->Panels, p);
+                    laUnfoldBlockTitle(l->DropToBlock);
+                    p->Block = l->DropToBlock;
+                    if(clear){
+                        laCombineChildBlocks(orig_block);
+                        if(!lstFindItem(orig_block->CurrentPanel,nutSameAddress,&orig_block->Panels)){
+                            orig_block->CurrentPanel = orig_block->Panels.pFirst;
+                        }
+                    }
+                    p->Block->CurrentPanel = p;
+                    Executed = 1;
+                    la_RecalcBlockRecursive(p->Block, p->Block->X, p->Block->Y, p->Block->W, p->Block->H);
+                    if(orig_block!=p->Block){
+                        la_RecalcBlockRecursive(orig_block, orig_block->X, orig_block->Y, orig_block->W, orig_block->H);
+                    }
+                }
+            }
+            MAIN.CurrentWindow->CurrentLayout->DropToBlock = 0;
+            MAIN.CurrentWindow->CurrentLayout->ClickedPanel = 0;
+            return 0;
+        }
+
         if(!b->Folded){
             for (p = b->Panels.pFirst; p; p = p->Item.pNext){ tw += (p->TitleWidth + LA_SEAM_W*2); }
             if (tw > b->W - LA_SEAM_W*2 - LA_RH) ratio = (real)(b->W - LA_SEAM_W*2 - LA_RH) / tw;
@@ -1717,70 +1771,26 @@ int la_ProcessBlockEvent(laOperator *a, laBlock *b, laEvent *e){
                     }
                     LT = RT;
                 }
-            }elif (e->type == LA_MOUSEMOVE){
-                if (abs(e->x - uid->LastX) > LA_RH*3 || abs(e->y - uid->LastY) > LA_RH*3){
-                    if (MAIN.CurrentWindow->CurrentLayout->ClickedPanel){
-                        l = MAIN.CurrentWindow->CurrentLayout;
-                        l->DropToBlock = b;
-                        l->DropLocation = la_DetectBlockDropLocation(b, e->x, e->y);
-                        laRefreshWindow();
-                    }
-                }
-            }elif (e->type == LA_L_MOUSE_UP){
-                l = MAIN.CurrentWindow->CurrentLayout;
-                if (l->DropToBlock){
-                    l->DropToBlock = la_MakeDropBlock(l->DropToBlock,l->DropLocation);
-                    p = l->ClickedPanel;
-                    if(p->Block == l->DropToBlock){
-                        if(laTearOffPanel(p->Block, p)) Executed=1;
-                    }else{
-                        p->Block->CurrentPanel = p->Item.pPrev ? p->Item.pPrev : (p->Item.pNext ? p->Item.pNext : 0);
-                        lstRemoveItem(&p->Block->Panels, p); laBlock* orig_block=p->Block->parent;
-                        int clear=0; if(!lstHaveItemInList(&p->Block->Panels)){clear=1;}
-                        lstPushItem(&l->DropToBlock->Panels, p);
-                        p->Block = l->DropToBlock;
-                        if(clear){
-                            laCombineChildBlocks(orig_block);
-                            if(!lstFindItem(orig_block->CurrentPanel,nutSameAddress,&orig_block->Panels)){
-                                orig_block->CurrentPanel = orig_block->Panels.pFirst;
-                            }
-                        }
-                        p->Block->CurrentPanel = p;
-                        Executed = 1;
-                        la_RecalcBlockRecursive(p->Block, p->Block->X, p->Block->Y, p->Block->W, p->Block->H);
-                        if(orig_block!=p->Block){
-                            la_RecalcBlockRecursive(orig_block, orig_block->X, orig_block->Y, orig_block->W, orig_block->H);
-                        }
-                    }
-                }
-                MAIN.CurrentWindow->CurrentLayout->DropToBlock = 0;
-                MAIN.CurrentWindow->CurrentLayout->ClickedPanel = 0;
-                return 0;
             }
-        }else{
-            if(!b->OnButton){ b->OnButton=1; laRefreshWindow(); } Ret=0;
-            if(laIsInBlockBotton1(b, e->x, e->y)){ if(b->OnButton!=2){b->OnButton=2;laRefreshWindow();} if(e->type==LA_L_MOUSE_DOWN){laUnfoldBlockTitle(b);Executed=1;Ret=1;} }
-            elif(laIsInBlockBotton2(b, e->x, e->y)){ if(b->OnButton!=2){b->OnButton=2;laRefreshWindow();}  if(e->type==LA_L_MOUSE_DOWN){laMaximizeBlock(b);Executed=1;Ret=1;} }
+
+            if (!Executed && e->type == LA_L_MOUSE_DOWN && laIsInBlockBotton1(b, e->x, e->y)){
+                laui_BlockMenu(a, MAIN.CurrentWindow, MAIN.CurrentWindow->CurrentLayout, b, e);
+            }
         }
 
         if (Executed){
             laRecalcPanel(b->CurrentPanel);
             la_RecalcBlockRecursive(b, b->X, b->Y, b->W, b->H);
         }
-
-        if (!Executed && e->type == LA_L_MOUSE_DOWN && laIsInBlockBotton1(b, e->x, e->y)){
-            laui_BlockMenu(a, MAIN.CurrentWindow, MAIN.CurrentWindow->CurrentLayout, b, e);
-        }
         return Ret;
-    }else{
-        if(b->OnButton){b->OnButton=0;laRefreshWindow();} 
     }
     return 0;
 }
 int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laEvent *e){
     laBlock *ob = l->MovingBlock;
     laWindow *w = WindowAct->Instance;
-    if (e->type == LA_MOUSEMOVE && ob && l->MovingBlock && l->IsMoving){
+
+    if (e->type == LA_MOUSEMOVE && ob && l->MovingBlock && l->IsMoving==2){
         if (ob->Vertical) ob->SplitRatio = (real)(e->y - ob->Y) / (real)(ob->H);
         else ob->SplitRatio = (real)(e->x - ob->X) / (real)(ob->W);
         la_RecalcBlockRecursive(ob, ob->X, ob->Y, ob->W, ob->H);
@@ -1788,20 +1798,49 @@ int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laE
         if (ob->B2->CurrentPanel) laRecalcPanel(ob->B2->CurrentPanel);
         return 1;
     }
-    if (ob = la_OnBlockSeperator(b, e)){
-        ob->B1->OnButton=ob->B2->OnButton=0;
+    laBlock* header_block=0;
+    if((header_block=la_OnBlockFoldedHeader(b,e)) && (header_block->Folded)){
+        if (header_block->CurrentPanel){
+            if (e->type == LA_MOUSE_WHEEL_DOWN && header_block->CurrentPanel->Item.pNext){
+                header_block->CurrentPanel = header_block->CurrentPanel->Item.pNext; laRedrawCurrentWindow(); return 1;
+            }elif (e->type == LA_MOUSE_WHEEL_UP && header_block->CurrentPanel->Item.pPrev){
+                header_block->CurrentPanel = header_block->CurrentPanel->Item.pPrev; laRedrawCurrentWindow(); return 1;
+            }
+        }
+
+        if(l->IsBlockHeaderClicked==1){ header_block=l->HeaderBlock; }
+        if(l->HeaderBlock!=header_block){ laRefreshWindow(); }
+        l->HeaderBlock=header_block;
+        if (e->type == LA_L_MOUSE_DOWN){
+            if((l->IsBlockHeaderClicked==1) && (tnsDistIdv2(l->LastX,l->LastY,e->x,e->y)<=LA_SEAM_W)){
+                l->IsBlockHeaderClicked=0; l->IsMoving=0; laUnfoldBlockTitle(header_block); return 1;
+            }
+            if(!l->IsBlockHeaderClicked){ l->IsBlockHeaderClicked = 1; l->LastX=e->x; l->LastY=e->y; laRefreshWindow(); }
+        }
+    }else{
+        l->IsBlockHeaderClicked = 0; l->HeaderBlock=0; laRefreshWindow();
+    }
+    if ((l->IsMoving==1) || (ob = la_OnBlockSeperator(b, e))){
+        if(l->IsMoving==1){ ob=l->MovingBlock; }
         if(l->MovingBlock!=ob){ laRefreshWindow(); }
         l->MovingBlock = ob; laSetWindowCursor(ob->Vertical?LA_UP_AND_DOWN:LA_LEFT_AND_RIGHT);
         if (e->type == LA_L_MOUSE_DOWN){
-            l->IsMoving = 1;
+            if(!l->IsMoving){ l->IsMoving = 1; l->LastX=e->x; l->LastY=e->y; }
+        }elif (e->type == LA_MOUSEMOVE){
+            if(l->IsMoving==1){
+                if(ob->Vertical){ if(abs(e->y-l->LastY)>2*LA_SEAM_W){ l->IsMoving=2; } }
+                else{ if(abs(e->x-l->LastX)>2*LA_SEAM_W){ l->IsMoving=2; } }
+            }
         }elif (e->type == LA_L_MOUSE_UP){
-            l->IsMoving = 0;
+            l->IsMoving = 0; laRefreshWindow();
         }elif (e->type == LA_R_MOUSE_DOWN){
             l->OnBlockSeperator = ob;
             laui_BlockEdgeMenu(WindowAct, l, ob, e);
         }
         return 1;
     }
+    
+    l->IsMoving = 0;
     if(l->MovingBlock){ l->MovingBlock = 0; laRefreshWindow(); laSetWindowCursor(LA_ARROW); }
     return 0;
 }
@@ -1960,7 +1999,7 @@ int OPMOD_Window(laOperator *a, laEvent *e){
         if (la_ProcessBlockEdgeEvent(a, w->CurrentLayout, RootBlock, e)) return LA_RUNNING;
 
         b = w->MaximizedBlock?w->MaximizedBlock:laDetectBlockRecursive(w->CurrentLayout->FirstBlock, e->x, e->y);
-        laClearBlockButtonRecursive(RootBlock,b);
+
         if (b && la_ProcessBlockEvent(a, b, e)) return LA_RUNNING;
         
         for (p = w->Panels.pFirst; p; p = p->Item.pNext){