Dialog basics

From Scriptwiki
Revision as of 01:11, 10 November 2008 by Daveoh (talk | contribs) (tabs + radio button groups)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Basic dialog commands and switches

/dialog -mdtsonkcvie name [table] [x y w h] [text]
Where name is the name by which you'll refer to the dialog, and table is the dialog table name used to create dialog

 -m	create a modeless dialog using 'table' /dialog -m name table
 -a	used with -m, uses currently  active window as the parent
 -x	close a dialog without triggering any events
 -d	open dialog on the desktop, used with -m
 -h	make dialog work with active server connection
 -t	set dialog title /dialog -t name text
 -s	set dialog size/pos /dialog -s name x y w h
 -r	centers dialog
 -bp	interprets size as dbu or pixels
 -o	set dialog ontop of all windows
 -n	unset ontop setting
 -k	click ok button
 -c	click cancel button
 -v	makes the dialog the active window
 -ie	minimize/restore the dialog if created on the desktop
 -g	renames existing dialog using <name> <newname>

The dialog table
You can use the dialog prefix to create a dialog table called name in a script using this format:

dialog [-l] name {
 title		"text"
 icon		filename, index
 size		x y w h
 option	type (dbu, pixels, notheme)
 
 text		"text", id, x y w h, style  (right, center, nowrap)
 edit		"text", id, x y w h, style  (right, center, multi, pass, read, return, hsbar, vsbar, autohs, autovs, limit N)
 button	"text", id, x y w h, style  (default, ok, cancel, flat, multi)
 check		"text", id, x y w h, style  (left, push, 3state)
 radio		"text", id, x y w h, style  (left, push, group)
 box		"text", id, x y w h, style
 scroll	"text", id, x y w h, style (top left bottom right horizontal range N N)
 
 list		id, x y w h, style          (sort, extsel, multsel, size, vsbar, hsbar, check, radio)
 combo		id, x y w h, style          (sort, edit, drop, size, vsbar, hsbar)
 
 icon		id, x y w h, filename, index, style    (noborder top left bottom right small large actual)
 
 link		"text", id, x y w h
 
 tab 		"text", id, x y w h
 tab		"text", id
 
 menu		"text", menuid [, menuid]
 item		"text", id [, menuid]
 item		break, id [, menuid]
}

The -l switch makes a dialog table local, so that it can only be accessed by other scripts in the same file.

Dbu vs. Pixels
The dbu option makes mIRC use dialog base units when creating the dialog, this ensures that the dialog will look the same for all users under any size display, etc. Pixels is the default however to maintain compatibility with previous scripts. The identifiers $dbuw and $dbuh return the dbu per pixel width and height values for the current display. This may or may not be an integer value.

Ok and Cancel buttons
You can specify an ok and/or cancel button, and when a user clicks the ok or cancel buttons, the dialog is closed. You can prevent the dialog from closing if a user clicks the ok button by using /halt.

Grouping radio buttons
Radio buttons can be grouped together using the 'group' style, followed by the radio buttons you want in the group without the 'group' style. E.g;

radio "Group 1 Option 1", 1, 10 10 100 20, group
radio "Group 1 Option 2", 2, 10 30 100 20
radio "Group 2 Option 1", 3, 10 50 100 20, group
radio "Group 2 Option 2", 4, 10 70 100 20

The above would create two radio button groups, each starting where the 'group' style is entered.

Default position and size
If you specify -1 for any of the x y w h values in the size setting for the dialog, a default setting is used. To make mIRC center the dialog in a window, specify x y as -1 -1. The size setting can be over-ridden in the init event (see below) by using /dialog -s name x y w h.


Example

;create a dialog table with name 'dialogtest'
dialog dialogtest {
 
 ;set the titlebar text of the dialog to "testing dialog"
 title "testing dialog"
 
 ;define the position and size of the dialog, x and y set to -1 so the dialog is created to the middle of mirc window, width set to 150 and height to 200 
 size -1 -1 150 200
 
 ;dpu, dialog basic units, so the dialog will be the same size in every resolution
 option dbu
 
 ;a text item that says "Random text", assigning id 1 for the item, x=5, y=10, w=100, h=10, no style
 text "Random text", 1, 5 10 100 10, 
}

;now you can call this dialog by writing: /dialog -m dialogtest dialogtest


A bit more in-depth example

