GtkDialog - tips

For discussions about programming, programming questions/advice, and projects that don't really have anything to do with Puppy.
Message
Author
User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#641 Post by technosaurus »

There is a simple progress bar example in /usr/share/doc/gtkdialog3 (in the devx)
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
SFR
Posts: 1800
Joined: Wed 26 Oct 2011, 21:52

Variable/Function as button's label?

#642 Post by SFR »

Hi

Is it possible to show variable or function's result as a button's label (<button></button>)?
I tried with <input>, <input file...>, <label> and nothing works...

Thanks in advance.

Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]

seaside
Posts: 934
Joined: Thu 12 Apr 2007, 00:19

Re: Variable/Function as button's label?

#643 Post by seaside »

SFR wrote:Hi

Is it possible to show variable or function's result as a button's label (<button></button>)?
I tried with <input>, <input file...>, <label> and nothing works...

Thanks in advance.

Greetings!
SFR,

Perhaps this is what you want-

Code: Select all

#! /bin/bash
LABEL=`echo result of some program`
export MAIN_DIALOG='
     <button>
      <label>'"$LABEL"'</label>
      <action>echo new label '"$LABEL"' created</action>
    </button>
  
'

gtkdialog3 --program=MAIN_DIALOG 
This would take the result of some program (in this case the phrase "result of some program") and assign it to the variable LABEL. Note that $LABEL is surrounded by double quotes followed by outer single quotes.

Cheers,
s

User avatar
SFR
Posts: 1800
Joined: Wed 26 Oct 2011, 21:52

Re: Variable/Function as button's label?

#644 Post by SFR »

seaside wrote:Perhaps this is what you want-

Code: Select all

#! /bin/bash
LABEL=`echo result of some program`
export MAIN_DIALOG='
     <button>
      <label>'"$LABEL"'</label>
      <action>echo new label '"$LABEL"' created</action>
    </button>
  
'

gtkdialog3 --program=MAIN_DIALOG 
This would take the result of some program (in this case the phrase "result of some program") and assign it to the variable LABEL. Note that $LABEL is surrounded by double quotes followed by outer single quotes.
This is exactly it, thanks very much!
I was stuck focusing myself on functions, your method is much easier. :)

Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]

User avatar
01micko
Posts: 8741
Joined: Sat 11 Oct 2008, 13:39
Location: qld
Contact:

timer example

#645 Post by 01micko »

This is a simplified timer widget example. The timer widget is not visible.

Requires gtkdialog >= 0.8.0 (you may need to change the call to "gtkdialog4" in wary/racy/lupu)

Thanks to technosaurus for the text2svg function. (@ techno, the header is needed to stop gtkdialog and other gtk apps from segfaulting, coutesy of thunor).

Code: Select all

#!/bin/bash
# timertest

# Functions====================================================================
text2svg()
{
#generate an image
WIDTH=$(($(echo "$1"|wc -c)*19))
T=35
BG="$2"
echo '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <rect width="'$WIDTH'"
     height="50"
     x="0"
     y="0"
     style="font-size:'${T}';fill:'$BG';fill-opacity:0.75;fill-rule:evenodd;stroke-width:3pt;"
     id="rect1" />
  <text
     x="0"
     y="35"
     style="font-size:'${T}';font-weight:normal;fill-opacity:0.75;stroke-width:3pt;font-family:helvetica;"
     id="text1">
    <tspan
       id="tspan1">'"${1}"'</tspan>
  </text>
</svg>' > /tmp/${3}.svg
}
export -f text2svg

randomfunc(){
echo "some random number $RANDOM"
}
export -f randomfunc

pixfunc(){
DATE=`date`	
text2svg "${DATE}" "#ADD8E6" date
	}
export -f pixfunc

btnfunc(){
TXT=`cat /tmp/timerfile`
case $TXT in
the)echo quick >/tmp/timerfile;text2svg quick "#0000FF" label ;;
quick)echo brown >/tmp/timerfile;text2svg brown "#00FFFF" label ;;
brown)echo fox >/tmp/timerfile;text2svg fox "#FF0000" label ;;
fox)echo jumped >/tmp/timerfile;text2svg jumped "#00FF00" label ;;
jumped)echo over >/tmp/timerfile;text2svg over "#FFFF00" label ;;
over)echo a >/tmp/timerfile;text2svg a "#FF00FF" label ;;
a)echo lazy >/tmp/timerfile;text2svg lazy "#FF9500" label ;;
lazy)echo dog >/tmp/timerfile;text2svg dog "#FF00AA" label ;;
dog)echo the >/tmp/timerfile;text2svg the "#FFFFFF" label ;;
esac
}
export -f btnfunc
#==============================================================================

