سؤال

أقوم بعمل محرر نصفي تافهة (كتمرين) في GTK باستخدام Glade و GTKBuilder و C. لدي قائمة تحرير مع قطع ونسخ ولصق بالإضافة إلى gtktextview للنص. تقوم GTKTextView تلقائيًا بربط تسلسل CUT/COPY/PASTE لنفسها (وحتى توفر عناصر القائمة إذا قمت بالنقر بزر الماوس الأيمن). أرغب في توصيل عناصر القائمة ، والنسخ ، واللصق في شريط القائمة الخاص بي بعرض النص الخاص بي حتى تتصرف كما هو متوقع.

لاحظ أن هذا اتصال ثنائي الاتجاه. (1) عند تنشيط أحد قطع GTKMenuitem أو نسخه أو لصقه ، فإنه يخبر GTKTextView للقيام بشيء ما. (2) عند إجراء تحديد أو مسحه في GTKTextView ، يتم تمكين القطع والنسخ أو تعطيلها على التوالي (انظر GEDIT كمثال). علاوة على ذلك ، (3) ما إذا كان يتم تمكين لصق أم لا يعتمد على حالة الحافظة.

كيف يمكنني توصيل عناصر القائمة الخاصة بي ونسخها ولصقها بعرض النص؟ هل هناك طريقة للقيام بذلك في Glade ، أم أن برنامج C يحتاج إلى بعض التعليمات البرمجية الإضافية لهذا الغرض؟ هل هناك طريقة مبسطة للقيام بذلك ، أو هل أحتاج إلى تنفيذ جميع السلوكيات الثلاثة المذكورة في الفقرة أعلاه يدويًا؟

هل كانت مفيدة؟

المحلول

ستحتاج إلى بعض رمز C الإضافي ، ولكن ليس كثيرًا. لهذا المثال ، أفترض أنك تستخدم GtkActionS لعناصر القائمة الخاصة بك ، ولكن إذا لم تكن الحل يجب أن يكون متشابهًا.

قم أولاً بإجراء عمليات الاسترجاعات لتصرفات القطع والنسخ واللصق في Glade. عندما تقوم بتوصيل الإشارات ، قم بتمرير بعض بنية البيانات التي تحتوي على مؤشرات على الأقل إلى إجراءات القطع والنسخ والصق ، وعرض النص ، كبيانات المستخدم.

void
on_cut(GtkAction *action, SomeStruct *data)
{
    g_signal_emit_by_name(data->view, "cut-clipboard", NULL);
    gtk_action_set_sensitive(data->paste_action, TRUE);
}

void
on_copy(GtkAction *action, SomeStruct *data)
{
    g_signal_emit_by_name(data->view, "copy-clipboard", NULL);
    gtk_action_set_sensitive(data->paste_action, TRUE);
}

void
on_paste(GtkAction *action, SomeStruct *data)
{
    g_signal_emit_by_name(data->view, "paste-clipboard", NULL);
}

بعد ذلك ، اتصل بـ notify::has-selection إشارة الخاص بك GtkTextBuffer:

void
on_has_selection_notify(GtkTextBuffer *buffer, GParamSpec *pspec, SomeStruct *data)
{
    gboolean has_selection = gtk_text_buffer_get_has_selection(buffer);
    gtk_action_set_sensitive(data->cut_action, has_selection);
    gtk_action_set_sensitive(data->copy_action, has_selection);
}

لتحديد الحالة الأولية لعمل اللصق (في حالة وجود نص على الحافظة عند بدء تشغيل التطبيق) قم بتشغيل الكود التالي أثناء إنشاء الواجهة الخاصة بك:

gtk_action_set_sensitive(data->paste_action, 
    gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)));

هذا يفترض أنه لا توجد طريقة للمستخدم لمسح الحافظة يدويًا (معظم البرامج لا تسمح لك بذلك.)

Lector Lector: الكود كما كتب هنا كل شيء غير مختبر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top