• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Właśnie wykonywane polecenie a ponowne – w GUI, oraz specyfika klikania

Object Storage Arubacloud
0 głosów
56 wizyt
pytanie zadane 8 stycznia w Algorytmy przez overcq Pasjonat (21,710 p.)

Przykład z przyciskiem GUI

Jeśli użytkownik kliknie dwa razy przycisk, to polecenie do niego przypisane zostanie zainicjowane dwa razy, chyba że programista stosuje jakieś mechanizmy zabezpieczające.

Wiem, że powyższy problem jest na przykład rozwiązany w wielu formularzach GUI, które zawierają przycisk “Dalej” oraz w oknach konfiguracji, które zawierają przycisk “Zastosuj”. W pierwszym przypadku stan przycisków formularza jest dostosowywany. Na przykład użytkownik wprowadził jakieś akceptowalne dane, to przycisk “Dalej” jest włączany, w przeciwnym przypadku – wyłączany. W drugim przypadku przycisk “Zastosuj” jest wyłączany po wprowadzeniu zmian, a po dokonaniu jakichś zmian w oknie konfiguracji – włączany.

Przykład z poleceniem z menu GUI

W tym przypadku po kliknięciu polecenia menu zamyka się ono, a polecenie zaczyna być wykonywane. Kompletnie nie wiem, jaki wtedy miałby być stan aplikacji GUI, by nie wykonywać ponownie tego samego polecenia.

Opis problemu

Wiadomo, że implementacje interfejsów GUI są zdarzeniowe, czyli w podanych przykładach zachodzi jakaś interakcja użytkownika (np. kliknięcie) i zostaje rozpoczęte wykonywanie procedury obsługi tego zdarzenia. Kolejna interakcja użytkownika nic nie wie o właśnie wykonywanej i zaczyna się (na poziomie abstrakcji GUI) niezależnie od poprzedniej.

Z tego powodu występują dwie przyczyny błędów kliknięcia elementu GUI:

  • Ponowne kliknięcie nie chciane, gdy już się wykonuje polecenie uruchomione poprzednim kliknięciem.
  • Kliknięcie nie zamierzone, które uruchamia polecenie, a użytkownik nie zamierzał kliknąć, lecz wykonał jakieś nietypowe naciśnięcie klawisza bądź przeciągnięcie wskaźnika myszy. Czyli nie zgadza się ze specyfiką klikania.

Na przykład można (i tak często się u mnie dzieje) kliknąć dwukrotnie na ikonie pliku/katalogu, by otworzyć, a wtedy z powodu opóźnień dysku, na którym znajduje się ten plik/katalog, kliknąć ponownie, i niezamierzenie wykona się drugi raz to polecenie albo na tej samej ikonie, albo na tym, co pojawi się w otwartym katalogu. Można też kliknąć dwukrotnie, ale nie trafić dokładnie w ikonę pliku/katalogu (która jest częściowo przezroczysta lub przy granicach), i wtedy wykona się dwa razy pojedyncze kliknięcie na dwóch różnych elementach GUI, np. ikonie i tle ikony.

Moje implementacje

Podczas implementacji eksperymentalnego GUI z użyciem xcb, dla której mój sterownik zdarzeń GUI znajduje się tutaj, przyjąłem dozwoloną charakterystykę kliknięcia i wielokrotnego kliknięcia. Mianowicie określiłem maksymalne opóźnienia dla zwolnienia przycisku oraz ponownego wciśnięcia przycisku. Jeśli któryś z nich zostanie przekroczony (np. użytkownik czeka zbyt długo ze zwolnieniem przycisku lub jego ponownym naciśnięciem), to wtedy uznana zostaje tylko sekwencja kliknięć wykonana poprawnie do pierwszego przekroczenia czasu. Ponadto określiłem też minimalne opóźnienie po uznaniu takiej sekwencji do odblokowania możliwości realizacji kolejnej sekwencji kliknięć.

Stąd powstała uniwersalna obsługa sekwencji kliknięć w sterowniku zdarzeń GUI, której wynikiem interpretacji są dwa parametry: który przycisk myszy użyty oraz ile razy naciśnięto lub zwolniono ten przycisk. (Można na przykład nacisnąć, zwolnić, nacisnąć i w wyniku jest 3. Coś jakby klik i rozpoczęcie uchwycenia obiektu GUI.)

Jednak (jak sprawdzam w przykładowym programie GUI) mimo poprawy ogólnej interpretacji kliknięć, czyli eliminacji pomyłkowych kliknięć, da się też zauważyć tym razem zignorowane kliknięcia. To ostatnie wynika z tego, że w moim sterowniku zdarzeń GUI w pętli zdarzeń od razu po odczycie zdarzenia GUI zapisuję jego parametry startowe do użycia na później, a dopiero po wykonaniu się pętli czytania wszystkich zdarzeń GUI dokonuję ich interpretacji. Z tego powodu niekiedy upływa już czas maksymalnego opóźnienia od pierwszego naciśnięcia przycisku do kolejnego zanim sterownik dokona interpretacji. Nie wiem, jak to rozwiązać.