; this dialog will calculate how long it is since/untill a specific day
; alias to open the dialog faster
alias dt { .dialog -m dialogtest dialogtest }

; the dialog table
dialog dialogtest {
  title "Testing"
  size -1 -1 200 200
  option dbu

  ; we'll use 2 tabs here, make them start from x/y -1 and w/h 202 so we'll have nice borders when it goes a bit over
  tab "From ",  1, -1 -1 202 202
  tab "Untill", 2, -1 -1 202 202

  ; 2 boxes for both tabs to create a nice title and frame (note tab1 and tab2 at the end)
  box "Time from date calculator"  , 3, 2 15 195 183, tab1
  box "Time untill date calculator", 4, 2 15 195 183, tab2

  ; the dropdown combo boxes for date/month/year selection, we'll do 2 different boxes for the year selection
  ; one that has past years, and the other one has upcoming years (for different tabs)
  ; this way we don't have to update the one everytime you change the tab
  combo 5, 10 25 20 10, drop
  combo 6, 31 25 20 10, drop
  combo 7, 52 25 24 10, drop tab1
  combo 8, 52 25 24 10, drop tab2

  ; buttons for calcultaing the result and to clear the list
  button "Calculate", 9, 78 24 37 12,
  button "Reset"    , 10, 153 24 37 12,

  ; show the text above the list, and the empty one (ID 12) is there for an error message, empty at the time being
  text "Last calculations:", 11, 12 42 50 20,
  text "", 12, 105 42 100 8,

  ; then the lists to store earlier calculations, 1 for each tab
  list 13, 10 50 180 80, sort tab1
  list 14, 10 50 180 80, sort tab2
}

; the init event, this event triggers every time the dialog opens, so here we will fill those controls
on *:dialog:dialogtest:init:0:{
  ; 2 first ones loops through days/months and adds them into dropdown combos
  var %x = 1 | while (%x <= 31) { did -a $dname 5 %x | inc %x }
  var %x = 1 | while (%x <= 12) { did -a $dname 6 %x | inc %x }

  ; these two are for the year selection, first starts from "this year -10 years", and is shown in the 1st tab
  ; second one starts from this year and goes 10 years forward, this is for the second tab
  var %x = $calc($asctime(yyyy) -10) | while (%x <= $asctime(yyyy)) { did -a $dname 7 %x | inc %x }
  var %x = $asctime(yyyy) | while (%x <= $calc($asctime(yyyy) +10)) { did -a $dname 8 %x | inc %x }
}

; sclick event for the "Calculate" button
on *:dialog:dialogtest:sclick:9:{ 
  ; we'll use these variables for the sake of clarity
  ; so %day, %month, %year to implode into %date ($base for zeropadding 5 -> 05 etc.)
  var %day = $base($did($dname,5),10,10,2)
  var %month = $base($did($dname,6),10,10,2)
  var %year = $did($dname,$iif($dialog($dname).tab == 1,7,8))
  var %date = $+(%year,-,%month,-,%day) 

  ; from $dialog().tab we'll see which tab is active, and choose the right list ID by that
  var %target = $iif($dialog($dname).tab == 1,13,14)

  ; again check the tab, and calculate the right duration (ctime - %date, or %date - ctime)
  if ($dialog($dname).tab == 1) { var %duration = - $duration($calc($ctime - $ctime(%date))) }
  else { var %duration = + $duration($calc($ctime(%date) - $ctime)) }

  ; check for errors, if day/month/year is empty (not inputted), or if the calculation returns a negative number
  if ($mid(%duration,3,1) == -) || (!%day) || (!%month) || (!%year) { 
    ; so we have an error, show it in the empty text field we created, and use timer to clear it after 4 seconds (/did -r)
    did -a $dname 12 Parameters missing, or wrong date
    .timerClearError 1 4 did -r $dname 12
    halt 
  }

  ; no errors if we're here, so, just show the result in %target ID in the form of "yyyy-mm-dd + 3days"
  did -a $dname %target %date %duration
}

; sclick event for the reset button
on *:dialog:dialogtest:sclick:10:{ 
  did -r $dname $iif($dialog($dname).tab == 1,13,14)
}

; dclick event just for echoing a line from the list, when you double click it
on *:dialog:dialogtest:dclick:13,14:{ 
  echo -ag $did($dname,$did,1).seltext
}