gui design – Looking for independent usability study of the Microsoft Fluent UI

I don’t have quantitative studies, but consider the following:

The Ribbon UI was created based on a huge quantitative research which came back with the result – if I remember correctly – that everyone uses a small amount of features, but everyone uses a different small set of those, with a pretty flat curve (if I remember well, all features were used by at least 10% of the participants)

Mind you, probably I am mistaken, if I am not, evidence should be in the Harris blogposts already linked.

So, this is one research we have.

The other research comes from Cooper, in About Face 3, where he states what a menu is used for (eg. it has educational purposes). I do hope he based it on research.

Also, we have this 3rd research, qualitatively good enough or not, it is you to decide.

The big question is, does your userbase demographics match the userbase of Office?

It has two parts:

  • Are most of your users frequent Microsoft Office for Windows users?
  • Do they have the same demographical distribution in terms of usage?

Demographical distribution is that “everyone uses a small amount of features, but they use a different set of it, and together, all features are used pretty often.” If this is true for your application, well, after billions of sessions, MS should be correct.

However, if you have a very different demographics – eg. there are a top 5 things an average user uses, and the next 95 buttons are only pressed by the sysadmins if they are asked to help – then I guess you should stick to a traditional toolbar + menu.

Or, if you have a lot of mac and/or adobe users, perhaps toolbar + menu + inspector.

I believe, that H3 came up positively in the research because “expert users” use a large amount of features, they are likely more into other apps daily than Office and therefore they can’t rely on their spatial memory to find those – this is the typical sysadmin: does not use Office on their own, but is asked on various hard topics.

For them, the educational purpose of the menu – where you can scan a list of items, decide which one or two fits your goals, check into those and repeat the process recursively – fits better, as a text-only menu is easy to scan.

For those, who don’t exploit such educational stuff – because they only have to press 20 buttons repeatedly which they learn spatially where they are – this “more frequent equals bigger” fits the purpose.

I hope this helps.

c++ – Best way to access (grand grand) parent element in gui

I’m creating a multi window gui program, in c++ with Qt Widgets. I do have many custom gui elements, which usually are c++ classes inherited from QWidget or other Qt elements. When foo is the main window, it often looks like this:

Foo = new Foo();
Bar1 *widget1(foo);
Bar2 *widget2(widget1);
Bar3 *widget3(widget2);
Bar4 *widget4(widget3);

foo->addWidget(widget1);
widget1->addWidget(widget2);
widget2->addWidget(widget3);
widget3->addWidget(widget4);

Actually I use std::shared_ptr everywhere but I’m omitting that here for the sake of readability. Also this is simplified, the order is not always like this and there may be other Qt elements in between.

The argument in the constructors is the “parent” Window. Qt handles the deletion of all my Widgets using the parent structures.

My problem is, that sometimes, I need to access elements of my main window foo from some Bar widget down the road. E.g.: “If this is clicked, add another tab to the QTabwidget in foo. I do not always know, how many layers there are between foo and widgetX.

What’s the best way to have a reference to foo in the lowest layer?

  1. The easiest way would be to make foo a singleton since I only ever have one foo window and once it get’s closed, my program terminates anyway. But making the whole class static comes with it’s own drawbacks.
  2. Add a reference to foo to all my constructors and pass it through them. I’d have a reference to foo in many places where I do not need one.
  3. I can access the parent reference that got passed through the constructors, but it’s a pointer to QWidget. I’d have to cast it, check whether it’s actually Foo and not Bar2, and then continue until I have found Foo.
  4. Set foo as a parent for everything, even if it is not really the parent (e.g. in a new Window). This would keep all my elements in memory until foo is destroyed.
  5. Use signals and slots. This sometimes works, but if I’m already 3 layers below foo when creating widget4, I can’t connect them without foo.

Currently I have a mixed mess where I sometimes pass a reference to foo, have some static elements in foo and at some point cast the parent widget to foo.

What would be a good approach here?

gui design – How should I provide the “select nothing” option in my icon picker?

I work on a desktop application that lets people create visual scripts. They can add properties to objects, and every property can have a user-defined icon for easy identification. I have added a picker widget that looks like a large button showing the icon, and when clicked opens a menu that lets the user select from the complete list of emoji.

