2013-12-24 4 views
-1

Я недавно экспериментировал с программированием Вала. У меня довольно много опыта программирования на других языках, но в последние годы застряли в основном с такими скриптовыми языками, как Python, Tcl и Perl. Меня впечатлил чистый внешний вид элементарной ОС, и именно это заставило меня взглянуть на Валу, и я должен сказать, что мои первые впечатления очень позитивны. Тем не менее, я столкнулся с проблемой программирования Dialog, и я подумал, что более опытные программисты Vala могут помочь. В моей последней тестовой программе я использую подпрограмму на основе диалога, чтобы получить значение (getYesNo), а затем отобразить строку, описывающую это значение, на экран, используя другую процедуру на основе диалога (showDialog). Обе процедуры корректно работают при использовании независимо друг от друга, но при использовании вместе, как описано, событие отображения удерживается до тех пор, пока второй вызов не будет выполнен в процедуру получения значения. Это похоже на ситуацию, когда вызов для «flush_events» будет решаться в Perl или Tcl. Но как я могу справиться с этим в Вала? Или есть способ избежать этого, в первую очередь?Диалоги в Вала

Код:

using Gtk; 
using Posix; 

public class DialogTestWindow: ApplicationWindow { 

    private int RESPONSE; 
    private Toolbar tbMain = new Toolbar(); 
    private ToolButton bAbout = new ToolButton(new Image.from_icon_name 
     ("help-about",IconSize.SMALL_TOOLBAR),null); 
    private ToolButton bDoIt = new ToolButton(new Image.from_icon_name 
     ("media-record",IconSize.SMALL_TOOLBAR),null); 
    private ToolButton bQuit = new ToolButton(new Image.from_icon_name 
     ("application-exit",IconSize.SMALL_TOOLBAR),null); 

    internal DialogTestWindow(DialogTest app) { 
     Object(application: app, title: "DialogTest"); 
     this.window_position = WindowPosition.CENTER; 
     this.set_default_size(720,480); 
// ---- Set up Toolbar ---------------------------------------------------- 
     tbMain.get_style_context().add_class(STYLE_CLASS_PRIMARY_TOOLBAR); 
     bQuit.is_important = true; 
     bQuit.clicked.connect(onQuit); 
     tbMain.add(bQuit); 
     bAbout.is_important = true; 
     bAbout.clicked.connect(onAbout); 
     tbMain.add(bAbout); 
     bDoIt.is_important = true; 
     bDoIt.clicked.connect(onDoIt); 
     tbMain.add(bDoIt); 
// ---- Pack Toolbar etc into vBox on main window ------------------------- 
     Box vbMain = new Box(Orientation.VERTICAL,0); 
     vbMain.pack_start(tbMain,false,true,0); 
     this.add(vbMain); 
     this.show_all(); 
     printf("Started\n"); 
    } 
// ==== getYesNo ========================================================== 
    private void getYesNo(string message) { 
     Dialog dialog = new Dialog.with_buttons 
      ("Get",this,DialogFlags.MODAL, 
      Stock.YES,ResponseType.YES,Stock.NO,ResponseType.NO,null); 
     var content = dialog.get_content_area(); 
// warning: assignment from incompatible pointer type 
// [enabled by default] 
     Label label = new Label(message); 
     label.set_line_wrap(true); 
     content.add(label); 
     dialog.response.connect((id)=>{ 
      printf("response id=%i\n",id); 
      RESPONSE = id; 
      dialog.destroy(); 
     }); 
     dialog.show_all(); 
    } 
// ==== onAbout =========================================================== 
    private void onAbout() { 
     Dialog dialog = new Dialog.with_buttons 
      ("About",this,DialogFlags.MODAL, 
      Stock.OK,ResponseType.OK,null); 
     var content = dialog.get_content_area(); 
// warning: assignment from incompatible pointer type 
// [enabled by default] 
     Label label = new Label("This program tests pop-up dialogs"); 
     content.add(label); 
     dialog.response.connect(()=>{dialog.destroy();}); 
     dialog.show_all(); 
    } 
// ==== onDoIt ============================================================ 
    private void onDoIt() { 
     getYesNo("Well?"); 
     if (RESPONSE==ResponseType.YES) showDialog("YES!"); 
    } 
// ==== onQuit ============================================================ 
    private void onQuit() { 
     printf("Ending\n"); 
     exit(-1); 
    } 
// ==== showDialog ======================================================== 
    private void showDialog(string message) { 
     Dialog dialog = new Dialog.with_buttons 
      ("Show",this,DialogFlags.MODAL, 
      Stock.OK,ResponseType.OK,null); 
     var content = dialog.get_content_area(); 
// warning: assignment from incompatible pointer type 
// [enabled by default] 
     Label label = new Label(message); 
     label.set_line_wrap(true); 
     content.add(label); 
     dialog.response.connect((id)=>{dialog.destroy();}); 
     dialog.show_all(); 
    } 

} 

public class DialogTest: Gtk.Application { 
    internal DialogTest() { 
     Object(application_id: "org.test.DialogTest"); 
    } 
    protected override void activate() { 
     new DialogTestWindow(this).show(); 
    } 
} 

extern void exit(int exit_code); 

public int main(string[] args) { 
    return new DialogTest().run(args); 
} 
+3

Не могли бы вы включить код? Имейте в виду, что Вала по сути использует GTK +, поэтому вы, вероятно, найдете ответ в этой документации (диалог, модальный диалог и т. Д.). –

+0

Благодарю Симеона (и Счастливого Рождества!). Я добавил полный код в нижней части исходного вопроса. – user3133505

ответ

1

Использование Gtk.Dialog.run, не Gtk.Widget.show_all. Это блокирует основной цикл, пока диалог не вернет результат, а не отобразит два диалога одновременно.

+0

Гений! Большое спасибо, nemequ: диалоговое тестирование отлично работает сейчас, то есть нет ничего, что могло бы помешать мне прыгнуть вперед с моим приложением ... (кроме моей ленивости) – user3133505

Смежные вопросы