*/}}
Browse Source

Improvements of APIs etc.

Yiming Wu 1 year ago
parent
commit
3c33e45fab
8 changed files with 78 additions and 200 deletions
  1. 3 1
      la_interface.h
  2. 56 182
      la_kernel.c
  3. 0 1
      la_resource.c
  4. 1 1
      la_tns.h
  5. 2 8
      resources/la_operators.c
  6. 6 0
      resources/la_properties.c
  7. 3 3
      resources/la_templates.c
  8. 7 4
      resources/la_widgets.c

+ 3 - 1
la_interface.h

@@ -139,6 +139,7 @@ typedef void (*laLayoutBkgDrawFunc)(void *, void *l);
 typedef void (*laPreFrameF)();
 typedef void (*laPreDrawF)();
 typedef void (*laPostFrameF)();
+typedef void (*laCleanupF)();
 
 STRUCTURE(laEvent){
     laListItem Item;
@@ -245,6 +246,7 @@ STRUCTURE(LA){
     laPreFrameF  PreFrame;
     laPreDrawF   PreDraw;
     laPostFrameF PostFrame;
+    laCleanupF Cleanup;
 
     real IdleStart, DelayStart;
     int DelayTriggered;
@@ -1564,6 +1566,7 @@ void laEnsureUserPreferences();
 
 int laGetReady();
 void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF PostFrame);
+void laSetCleanupCallback(laCleanupF Cleanup);
 laWindow *laDesignWindow(int X, int Y, int W, int H);
 laLayout *laDesignLayout(laWindow *w, char *Title);
 void laFoldBlockTitle(laBlock* b);
@@ -1806,7 +1809,6 @@ int laOperatorExists(const char* ID);
 int laInvokeUi(laOperator *From, char *ID, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals);
 int laInvokeUiP(laOperator *From, laOperatorType *at, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals);
 int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *args, char *args2);
-int laInvokeCreateThis(laOperator *From, char *ID, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2);
 int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This, char *args, char *args2);
 int laInvokePCreateThis(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2);
 void laRequestDelayEvent(real Seconds);

+ 56 - 182
la_kernel.c