However there is currently no way for the user to disable the icon (“clear” or “select none”), and I am wondering how to implement this. I have thought of the following:

  • add a right-click context menu with a single “Clear” or “Select None” entry; I don’t like this because it is not obvious that right-clicking will do anything, and a popup menu with only one entry seems weird.
  • add an empty emoji at the beginning of the list, so the user can select it just like the others; I don’t like this because they will need to scroll to the top of the list, and maybe even navigate to the first tab; also none of the emoji have any borders so an empty button will just be appear as a blank space, and may even look like a rendering bug to the user.
  • add a “Clear” button… somewhere in the picker menu? I could not find a good place to put it. Also, should it have text or would an icon suffice? The emoji are very diverse and colourful, so an icon may not be appropriate.
  • add a “Clear” button outside the picker. If so, what should it look like?

What are good examples that I could get inspiration from?

For reference, here is what the picker looks like right now:

emoji picker

Here is what an empty entry would look like:

empty button

And an external button:

external button

Start the gui program as non-root in systemd

Run ps -ef to find that the process number of upstart is 1566. When the parent process id of my gui program is 1566, it can be displayed normally. Now there are several problems that cause my gui program to not run normally.

  1. I have a systemd program, its name is terui. I want to start my gui program in terui. This is my startup code: system("su sunxy -c 'DISPLAY=:0 XAUTHORITY=/home/sunxy/.Xauthority /etc/opt/kpki/mw/KCliBaseService/start_tray.sh'");

  2. I found that after starting in this way, the parent process id of the gui program was 1, not 1566, which caused my gui program to fail to display normally. When I enter su sunxy -c’DISPLAY=:0 XAUTHORITY=/home/sunxy/.Xauthority /etc/opt/kpki/mw/KCliBaseService/start_tray.sh’ as a root user in bash, my gui program can be displayed normally, and its parent process id is 1566.

  3. This is my terui.service:

(Unit)
Description=terui Daemon
Requires=network-online.target
After=network-online.target

(Service)
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/sunxy/.Xauthority"
ExecStart=/home/testui/build/terui
User=root
Type=simple
Restart=always
RestartSec=3s
(Install)
WantedBy=graphical.target

So, my question is, what should I do to display the gui program normally

gui design – Is filling the center-area of a GUI with several forms a good practice?

Center-area concept:

For a desktop application, we commonly find a similar structure for the GUI:

  • Top menu / Ribbon
  • Dockables left and right to explore the content and show properties.
  • Center-area with the main content or view. Internal frames are deprecated in favour of file tabs.

I am not sure about the name of this “center-area”, my apologies if there is a more appropriate name. For the purpose of this question, I will keep calling it “center-area”

As an example (E is the center-area):

enter image description here


Multiple center-areas concept:

Let now suppose a use-case where several views of the same “file” or “project” are useful with an equivalent importance: to illustrate this principle, I will take the example of a “3D printer” slicer.

  • The 3D view is required to be big, so details and possible issues are well visible. (It makes sense to have it in the center-area).
  • The user spend 90% of it time on settings and configurations, which would ideally be in the center-area. Note that applying those settings (slicing) take time (usually many seconds), so there is no point in showing the 3D view and settings at the same time.

An other example is a 3D engine editor:

  • The designer spend lot of time editing the 3D view, by placing new models in it (it makes sense to have it in the center-area).
  • The designer spend lot of time configuring shaders managing huge graphs. (it makes sense to have the graph view in the center-area).

Shader editor in Unreal engine
3D view editor in Unreal engine

Note: I want to highlight the difference between having multiple content in the same center-area GUI (e.g. multi-files in your browser), versus having multiple GUIs filling the center-area, for the same project or file.

The question (s):

Is having two(or more) GUI filling the center-area a good practice?
Otherwise, what are the alternatives?
Finally, is there a name for this multi-central-area GUI?

gui design – Same Side Navigation for bigger and smaller screens?

I am trying to find a way to navigate amongst rather complex content using an “admin” side navigation. The goal have been to use same navigation regardless of mobile or desktop.

