Bagaimana cara membuat indikator Unity?


25

Saya tertarik dengan indikator Unity dan bertanya-tanya apakah ada tutorial tentang cara memprogramnya. Saya dapat menggunakan sumber-sumber yang ada sebagai pilihan terakhir, tetapi saya lebih suka pendekatan yang lebih ramah karena keterampilan pemrograman saya sangat terbatas.



Lihat juga jawaban ini . Ini menjelaskan cara membuat indikator sistem , yang memiliki lebih banyak kemungkinan daripada indikator aplikasi. Saya bereksperimen sedikit dan juga melihat indikator sistem default Unity, seperti indikator suara dan bluetooth; dan muncul dengan contoh saya sendiri, ScreenToolsIndicator , yang menggunakan tombol dan slider juga. Saya memilih C karena contoh sneetsher ada di C, tetapi ada pembungkus C ++ untuk GLib juga (glibmm).
okaresz

Jawaban:


21

Dokumentasi Indikator Aplikasi dengan contoh dan dokumen API tersedia di sini:

Belum ada tutorial tentang Indikator Aplikasi di sana, tetapi tetap ikuti perkembangan untuk konten lainnya di bagian tutorial situs Pengembang Aplikasi:


2
Menabrak. Semua tautan ini sudah usang dan mengarah ke pesan 'halaman tidak ditemukan'. Apakah ada sumber daya baru yang bisa saya temukan? Situs resmi developer.ubuntu.com/apps/qml/cookbook/… tautan ke pertanyaan ini dengan Is there any tutorial for programming Unity indicators?judul.
Daniel W.

Tautan rusak di mana-mana, Lihat ApplicationIndicators wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators , rujukan API-nya sebagai HTML dalam libappindicator-docpaket.
user.dz

1
Ada bug yang diajukan pada dokumentasi yang hilang: bugs.launchpad.net/ubuntudeveloperportal/+bug/1317065
Jorge Castro

4

Berikut adalah contoh indikator aplikasi dalam C. Ini adalah versi "indikator saja" (tanpa jendela) dari contoh yang disediakan di Wiki Ubuntu :

#include <libappindicator/app-indicator.h>

static void activate_action (GtkAction *action);

static GtkActionEntry entries[] = {
    {"New",  "document-new",     "_New",  "<control>N",
        "Create a new file",    G_CALLBACK(activate_action)},
    {"Open", "document-open",    "_Open", "<control>O",
        "Open a file",          G_CALLBACK(activate_action)},
    {"Save", "document-save",    "_Save", "<control>S",
        "Save file",            G_CALLBACK(activate_action)},
    {"Quit", "application-exit", "_Quit", "<control>Q",
        "Exit the application", G_CALLBACK(gtk_main_quit)},
};
static guint n_entries = G_N_ELEMENTS(entries);

static const gchar *ui_info =
"<ui>"
"  <popup name='IndicatorPopup'>"
"    <menuitem action='New' />"
"    <menuitem action='Open' />"
"    <menuitem action='Save' />"
"    <menuitem action='Quit' />"
"  </popup>"
"</ui>";

static void activate_action(GtkAction *action)
{
    const gchar *name = gtk_action_get_name (action);
    GtkWidget *dialog;

    dialog = gtk_message_dialog_new(NULL,
                                    GTK_DIALOG_DESTROY_WITH_PARENT,
                                    GTK_MESSAGE_INFO,
                                    GTK_BUTTONS_CLOSE,
                                    "You activated action: \"%s\"",
                                    name);

    g_signal_connect(dialog, "response", 
                     G_CALLBACK(gtk_widget_destroy), NULL);

    gtk_widget_show(dialog);
}