@@ -470,6 +470,8 @@ int laGetReady(){
 }
 
 void laShutoff(){
+    if(MAIN.Cleanup) MAIN.Cleanup();
+
     strSafeDestroy(&MAIN.WorkingDirectory);
     strSafeDestroy(&MAIN.example_string);
 
@@ -743,6 +745,9 @@ void laRetriggerOperators(){
 void laSetFrameCallbacks(laPreFrameF PreFrame, laPreDrawF PreDraw, laPostFrameF PostFrame){
     MAIN.PreFrame=PreFrame; MAIN.PreDraw=PreDraw; MAIN.PostFrame=PostFrame;
 }
+void laSetCleanupCallback(laCleanupF Cleanup){
+    MAIN.Cleanup=Cleanup;
+}
 
 //====================================================================================================
 
@@ -3019,7 +3024,7 @@ laUiItem *la_UpdatePropDisplay(laUiItem *ui, laPropPack *Base, const char *Path,
 
         if (!result){
             ui->AT = laGetOperatorType(Path);
-            if (!ui->AT /* && !OverrideType*/) return la_UpdatePropDisplay(ui, 0, "la.example_int", 0, 0, instructions);
+            if (!ui->AT /* && !OverrideType*/) return la_UpdatePropDisplay(ui, 0, "la.unknown_prop", 0, 0, instructions);
             ui->Type = la_GetUiButtonType();
             if (OverrideType && (OverrideType->ForType == LA_PROP_OPERATOR)) ui->Type = OverrideType;
         }else{
@@ -4321,7 +4326,7 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                 int MaxB = ElementB;
                 int CanGetTheme = laCanGetTheme(ui->PP.LastPs->p);laTheme* OriginalTheme=MAIN.CurrentTheme;
                 int CanGetGap= laCanGetGap(ui->PP.LastPs->p); int Gap=0;
-                int CanGetCategory= laCanGetCategory(ui->PP.LastPs->p); char _cat[256]; char* cat=_cat; int GotCategory=0;
+                int CanGetCategory= laCanGetCategory(ui->PP.LastPs->p); char _cat[256]; char* cat=_cat; int GotCategory=0,FirstIn=1;
 
                 if (!ElementLimit) RowPriority = 0;
 
@@ -4350,11 +4355,12 @@ int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast
                         laGetCategory(ui->PP.LastPs->p, ui->PP.LastPs->UseInstance, ui->PP.EndInstance, _cat, &cat); if(cat[0]) GotCategory=1;
                     }else GotCategory=0;
 
-                    if(GotCategory){ Begin+=LA_RH*1.5+bt->TM; 
+                    if(GotCategory){ Begin+=LA_RH*(FirstIn?1:1.5)+bt->TM; 
                         if (RowPriority){
-                            Row += 1; Col=0; Begin = ElementB+bt->TM+LA_RH*1.5+bt->TM;
+                            Row += 1; Col=0; Begin = ElementB+bt->TM+LA_RH*(FirstIn?1:1.5)+bt->TM;
                         }
                     }
+                    FirstIn=0;
 
                     if (ElementLimit){
                         EL = tnsInterpolate(ui->TL, ui->TR, (Col)*ElementWidth);
@@ -4972,7 +4978,10 @@ int la_DrawUiListRecursive(laUiListDraw *uild, laUiList *uil, int L, int R, int
                     }
 
                     if(sub->TabName && sub->TabName->Ptr){
-                        tnsDrawStringAuto(sub->TabName->Ptr,laThemeColor(bt,LA_BT_DISABLED|LA_BT_TEXT),ui->L+bt->LM+bt->LP,ui->R,sub->U-LA_RH,LA_TEXT_MONO);
+                        int NoDecal=ui->Flags&LA_UI_FLAGS_NO_DECAL;
+                        int NoGap=ui->Flags&LA_UI_FLAGS_NO_GAP;
+                        tnsDrawStringAuto(sub->TabName->Ptr,laThemeColor(bt,LA_BT_DISABLED|LA_BT_TEXT),
+                            ui->L+(NoDecal?0:bt->LM)+(NoGap?0:bt->LP),ui->R,sub->U-LA_RH,LA_TEXT_MONO);
                         tnsFlush();
                     }
 
@@ -5608,7 +5617,7 @@ void *la_DestroyOperator(laOperator **a, laListHandle *Operators, int OnlyThisOn
         MAIN.CurrentPanel = (*a)->OperatorPanel;
         laDestroySinglePanel((*a)->OperatorPanel,0);
     }
-    if ((*a)->CreatedThis) FreeMem((*a)->CreatedThis);
+    if ((*a)->CreatedThis) memFree((*a)->CreatedThis);
 
     if ((*a)->ExtraInstructionsP) strDestroyStringSplitor(&(*a)->ExtraInstructionsP);
 
@@ -5667,85 +5676,11 @@ int laOperatorAvailableSafe(char *ID, laPropPack *This, void *Real_FromInstance,
     return laOperatorAvailablePSafe(at, This, Real_FromInstance, Instructions);
 }
 
-int laInvokeUi(laOperator *From, char *ID, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
-    laOperatorType *at;
-    laOperator *a, *f = From;
-
-    int rev;
-
-    if (la_UiOperatorExists(inst)) return -1;
-
-    at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID);
-    if (!at) return -1;
-
-    a = la_CreateOperator(at);
-    a->Instance = inst;
-    a->ToPanel = MAIN.ToPanel;
-    if (!IgnoreLocals) lstGeneratePointerList(f ? &f->LocalUiLists : 0, Locals, &a->LocalUiLists);
-
-    if (From) f->Child = a;
-
-    a->Using = 1;
-
-    if (at->Init) at->Init(a);
-    rev = at->Invoke(a, e);
-
-    a->Using = 0;
-
-    if (rev & LA_FINISH){
-        a->StopNow = 1; if(From)From->Child=0;
-    }
-    if (rev & LA_BLOCK){
-        lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
-        a->State = rev;
-    }else la_DestroyOperator(&a, 0, 0);
-
-    return rev;
-}
-int laInvokeUiP(laOperator *From, laOperatorType *at, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
-    laOperator *a, *f = From;
-    int rev;
-
-    if (!at || (la_UiOperatorExists(inst))){
-        return -1;
-    }
-    a = la_CreateOperator(at);
-    a->Instance = inst;
-    a->ToPanel = MAIN.ToPanel;
-    if (!IgnoreLocals) lstGeneratePointerList(f ? &f->LocalUiLists : 0, Locals, &a->LocalUiLists);
-
-    if (From) f->Child = a;
-
-    a->Using = 1;
-
-    if (at->Init) at->Init(a);
-    rev = at->Invoke(a, e);
-
-    a->Using = 0;
-
-    if (rev & LA_FINISH){
-        a->StopNow = 1; if(From)From->Child=0;
-    }
-    if (rev & LA_BLOCK){
-        lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
-        a->State = rev;
-    }else
-        la_DestroyOperator(&a, 0, 0);
-
-    DEB = a;
-
-    return rev;
-}
-
-int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *args, char *args2){
-    laOperatorType *at;
+int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This, char *args, char *args2){
     laOperator *a, *f = From;
     int rev;
 
-    at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID);
-    if (!at) return -1;
-
-    if (!f && e && e->Localized) return -1;
+    if (!f && e&&e->Localized) return -1;
 
     a = la_CreateOperator(at);
     a->ToPanel = MAIN.ToPanel;
@@ -5760,14 +5695,21 @@ int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *arg
         return LA_CANCELED;
     }
 
-    if (e&&(!e->Localized) && (at->ExtraMark & LA_EXTRA_TO_PANEL)){
+    lstGeneratePointerList(f ? &f->LocalUiLists : 0, 0, &a->LocalUiLists);
+
+    if (e&&!e->Localized && at->ExtraMark & LA_EXTRA_TO_PANEL){
         laWindowToLocal(0, a->ToPanel, &e->x, &e->y);
         e->Localized = 1;
     }
 
-    if (e&&e->Localized && (!at->ExtraMark & LA_EXTRA_TO_PANEL)){
-        laLocalToWindow(0, a->ToPanel, &e->x, &e->y);
-        e->Localized = 0;
+    if (e&&e->Localized){
+        if (!at->ExtraMark & LA_EXTRA_TO_PANEL){
+            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
+            e->Localized = 0;
+        }else{
+            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
+            laWindowToLocal(a, a->ToPanel, &e->x, &e->y);
+        }
     }
 
     if (From) f->Child = a;
@@ -5780,30 +5722,35 @@ int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *arg
     a->Using = 0;
 
     if (rev & LA_FINISH){
-        a->StopNow = 1; if(From)From->Child=0;
+        a->StopNow = 1;  if(From)From->Child=0;
     }
 
     if (!a->StopNow && (rev&LA_BLOCK || rev&LA_PASS_ON)){
         lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
         a->State = rev;
         a->PP.EndInstance = a->CustomData;
+        if (a->PP.LastPs) a->PP.LastPs->Type = L'.';
     }else
         la_DestroyOperator(&a, 0, 0);
 
     return rev;
 }
-int laInvokeCreateThis(laOperator *From, char *ID, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2){
-    laOperatorType *at;
-    laOperator *a, *f = From;
-    int rev;
-    laPropPack *created;
+int laInvoke(laOperator *From, char *ID, laEvent *e, laPropPack *This, char *args, char *args2){
+    laOperatorType *at; laOperator *a, *f = From;
 
     at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID);
     if (!at) return -1;
 
-    if (!f && (e && e->Localized) || !OrigionalThis || !OrigionalThis->LastPs) return -1;
+    return laInvokeP(From,at,e,This,args,args2);
+}
+int laInvokePCreateThis(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2){
+    laOperator *a, *f = From;
+    int rev;
+    laPropPack *created;
+
+    if (!f && e&&e->Localized || !OrigionalThis || !OrigionalThis->LastPs) return -1;
 
-    created = CreateNew(laPropPack);
+    created = memAcquireSimple(sizeof(laPropPack));
     created->LastPs = memAcquireSimple(sizeof(laPropStep));
     created->Go = created->LastPs;
     created->LastPs->p = OrigionalThis->LastPs->p;
@@ -5851,41 +5798,15 @@ int laInvokeCreateThis(laOperator *From, char *ID, laEvent *e, laPropPack *Origi
 
     return rev;
 }
-int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This, char *args, char *args2){
+int laInvokeUiP(laOperator *From, laOperatorType *at, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
     laOperator *a, *f = From;
     int rev;
 
-    if (!f && e&&e->Localized) return -1;
-
+    if (!at || (la_UiOperatorExists(inst))){ return -1; }
     a = la_CreateOperator(at);
+    a->Instance = inst;
     a->ToPanel = MAIN.ToPanel;
-    a->This = This;
-    a->ExtraInstructions = args;
-    strMakeInstructions(&a->ExtraInstructionsP, args);
-    strMakeInstructions(&a->ExtraInstructionsP, args2);
-    strMakeInstructions(&a->ExtraInstructionsP, at->ExtraInstructions);
-
-    if (!laOperatorAvailableP(at, This, a->ExtraInstructionsP)){
-        la_DestroyOperator(&a, 0, 0);
-        return LA_CANCELED;
-    }
-
-    lstGeneratePointerList(f ? &f->LocalUiLists : 0, 0, &a->LocalUiLists);
-
-    if (e&&!e->Localized && at->ExtraMark & LA_EXTRA_TO_PANEL){
-        laWindowToLocal(0, a->ToPanel, &e->x, &e->y);
-        e->Localized = 1;
-    }
-
-    if (e&&e->Localized){
-        if (!at->ExtraMark & LA_EXTRA_TO_PANEL){
-            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
-            e->Localized = 0;
-        }else{
-            laLocalToWindow(f, f->ToPanel, &e->x, &e->y);
-            laWindowToLocal(a, a->ToPanel, &e->x, &e->y);
-        }
-    }
+    if (!IgnoreLocals) lstGeneratePointerList(f ? &f->LocalUiLists : 0, Locals, &a->LocalUiLists);
 
     if (From) f->Child = a;
 
@@ -5897,74 +5818,27 @@ int laInvokeP(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *This
     a->Using = 0;
 
     if (rev & LA_FINISH){
-        a->StopNow = 1;  if(From)From->Child=0;
+        a->StopNow = 1; if(From)From->Child=0;
     }
-
-    if (!a->StopNow && (rev&LA_BLOCK || rev&LA_PASS_ON)){
+    if (rev & LA_BLOCK){
         lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
         a->State = rev;
-        a->PP.EndInstance = a->CustomData;
-        if (a->PP.LastPs) a->PP.LastPs->Type = L'.';
-    }else
-        la_DestroyOperator(&a, 0, 0);
+    }else la_DestroyOperator(&a, 0, 0);
+
+    DEB = a;
 
     return rev;
 }
-int laInvokePCreateThis(laOperator *From, laOperatorType *at, laEvent *e, laPropPack *OrigionalThis, void *FromInstance, char *args, char *args2){
+int laInvokeUi(laOperator *From, char *ID, laEvent *e, void *inst, laListHandle *Locals, int IgnoreLocals){
+    laOperatorType *at;
     laOperator *a, *f = From;
-    int rev;
-    laPropPack *created;
-
-    if (!f && e&&e->Localized || !OrigionalThis || !OrigionalThis->LastPs) return -1;
-
-    created = CreateNew(laPropPack);
-    created->LastPs = memAcquireSimple(sizeof(laPropStep));
-    created->Go = created->LastPs;
-    created->LastPs->p = OrigionalThis->LastPs->p;
-    created->LastPs->UseInstance = FromInstance;
-    created->EndInstance = FromInstance;
-    created->LastIndex = OrigionalThis->LastIndex;
-
-    a = la_CreateOperator(at);
-    a->ToPanel = MAIN.ToPanel;
-    a->This = created;
-    a->CreatedThis = created;
-    a->ExtraInstructions = args;
-    strMakeInstructions(&a->ExtraInstructionsP, args);
-    strMakeInstructions(&a->ExtraInstructionsP, args2);
-    strMakeInstructions(&a->ExtraInstructionsP, at->ExtraInstructions);
-
-    if (!laOperatorAvailableP(at, created, a->ExtraInstructionsP)){
-        la_DestroyOperator(&a, 0, 0);
-        return LA_CANCELED;
-    }
-
-    lstGeneratePointerList(f ? &f->LocalUiLists : 0, 0, &a->LocalUiLists);
-
-    if (e&&!e->Localized && at->ExtraMark & LA_EXTRA_TO_PANEL) laWindowToLocal(0, a->ToPanel, &e->x, &e->y);
-
-    if (From) f->Child = a;
-
-    a->Using = 1;
 
-    if (at->Init) at->Init(a);
-    rev = at->Invoke(a, e);
-
-    a->Using = 0;
-
-    if (rev & LA_FINISH){
-        a->StopNow = 1; if(From)From->Child=0;
-    }
-
-    if (!a->StopNow && (rev&LA_BLOCK || rev&LA_PASS_ON)){
-        lstAppendItem(&MAIN.CurrentWindow->PendingOperators, a);
-        a->State = rev;
-        a->PP.EndInstance = a->CustomData;
-    }else
-        la_DestroyOperator(&a, 0, 0);
+    if (la_UiOperatorExists(inst)) return -1;
+    at = hsh256FindItemSTR(&MAIN.OperatorTypeHash, la_OperatorTypeByID, ID); if (!at) return -1;
 
-    return rev;
+    return laInvokeUiP(From,at,e,inst,Locals,IgnoreLocals);
 }
+
 void laRequestDelayEvent(real Seconds){
     MAIN.DelayTriggered=0; MAIN.DelayStart=MAIN.TimeAccum; MAIN.DelayTime = Seconds; }
 

+ 0 - 1
la_resource.c

@@ -98,7 +98,6 @@ void la_RegisterMainThemes(){
 "hello(){\n"
 "    world!\n"
 "    This is a LaGUI application 🤔\n"
-"    Now with monospace font support :D\n    And when mixing characters, advances would be correct.\n"
 "}");
 
     la_UDFAppendSharedTypePointer("BT Panel", &_LA_THEME_PANEL);

+ 1 - 1
la_tns.h

@@ -972,7 +972,7 @@ void tnsVectorCopy3d(tnsVector3d from, tnsVector3d to);
 void tnsVectorCopy4d(tnsVector4d from, tnsVector4d to);
 void tnsVectorMultiSelf4d(tnsVector4d from, real num);
 void tnsVectorMultiSelf3d(tnsVector3d from, real num);
-void tnsVectorMultiSelf2d(tnsVector3d from, real num);
+void tnsVectorMultiSelf2d(tnsVector2d from, real num);
 void tnsVectorMulti4d(tnsVector4d to, tnsVector4d from, real num);
 void tnsVectorMulti3d(tnsVector3d to, tnsVector3d from, real num);
 void tnsVectorMulti2d(tnsVector2d to, tnsVector2d from, real num);

+ 2 - 8
resources/la_operators.c

@@ -843,14 +843,8 @@ int laget_NewPanelGetActiveTemplate(laNewPanelData* np, laUiTemplate* uit){
     return np->SelectedTemplate;
 }
 void laui_PanelTemplateSelect(laUiList *uil, laPropPack *This, laPropPack *OperatorProps, laColumn *UNUSED, int context){
-    laColumn *c;
-    laProp *p, *gp;
-
-    c = laFirstColumn(uil);
-
-    gp = OperatorProps->LastPs->p;
-    
-    laShowItem(uil, c, OperatorProps, "template")->SymbolID=2;
+    laColumn *c = laFirstColumn(uil);
+    laUiItem* ui=laShowItem(uil, c, OperatorProps, "template");ui->SymbolID=2; ui->Flags|=LA_UI_FLAGS_NO_DECAL;
 }
 
 int OPINV_NewLayout(laOperator *a, laEvent *e){

+ 6 - 0
resources/la_properties.c

@@ -407,6 +407,9 @@ void *laget_CanvasExtra(laUiItem *ui){
     return 0;
 }
 
+void laget_UnknownPropertyString(laUDF *udf, char *result, char** here){
+    *here="Unknown Property";
+}
 void laget_MainIdentifier(laUDF *udf, char *result, char** here){
     strcpy(result, "MAIN");
 }
@@ -921,6 +924,9 @@ void la_RegisterInternalProps(){
             
             laAddIntProperty(p, "example_int", "Example Integer", "Example integer", 0, 0, 0, 100, 0, 1, 50, 0, offsetof(LA, example_int), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
             laAddStringProperty(p, "example_string", "Example String", "Example string", 0, 0, 0, 0, 1, offsetof(LA,example_string), 0, 0, 0, 0, 0);
+            laAddStringProperty(p, "unknown_prop", "Unknown Property", "Placeholder for unknown property, probably due to a wrong property path, or not setting LA_AS_IDENTIFIER in any of the properties.",
+                LA_WIDGET_STRING_PLAIN, 0, 0, 0, 0, 0, 0, laget_UnknownPropertyString, 0, 0, LA_READ_ONLY);
+        
         }
 
         p = laAddPropertyContainer("la_node_category", "Node Category", "Node category", 0, laui_IdentifierOnly, sizeof(laNodeCategory), 0, 0, 1);{

+ 3 - 3
resources/la_templates.c

@@ -229,9 +229,9 @@ void laui_SubPropInfoDefault(laUiList *uil, laPropPack *Base, laPropPack *Operat
             b1 = laOnConditionToggle(uil, crrl, 0, 0, 0, 0, 0);{ b1->Flags|=LA_TEXT_ALIGN_LEFT;
                 sprintf(buf, "text=...%s;", p->Name);
                 strSafeSet(&b1->ExtraInstructions, buf);
-                laUiDefineFunc f=((laSubProp*)p)->GetType?0:
-                    (p->UiDefine?p->UiDefine:(p->SubProp&&p->SubProp->UiDefine?p->SubProp->UiDefine:laui_SubPropInfoDefault));
-                laShowItemFull(uil, cr, Base, p->Identifier, 0,0, f, 0);
+                laUiDefineFunc f=laui_SubPropInfoDefault;
+                if(!context) f=((laSubProp*)p)->GetType?0:(p->UiDefine?p->UiDefine:(p->SubProp&&p->SubProp->UiDefine?p->SubProp->UiDefine:laui_SubPropInfoDefault));
+                laShowItemFull(uil, cr, Base, p->Identifier, 0,0, f, context);
             }
             laEndCondition(uil, b1);
             laShowSeparator(uil, c);

+ 7 - 4
resources/la_widgets.c

@@ -915,7 +915,8 @@ void la_MultiStringDraw(laUiItem *ui, int h){
     while(Count){ Count/=10; NumberWidth+=MonoWidth; }
 
     if (ui->State!=LA_UI_ACTIVE){
-        strSetEditViewRange(ui->Extra->Edit,ui->Extra->HeightCoeff,(ui->R-ui->L-NumberWidth-bt->LM*2-bt->RM)/MonoWidth);
+        strSetEditViewRange(ui->Extra->Edit,
+            ui->Extra->HeightCoeff>0?ui->Extra->HeightCoeff:((ui->B-ui->U)/LA_RH),(ui->R-ui->L-NumberWidth-bt->LM*2-bt->RM)/MonoWidth);
     }
 
     if(!NoDecal){
@@ -1621,8 +1622,6 @@ int la_ProcessTextEdit(laEvent *e, laStringEdit *se, laUiItem* ui){
         case LA_KEY_ARRDOWN: strMoveCursorLine(se, 0, Select); return 1;
         }
         break;
-    case LA_MOUSE_WHEEL_DOWN: strMoveView(se, MAIN.ScrollingSpeed, 0); return 1;
-    case LA_MOUSE_WHEEL_UP: strMoveView(se, -MAIN.ScrollingSpeed, 0); return 1;
     case LA_L_MOUSE_DOWN:
     case LA_MOUSEMOVE:
         if(!ui) return 0;
@@ -2349,7 +2348,8 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
 void la_SetMultistringViewRange(laUiItem* ui, laStringEdit* se, laBoxedTheme* bt){
     int NumberWidth=0; int MonoWidth=tnsGetMonoFontAdvance(); int Count=se->TotalLines;
     while(Count){ Count/=10; NumberWidth+=MonoWidth; }
-    strSetEditViewRange(ui->Extra->Edit,ui->Extra->HeightCoeff,(ui->R-ui->L-NumberWidth-bt->LM*2-bt->RM)/MonoWidth);
+    strSetEditViewRange(ui->Extra->Edit,
+        ui->Extra->HeightCoeff>0?ui->Extra->HeightCoeff:((ui->B-ui->U)/LA_RH),(ui->R-ui->L-NumberWidth-bt->LM*2-bt->RM)/MonoWidth);
 }
 int OPMOD_MultiString(laOperator *a, laEvent *e){
     laUiItem *ui = a->Instance;
@@ -2411,6 +2411,9 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
         if (la_ProcessTextEdit(e, se, ui)) return LA_RUNNING;
     }
 
+    if(e->Type==LA_MOUSE_WHEEL_DOWN){ strMoveView(se, MAIN.ScrollingSpeed, 0); laRedrawCurrentPanel(); return LA_RUNNING; }
+    elif(e->Type==LA_MOUSE_WHEEL_UP){ strMoveView(se, -MAIN.ScrollingSpeed, 0); laRedrawCurrentPanel(); return LA_RUNNING; }
+
     if (e->Type == LA_L_MOUSE_DOWN){
         if (ui->State == LA_UI_NORMAL){
             ui->State = LA_UI_ACTIVE;