Am I thinking in the right direction or do I have to reconsider?

Live mockup: http://94.237.92.101:6060

Using Hamburger

Bigger screens: The menu should open and close at same level as content. 
Smaller screens: The menu should open and close above content

Resize Windows

Bigger screens: Full menu as default
Smaller screens: No menu as default

Using menu buttons (Home etc)

Bigger screens: Select the active link and stay open
Smaller screens: Select the active link and close

At reloading page

Bigger screens: The menu level select persists and active links should be selected
Smaller screens: The menu should stay closed

Using link on the content

Bigger screens: The menu should stay open at current level and select active link
Smaller screens: The menu should stay closed

python 3.x – Como utilizar uma função paralela ao pysimple GUI sem que a interface trave

tudo bem?
Estou atualmente realizando um bot para fins didáticos.
Estou utilizando a biblioteca pySIMPLE GUI para realizar a interface e a biblioteca selenium para requisitar os elementos web.

O que está ocorrendo:

  • Quando eu utilizo a função do bot dentro do loop do pySimple GUI a interface simplesmente para de responder. ( O código até que funciona, no entanto, a interface de saída para visualizar os comentários trava e muitas das vezes tenho que fechar)

inserir a descrição da imagem aqui

O código da minha interface é:

import PySimpleGUI as sg

def janela_login():
    sg.theme('reddit')
    layout = (
        (sg.Text('BOT PARA INSTAGRAM')),
        (sg.Text('Usuário: ' ), sg.Input(size=(20,1), key ='username')),
        (sg.Text('Senha:   '), sg.Input(password_char="*",size=(20,1), key = 'password')),
        (sg.Text('Link:      '), sg.Input(size=(30,1),key = 'link')),
        (sg.Button('Entrar na conta', key = 'btn_login'))
    )
    return sg.Window('login', layout = layout, finalize = True)

def janela_saida():
    sg.theme('reddit')
    layout = (
        (sg.Text('BOT PARA INSTAGRAM')),
        (sg.Output(size=(50,20)))
            
    )
    return sg.Window('BOT', layout = layout, finalize = True)

janela1,janela2 = janela_login(),None

while True:

    window,event,values = sg.read_all_windows(timeout=10000)

    if window == janela1 and event == sg.WIN_CLOSED:
        break

    if window == janela1 and event =='btn_login':
        if values('username') == " " or values('password') == "" or values('link') == "":
            sg.popup('Por favor, digite os campos informados')
        else:
            janela1.hide()
            janela2 = janela_saida()
            driver = webdriver.Chrome(ChromeDriverManager().install())

Já o código do bot é:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.keys import Keys
import time
import sys
import getpass
import random
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get(values('link'))
    
btn_entrar = driver.find_element_by_xpath("//*(@id='react-root')/section/nav/div(2)/div/div/div(3)/div/span/a(1)")
btn_entrar.click()
time.sleep(3)
campo_username = driver.find_element_by_xpath("//*(@id='loginForm')/div/div(1)/div/label/input")
campo_username.send_keys(values('username'))
time.sleep(2)
campo_senha = driver.find_element_by_xpath("//*(@id='loginForm')/div/div(2)/div/label/input")
campo_senha.send_keys(values('password'))
campo_senha.send_keys(Keys.ENTER)
time.sleep(10)
agora_não = driver.find_element_by_class_name('cmbtv')
print("Element is visible? " + str(agora_não.is_displayed()))
time.sleep(1)
agora_não.click()
time.sleep(3)

javascript = """ 
var elm = arguments(0), txt = arguments(1); 
elm.value += txt; 
elm.dispatchEvent(new Event('change')); 
""" 

