Eagle ULP: dlgComboBox breedte

fatbeard

Honourable Member

In mijn DXF importer heb ik een combobox voor de doel-layer selectie.
Standaard staan er in de lijst alleen de zichtbare layers, maar met een checkbox kun je alle (legale) layers laten zien.
De breedte van die checkbox aangepast aan de te tonen lijst, dus het wijzigen van het vinkje kan de breedte ervan beïnvloeden.
Op zich handig, maar de layout van de GUI raakt erdoor verstoord; de combobox gaat de checkbox overlappen:

Ik kan de maximale lengte van de te tonen lijst prima bepalen nog voordat de GUI wordt opgebouwd.

Vandaar de vraag: kan ik een vaste/specifieke breedte van een combobox afdwingen en zo ja, hoe?

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.
fripster

Golden Member

hoi. Normaliter kun je in programmeertalen de Width property van een ComboBox gewoon in code instellen. Iets van MijnComboBox1.width = 100; of zoiets. Ik ken de ULP taal niet zo. Kon het ook niet zo snel op internet vinden. Wel dat er bekende issues zijn met Eagle combobox breedtes.

Edit: Je zou ook de property 'Left' van de checkbox mee kunnen laten afhangen van de breedte van de ComboBox.... Dat is net zo simpel.

Hope this helps.

Fripster