int main(int argc, char **argv)
{
    GtkWidget*      indicator_menu;
    GtkActionGroup* action_group;
    GtkUIManager*   uim;
    AppIndicator* indicator;
    GError* error = NULL;

    gtk_init(&argc, &argv);

    /* Menus */
    action_group = gtk_action_group_new("AppActions");
    gtk_action_group_add_actions(action_group, entries, n_entries,
                                 NULL);

    uim = gtk_ui_manager_new();
    gtk_ui_manager_insert_action_group(uim, action_group, 0);

    if (!gtk_ui_manager_add_ui_from_string(uim, ui_info, -1, &error)) {
        g_message("Failed to build menus: %s\n", error->message);
        g_error_free(error);
        error = NULL;
    }

    /* Indicator */
    indicator = app_indicator_new("example-simple-client",
                                  "go-jump",
                                  APP_INDICATOR_CATEGORY_APPLICATION_STATUS);

    indicator_menu = gtk_ui_manager_get_widget(uim, "/ui/IndicatorPopup");

    app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_attention_icon(indicator, "indicator-messages-new");

    app_indicator_set_menu(indicator, GTK_MENU(indicator_menu));

    gtk_main();

    return 0;
}

Tautan menghasilkan 404
Dering Ø

@ ringø Jawaban sergej yang diedit, menambahkan tautan yang berfungsi. Secara efektif, ini adalah tautan yang sama dengan jawaban Jorge.
Sergiy Kolodyazhnyy

1

Saya melakukan tutorial singkat di sini untuk membuat indikator aplikasi stop watch dengan python: http://www.steshadoku.com/blog/2017/elapses-creating-a-unity-stopwatch-indicator-w-python/

import gobject
import gtk
import appindicator
import os, sys
import time
from datetime import timedelta

if __name__ == "__main__":

    saveseconds = 0 #global variable to save how many seconds the clock has run
    dir_path = os.path.dirname(os.path.realpath(__file__))
    source_id = ""

    def on_timer(args=None):
      savetime = int(time.time() - timestart) + saveseconds
      ind.set_label(str(timedelta(seconds=savetime)))
      return True

    def finish(args=None):
        sys.exit()
        return True

    def stoptime(args=None):
        #print(source_id)
        global saveseconds
        saveseconds += int(time.time() - timestart)
        gtk.timeout_remove(source_id)
        return True

    def starttime(args=None):
        global timestart
        timestart = time.time()
        global source_id
        source_id = gtk.timeout_add(1000, on_timer)
            #sets timer to run every 1s
        return True

    def cleartime(args=None):
        global saveseconds
        saveseconds = 0
        ind.set_label(str(timedelta(seconds=0)))
        gtk.timeout_remove(source_id)
        return True

    #format below is category name, icon
    ind = appindicator.Indicator ("simple-clock-client", "hourglass", appindicator.CATEGORY_APPLICATION_STATUS, dir_path)
    ind.set_status (appindicator.STATUS_ACTIVE)
    ind.set_label("Elapses"); #name of program and initial display

    ##Setup Menu Items
    menu = gtk.Menu()

    stop = gtk.MenuItem("Stop")
    stop.connect("activate", stoptime)
    stop.show()
    menu.append(stop)

    start = gtk.MenuItem("Start")
    start.connect("activate", starttime)
    start.show()
    menu.append(start)

    clear = gtk.MenuItem("Clear")
    clear.connect("activate", cleartime)
    clear.show()
    menu.append(clear)

    exit = gtk.MenuItem("Exit")
    exit.connect("activate", finish)
    exit.show()
    menu.append(exit)

    ind.set_menu(menu) #set the menu with added items
    gtk.main()

1
Saya tidak melihat kode yang sebenarnya, tetapi untuk satu hal: Anda memiliki kesalahan lekukan. Baik di sini maupun di tutorial yang ditautkan.
Jacob Vlijm

Tidak, ada satu ruang lekukan. . . hanya satu, yang membuatnya sangat menyakitkan untuk membaca kode dan tidak sesuai dengan standar PEP8 Python
Sergiy Kolodyazhnyy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.