contador = 0
while contador < 1500:  
     
    if(contador % 23 == 0 ):
        driver.refresh()
        for remaining in range(3400, 0, -1): 
            print('r                 ' ,remaining,'segundos para publicar o próximo comentário ', end=' ' )  
            sys.stdout.flush()
            time.sleep(1)
        
    for remaining in range(35, 0, -1):
        print('r                      ' ,remaining,' segundos para publicar o próximo comentário ', end=' ' )  
        sys.stdout.flush()
        time.sleep(1)
      
   
    msg = ("U0001F39E","U0001F3A5","U0001F3AC","U0001F3EE","U0001F3F7","U0001F400","U0001F401","U0001F402","U0001F403","U0001F404","U0001F405","U0001F406","U0001F407","U0001F408","U0001F40E","U0001F40F","U0001F410","U0001F411","U0001F412","U0001F413","U0001F414","U0001F415","U0001F416","U0001F417","U0001F418","U0001F423","U0001F424","U0001F425","U0001F426","U0001F427","U0001F428","U0001F429","U0001F42A","U0001F42B","U0001F42D","U0001F42E","U0001F42F","U0001F430","U0001F431","U0001F434","U0001F435","U0001F436","U0001F437","U0001F439","U0001F43A","U0001F43B","U0001F43C","U0001F43D","U0001F43E","U0001F43F","U0001F479","U0001F47A","U0001F47B","U0001F47D","U0001F47E","U0001F47F","U0001F480","U0001F4A1","U0001F4A9","U0001F4B0","U0001F4B3","U0001F4B4","U0001F4B5","U0001F4B6","U0001F4B7","U0001F4B8","U0001F4B9","U0001F4BB","U0001F4BD","U0001F4BE","U0001F4BF","U0001F4C0","U0001F4C3","U0001F4C4","U0001F4D1","U0001F4D2","U0001F4D3","U0001F4D4","U0001F4D5","U0001F4D6","U0001F4D7","U0001F4D8","U0001F4D9","U0001F4DA","U0001F4DC","U0001F4DE","U0001F4DF","U0001F4E0","U0001F4E4","U0001F4E5","U0001F4E6","U0001F4E7","U0001F4E8","U0001F4E9","U0001F4EA","U0001F4EB","U0001F4EC","U0001F4ED","U0001F4EE","U0001F4F0","U0001F4F2","U0001F4F7","U0001F4F8","U0001F4F9","U0001F4FA","U0001F4FC","U0001F4FD","U0001F50B","U0001F50C","U0001F50D","U0001F50E","U0001F516","U0001F526","U0001F54A","U0001F56F","U0001F5A5","U0001F5A8","U0001F5B1","U0001F5B2","U0001F5DE","U0001F5F3","U0001F600","U0001F601","U0001F602","U0001F603","U0001F604","U0001F605","U0001F606","U0001F607","U0001F608","U0001F609","U0001F60A","U0001F60B","U0001F60C","U0001F60D","U0001F60E","U0001F60F","U0001F610","U0001F611","U0001F612","U0001F613","U0001F614","U0001F615","U0001F616","U0001F617","U0001F618","U0001F619","U0001F61A","U0001F61B","U0001F61C","U0001F61D","U0001F61E","U0001F61F","U0001F620","U0001F621","U0001F622","U0001F623","U0001F624","U0001F625","U0001F626","U0001F627","U0001F628","U0001F629","U0001F62A","U0001F62B","U0001F62C","U0001F62D","U0001F62E","U0001F62F","U0001F630","U0001F631","U0001F632","U0001F633","U0001F634","U0001F635","U0001F636","U0001F637","U0001F641","U0001F642","U0001F643","U0001F644","U0001F910","U0001F911","U0001F912","U0001F913","U0001F914","U0001F915","U0001F916","U0001F917","U0001F920","U0001F921","U0001F922","U0001F923","U0001F924","U0001F925","U0001F927","U0001F928","U0001F929","U0001F92A","U0001F92B","U0001F92C","U0001F92D","U0001F92E","U0001F92F","U0001F970","U0001F971","U0001F972","U0001F973","U0001F974","U0001F975","U0001F976","U0001F978","U0001F97A","U0001F981","U0001F983","U0001F984","U0001F985","U0001F986","U0001F987","U0001F989","U0001F98A","U0001F98C","U0001F98D","U0001F98F","U0001F992","U0001F993","U0001F994","U0001F998","U0001F999","U0001F99B","U0001F99D","U0001F9A1","U0001F9A2","U0001F9A3","U0001F9A5","U0001F9A6","U0001F9A7","U0001F9A8","U0001F9AB","U0001F9AC","U0001F9AE","U0001F9D0","U0001F9EE","U0001F9FE","U0001FA94","U0001FA99")
   
    # driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    driver.find_element_by_class_name('Ypffh').click()
    campo_comment = driver.find_element_by_class_name('Ypffh')
    driver.execute_script(javascript, campo_comment, random.choice(msg))
    print("Element is visible? " + str(campo_comment.is_displayed()))
    time.sleep(2)
    campo_comment.send_keys(" ")
    time.sleep(1)
    campo_comment.send_keys(Keys.ENTER)
    contador = contador + 1
    print('r ', '                      ',contador,'- Comentário publicado com sucesso ','(', random.choice(msg),")")
    
     