[Bericht gewijzigd door fripster op zondag 27 december 2020 16:17:50 (18%)

Eens een wirehead,altijd een wirehead.... gopher://fripster.ydns.eu

Kun je niet in je ulp ,de parameter dlgStretch( ) een andere waarde geven?

fatbeard

Honourable Member

@fripster
ULP = user language program, een C dialect wat alleen door Eagle wordt gebruikt; comboboxes en checkboxes hebben daar geen properties :(

@Gij Kieken
dlgStretch is een functie die voor een variabele ruimte zorgt, de waarde die je meegeeft (factor) is alleen slecht bedocumenteerd. Voorzover ik heb gemerkt is die alleen nuttig als je meerdere stretches gebruikt binnen hetzelfde layoutblok, hij geeft dan de verhouding aan.
Bijvoorbeeld

code:

dlgHBoxLayout
{ dlgStretch(2);
  dlgLabel("text");
  dlgStretch(1);
}

laat links tweemaal zoveel ruimte als rechts...

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

hoe bouw je nu de GUI op? gebruik je een H/VBOX of Grid-layout?
of zet je de elementen op pixelbasis neer?

als laatste optie kun je gewoon de tektst afkappen, gewoon if strlen>10 dan kap af na 10:

It is also perfectly ok to "cut off" part of a string by "punching" a zero character into it:
string s = "abcde";
s[3] = 0;
This will result in s having the value "abc".

http://web.mit.edu/xavid/arch/i386_rhel4/help/158.htm

dan wel een "beletselteken" toevoegen:
https://nl.wikipedia.org/wiki/Beletselteken

[Bericht gewijzigd door Progger op zondag 27 december 2020 17:20:16 (15%)

GMT+1

Dan moet je <include hidden> wat opschuiven en proberen te lijnen met de rest van je GUI voor het wat proper te laten lijken.

fatbeard

Honourable Member

Ik gebruik een dlgGridLayout:

code:

    dlgGroup("select where and how to import into this " + W)
    { //dlgStretch(1);        // align bottom
      dlgGridLayout
      { if(Editor == "SYM" || Editor == "PAC")
        { dlgCell(0,0) dlgLabel("<p align=right>destination</p>");
          dlgCell(0,1) dlgComboBox(Destinations, Destination);
          W = "<p align=right>on layer</p>";
        } 
        else W = "<p align=right>layer</p>";
        dlgCell(1,0) dlgLabel(W);
        dlgCell(1,1) dlgComboBox(EagleLayers, Layer) AutoConfirm = FALSE;
        dlgCell(1,2,1,3) dlgCheckBox("include\nhidden",C_incHiddenEagle) find_layers();
        dlgCell(2,0) dlgLabel("<p align=right>line width</p>");
        dlgCell(2,1) dlgRealEdit(linewidth);
        dlgCell(2,2,2,3)
        { dlgComboBox(EagleUnits,EagleUnit)
          { NYI("Eagle units");EagleUnit=0;
            switch(EagleUnit)
            { case 0: Eunit = "micron"; resolution = 0; break;
              case 1: Eunit = "mm"; resolution = 2; break;
              case 2: Eunit = "mil"; resolution = 1; break;
              case 3: Eunit = "inch"; resolution = 3; break;
            }
          }
          dlgStretch(1);
        }
        dlgCell(3,0) dlgLabel("<p align=right>X offset</p>");
        dlgCell(3,1) dlgRealEdit(Xorg);
        dlgCell(3,2) dlgLabel(Eunit,1);
        dlgCell(4,0) dlgLabel("<p align=right>Y offset</p>");
        dlgCell(4,1) dlgRealEdit(Yorg);
        dlgCell(4,2) dlgLabel(Eunit,1);
        dlgCell(3,3,4,3)
        { dlgGroup("center")
          { dlgHBoxLayout
            { dlgStretch(1);
              dlgCheckBox ("",C_CenterDXF)
              { doDXF();
                CenterDXF();
              }
            }
          }
          dlgStretch(1);    // align left
        }
        dlgCell(5,0) dlgLabel("<p align=right>Scale</p>");
        dlgCell(5,1)
        { dlgRealEdit(scale);
          CF=ConversionFactor(scale);
        }
        dlgCell(6,0,6,3)
        { dlgLabel("resolution\n(microns)");
          dlgRadioButton("0.1", resolution);
          dlgRadioButton("1", resolution);
          dlgRadioButton("10", resolution);
          dlgRadioButton("100", resolution);
          dlgStretch(1);
        } // Cell
      } // Grid
    } // Group "EXPORT"
Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Als je wat googeld met deze lijn ,
dlgCell(1,2,1,3) dlgCheckBox("include\nhidden",C_incHiddenEagle) find_layers();
Kun je de checkbox en bijhorende tekst verplaatsen.

fatbeard

Honourable Member

Op 27 december 2020 18:13:23 schreef Gij Kieken:
Als je wat googeld met deze lijn ,
dlgCell(1,2,1,3) dlgCheckBox("include\nhidden",C_incHiddenEagle) find_layers();
Kun je de checkbox en bijhorende tekst verplaatsen.

Dat is me bekend (ik heb het programma zelf geschreven), het onderliggende probleem (dat van dynamische inhoud en dus dynamische breedte van de combobox) wordt er echter niet mee opgelost: als ik de checkbox en tekst verplaats zodat het er bij de 'lange' combobox goed uitziet zal het er bij de 'korte' combobox lang niet meer zo goed uitzien...
Plus dat ik dan ook de andere elementen moet gaan verplaatsen (dus een nieuwe GUI moet ontwerpen).

Misschien ontkom ik daar toch niet aan, maar als het ff te vermijden is...

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Wat is dan wel de max breedte dewelke je nodig hebt?
Verplaats include/hidden naar boven of eronder.
Anders proberen de dynamische gegevens procustion method af te kappen.
Maar ahja dat had jezelf al uitgevogeld.

[Bericht gewijzigd door Gij Kieken op zondag 27 december 2020 20:11:46 (11%)

fatbeard

Honourable Member

De maximum breedte wordt gedicteerd door de layerlist van het ontwerp wat in bewerking is, daar valt op voorhand erg weinig over te zeggen. Het is namelijk ook perfect mogelijk dat er geen verschil is in breedte tussen de volledige lijst en de 'zichtbare' lijst...
De volledige lijst is dus minstens net zo breed als de 'zichtbare' lijst, maar waarschijnlijk breder.

De checkbox erboven is onlogisch, eronder ziet er niet uit (heb ik geprobeerd) en de gegevens afkappen (met of zonder beletselteken) is niet erg gebruiksvriendelijk.

Ondertussen (uiteraard zit ik intussen niet stil) heb ik een mogelijke workaround gevonden: starten met het vinkje aan, dus maximale breedte. De combobox blijkt niet te krimpen als het vinkje dan wordt uitgezet, dus de layout springt niet meer.
Is niet ideaal, maar werkbaar.

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.