Pytania

  1. W jaki sposób zaprojektować abstrakcję stanu wizualnego aplikacji GUI w zależności od tego, co się w niej obecnie dzieje ze względu na interakcję z użytkownikiem? Czy istnieją do tego jakieś gotowe przykłady, szablony?
  2. Czy istnieje jakiś system GUI, w którym byłby bezpośredni związek między specyfiką klikania przez użytkownika a graficzną wizualizacją stanu? Tak by system GUI interpretował kliknięcia i uruchamiał polecenia tylko wtedy, gdy użytkownik się nie pomylił.

1 odpowiedź

+1 głos
odpowiedź 8 stycznia przez adrian17 Ekspert (344,860 p.)

Nie zszedłeś na trochę za niski poziom?

To znaczy: tak, odróżnianie kliknięcia od doubleclicka i kliknięcia od przeciągnięcia to (z tego, co rozumiem) odpowiedzialność warstwy bezpośrednio nad xcb. Ale typowy guzik w ogóle nie interesuje się doubleclickami; dostaje od niższej warstwy informację "zostałem kliknięty" i tyle.

Ponowne kliknięcie nie chciane, gdy już się wykonuje polecenie uruchomione poprzednim kliknięciem.

Jeśli operacja trwa dłuższy czas, to typowa aplikacja po prostu wyłącza guzik w momencie kliknięcia i włącza z powrotem w momencie zakończenia polecenia.

Kliknięcie nie zamierzone, które uruchamia polecenie, a użytkownik nie zamierzał kliknąć, lecz wykonał jakieś nietypowe naciśnięcie klawisza bądź przeciągnięcie wskaźnika myszy. Czyli nie zgadza się ze specyfiką klikania.

Tak, tutaj warstwa niższa powinna odróżnić kliknięcie od "wcisnął przycisk i przeciągnął" i nie odpalić na guziku logiki kliknięcia.

Tak by system GUI interpretował kliknięcia i uruchamiał polecenia tylko wtedy, gdy użytkownik się nie pomylił.

Nie rozumiem pytania. To, czy guzik można wcisnąć raz, albo raz na 5 minut, albo tylko gdy jakaś operacja się nie dzieje, albo tak często jak tylko user będzie chciał - to zależy od aplikacji, a nie uniwersalnego frameworka do GUI.

komentarz 8 stycznia przez overcq Pasjonat (21,710 p.)

Jeśli operacja trwa dłuższy czas, to typowa aplikacja po prostu wyłącza guzik w momencie kliknięcia i włącza z powrotem w momencie zakończenia polecenia.

Tak mimochodem – w takim przypadku też pozostaje możliwość, że użytkownik kliknie drugi raz przycisk, zanim zostanie wyłączony. Dotychczas w pewnej wtyczce do edytora tekstu stosowałem do tego celu zmienne zabezpieczające wejście do procedury polecenia, w taki sam sposób jak wyłączanie i włączanie przycisku.

Miałem na myśli coś takiego: istnieje jakiś system przełączania wizualizacji/stanów w zależności od tego, co robi użytkownik i program, nie tylko sam użytkownik. W pierwszym pytaniu pytałem o jakiś szablon aplikacji, która coś robi, a w drugim – o właśnie połączenie stanu okna z wykonywanymi poleceniami, tak by program tylko wykonywał polecenia, nie martwiąc się o poprawność. Musiałyby istnieć jakieś wzorce wykonywania się programu…

komentarz 8 stycznia przez adrian17 Ekspert (344,860 p.)

w takim przypadku też pozostaje możliwość, że użytkownik kliknie drugi raz przycisk, zanim zostanie wyłączony

To nie powinno być możliwe przy dobrze napisanym frameworku. To znaczy - "wyłączenie" przycisku powinno oznaczać, że następne zdarzenie kliknięcia, nawet jeśli już się fizycznie wydarzyło i jest w kolejce, nie będzie skutkowało wywołaniem logiki przycisku.

Miałem na myśli coś takiego: istnieje jakiś system przełączania wizualizacji/stanów w zależności od tego, co robi użytkownik i program, nie tylko sam użytkownik. W pierwszym pytaniu pytałem o jakiś szablon aplikacji, która coś robi, a w drugim – o właśnie połączenie stanu okna z wykonywanymi poleceniami, tak by program tylko wykonywał polecenia, nie martwiąc się o poprawność. Musiałyby istnieć jakieś wzorce wykonywania się programu…

Mówisz strasznie ogólnie, do tego stopnia że nie mam pojęcia o czym mówisz. W zależności od tego co właściwie masz na myśli, odpowiedź może być gdziekolwiek między "to oczywiste, praktycznie każde GUI pod słońcem to obsługuje" a "to niemożliwe, nie możesz czytać w myślach usera".

Podobne pytania

0 głosów
1 odpowiedź 209 wizyt
0 głosów
0 odpowiedzi 490 wizyt
pytanie zadane 13 marca 2021 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 349 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez fennec Nowicjusz (160 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...