driver.quit()



Errata 1 – O código da interface sem a presença do código do BOT roda sem travar.

Errata 2 – O código do BOT quando rodado no console (terminal) roda perfeitamente.

O que será que eu estou errando?

Obrigado a todos!

gui – Ubuntu 20.04 UI very slow after some time of inactivity

I updated an Ubuntu 18.04 LTS to 20.04.2 LTS on a 27″ Mac some time ago now.

Basically all works fine so far.

But when I do not touch the system for some time (> 10 to 15 minutes), it is shitty slow: mouse does not respond, keyboard actions are not recognised, and so on.

When I am logged into the system through ssh an the same time, that terminal responds completely normal.

After pushing around the mouse for some time, the UI “wakes up” again, and I can continue to work with it as normal, until the next break …

Just as a side note: recently, I installed Ubuntu 20.10 to a Dell Latitude Laptop from scratch and observed the same behaviour there …

Both systems boot up completely normal, and after the boot, they operate with (more than) acceptable speed: all input operations are accepted immediately, and the display is immediate.

Problems show up only after some time of inactivity, as said already …

Any ideas?

blog – Is there a good open-source blogging system out there written in nodejs that comes with GUI?

I’ve been working with this company for a few years. When we first started, I wrote their website using PHP and their mobile app using Cordova. They needed a blogging system and so since we were using PHP as the language I hooked them with Serendipity. It’s old and it’s not that great but there was that one theme that looked modern enough to be usable. Serendipity is written in PHP and uses MySQL. What I like about it is that it offers a GUI backend for my client to be able to create and write posts on his own a bit like WordPress.

Thing is now we’re migrating to nodejs and postgres.

Here’s what I’m looking for :

  • Blog system with GUI for my client
  • Written in Nodejs
  • Open source
  • I’d like to be able to query every post my client writes from the blogging system and display/embedded them on the website. With Serendipity, it’s like a whole new website I have to link from their website.

I’ve done a bit of research and I came accross Poet which is written in node. But it doesn’t seem to offer any GUI for humans to be able to write, delete and create new posts?

Can anyone suggests anything? Thanks

sql server – SQL 2019 Linux, slow at GUI fast at sqlcmd/Query Analyzer

Server information

OS Redhat 7
Memory 100GB
CPU usage 1%
User db size 2 gb each on avg
total 7 user databases
SSMS installed on a jump server
Azure Data studio is also installed
App Gui on application server
Latency between jump server to db server <1ms
Latency between application server and db server <1ms
all are in same network, only switch is between them
all are physical machines

Issue

  1. SSMS – When I connect to SSMS, the databases in object explorer takes around 30 seconds to populate. Opening database properties takes upto 50 seconds to open
    Query analyser/sqlcmd from SSMS runs “select name from sys.sysdatabases” instantly without delay

  2. Azure data studio – Populates Databases list fairly quickly but takes more than a minute to show database properties.

  3. App Gui – also have the same behaviour as SSMS.

From every location, querying seems fast enough but GUI is found to be slow.

Different scenario

I have other SQL Server on windows OS, the SSMS, Azure data studio behaviour is usual where they populate information on GUI instantly.
We also have few database on Azure SQL Database and Azure VM, they also connect instantly and populate information instantly at SSMS GUI

What we want to achieve?

We need our App gui, SSMS to perform as fast as SQL Server on Windows OS at gui level.

So what could be the issue and how I can fix this?

Please help!