echo dog >/tmp/timerfile
pixfunc
btnfunc

export gui='<window>
 <vbox>
  <text><label>timer test</label></text>
  <pixmap>
    <variable>PIX</variable>
    <input file>/tmp/date.svg</input>
  </pixmap> 
  <hbox homogeneous="true">  
   <button tooltip-text="exit">
    <variable>BTX</variable>
    <input file>/tmp/label.svg</input>
   </button>
  </hbox>
  <text><variable>VAR</variable><input>date +%T</input></text>
  <text><variable>RANDNUM</variable><input>randomfunc</input></text>
  <entry><variable>ENTRY</variable><input>echo $RANDOM is random too</input></entry>
  <timer interval="1" visible="false">
    <action>pixfunc</action>
    <action>btnfunc</action>
    <action type="refresh">PIX</action>
    <action type="refresh">BTX</action>
    <action type="refresh">VAR</action>
    <action type="refresh">RANDNUM</action>
    <action type="refresh">ENTRY</action>
  </timer> 
  <hbox>
   <button ok></button>
  </hbox>
 </vbox>
</window>'
eval $(gtkdialog -p gui)
case $EXIT in
*)rm -f /tmp/*.svg ;;
esac

Puppy Linux Blog - contact me for access

User avatar
technosaurus
Posts: 4853
Joined: Mon 19 May 2008, 01:24
Location: Blue Springs, MO
Contact:

#646 Post by technosaurus »

It often comes up how to get wget to give you the percent complete (for progress bars), so I grokked it out to work with Xdialog (I am working on some gtk1 stuff right now) - perhaps someone would like to tweak it for gtkdialog?

Code: Select all

download_progress(){
while ([ $# -gt 0 ]) do
	wget -v $1 -o /dev/stdout | while read LINE; do
		case $LINE in
			*%*)LINE=${LINE##*..};echo ${LINE%%%*};;
		esac
	done |Xdialog --gauge "Download progress ($# files remaining.)
Current file is:
$1" 0 0
	shift
done
}
and here is one for curl:
{export your CURL_PARAMETERS first}

Code: Select all

upload_progress(){
curl --progress-bar $CURL_PARAMETERS 2>&1 \
| tr "\r" "\n"|sed "s,# *,,gm" \
| Xdialog --title "Progress" --gauge "$1 \n transfering ..." 0 0
}
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].

User avatar
Dougal
Posts: 2502
Joined: Wed 19 Oct 2005, 13:06
Location: Hell more grotesque than any medieval woodcut

#647 Post by Dougal »

technosaurus wrote:It often comes up how to get wget to give you the percent complete (for progress bars), so I grokked it out to work with Xdialog (I am working on some gtk1 stuff right now) - perhaps someone would like to tweak it for gtkdialog?
Gtkdialog enables you to run a shell inside the progressbar element, so you can just sort the wget output inside it... that's what I did with the dhcpcd progressbars (note that with gtkdialog, when you echo a number, it is used for the percentage, while echoing text changes what's displayed in the progressbar).
What's the ugliest part of your body?
Some say your nose
Some say your toes
But I think it's your mind

jpeps
Posts: 3179
Joined: Sat 31 May 2008, 19:00

#648 Post by jpeps »

Here's one solution to a combo-checklist. I was looking for a simple way to create a useable array for the whole checklist.

Code: Select all

#!/bin/sh

#Combo-Checklist example

export NUM="5"
 function funcChkCreate() {
 
 for ((i=1;i<"$NUM";i++)); do
    echo '<checkbox>
      <label>NAME '"$i"'</label>
      <variable>STAT'"$i"'</variable>
     </checkbox>'
 done
    
  }
ComboCheck() {

echo
for ((i=1;i<"$NUM";i++)); do
eval echo "NAME ${i}=""\$STAT${i}" >/tmp/out
var[$i]=`cat /tmp/out`
echo "${var[$i]}"
  done
 
}
export -f ComboCheck

export MAIN_DIALOG='

<vbox height="150" scrollable="true">
'"$(funcChkCreate)"'
<hbox>
<button>
  <label>ComboCheck</label>
  <action>ComboCheck</action>
</button>
<button ok></button>
</hbox>
</vbox>
'
gtkdialog --program=MAIN_DIALOG

User avatar
RSH
Posts: 2397
Joined: Mon 05 Sep 2011, 14:21
Location: Germany

#649 Post by RSH »

jpeps wrote:Here's one solution to a combo-checklist. I was looking for a simple way to create a useable array for the whole checklist.
Hi.

I think it would be more comfortable to have the buttons outside the scrollable section.

Code: Select all

#!/bin/sh

#Combo-Checklist example

export NUM="15"
 function funcChkCreate() {
 
 for ((i=1;i<"$NUM";i++)); do
    echo '<checkbox>
      <label>NAME '"$i"'</label>
      <variable>STAT'"$i"'</variable>
     </checkbox>'
 done
   
  }
ComboCheck() {

echo
for ((i=1;i<"$NUM";i++)); do
eval echo "NAME ${i}=""\$STAT${i}" >/tmp/out
var[$i]=`cat /tmp/out`
echo "${var[$i]}"
  done
 
}
export -f ComboCheck

export MAIN_DIALOG='
<vbox>
<vbox height="150" scrollable="true">
'"$(funcChkCreate)"'
</vbox>
<vbox>
<hbox>
<button>
  <label>ComboCheck</label>
  <action>ComboCheck</action>
</button>
<button ok></button>
</hbox>
</vbox>
</vbox>'
gtkdialog --program=MAIN_DIALOG
Attachments
combocheck-buttoons-outside.jpg
(10.49 KiB) Downloaded 1197 times
[b][url=http://lazy-puppy.weebly.com]LazY Puppy[/url][/b]
[b][url=http://rshs-dna.weebly.com]RSH's DNA[/url][/b]
[url=http://murga-linux.com/puppy/viewtopic.php?t=91422][b]SARA B.[/b][/url]

jpeps
Posts: 3179
Joined: Sat 31 May 2008, 19:00

#650 Post by jpeps »

Good idea, RSH. I just incorporated that into gnewpet.

User avatar
RSH
Posts: 2397
Joined: Mon 05 Sep 2011, 14:21
Location: Germany

#651 Post by RSH »

I did play a little with that script, to understand how it works. Something has made me a little disturbed.

By giving 5 as NUM i always get only 4 arguments back.

I think it is because of

Code: Select all

for ((i=1;i<"$NUM";i++)); do
This one: i<"$NUM means - smaller as $NUM, but 5 is not smaller as $NUM.

So i-1<"$NUM works well and gives back 5 arguments.

In PASCAL i would write i<=$NUM, but i don't know the correct syntax in bash to use <=$NUM.

I do know:

equals = if a = b - and
unequals = if a != b

How do i write in bash a <= b ?
[b][url=http://lazy-puppy.weebly.com]LazY Puppy[/url][/b]
[b][url=http://rshs-dna.weebly.com]RSH's DNA[/url][/b]
[url=http://murga-linux.com/puppy/viewtopic.php?t=91422][b]SARA B.[/b][/url]

jpeps
Posts: 3179
Joined: Sat 31 May 2008, 19:00

#652 Post by jpeps »

RSH wrote: By giving 5 as NUM i always get only 4 arguments back.
Typically, you start with i=0. This is just a template, so NUM is irrelevant. In practice, the labels would be names from a list with NUM being the number of lines.

User avatar
SFR
Posts: 1800
Joined: Wed 26 Oct 2011, 21:52

How to handle a variable inside 'edit' field?

#653 Post by SFR »

How to handle a variable inside <edit>'s <default></default> or <input></input> tags?

I wrote simple encryption tool that operates on temporary files, but it should be done on variables, for security reasons.
Anyway, as an example, let's say I have:

Code: Select all

#! /bin/sh

message="Something"

change () {
message="Completely different something"
echo $message		# for debugging
}
export -f change

export MAIN='
  <vbox>
    <edit>
      <variable>VAR</variable>
      <default>'"$message"'</default>
    </edit>
    <button>
      <action>change</action>
      <action>refresh:VAR</action>
      <label>Refresh</label>
    </button>
  </vbox>
'
gtkdialog -p MAIN
echo $message		#for debugging also
...and it doesn't work, 'edit' field isn't refreshed at all.
Also, tried for 256 ways to put a variable between <input></input> tags - unsuccessfully.
The odd thing is that when I press "Refresh" button, the 'message' variable is changed (first 'echo'), but on exit it returns to its previous state (second 'echo').
AFAIK variables in Bash are global by default..?

How can I do it and is it possible at all?

TIA & Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]

User avatar
don570
Posts: 5528
Joined: Wed 10 Mar 2010, 19:58
Location: Ontario

#654 Post by don570 »

I'm working on an improved bacon recorder and
I used a 'refresh' of a variable successfully. :wink:
The variable SAVEFOLDER was defined earlier in the script.

Code: Select all


<hbox>
<text><label>"Save Folder (path)"</label></text>
 
    <entry tooltip-text=" Folder destination for recording ">
     <input>cat "$WORKDIR/SAVEFOLDER"</input>
     <variable>SAVEFOLDER</variable>
     
    </entry>
<button tooltip-text=" Folder selector ">
     <input file>/usr/local/share/icons/folder-open.png</input>
        <action>Xdialog --title "Choose Directory to save recording" --stdout --no-buttons --no-cancel --dselect /mnt 32 80 > $WORKDIR/SAVEFOLDER</action>      
        <action>refresh:SAVEFOLDER</action>        
    </button>
    <button tooltip-text="Path Examples">
      <input file stock="gtk-info"></input>     
	 <action>info_dialog</action>
</button>
</hbox>


User avatar
SFR
Posts: 1800
Joined: Wed 26 Oct 2011, 21:52

#655 Post by SFR »

Hi don570

You're absolutely right and a variable refresh works fine with <text><label> or <entry><input> (and even with <button><label>!),
but for unknown reason it doesn't want to cooperate with <edit><default> and <edit><input>.
I can use only <input file> to be able to refresh it.

On the other hand I'm new to GTKDialog and it may be some stupid mistake in my code,
but on the other hand again, I tried so many combinations and nothing...
I'm totally confused by this...

Thanks anyway :)

EDIT:
My first example was a bit fuzzy, here's another one where refreshing doesn't work:

Code: Select all

#!/bin/sh

export MAIN='
  <vbox>
    <edit>
      <variable>VAR</variable>  
      <default>'"`date`"'</default>
    </edit> 
    <button>
      <action>refresh:VAR</action>
      <label>Refresh</label>
    </button>
  </vbox>
'
gtkdialog -p MAIN
Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]

seaside
Posts: 934
Joined: Thu 12 Apr 2007, 00:19

#656 Post by seaside »

SFR,

This works -

Code: Select all

export MAIN='
  <vbox>
    <entry>
      <variable>VAR</variable> 
      <input>date</input>
    </entry>
    <button>
      <action>refresh:VAR</action>
      <label>Refresh</label>
    </button>
  </vbox>
'
gtkdialog3 -p MAIN 
Generally, only "<variable>VAR</variable>" variables get set on a "refresh:VAR" command. Variables like "$message" are set once and if a "child process" (such as a function) is begun in an attempt to reset a variable, it isn't visible to the parent (original gtkdialog program).

You'll notice that frequently /tmp files are used to hold variables so that they can be referenced in those cases.

Cheers,
s

User avatar
SFR
Posts: 1800
Joined: Wed 26 Oct 2011, 21:52

#657 Post by SFR »

seaside wrote:This works -

Code: Select all

export MAIN='
  <vbox>
    <entry>
      <variable>VAR</variable> 
      <input>date</input>
    </entry>
    <button>
      <action>refresh:VAR</action>
      <label>Refresh</label>
    </button>
  </vbox>
'
gtkdialog3 -p MAIN 
Yes, this works, but after deeper reflection I think that GTKDialog simply doesn't provide this mechanism in <edit> widget.

entry widget definition:

Code: Select all

<entry tag_attr="value"...>
        <default>text</default>
        <variable>varname</variable>
        <height>value</height>
        <width>value</width>
        <input>command</input>
        <input file>filename</input>
        <sensitive>state</sensitive>
        <action>activity</action>...
        <action signal="type">activity</action>...
        <action type="function">parameter</action>...
        <output file>filename</output>
</entry>
There are <input file> AND <input> directives available. All right.

edit widget definition:

Code: Select all

<edit tag_attr="value"...>
        <default>state</default>
        <variable>varname</variable>
        <height>value</height>
        <width>value</width>
        <input file>filename</input>
        <sensitive>state</sensitive>
        <action signal="type">activity</action>...
        <output file>filename</output>
</edit>
There's ONLY <input file> directive...

But nevermind - I can use 'shred' to delete temp files in a secure way. :twisted:
seaside wrote:Generally, only "<variable>VAR</variable>" variables get set on a "refresh:VAR" command. Variables like "$message" are set once and if a "child process" (such as a function) is begun in an attempt to reset a variable, it isn't visible to the parent (original gtkdialog program).

You'll notice that frequently /tmp files are used to hold variables so that they can be referenced in those cases.
Thanks for clarification, I suspected something like that, but wasn't sure how exactly it works. :)

Thanks again to all of you & Greetings
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]

User avatar
zigbert
Posts: 6621
Joined: Wed 29 Mar 2006, 18:13
Location: Valåmoen, Norway
Contact:

#658 Post by zigbert »

I will explain the new event-handling in Pmusic 2.4.0. It is a smarter way to update gui on non-user-actions. User-actions is mouse-clicks and key-entries, and is the common way to interact between user and gui. An example of updating the gui on a non-user-action in Pmusic is the loading of id3-tags for files shown in the file-browser....

When clicking on a directory, the browser field refreshes and shows the content of the new directory. Now, Pmusic continues with a background process to read the id3 information of the files. When finished, the browser field should be updated by the new info. - Without the user to click anywhere.

The solution is to either use a <progressbar> which runs its <action> when reaches 100% or a <timer> which acts at a given interval. Older Pmusic releases used the <progressbar> solution while recent code uses a <timer>. Both solutions has the downside that they uses an amount of cpu power. In a complex gui with several non-user actions this could end up with several cpu-hungry <timers> updating their unique widget(s) of the gui.

Pmusic has used 2 <timers> running constantly to update their defined gui-part. You might think that 1 <timer> would be enough, - it could refresh all wanted widgets - it wouldn't harm if the refreshing didn't change anything. BUT, refreshing has an effect on the focus handling. It simply resets the focus, which means that:
- scrolling in <table> is moved to top.
- what you are about to write in an <entry> is cleared.
- Your selected item in the <tree> is not selected anymore
- ...

The idea of Pmusic 2.4.0 was to update all kinds of trackinfo (meta-tags, lyrics, albumart, discography, ...) when a new track starts playing. This would not be possible with the underlaying event-handling in Pmusic because it would either suck you cpu-power (with several <timers>), or a global refreshing would make it impossible to be a user (because of focus issues). Also, there is a fact that too many refreshing <action> on a <timer> will increase cpu-usage as well.

So the solution has been to add ONE <timer>, which refreshes a small set of <checkboxes> that (if true) refreshes a single or group of widgets.

<checkboxes> can be set true or false by their <input file>, so we can simply 'echo true' to its <input file>. The <timer> runs its <actions> each second, and the <checkbox> will be refreshed by its <input file>. The code could look like this:

Code: Select all

<checkbox visible="false">
 <label>a</label>
 <variable>UPDATE_GUI</variable>
 <input>cat /path/UPDATE_GUI</input>
 <action>if true refresh:PLAYLIST</action>
 <action>if true refresh:ARTWORK</action>
 <action>if true refresh:BUTTON_PLAY</action>
 <action>if true echo false > /path/UPDATE_GUI</action>
 <action>if true refresh:UPDATE_GUI</action>
</checkbox>
All actions will run only if value is true. To avoid more than one refreshing we reset <input file> and the <checkbox> value to false. Now it will be silent until next time we 'echo true > inputfile'.

jpeps
Posts: 3179
Joined: Sat 31 May 2008, 19:00

#659 Post by jpeps »

Wouldn't it be posible to eliminate the timer altogether? If something like a new track gets played, an input file gets flagged and the checkbox gets refreshed.

User avatar
zigbert
Posts: 6621
Joined: Wed 29 Mar 2006, 18:13
Location: Valåmoen, Norway
Contact:

#660 Post by zigbert »

jpeps wrote:Wouldn't it be posible to eliminate the timer altogether? If something like a new track gets played, an input file gets flagged and the checkbox gets refreshed.
What will make the checkbox reread the inputfile?

Post Reply